Merge pull request 'develop' (#7) from Hay1tsme/artemis:develop into develop
Reviewed-on: https://gitea.tendokyu.moe/ThatzOkay/artemis/pulls/7
This commit is contained in:
commit
4a18f6b3bc
@ -194,9 +194,9 @@ class AimedbServlette():
|
|||||||
|
|
||||||
if user_id and user_id > 0:
|
if user_id and user_id > 0:
|
||||||
await self.data.card.update_card_last_login(req.access_code)
|
await self.data.card.update_card_last_login(req.access_code)
|
||||||
if req.access_code.startswith("010") or req.access_code.startswith("3"):
|
if (req.access_code.startswith("010") or req.access_code.startswith("3")) and req.serial_number != 0x04030201: # Default segatools sn
|
||||||
await self.data.card.set_chip_id_by_access_code(req.access_code, req.serial_number)
|
await self.data.card.set_chip_id_by_access_code(req.access_code, req.serial_number)
|
||||||
self.logger.info(f"Attempt to set chip id to {req.serial_number} for access code {req.access_code}")
|
self.logger.info(f"Attempt to set chip id to {req.serial_number:08X} for access code {req.access_code}")
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
async def handle_lookup_ex(self, data: bytes, resp_code: int) -> ADBBaseResponse:
|
async def handle_lookup_ex(self, data: bytes, resp_code: int) -> ADBBaseResponse:
|
||||||
@ -240,18 +240,19 @@ class AimedbServlette():
|
|||||||
used on the big boy networks.
|
used on the big boy networks.
|
||||||
"""
|
"""
|
||||||
req = ADBFelicaLookupRequest(data)
|
req = ADBFelicaLookupRequest(data)
|
||||||
card = await self.data.card.get_card_by_idm(req.idm)
|
idm = req.idm.zfill(16)
|
||||||
|
card = await self.data.card.get_card_by_idm(idm)
|
||||||
if not card:
|
if not card:
|
||||||
ac = self.data.card.to_access_code(req.idm)
|
ac = self.data.card.to_access_code(idm)
|
||||||
test = await self.data.card.get_card_by_access_code(ac)
|
test = await self.data.card.get_card_by_access_code(ac)
|
||||||
if test:
|
if test:
|
||||||
await self.data.card.set_idm_by_access_code(ac, req.idm)
|
await self.data.card.set_idm_by_access_code(ac, idm)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
ac = card['access_code']
|
ac = card['access_code']
|
||||||
|
|
||||||
self.logger.info(
|
self.logger.info(
|
||||||
f"idm {req.idm} ipm {req.pmm} -> access_code {ac}"
|
f"idm {idm} ipm {req.pmm.zfill(16)} -> access_code {ac}"
|
||||||
)
|
)
|
||||||
return ADBFelicaLookupResponse.from_req(req.head, ac)
|
return ADBFelicaLookupResponse.from_req(req.head, ac)
|
||||||
|
|
||||||
@ -293,13 +294,14 @@ class AimedbServlette():
|
|||||||
async def handle_felica_lookup_ex(self, data: bytes, resp_code: int) -> bytes:
|
async def handle_felica_lookup_ex(self, data: bytes, resp_code: int) -> bytes:
|
||||||
req = ADBFelicaLookup2Request(data)
|
req = ADBFelicaLookup2Request(data)
|
||||||
user_id = None
|
user_id = None
|
||||||
card = await self.data.card.get_card_by_idm(req.idm)
|
idm = req.idm.zfill(16)
|
||||||
|
card = await self.data.card.get_card_by_idm(idm)
|
||||||
if not card:
|
if not card:
|
||||||
access_code = self.data.card.to_access_code(req.idm)
|
access_code = self.data.card.to_access_code(idm)
|
||||||
card = await self.data.card.get_card_by_access_code(access_code)
|
card = await self.data.card.get_card_by_access_code(access_code)
|
||||||
if card:
|
if card:
|
||||||
user_id = card['user']
|
user_id = card['user']
|
||||||
await self.data.card.set_idm_by_access_code(access_code, req.idm)
|
await self.data.card.set_idm_by_access_code(access_code, idm)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
user_id = card['user']
|
user_id = card['user']
|
||||||
@ -309,7 +311,7 @@ class AimedbServlette():
|
|||||||
user_id = -1
|
user_id = -1
|
||||||
|
|
||||||
self.logger.info(
|
self.logger.info(
|
||||||
f"idm {req.idm} ipm {req.pmm} -> access_code {access_code} user_id {user_id}"
|
f"idm {idm} ipm {req.pmm} -> access_code {access_code} user_id {user_id}"
|
||||||
)
|
)
|
||||||
|
|
||||||
resp = ADBFelicaLookup2Response.from_req(req.head, user_id, access_code)
|
resp = ADBFelicaLookup2Response.from_req(req.head, user_id, access_code)
|
||||||
@ -370,7 +372,7 @@ class AimedbServlette():
|
|||||||
)
|
)
|
||||||
|
|
||||||
if user_id > 0:
|
if user_id > 0:
|
||||||
if req.access_code.startswith("010") or req.access_code.startswith("3"):
|
if (req.access_code.startswith("010") or req.access_code.startswith("3")) and req.serial_number != 0x04030201: # Default segatools sn:
|
||||||
await self.data.card.set_chip_id_by_access_code(req.access_code, req.serial_number)
|
await self.data.card.set_chip_id_by_access_code(req.access_code, req.serial_number)
|
||||||
self.logger.info(f"Attempt to set chip id to {req.serial_number} for access code {req.access_code}")
|
self.logger.info(f"Attempt to set chip id to {req.serial_number} for access code {req.access_code}")
|
||||||
|
|
||||||
|
@ -35,9 +35,9 @@ def upgrade():
|
|||||||
|
|
||||||
def downgrade():
|
def downgrade():
|
||||||
# ### commands auto generated by Alembic - please adjust! ###
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
op.drop_constraint(None, 'aime_card', type_='unique')
|
op.drop_constraint("chip_id", 'aime_card', type_='unique')
|
||||||
op.drop_constraint(None, 'aime_card', type_='unique')
|
op.drop_constraint("idm", 'aime_card', type_='unique')
|
||||||
op.drop_constraint(None, 'aime_card', type_='unique')
|
op.drop_constraint("access_code", 'aime_card', type_='unique')
|
||||||
op.alter_column('aime_card', 'created_date',
|
op.alter_column('aime_card', 'created_date',
|
||||||
existing_type=mysql.TIMESTAMP(),
|
existing_type=mysql.TIMESTAMP(),
|
||||||
server_default=sa.text('CURRENT_TIMESTAMP'),
|
server_default=sa.text('CURRENT_TIMESTAMP'),
|
||||||
|
291
core/data/alembic/versions/680789dabab3_sao_player_changes.py
Normal file
291
core/data/alembic/versions/680789dabab3_sao_player_changes.py
Normal file
@ -0,0 +1,291 @@
|
|||||||
|
"""sao_player_changes
|
||||||
|
|
||||||
|
Revision ID: 680789dabab3
|
||||||
|
Revises: a616fd164e40
|
||||||
|
Create Date: 2024-06-26 23:19:16.863778
|
||||||
|
|
||||||
|
"""
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
from sqlalchemy.dialects import mysql
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = '680789dabab3'
|
||||||
|
down_revision = 'a616fd164e40'
|
||||||
|
branch_labels = None
|
||||||
|
depends_on = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
op.add_column('sao_equipment_data', sa.Column('is_shop_purchase', sa.BOOLEAN(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_equipment_data', sa.Column('is_protect', sa.BOOLEAN(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_equipment_data', sa.Column('property1_property_id', sa.BIGINT(), server_default='2', nullable=False))
|
||||||
|
op.add_column('sao_equipment_data', sa.Column('property1_value1', sa.INTEGER(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_equipment_data', sa.Column('property1_value2', sa.INTEGER(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_equipment_data', sa.Column('property2_property_id', sa.BIGINT(), server_default='2', nullable=False))
|
||||||
|
op.add_column('sao_equipment_data', sa.Column('property2_value1', sa.INTEGER(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_equipment_data', sa.Column('property2_value2', sa.INTEGER(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_equipment_data', sa.Column('property3_property_id', sa.BIGINT(), server_default='2', nullable=False))
|
||||||
|
op.add_column('sao_equipment_data', sa.Column('property3_value1', sa.INTEGER(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_equipment_data', sa.Column('property3_value2', sa.INTEGER(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_equipment_data', sa.Column('property4_property_id', sa.BIGINT(), server_default='2', nullable=False))
|
||||||
|
op.add_column('sao_equipment_data', sa.Column('property4_value1', sa.INTEGER(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_equipment_data', sa.Column('property4_value2', sa.INTEGER(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_equipment_data', sa.Column('converted_card_num', sa.INTEGER(), server_default='0', nullable=False))
|
||||||
|
op.alter_column('sao_equipment_data', 'equipment_id',
|
||||||
|
existing_type=mysql.INTEGER(),
|
||||||
|
type_=sa.BIGINT(),
|
||||||
|
existing_nullable=False)
|
||||||
|
op.alter_column('sao_equipment_data', 'get_date',
|
||||||
|
existing_type=mysql.TIMESTAMP(),
|
||||||
|
server_default=sa.text('now()'),
|
||||||
|
existing_nullable=False)
|
||||||
|
op.create_foreign_key(None, 'sao_equipment_data', 'sao_static_property', ['property2_property_id'], ['PropertyId'], onupdate='cascade', ondelete='cascade')
|
||||||
|
op.create_foreign_key(None, 'sao_equipment_data', 'sao_static_property', ['property4_property_id'], ['PropertyId'], onupdate='cascade', ondelete='cascade')
|
||||||
|
op.create_foreign_key(None, 'sao_equipment_data', 'sao_static_property', ['property3_property_id'], ['PropertyId'], onupdate='cascade', ondelete='cascade')
|
||||||
|
op.create_foreign_key(None, 'sao_equipment_data', 'sao_static_property', ['property1_property_id'], ['PropertyId'], onupdate='cascade', ondelete='cascade')
|
||||||
|
op.create_foreign_key(None, 'sao_equipment_data', 'sao_static_equipment_list', ['equipment_id'], ['EquipmentId'], onupdate='cascade', ondelete='cascade')
|
||||||
|
op.add_column('sao_hero_log_data', sa.Column('max_level_extend_num', sa.INTEGER(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_hero_log_data', sa.Column('is_awakenable', sa.BOOLEAN(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_hero_log_data', sa.Column('awakening_stage', sa.INTEGER(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_hero_log_data', sa.Column('awakening_exp', sa.INTEGER(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_hero_log_data', sa.Column('is_shop_purchase', sa.BOOLEAN(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_hero_log_data', sa.Column('is_protect', sa.BOOLEAN(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_hero_log_data', sa.Column('property1_property_id', sa.BIGINT(), server_default='2', nullable=False))
|
||||||
|
op.add_column('sao_hero_log_data', sa.Column('property1_value1', sa.INTEGER(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_hero_log_data', sa.Column('property1_value2', sa.INTEGER(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_hero_log_data', sa.Column('property2_property_id', sa.BIGINT(), server_default='2', nullable=False))
|
||||||
|
op.add_column('sao_hero_log_data', sa.Column('property2_value1', sa.INTEGER(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_hero_log_data', sa.Column('property2_value2', sa.INTEGER(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_hero_log_data', sa.Column('property3_property_id', sa.BIGINT(), server_default='2', nullable=False))
|
||||||
|
op.add_column('sao_hero_log_data', sa.Column('property3_value1', sa.INTEGER(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_hero_log_data', sa.Column('property3_value2', sa.INTEGER(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_hero_log_data', sa.Column('property4_property_id', sa.BIGINT(), server_default='2', nullable=False))
|
||||||
|
op.add_column('sao_hero_log_data', sa.Column('property4_value1', sa.INTEGER(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_hero_log_data', sa.Column('property4_value2', sa.INTEGER(), server_default='0', nullable=False))
|
||||||
|
op.add_column('sao_hero_log_data', sa.Column('converted_card_num', sa.INTEGER(), server_default='0', nullable=False))
|
||||||
|
op.alter_column('sao_hero_log_data', 'skill_slot1_skill_id',
|
||||||
|
existing_type=mysql.INTEGER(),
|
||||||
|
type_=sa.BIGINT(),
|
||||||
|
nullable=True)
|
||||||
|
op.alter_column('sao_hero_log_data', 'skill_slot2_skill_id',
|
||||||
|
existing_type=mysql.INTEGER(),
|
||||||
|
type_=sa.BIGINT(),
|
||||||
|
nullable=True)
|
||||||
|
op.alter_column('sao_hero_log_data', 'skill_slot3_skill_id',
|
||||||
|
existing_type=mysql.INTEGER(),
|
||||||
|
type_=sa.BIGINT(),
|
||||||
|
nullable=True)
|
||||||
|
op.alter_column('sao_hero_log_data', 'skill_slot4_skill_id',
|
||||||
|
existing_type=mysql.INTEGER(),
|
||||||
|
type_=sa.BIGINT(),
|
||||||
|
nullable=True)
|
||||||
|
op.alter_column('sao_hero_log_data', 'skill_slot5_skill_id',
|
||||||
|
existing_type=mysql.INTEGER(),
|
||||||
|
type_=sa.BIGINT(),
|
||||||
|
nullable=True)
|
||||||
|
op.alter_column('sao_hero_log_data', 'get_date',
|
||||||
|
existing_type=mysql.TIMESTAMP(),
|
||||||
|
server_default=sa.text('now()'),
|
||||||
|
existing_nullable=False)
|
||||||
|
op.alter_column("sao_hero_log_data", "user_hero_log_id",
|
||||||
|
existing_type=sa.Integer(),
|
||||||
|
new_column_name="hero_log_id",
|
||||||
|
type_=sa.BIGINT(),
|
||||||
|
nullable=False)
|
||||||
|
op.execute(sa.text("UPDATE sao_hero_log_data SET skill_slot1_skill_id = NULL WHERE skill_slot1_skill_id = 0;"))
|
||||||
|
op.execute(sa.text("UPDATE sao_hero_log_data SET skill_slot2_skill_id = NULL WHERE skill_slot2_skill_id = 0;"))
|
||||||
|
op.execute(sa.text("UPDATE sao_hero_log_data SET skill_slot3_skill_id = NULL WHERE skill_slot3_skill_id = 0;"))
|
||||||
|
op.execute(sa.text("UPDATE sao_hero_log_data SET skill_slot4_skill_id = NULL WHERE skill_slot4_skill_id = 0;"))
|
||||||
|
op.execute(sa.text("UPDATE sao_hero_log_data SET skill_slot5_skill_id = NULL WHERE skill_slot5_skill_id = 0;"))
|
||||||
|
op.execute(sa.text("UPDATE sao_hero_log_data SET main_weapon = NULL WHERE main_weapon = 0;"))
|
||||||
|
op.execute(sa.text("UPDATE sao_hero_log_data SET sub_equipment = NULL WHERE sub_equipment = 0;"))
|
||||||
|
op.execute(sa.text("UPDATE sao_hero_party SET user_hero_log_id_1 = NULL WHERE user_hero_log_id_1 = 0;"))
|
||||||
|
op.execute(sa.text("UPDATE sao_hero_party SET user_hero_log_id_2 = NULL WHERE user_hero_log_id_2 = 0;"))
|
||||||
|
op.execute(sa.text("UPDATE sao_hero_party SET user_hero_log_id_3 = NULL WHERE user_hero_log_id_3 = 0;"))
|
||||||
|
|
||||||
|
op.execute(sa.text("UPDATE sao_hero_log_data INNER JOIN sao_equipment_data ON sao_hero_log_data.main_weapon = sao_equipment_data.equipment_id SET sao_hero_log_data.main_weapon = sao_equipment_data.id;"))
|
||||||
|
op.execute(sa.text("UPDATE sao_hero_log_data INNER JOIN sao_equipment_data ON sao_hero_log_data.sub_equipment = sao_equipment_data.equipment_id SET sao_hero_log_data.sub_equipment = sao_equipment_data.id;"))
|
||||||
|
|
||||||
|
op.execute(sa.text("UPDATE sao_hero_party INNER JOIN sao_hero_log_data ON sao_hero_party.user_hero_log_id_1 = sao_hero_log_data.hero_log_id SET sao_hero_party.user_hero_log_id_1 = sao_hero_log_data.id;"))
|
||||||
|
op.execute(sa.text("UPDATE sao_hero_party INNER JOIN sao_hero_log_data ON sao_hero_party.user_hero_log_id_2 = sao_hero_log_data.hero_log_id SET sao_hero_party.user_hero_log_id_2 = sao_hero_log_data.id;"))
|
||||||
|
op.execute(sa.text("UPDATE sao_hero_party INNER JOIN sao_hero_log_data ON sao_hero_party.user_hero_log_id_3 = sao_hero_log_data.hero_log_id SET sao_hero_party.user_hero_log_id_3 = sao_hero_log_data.id;"))
|
||||||
|
|
||||||
|
op.create_foreign_key(None, 'sao_hero_log_data', 'sao_static_property', ['property4_property_id'], ['PropertyId'], onupdate='cascade', ondelete='cascade')
|
||||||
|
op.create_foreign_key(None, 'sao_hero_log_data', 'sao_static_skill', ['skill_slot1_skill_id'], ['SkillId'], onupdate='set null', ondelete='set null')
|
||||||
|
op.create_foreign_key(None, 'sao_hero_log_data', 'sao_static_skill', ['skill_slot5_skill_id'], ['SkillId'], onupdate='set null', ondelete='set null')
|
||||||
|
op.create_foreign_key(None, 'sao_hero_log_data', 'sao_static_skill', ['skill_slot2_skill_id'], ['SkillId'], onupdate='set null', ondelete='set null')
|
||||||
|
op.create_foreign_key(None, 'sao_hero_log_data', 'sao_static_skill', ['skill_slot3_skill_id'], ['SkillId'], onupdate='set null', ondelete='set null')
|
||||||
|
op.create_foreign_key(None, 'sao_hero_log_data', 'sao_equipment_data', ['main_weapon'], ['id'], onupdate='set null', ondelete='set null')
|
||||||
|
op.create_foreign_key(None, 'sao_hero_log_data', 'sao_static_property', ['property3_property_id'], ['PropertyId'], onupdate='cascade', ondelete='cascade')
|
||||||
|
op.create_foreign_key(None, 'sao_hero_log_data', 'sao_static_skill', ['skill_slot4_skill_id'], ['SkillId'], onupdate='set null', ondelete='set null')
|
||||||
|
op.create_foreign_key(None, 'sao_hero_log_data', 'sao_equipment_data', ['sub_equipment'], ['id'], onupdate='set null', ondelete='set null')
|
||||||
|
op.create_foreign_key(None, 'sao_hero_log_data', 'sao_static_property', ['property1_property_id'], ['PropertyId'], onupdate='cascade', ondelete='cascade')
|
||||||
|
op.create_foreign_key(None, 'sao_hero_log_data', 'sao_static_hero_list', ['hero_log_id'], ['HeroLogId'], onupdate='cascade', ondelete='cascade')
|
||||||
|
op.create_foreign_key(None, 'sao_hero_log_data', 'sao_static_property', ['property2_property_id'], ['PropertyId'], onupdate='cascade', ondelete='cascade')
|
||||||
|
op.create_foreign_key(None, 'sao_hero_party', 'sao_hero_log_data', ['user_hero_log_id_3'], ['id'], onupdate='cascade', ondelete='cascade')
|
||||||
|
op.create_foreign_key(None, 'sao_hero_party', 'sao_hero_log_data', ['user_hero_log_id_1'], ['id'], onupdate='cascade', ondelete='cascade')
|
||||||
|
op.create_foreign_key(None, 'sao_hero_party', 'sao_hero_log_data', ['user_hero_log_id_2'], ['id'], onupdate='cascade', ondelete='cascade')
|
||||||
|
op.alter_column('sao_item_data', 'get_date',
|
||||||
|
existing_type=mysql.TIMESTAMP(),
|
||||||
|
server_default=sa.text('now()'),
|
||||||
|
existing_nullable=False)
|
||||||
|
op.alter_column('sao_play_sessions', 'play_date',
|
||||||
|
existing_type=mysql.TIMESTAMP(),
|
||||||
|
server_default=sa.text('now()'),
|
||||||
|
existing_nullable=False)
|
||||||
|
op.add_column('sao_player_quest', sa.Column('quest_type', sa.INTEGER(), server_default='1', nullable=False))
|
||||||
|
op.alter_column('sao_player_quest', 'play_date',
|
||||||
|
existing_type=mysql.TIMESTAMP(),
|
||||||
|
server_default=sa.text('now()'),
|
||||||
|
existing_nullable=False)
|
||||||
|
op.alter_column('sao_player_quest', 'episode_id',
|
||||||
|
existing_type=mysql.INTEGER(),
|
||||||
|
new_column_name="quest_scene_id",
|
||||||
|
type_=sa.BIGINT(),
|
||||||
|
nullable=False)
|
||||||
|
op.create_foreign_key(None, 'sao_player_quest', 'sao_static_quest', ['quest_scene_id'], ['QuestSceneId'], onupdate='cascade', ondelete='cascade')
|
||||||
|
op.add_column('sao_profile', sa.Column('my_shop', sa.INTEGER(), nullable=True))
|
||||||
|
op.add_column('sao_profile', sa.Column('fav_hero', sa.INTEGER(), nullable=True))
|
||||||
|
op.add_column('sao_profile', sa.Column('when_register', sa.TIMESTAMP(), server_default=sa.text('now()'), nullable=True))
|
||||||
|
op.add_column('sao_profile', sa.Column('last_login_date', sa.TIMESTAMP(), nullable=True))
|
||||||
|
op.add_column('sao_profile', sa.Column('last_yui_medal_date', sa.TIMESTAMP(), nullable=True))
|
||||||
|
op.add_column('sao_profile', sa.Column('last_bonus_yui_medal_date', sa.TIMESTAMP(), nullable=True))
|
||||||
|
op.add_column('sao_profile', sa.Column('last_comeback_date', sa.TIMESTAMP(), nullable=True))
|
||||||
|
op.add_column('sao_profile', sa.Column('last_login_bonus_date', sa.TIMESTAMP(), nullable=True))
|
||||||
|
op.add_column('sao_profile', sa.Column('ad_confirm_date', sa.TIMESTAMP(), nullable=True))
|
||||||
|
op.add_column('sao_profile', sa.Column('login_ct', sa.INTEGER(), server_default='0', nullable=True))
|
||||||
|
op.create_foreign_key(None, 'sao_profile', 'sao_hero_log_data', ['fav_hero'], ['id'], onupdate='cascade', ondelete='set null')
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
op.drop_constraint("sao_profile_ibfk_2", 'sao_profile', type_='foreignkey')
|
||||||
|
op.drop_column('sao_profile', 'login_ct')
|
||||||
|
op.drop_column('sao_profile', 'ad_confirm_date')
|
||||||
|
op.drop_column('sao_profile', 'last_login_bonus_date')
|
||||||
|
op.drop_column('sao_profile', 'last_comeback_date')
|
||||||
|
op.drop_column('sao_profile', 'last_bonus_yui_medal_date')
|
||||||
|
op.drop_column('sao_profile', 'last_yui_medal_date')
|
||||||
|
op.drop_column('sao_profile', 'last_login_date')
|
||||||
|
op.drop_column('sao_profile', 'when_register')
|
||||||
|
op.drop_column('sao_profile', 'fav_hero')
|
||||||
|
op.drop_column('sao_profile', 'my_shop')
|
||||||
|
op.alter_column('sao_player_quest', 'quest_scene_id',
|
||||||
|
existing_type=mysql.BIGINT(),
|
||||||
|
new_column_name="episode_id",
|
||||||
|
type_=sa.INTEGER(),
|
||||||
|
nullable=False)
|
||||||
|
op.drop_constraint("sao_player_quest_ibfk_2", 'sao_player_quest', type_='foreignkey')
|
||||||
|
op.alter_column('sao_player_quest', 'play_date',
|
||||||
|
existing_type=mysql.TIMESTAMP(),
|
||||||
|
server_default=sa.text('CURRENT_TIMESTAMP'),
|
||||||
|
existing_nullable=False)
|
||||||
|
op.drop_column('sao_player_quest', 'quest_scene_id')
|
||||||
|
op.drop_column('sao_player_quest', 'quest_type')
|
||||||
|
op.alter_column('sao_play_sessions', 'play_date',
|
||||||
|
existing_type=mysql.TIMESTAMP(),
|
||||||
|
server_default=sa.text('CURRENT_TIMESTAMP'),
|
||||||
|
existing_nullable=False)
|
||||||
|
op.alter_column('sao_item_data', 'get_date',
|
||||||
|
existing_type=mysql.TIMESTAMP(),
|
||||||
|
server_default=sa.text('CURRENT_TIMESTAMP'),
|
||||||
|
existing_nullable=False)
|
||||||
|
op.drop_constraint("sao_hero_party_ibfk_2", 'sao_hero_party', type_='foreignkey')
|
||||||
|
op.drop_constraint("sao_hero_party_ibfk_3", 'sao_hero_party', type_='foreignkey')
|
||||||
|
op.drop_constraint("sao_hero_party_ibfk_4", 'sao_hero_party', type_='foreignkey')
|
||||||
|
op.alter_column("sao_hero_log_data", "hero_log_id",
|
||||||
|
existing_type=sa.BIGINT(),
|
||||||
|
new_column_name="user_hero_log_id",
|
||||||
|
type_=sa.Integer(),
|
||||||
|
nullable=False)
|
||||||
|
op.drop_constraint("sao_hero_log_data_ibfk_2", 'sao_hero_log_data', type_='foreignkey')
|
||||||
|
op.drop_constraint("sao_hero_log_data_ibfk_3", 'sao_hero_log_data', type_='foreignkey')
|
||||||
|
op.drop_constraint("sao_hero_log_data_ibfk_4", 'sao_hero_log_data', type_='foreignkey')
|
||||||
|
op.drop_constraint("sao_hero_log_data_ibfk_5", 'sao_hero_log_data', type_='foreignkey')
|
||||||
|
op.drop_constraint("sao_hero_log_data_ibfk_6", 'sao_hero_log_data', type_='foreignkey')
|
||||||
|
op.drop_constraint("sao_hero_log_data_ibfk_7", 'sao_hero_log_data', type_='foreignkey')
|
||||||
|
op.drop_constraint("sao_hero_log_data_ibfk_8", 'sao_hero_log_data', type_='foreignkey')
|
||||||
|
op.drop_constraint("sao_hero_log_data_ibfk_9", 'sao_hero_log_data', type_='foreignkey')
|
||||||
|
op.drop_constraint("sao_hero_log_data_ibfk_10", 'sao_hero_log_data', type_='foreignkey')
|
||||||
|
op.drop_constraint("sao_hero_log_data_ibfk_11", 'sao_hero_log_data', type_='foreignkey')
|
||||||
|
op.drop_constraint("sao_hero_log_data_ibfk_12", 'sao_hero_log_data', type_='foreignkey')
|
||||||
|
op.drop_constraint("sao_hero_log_data_ibfk_13", 'sao_hero_log_data', type_='foreignkey')
|
||||||
|
op.alter_column('sao_hero_log_data', 'get_date',
|
||||||
|
existing_type=mysql.TIMESTAMP(),
|
||||||
|
server_default=sa.text('CURRENT_TIMESTAMP'),
|
||||||
|
existing_nullable=False)
|
||||||
|
op.alter_column('sao_hero_log_data', 'skill_slot5_skill_id',
|
||||||
|
existing_type=sa.BIGINT(),
|
||||||
|
type_=mysql.INTEGER(),
|
||||||
|
nullable=False)
|
||||||
|
op.alter_column('sao_hero_log_data', 'skill_slot4_skill_id',
|
||||||
|
existing_type=sa.BIGINT(),
|
||||||
|
type_=mysql.INTEGER(),
|
||||||
|
nullable=False)
|
||||||
|
op.alter_column('sao_hero_log_data', 'skill_slot3_skill_id',
|
||||||
|
existing_type=sa.BIGINT(),
|
||||||
|
type_=mysql.INTEGER(),
|
||||||
|
nullable=False)
|
||||||
|
op.alter_column('sao_hero_log_data', 'skill_slot2_skill_id',
|
||||||
|
existing_type=sa.BIGINT(),
|
||||||
|
type_=mysql.INTEGER(),
|
||||||
|
nullable=False)
|
||||||
|
op.alter_column('sao_hero_log_data', 'skill_slot1_skill_id',
|
||||||
|
existing_type=sa.BIGINT(),
|
||||||
|
type_=mysql.INTEGER(),
|
||||||
|
nullable=False)
|
||||||
|
op.alter_column('sao_hero_log_data', 'sub_equipment',
|
||||||
|
existing_type=sa.BIGINT(),
|
||||||
|
type_=mysql.INTEGER(),
|
||||||
|
nullable=False)
|
||||||
|
op.alter_column('sao_hero_log_data', 'main_weapon',
|
||||||
|
existing_type=sa.BIGINT(),
|
||||||
|
type_=mysql.INTEGER(),
|
||||||
|
nullable=False)
|
||||||
|
op.drop_column('sao_hero_log_data', 'converted_card_num')
|
||||||
|
op.drop_column('sao_hero_log_data', 'property4_value2')
|
||||||
|
op.drop_column('sao_hero_log_data', 'property4_value1')
|
||||||
|
op.drop_column('sao_hero_log_data', 'property4_property_id')
|
||||||
|
op.drop_column('sao_hero_log_data', 'property3_value2')
|
||||||
|
op.drop_column('sao_hero_log_data', 'property3_value1')
|
||||||
|
op.drop_column('sao_hero_log_data', 'property3_property_id')
|
||||||
|
op.drop_column('sao_hero_log_data', 'property2_value2')
|
||||||
|
op.drop_column('sao_hero_log_data', 'property2_value1')
|
||||||
|
op.drop_column('sao_hero_log_data', 'property2_property_id')
|
||||||
|
op.drop_column('sao_hero_log_data', 'property1_value2')
|
||||||
|
op.drop_column('sao_hero_log_data', 'property1_value1')
|
||||||
|
op.drop_column('sao_hero_log_data', 'property1_property_id')
|
||||||
|
op.drop_column('sao_hero_log_data', 'is_protect')
|
||||||
|
op.drop_column('sao_hero_log_data', 'is_shop_purchase')
|
||||||
|
op.drop_column('sao_hero_log_data', 'awakening_exp')
|
||||||
|
op.drop_column('sao_hero_log_data', 'awakening_stage')
|
||||||
|
op.drop_column('sao_hero_log_data', 'is_awakenable')
|
||||||
|
op.drop_column('sao_hero_log_data', 'max_level_extend_num')
|
||||||
|
op.drop_constraint("sao_equipment_data_ibfk_2", 'sao_equipment_data', type_='foreignkey')
|
||||||
|
op.drop_constraint("sao_equipment_data_ibfk_3", 'sao_equipment_data', type_='foreignkey')
|
||||||
|
op.drop_constraint("sao_equipment_data_ibfk_4", 'sao_equipment_data', type_='foreignkey')
|
||||||
|
op.drop_constraint("sao_equipment_data_ibfk_5", 'sao_equipment_data', type_='foreignkey')
|
||||||
|
op.drop_constraint("sao_equipment_data_ibfk_6", 'sao_equipment_data', type_='foreignkey')
|
||||||
|
op.alter_column('sao_equipment_data', 'get_date',
|
||||||
|
existing_type=mysql.TIMESTAMP(),
|
||||||
|
server_default=sa.text('CURRENT_TIMESTAMP'),
|
||||||
|
existing_nullable=False)
|
||||||
|
op.alter_column('sao_equipment_data', 'equipment_id',
|
||||||
|
existing_type=sa.BIGINT(),
|
||||||
|
type_=mysql.INTEGER(),
|
||||||
|
existing_nullable=False)
|
||||||
|
op.drop_column('sao_equipment_data', 'converted_card_num')
|
||||||
|
op.drop_column('sao_equipment_data', 'property4_value2')
|
||||||
|
op.drop_column('sao_equipment_data', 'property4_value1')
|
||||||
|
op.drop_column('sao_equipment_data', 'property4_property_id')
|
||||||
|
op.drop_column('sao_equipment_data', 'property3_value2')
|
||||||
|
op.drop_column('sao_equipment_data', 'property3_value1')
|
||||||
|
op.drop_column('sao_equipment_data', 'property3_property_id')
|
||||||
|
op.drop_column('sao_equipment_data', 'property2_value2')
|
||||||
|
op.drop_column('sao_equipment_data', 'property2_value1')
|
||||||
|
op.drop_column('sao_equipment_data', 'property2_property_id')
|
||||||
|
op.drop_column('sao_equipment_data', 'property1_value2')
|
||||||
|
op.drop_column('sao_equipment_data', 'property1_value1')
|
||||||
|
op.drop_column('sao_equipment_data', 'property1_property_id')
|
||||||
|
op.drop_column('sao_equipment_data', 'is_protect')
|
||||||
|
op.drop_column('sao_equipment_data', 'is_shop_purchase')
|
437
core/data/alembic/versions/a616fd164e40_sao_backport.py
Normal file
437
core/data/alembic/versions/a616fd164e40_sao_backport.py
Normal file
@ -0,0 +1,437 @@
|
|||||||
|
"""sao_backport
|
||||||
|
|
||||||
|
Revision ID: a616fd164e40
|
||||||
|
Revises: 48f4acc43a7e
|
||||||
|
Create Date: 2024-06-24 20:28:34.471282
|
||||||
|
|
||||||
|
"""
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
from sqlalchemy.dialects import mysql
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = 'a616fd164e40'
|
||||||
|
down_revision = '48f4acc43a7e'
|
||||||
|
branch_labels = None
|
||||||
|
depends_on = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
op.drop_table('sao_static_quest')
|
||||||
|
op.create_table('sao_static_quest',
|
||||||
|
sa.Column('QuestSceneId', sa.BIGINT(), nullable=False),
|
||||||
|
sa.Column('SortNo', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('Tutorial', sa.BOOLEAN(), nullable=False),
|
||||||
|
sa.Column('ColRate', sa.DECIMAL(), nullable=False),
|
||||||
|
sa.Column('LimitDefault', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('LimitResurrection', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('RewardTableSubId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('PlayerTraceTableSubId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('SuccessPlayerExp', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('FailedPlayerExp', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('PairExpRate', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('TrioExpRate', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('SingleRewardVp', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('PairRewardVp', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('TrioRewardVp', sa.INTEGER(), nullable=False),
|
||||||
|
sa.PrimaryKeyConstraint('QuestSceneId'),
|
||||||
|
mysql_charset='utf8mb4'
|
||||||
|
)
|
||||||
|
|
||||||
|
op.create_table('sao_static_property',
|
||||||
|
sa.Column('PropertyId', sa.BIGINT(), nullable=False),
|
||||||
|
sa.Column('PropertyTargetType', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('PropertyName', sa.VARCHAR(length=255), nullable=False),
|
||||||
|
sa.Column('PropertyName_en', sa.VARCHAR(length=255), nullable=True),
|
||||||
|
sa.Column('PropertyNameFormat', sa.VARCHAR(length=255), nullable=False),
|
||||||
|
sa.Column('PropertyNameFormat_en', sa.VARCHAR(length=255), nullable=True),
|
||||||
|
sa.Column('PropertyTypeId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('Value1Min', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('Value1Max', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('Value2Min', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('Value2Max', sa.INTEGER(), nullable=False),
|
||||||
|
sa.PrimaryKeyConstraint('PropertyId'),
|
||||||
|
mysql_charset='utf8mb4'
|
||||||
|
)
|
||||||
|
op.create_table('sao_static_reward',
|
||||||
|
sa.Column('RewardTableId', sa.BIGINT(), nullable=False),
|
||||||
|
sa.Column('RewardTableSubId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('UnanalyzedLogGradeId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('CommonRewardType', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('CommonRewardId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('CommonRewardNum', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('StrengthMin', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('StrengthMax', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('PropertyTableSubId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('QuestInfoDisplayFlag', sa.BOOLEAN(), nullable=False),
|
||||||
|
sa.Column('Rate', sa.INTEGER(), nullable=False),
|
||||||
|
sa.PrimaryKeyConstraint('RewardTableId'),
|
||||||
|
mysql_charset='utf8mb4'
|
||||||
|
)
|
||||||
|
op.create_table('sao_static_skill',
|
||||||
|
sa.Column('SkillId', sa.BIGINT(), nullable=False),
|
||||||
|
sa.Column('WeaponTypeId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('Name', sa.VARCHAR(length=255), nullable=False),
|
||||||
|
sa.Column('Name_en', sa.VARCHAR(length=255), nullable=True),
|
||||||
|
sa.Column('Attack', sa.BOOLEAN(), nullable=False),
|
||||||
|
sa.Column('Passive', sa.BOOLEAN(), nullable=False),
|
||||||
|
sa.Column('Pet', sa.BOOLEAN(), nullable=False),
|
||||||
|
sa.Column('Level', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('SkillCondition', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('CoolTime', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('SkillIcon', sa.VARCHAR(length=255), nullable=False),
|
||||||
|
sa.Column('FriendSkillIcon', sa.VARCHAR(length=255), nullable=False),
|
||||||
|
sa.Column('InfoText', sa.VARCHAR(length=255), nullable=False),
|
||||||
|
sa.Column('InfoText_en', sa.VARCHAR(length=255), nullable=True),
|
||||||
|
sa.PrimaryKeyConstraint('SkillId'),
|
||||||
|
mysql_charset='utf8mb4'
|
||||||
|
)
|
||||||
|
op.create_table('sao_static_trace_table',
|
||||||
|
sa.Column('PlayerTraceTableId', sa.BIGINT(), nullable=False),
|
||||||
|
sa.Column('PlayerTraceTableSubId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('CommonRewardType', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('CommonRewardId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('CommonRewardNum', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('Rate', sa.INTEGER(), nullable=False),
|
||||||
|
sa.PrimaryKeyConstraint('PlayerTraceTableId'),
|
||||||
|
mysql_charset='utf8mb4'
|
||||||
|
)
|
||||||
|
op.create_table('sao_player_beginner_mission',
|
||||||
|
sa.Column('id', sa.BIGINT(), nullable=False),
|
||||||
|
sa.Column('user', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('beginner_mission_id', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('condition_id', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('is_seat', sa.BOOLEAN(), server_default='0', nullable=False),
|
||||||
|
sa.Column('achievement_num', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('complete_flag', sa.BOOLEAN(), server_default='0', nullable=False),
|
||||||
|
sa.Column('complete_date', sa.TIMESTAMP(), nullable=True),
|
||||||
|
sa.Column('reward_received_flag', sa.BOOLEAN(), server_default='0', nullable=False),
|
||||||
|
sa.Column('reward_received_date', sa.TIMESTAMP(), nullable=True),
|
||||||
|
sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'),
|
||||||
|
sa.PrimaryKeyConstraint('id'),
|
||||||
|
sa.UniqueConstraint('user'),
|
||||||
|
sa.UniqueConstraint('user', 'condition_id', name='sao_player_beginner_mission_uk'),
|
||||||
|
mysql_charset='utf8mb4'
|
||||||
|
)
|
||||||
|
op.create_table('sao_player_resource_card',
|
||||||
|
sa.Column('id', sa.BIGINT(), nullable=False),
|
||||||
|
sa.Column('user', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('common_reward_type', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('common_reward_id', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('holographic_flag', sa.BOOLEAN(), server_default='0', nullable=False),
|
||||||
|
sa.Column('serial', sa.VARCHAR(length=20), nullable=True),
|
||||||
|
sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'),
|
||||||
|
sa.PrimaryKeyConstraint('id'),
|
||||||
|
sa.UniqueConstraint('serial'),
|
||||||
|
mysql_charset='utf8mb4'
|
||||||
|
)
|
||||||
|
op.create_table('sao_player_tutorial',
|
||||||
|
sa.Column('id', sa.BIGINT(), nullable=False),
|
||||||
|
sa.Column('user', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('tutorial_byte', sa.INTEGER(), nullable=False),
|
||||||
|
sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'),
|
||||||
|
sa.PrimaryKeyConstraint('id'),
|
||||||
|
sa.UniqueConstraint('user', 'tutorial_byte', name='sao_player_tutorial_uk'),
|
||||||
|
mysql_charset='utf8mb4'
|
||||||
|
)
|
||||||
|
op.create_table('sao_static_episode',
|
||||||
|
sa.Column('EpisodeId', sa.BIGINT(), nullable=False),
|
||||||
|
sa.Column('EpisodeChapterId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('ReleaseEpisodeId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('Title', sa.VARCHAR(length=255), nullable=False),
|
||||||
|
sa.Column('CommentSummary', sa.VARCHAR(length=255), nullable=False),
|
||||||
|
sa.Column('ExBonusTableSubId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('QuestSceneId', sa.BIGINT(), nullable=True),
|
||||||
|
sa.ForeignKeyConstraint(['QuestSceneId'], ['sao_static_quest.QuestSceneId'], onupdate='cascade', ondelete='cascade'),
|
||||||
|
sa.PrimaryKeyConstraint('EpisodeId'),
|
||||||
|
mysql_charset='utf8mb4'
|
||||||
|
)
|
||||||
|
op.create_table('sao_static_ex_bonus',
|
||||||
|
sa.Column('ExBonusTableId', sa.BIGINT(), nullable=False),
|
||||||
|
sa.Column('ExBonusTableSubId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('ExBonusConditionId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('ConditionValue1', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('ConditionValue2', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('CommonRewardType', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('CommonRewardId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('CommonRewardNum', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('Strength', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('Property1PropertyId', sa.BIGINT(), nullable=False),
|
||||||
|
sa.Column('Property1Value1', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('Property1Value2', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('Property2PropertyId', sa.BIGINT(), nullable=False),
|
||||||
|
sa.Column('Property2Value1', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('Property2Value2', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('Property3PropertyId', sa.BIGINT(), nullable=False),
|
||||||
|
sa.Column('Property3Value1', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('Property3Value2', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('Property4PropertyId', sa.BIGINT(), nullable=False),
|
||||||
|
sa.Column('Property4Value1', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('Property4Value2', sa.INTEGER(), nullable=False),
|
||||||
|
sa.ForeignKeyConstraint(['Property1PropertyId'], ['sao_static_property.PropertyId'], onupdate='cascade', ondelete='cascade'),
|
||||||
|
sa.ForeignKeyConstraint(['Property2PropertyId'], ['sao_static_property.PropertyId'], onupdate='cascade', ondelete='cascade'),
|
||||||
|
sa.ForeignKeyConstraint(['Property3PropertyId'], ['sao_static_property.PropertyId'], onupdate='cascade', ondelete='cascade'),
|
||||||
|
sa.ForeignKeyConstraint(['Property4PropertyId'], ['sao_static_property.PropertyId'], onupdate='cascade', ondelete='cascade'),
|
||||||
|
sa.PrimaryKeyConstraint('ExBonusTableId'),
|
||||||
|
mysql_charset='utf8mb4'
|
||||||
|
)
|
||||||
|
op.create_table('sao_static_ex_tower',
|
||||||
|
sa.Column('ExTowerQuestId', sa.BIGINT(), nullable=False),
|
||||||
|
sa.Column('ExTowerId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('ReleaseExTowerQuestId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('Title', sa.VARCHAR(length=255), nullable=False),
|
||||||
|
sa.Column('Title_en', sa.VARCHAR(length=255), nullable=True),
|
||||||
|
sa.Column('ExBonusTableSubId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('QuestSceneId', sa.BIGINT(), nullable=False),
|
||||||
|
sa.ForeignKeyConstraint(['QuestSceneId'], ['sao_static_quest.QuestSceneId'], onupdate='cascade', ondelete='cascade'),
|
||||||
|
sa.PrimaryKeyConstraint('ExTowerQuestId'),
|
||||||
|
mysql_charset='utf8mb4'
|
||||||
|
)
|
||||||
|
op.create_table('sao_static_side_quest',
|
||||||
|
sa.Column('SideQuestId', sa.BIGINT(), nullable=False),
|
||||||
|
sa.Column('DisplayName', sa.VARCHAR(length=255), nullable=False),
|
||||||
|
sa.Column('DisplayName_en', sa.VARCHAR(length=255), nullable=True),
|
||||||
|
sa.Column('EpisodeNum', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('ExBonusTableSubId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('QuestSceneId', sa.BIGINT(), nullable=False),
|
||||||
|
sa.ForeignKeyConstraint(['QuestSceneId'], ['sao_static_quest.QuestSceneId'], onupdate='cascade', ondelete='cascade'),
|
||||||
|
sa.PrimaryKeyConstraint('SideQuestId'),
|
||||||
|
sa.UniqueConstraint('SideQuestId'),
|
||||||
|
mysql_charset='utf8mb4'
|
||||||
|
)
|
||||||
|
op.create_table('sao_static_skill_table',
|
||||||
|
sa.Column('SkillTableId', sa.BIGINT(), nullable=False),
|
||||||
|
sa.Column('SkillId', sa.BIGINT(), nullable=False),
|
||||||
|
sa.Column('SkillTableSubId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('LevelObtained', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('AwakeningId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.ForeignKeyConstraint(['SkillId'], ['sao_static_skill.SkillId'], onupdate='cascade', ondelete='cascade'),
|
||||||
|
sa.PrimaryKeyConstraint('SkillTableId'),
|
||||||
|
mysql_charset='utf8mb4'
|
||||||
|
)
|
||||||
|
op.create_table('sao_static_tower',
|
||||||
|
sa.Column('TowerId', sa.BIGINT(), nullable=False),
|
||||||
|
sa.Column('ReleaseTowerId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('ExBonusTableSubId', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('QuestSceneId', sa.BIGINT(), nullable=False),
|
||||||
|
sa.ForeignKeyConstraint(['QuestSceneId'], ['sao_static_quest.QuestSceneId'], onupdate='cascade', ondelete='cascade'),
|
||||||
|
sa.PrimaryKeyConstraint('TowerId'),
|
||||||
|
mysql_charset='utf8mb4'
|
||||||
|
)
|
||||||
|
op.create_table('sao_player_ex_bonus',
|
||||||
|
sa.Column('id', sa.BIGINT(), nullable=False),
|
||||||
|
sa.Column('user', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('quest_scene_id', sa.BIGINT(), nullable=False),
|
||||||
|
sa.Column('ex_bonus_table_id', sa.BIGINT(), nullable=False),
|
||||||
|
sa.Column('quest_clear_flag', sa.BOOLEAN(), server_default='0', nullable=False),
|
||||||
|
sa.ForeignKeyConstraint(['ex_bonus_table_id'], ['sao_static_ex_bonus.ExBonusTableId'], onupdate='cascade', ondelete='cascade'),
|
||||||
|
sa.ForeignKeyConstraint(['quest_scene_id'], ['sao_static_quest.QuestSceneId'], onupdate='cascade', ondelete='cascade'),
|
||||||
|
sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'),
|
||||||
|
sa.PrimaryKeyConstraint('id'),
|
||||||
|
sa.UniqueConstraint('user', 'quest_scene_id', 'ex_bonus_table_id', name='sao_player_ex_bonus_uk'),
|
||||||
|
mysql_charset='utf8mb4'
|
||||||
|
)
|
||||||
|
op.create_table('sao_player_hero_card',
|
||||||
|
sa.Column('id', sa.BIGINT(), nullable=False),
|
||||||
|
sa.Column('user', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('user_hero_id', sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column('holographic_flag', sa.BOOLEAN(), server_default='0', nullable=False),
|
||||||
|
sa.Column('serial', sa.VARCHAR(length=20), nullable=True),
|
||||||
|
sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'),
|
||||||
|
sa.ForeignKeyConstraint(['user_hero_id'], ['sao_hero_log_data.id'], onupdate='cascade', ondelete='cascade'),
|
||||||
|
sa.PrimaryKeyConstraint('id'),
|
||||||
|
sa.UniqueConstraint('serial'),
|
||||||
|
mysql_charset='utf8mb4'
|
||||||
|
)
|
||||||
|
op.alter_column('sao_end_sessions', 'play_date',
|
||||||
|
existing_type=mysql.TIMESTAMP(),
|
||||||
|
server_default=sa.text('now()'),
|
||||||
|
existing_nullable=False)
|
||||||
|
|
||||||
|
op.drop_table('sao_static_equipment_list')
|
||||||
|
op.create_table("sao_static_equipment_list",
|
||||||
|
sa.Column("EquipmentId", sa.BIGINT, primary_key=True, nullable=False),
|
||||||
|
sa.Column("EquipmentType", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("WeaponTypeId", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("Name", sa.VARCHAR(255), nullable=False),
|
||||||
|
sa.Column("Name_en", sa.VARCHAR(255)),
|
||||||
|
sa.Column("Rarity", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("Power", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("StrengthIncrement", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("SkillCondition", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("Property1PropertyId", sa.BIGINT, sa.ForeignKey("sao_static_property.PropertyId", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||||
|
sa.Column("Property1Value1", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("Property1Value2", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("Property2PropertyId", sa.BIGINT, sa.ForeignKey("sao_static_property.PropertyId", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||||
|
sa.Column("Property2Value1", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("Property2Value2", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("Property3PropertyId", sa.BIGINT, sa.ForeignKey("sao_static_property.PropertyId", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||||
|
sa.Column("Property3Value1", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("Property3Value2", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("Property4PropertyId", sa.BIGINT, sa.ForeignKey("sao_static_property.PropertyId", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||||
|
sa.Column("Property4Value1", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("Property4Value2", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("SalePrice", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("CompositionExp", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("AwakeningExp", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("FlavorText", sa.VARCHAR(255), nullable=False),
|
||||||
|
sa.Column("FlavorText_en", sa.VARCHAR(255)),
|
||||||
|
mysql_charset="utf8mb4"
|
||||||
|
)
|
||||||
|
|
||||||
|
op.drop_table('sao_static_hero_list')
|
||||||
|
op.create_table("sao_static_hero_list",
|
||||||
|
sa.Column("HeroLogId", sa.BIGINT, primary_key=True, nullable=False),
|
||||||
|
sa.Column("CharaId", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("Name", sa.VARCHAR(255), nullable=False),
|
||||||
|
sa.Column("Nickname", sa.VARCHAR(255), nullable=False),
|
||||||
|
sa.Column("Name_en", sa.VARCHAR(255)),
|
||||||
|
sa.Column("Nickname_en", sa.VARCHAR(255)),
|
||||||
|
sa.Column("Rarity", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("WeaponTypeId", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("HeroLogRoleId", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("CostumeTypeId", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("UnitId", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("DefaultEquipmentId1", sa.BIGINT, sa.ForeignKey("sao_static_equipment_list.EquipmentId", ondelete="cascade", onupdate="cascade")),
|
||||||
|
sa.Column("DefaultEquipmentId2", sa.BIGINT, sa.ForeignKey("sao_static_equipment_list.EquipmentId", ondelete="cascade", onupdate="cascade")),
|
||||||
|
sa.Column("SkillTableSubId", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("HpMin", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("HpMax", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("StrMin", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("StrMax", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("VitMin", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("VitMax", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("IntMin", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("IntMax", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("Property1PropertyId", sa.BIGINT, sa.ForeignKey("sao_static_property.PropertyId", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||||
|
sa.Column("Property1Value1", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("Property1Value2", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("Property2PropertyId", sa.BIGINT, sa.ForeignKey("sao_static_property.PropertyId", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||||
|
sa.Column("Property2Value1", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("Property2Value2", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("Property3PropertyId", sa.BIGINT, sa.ForeignKey("sao_static_property.PropertyId", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||||
|
sa.Column("Property3Value1", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("Property3Value2", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("Property4PropertyId", sa.BIGINT, sa.ForeignKey("sao_static_property.PropertyId", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||||
|
sa.Column("Property4Value1", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("Property4Value2", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("FlavorText", sa.VARCHAR(255), nullable=False),
|
||||||
|
sa.Column("FlavorText_en", sa.VARCHAR(255)),
|
||||||
|
sa.Column("SalePrice", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("CompositionExp", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("AwakeningExp", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("Slot4UnlockLevel", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("Slot5UnlockLevel", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("CollectionEmptyFrameDisplayFlag", sa.BOOLEAN, nullable=False),
|
||||||
|
mysql_charset="utf8mb4"
|
||||||
|
)
|
||||||
|
|
||||||
|
op.drop_table('sao_static_item_list')
|
||||||
|
op.create_table("sao_static_item_list",
|
||||||
|
sa.Column("ItemId", sa.INTEGER, nullable=False, primary_key=True),
|
||||||
|
sa.Column("ItemTypeId", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("Name", sa.VARCHAR(255), nullable=False),
|
||||||
|
sa.Column("Name_en", sa.VARCHAR(255)),
|
||||||
|
sa.Column("Rarity", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("Value", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("PropertyId", sa.BIGINT, sa.ForeignKey("sao_static_property.PropertyId", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||||
|
sa.Column("PropertyValue1Min", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("PropertyValue1Max", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("PropertyValue2Min", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("PropertyValue2Max", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("FlavorText", sa.VARCHAR(255), nullable=False),
|
||||||
|
sa.Column("FlavorText_en", sa.VARCHAR(255)),
|
||||||
|
sa.Column("SalePrice", sa.INTEGER, nullable=False),
|
||||||
|
sa.Column("ItemIcon", sa.VARCHAR(255), nullable=False),
|
||||||
|
mysql_charset="utf8mb4"
|
||||||
|
)
|
||||||
|
# ### end Alembic commands ###
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
op.drop_table('sao_static_item_list')
|
||||||
|
op.create_table("sao_static_item_list",
|
||||||
|
sa.Column("id", sa.Integer, primary_key=True, nullable=False),
|
||||||
|
sa.Column("version", sa.Integer),
|
||||||
|
sa.Column("itemId", sa.Integer),
|
||||||
|
sa.Column("itemTypeId", sa.Integer),
|
||||||
|
sa.Column("name", sa.String(255)),
|
||||||
|
sa.Column("rarity", sa.Integer),
|
||||||
|
sa.Column("flavorText", sa.String(255)),
|
||||||
|
sa.Column("enabled", sa.Boolean),
|
||||||
|
sa.UniqueConstraint(
|
||||||
|
"version", "itemId", name="sao_static_item_list_uk"
|
||||||
|
),
|
||||||
|
mysql_charset="utf8mb4"
|
||||||
|
)
|
||||||
|
|
||||||
|
op.drop_table('sao_static_hero_list')
|
||||||
|
op.create_table("sao_static_hero_list",
|
||||||
|
sa.Column("id", sa.Integer, primary_key=True, nullable=False),
|
||||||
|
sa.Column("version", sa.Integer),
|
||||||
|
sa.Column("heroLogId", sa.Integer),
|
||||||
|
sa.Column("name", sa.String(255)),
|
||||||
|
sa.Column("nickname", sa.String(255)),
|
||||||
|
sa.Column("rarity", sa.Integer),
|
||||||
|
sa.Column("skillTableSubId", sa.Integer),
|
||||||
|
sa.Column("awakeningExp", sa.Integer),
|
||||||
|
sa.Column("flavorText", sa.String(255)),
|
||||||
|
sa.Column("enabled", sa.Boolean),
|
||||||
|
sa.UniqueConstraint(
|
||||||
|
"version", "heroLogId", name="sao_static_hero_list_uk"
|
||||||
|
),
|
||||||
|
mysql_charset="utf8mb4",
|
||||||
|
)
|
||||||
|
|
||||||
|
op.drop_table('sao_static_equipment_list')
|
||||||
|
op.create_table("sao_static_equipment_list",
|
||||||
|
sa.Column("id", sa.Integer, primary_key=True, nullable=False),
|
||||||
|
sa.Column("version", sa.Integer),
|
||||||
|
sa.Column("equipmentId", sa.Integer),
|
||||||
|
sa.Column("equipmentType", sa.Integer),
|
||||||
|
sa.Column("weaponTypeId", sa.Integer),
|
||||||
|
sa.Column("name", sa.String(255)),
|
||||||
|
sa.Column("rarity", sa.Integer),
|
||||||
|
sa.Column("flavorText", sa.String(255)),
|
||||||
|
sa.Column("enabled", sa.Boolean),
|
||||||
|
sa.UniqueConstraint(
|
||||||
|
"version", "equipmentId", name="sao_static_equipment_list_uk"
|
||||||
|
),
|
||||||
|
mysql_charset="utf8mb4"
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
op.alter_column('sao_end_sessions', 'play_date',
|
||||||
|
existing_type=mysql.TIMESTAMP(),
|
||||||
|
server_default=sa.text('CURRENT_TIMESTAMP'),
|
||||||
|
existing_nullable=False)
|
||||||
|
op.drop_table('sao_player_hero_card')
|
||||||
|
op.drop_table('sao_player_ex_bonus')
|
||||||
|
op.drop_table('sao_static_tower')
|
||||||
|
op.drop_table('sao_static_skill_table')
|
||||||
|
op.drop_table('sao_static_side_quest')
|
||||||
|
op.drop_table('sao_static_ex_tower')
|
||||||
|
op.drop_table('sao_static_ex_bonus')
|
||||||
|
op.drop_table('sao_static_episode')
|
||||||
|
op.drop_table('sao_player_tutorial')
|
||||||
|
op.drop_table('sao_player_resource_card')
|
||||||
|
op.drop_table('sao_player_beginner_mission')
|
||||||
|
op.drop_table('sao_static_trace_table')
|
||||||
|
op.drop_table('sao_static_skill')
|
||||||
|
op.drop_table('sao_static_reward')
|
||||||
|
op.drop_table('sao_static_property')
|
||||||
|
op.drop_table('sao_static_quest')
|
||||||
|
op.create_table('sao_static_quest',
|
||||||
|
sa.Column('id', mysql.INTEGER(), autoincrement=True, nullable=False),
|
||||||
|
sa.Column('enabled', mysql.TINYINT(display_width=1), autoincrement=False, nullable=True),
|
||||||
|
sa.Column('version', mysql.INTEGER(), autoincrement=False, nullable=True),
|
||||||
|
sa.Column('questSceneId', mysql.INTEGER(), autoincrement=False, nullable=True),
|
||||||
|
sa.Column('sortNo', mysql.INTEGER(), autoincrement=False, nullable=True),
|
||||||
|
sa.Column('name', mysql.VARCHAR(charset='utf8mb4', collation='utf8mb4_general_ci', length=255), nullable=True),
|
||||||
|
sa.PrimaryKeyConstraint('id'),
|
||||||
|
sa.UniqueConstraint("version", "questSceneId", name="sao_static_quest_uk"),
|
||||||
|
mysql_charset='utf8mb4'
|
||||||
|
)
|
||||||
|
# ### end Alembic commands ###
|
@ -25,6 +25,9 @@ aime_card = Table(
|
|||||||
|
|
||||||
|
|
||||||
class CardData(BaseData):
|
class CardData(BaseData):
|
||||||
|
moble_os_codes = set([0x06, 0x07, 0x10, 0x12, 0x13, 0x14, 0x15, 0x17, 0x18])
|
||||||
|
card_os_codes = set([0x20, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7])
|
||||||
|
|
||||||
async def get_card_by_access_code(self, access_code: str) -> Optional[Row]:
|
async def get_card_by_access_code(self, access_code: str) -> Optional[Row]:
|
||||||
sql = aime_card.select(aime_card.c.access_code == access_code)
|
sql = aime_card.select(aime_card.c.access_code == access_code)
|
||||||
|
|
||||||
@ -140,6 +143,11 @@ class CardData(BaseData):
|
|||||||
if not result:
|
if not result:
|
||||||
self.logger.error(f"Failed to update IDm to {idm} for {access_code}")
|
self.logger.error(f"Failed to update IDm to {idm} for {access_code}")
|
||||||
|
|
||||||
|
async def set_access_code_by_access_code(self, old_ac: str, new_ac: str) -> None:
|
||||||
|
result = await self.execute(aime_card.update(aime_card.c.access_code == old_ac).values(access_code=new_ac))
|
||||||
|
if not result:
|
||||||
|
self.logger.error(f"Failed to change card access code from {old_ac} to {new_ac}")
|
||||||
|
|
||||||
def to_access_code(self, luid: str) -> str:
|
def to_access_code(self, luid: str) -> str:
|
||||||
"""
|
"""
|
||||||
Given a felica cards internal 16 hex character luid, convert it to a 0-padded 20 digit access code as a string
|
Given a felica cards internal 16 hex character luid, convert it to a 0-padded 20 digit access code as a string
|
||||||
|
@ -1,129 +0,0 @@
|
|||||||
# ARTEMiS - Ubuntu 20.04 LTS Guide
|
|
||||||
This step-by-step guide assumes that you are using a fresh install of Ubuntu 20.04 LTS, some of the steps can be skipped if you already have an installation with MySQL 5.7 or even some of the modules already present on your environment
|
|
||||||
|
|
||||||
# Setup
|
|
||||||
## Install memcached module
|
|
||||||
1. sudo apt-get install memcached
|
|
||||||
2. Under the file /etc/memcached.conf, please make sure the following parameters are set:
|
|
||||||
|
|
||||||
```
|
|
||||||
# Start with a cap of 64 megs of memory. It's reasonable, and the daemon default
|
|
||||||
# Note that the daemon will grow to this size, but does not start out holding this much
|
|
||||||
# memory
|
|
||||||
|
|
||||||
-I 128m
|
|
||||||
-m 1024
|
|
||||||
```
|
|
||||||
|
|
||||||
** This is mandatory to avoid memcached overload caused by Crossbeats or by massive profiles
|
|
||||||
|
|
||||||
3. Restart memcached using: sudo systemctl restart memcached
|
|
||||||
|
|
||||||
## Install MySQL 5.7
|
|
||||||
```
|
|
||||||
sudo apt update
|
|
||||||
sudo apt install wget -y
|
|
||||||
wget https://dev.mysql.com/get/mysql-apt-config_0.8.12-1_all.deb
|
|
||||||
sudo dpkg -i mysql-apt-config_0.8.12-1_all.deb
|
|
||||||
```
|
|
||||||
1. During the first prompt, select Ubuntu Bionic
|
|
||||||
2. Select the default option
|
|
||||||
3. Select MySQL 5.7
|
|
||||||
4. Select the last option
|
|
||||||
```
|
|
||||||
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-cache policy mysql-server
|
|
||||||
sudo apt install -f mysql-client=5.7* mysql-community-server=5.7* mysql-server=5.7*
|
|
||||||
```
|
|
||||||
|
|
||||||
## Default Configuration for MySQL Server
|
|
||||||
1. sudo mysql_secure_installation
|
|
||||||
> Make sure to follow the steps that will be prompted such as changing the mysql root password and such
|
|
||||||
|
|
||||||
2. Test your MySQL Server login by doing the following command :
|
|
||||||
> mysql -u root -p
|
|
||||||
|
|
||||||
## Create the default ARTEMiS database and user
|
|
||||||
1. mysql -u root -p
|
|
||||||
2. Please change the password indicated in the next line for a custom secure one and continue with the next commands
|
|
||||||
|
|
||||||
```
|
|
||||||
CREATE USER 'aime'@'localhost' IDENTIFIED BY 'MyStrongPass.';
|
|
||||||
CREATE DATABASE aime;
|
|
||||||
GRANT Alter,Create,Delete,Drop,Index,Insert,References,Select,Update ON aime.* TO 'aime'@'localhost';
|
|
||||||
FLUSH PRIVILEGES;
|
|
||||||
exit;
|
|
||||||
```
|
|
||||||
|
|
||||||
3. sudo systemctl restart mysql
|
|
||||||
|
|
||||||
## Install Python modules
|
|
||||||
```
|
|
||||||
sudo apt-get install python3-dev default-libmysqlclient-dev build-essential mysql-client libmysqlclient-dev libmemcached-dev
|
|
||||||
sudo apt install libpython3.8-dev
|
|
||||||
sudo apt-get install python3-software-properties
|
|
||||||
sudo apt install python3-pip
|
|
||||||
sudo pip3 install --upgrade pip testresources
|
|
||||||
sudo pip3 install --upgrade pip setuptools
|
|
||||||
sudo apt-get install python3-tk
|
|
||||||
```
|
|
||||||
7. Change your work path to the ARTEMiS root folder using 'cd' and install the requirements:
|
|
||||||
> sudo python3 -m pip install -r requirements.txt
|
|
||||||
|
|
||||||
## Copy/Rename the folder example_config to config
|
|
||||||
|
|
||||||
## Adjust /config/core.yaml
|
|
||||||
1. Make sure to change the server listen_address to be set to your local machine IP (ex.: 192.168.1.xxx)
|
|
||||||
2. Adjust the proper MySQL information you created earlier
|
|
||||||
3. Add the AimeDB key at the bottom of the file
|
|
||||||
|
|
||||||
## Create the database tables for ARTEMiS
|
|
||||||
1. sudo python3 dbutils.py create
|
|
||||||
|
|
||||||
2. If you get "No module named Crypto", run the following command:
|
|
||||||
```
|
|
||||||
sudo pip uninstall crypto
|
|
||||||
sudo pip uninstall pycrypto
|
|
||||||
sudo pip install pycrypto
|
|
||||||
```
|
|
||||||
|
|
||||||
## Firewall Adjustements
|
|
||||||
```
|
|
||||||
sudo ufw allow 80
|
|
||||||
sudo ufw allow 443
|
|
||||||
sudo ufw allow 8443
|
|
||||||
sudo ufw allow 22345
|
|
||||||
sudo ufw allow 8090
|
|
||||||
sudo ufw allow 8444
|
|
||||||
sudo ufw allow 8080
|
|
||||||
```
|
|
||||||
|
|
||||||
## Running the ARTEMiS instance
|
|
||||||
1. sudo python3 index.py
|
|
||||||
|
|
||||||
# Troubleshooting
|
|
||||||
|
|
||||||
## Game does not connect to ARTEMiS Allnet server
|
|
||||||
1. Double-check your core.yaml, the listen_address is most likely either not binded to the proper IP or the port is not opened
|
|
||||||
|
|
||||||
## Game does not connect to Title Server
|
|
||||||
1. Verify that your core.yaml is setup properly for both the server listen_address and title hostname
|
|
||||||
2. Boot your game and verify that an AllNet response does show and if it does, attempt to open the URI that is shown under a browser such as Edge, Chrome & Firefox.
|
|
||||||
3. If a page is shown, the server is working properly and if it doesn't, double check your port forwarding and also that you have entered the proper local IP under the Title hostname in core.yaml.
|
|
||||||
|
|
||||||
## Unhandled command under AimeDB
|
|
||||||
1. Double check your AimeDB key under core.yaml, it is incorrect.
|
|
||||||
|
|
||||||
## Memcache failed, error 3
|
|
||||||
1. Make sure memcached is properly installed and running. You can check the status of the service using the following command:
|
|
||||||
> sudo systemctl status memcached
|
|
||||||
2. If it is failing, double check the /etc/memcached.conf file, it may have duplicated arguments like the -I and -m
|
|
||||||
3. If it is still not working afterward, you can proceed with a workaround by manually editing the /core/data/cache.py file.
|
|
||||||
```
|
|
||||||
# Make memcache optional
|
|
||||||
try:
|
|
||||||
has_mc = False
|
|
||||||
except ModuleNotFoundError:
|
|
||||||
has_mc = False
|
|
||||||
```
|
|
@ -59,7 +59,7 @@ GRANT Alter,Create,Delete,Drop,Index,Insert,References,Select,Update ON aime.* T
|
|||||||
- Put the password you created for the aime user into the `database` section.
|
- Put the password you created for the aime user into the `database` section.
|
||||||
- Put in the aimedb key (YOU DO NOT GENERATE THIS KEY, FIND IT SOMEWHERE).
|
- Put in the aimedb key (YOU DO NOT GENERATE THIS KEY, FIND IT SOMEWHERE).
|
||||||
- Set your hostname to be whatever hostname or IP address games can reach your server at (many games reject localhost and 127.0.0.1).
|
- Set your hostname to be whatever hostname or IP address games can reach your server at (many games reject localhost and 127.0.0.1).
|
||||||
- Optional: generate base64-encoded secrets for aimedb and frontend.
|
- Optional: generate base64-encoded secrets for aimedb and frontend using something like `openssl rand -base64 64`. It is advised to make all secrets different.
|
||||||
- See [config.md](docs/config.md) for a full list of options.
|
- See [config.md](docs/config.md) for a full list of options.
|
||||||
- edit `idz.yaml`
|
- edit `idz.yaml`
|
||||||
- If you don't plan on anyone using your server to play Initial D Zero, it is best to disable it to cut down on console spam on boot.
|
- If you don't plan on anyone using your server to play Initial D Zero, it is best to disable it to cut down on console spam on boot.
|
||||||
|
@ -1,102 +0,0 @@
|
|||||||
# ARTEMiS - Windows 10/11 Guide
|
|
||||||
This step-by-step guide assumes that you are using a fresh install of Windows 10/11 without MySQL installed, some of the steps can be skipped if you already have an installation with MySQL 8.0 or even some of the modules already present on your environment
|
|
||||||
|
|
||||||
# Setup
|
|
||||||
## Install Python Python 3.9 (recommended) or 3.10
|
|
||||||
1. Download Python 3.9 : [Link](https://www.python.org/ftp/python/3.9.13/python-3.9.13-amd64.exe)
|
|
||||||
2. Install python-3.9.13-amd64.exe
|
|
||||||
1. Select Customize installation
|
|
||||||
2. Make sure that pip, tcl/tk, and the for all users are checked and hit Next
|
|
||||||
3. Make sure that you enable "Create shortcuts for installed applications" and "Add Python to environment variables" and hit Install
|
|
||||||
|
|
||||||
## Install MySQL 8.0
|
|
||||||
1. Download MySQL 8.0 Server : [Link](https://dev.mysql.com/get/Downloads/MySQLInstaller/mysql-installer-community-8.0.34.0.msi)
|
|
||||||
2. Install mysql-installer-web-community-8.0.34.0.msi
|
|
||||||
1. Click on "Add ..." on the side
|
|
||||||
2. Click on the "+" next to MySQL Servers
|
|
||||||
3. Make sure MySQL Server 8.0.34 - X64 is under the products to be installed.
|
|
||||||
4. Hit Next and Next once installed
|
|
||||||
5. Select the configuration type "Development Computer"
|
|
||||||
6. Hit Next
|
|
||||||
7. Select "Use Legacy Authentication Method (Retain MySQL 5.x compatibility)" and hit Next
|
|
||||||
8. Enter a root password and then hit Next >
|
|
||||||
9. Leave everything under Windows Service as default and hit Next >
|
|
||||||
10. Click on Execute and for it to finish and hit Next> and then Finish
|
|
||||||
3. Open MySQL 8.0 Command Line Client and login as your root user
|
|
||||||
4. Change `<Enter Password Here>` to a new password for the user aime, type those commands to create your user and the database
|
|
||||||
|
|
||||||
```sql
|
|
||||||
CREATE USER 'aime'@'localhost' IDENTIFIED BY '<Enter Password Here>';
|
|
||||||
CREATE DATABASE aime;
|
|
||||||
GRANT Alter,Create,Delete,Drop,Index,Insert,References,Select,Update ON aime.* TO 'aime'@'localhost';
|
|
||||||
FLUSH PRIVILEGES;
|
|
||||||
exit;
|
|
||||||
```
|
|
||||||
|
|
||||||
## Install Python modules
|
|
||||||
1. Change your work path to the artemis-master folder using 'cd' and install the requirements:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
pip install -r requirements.txt
|
|
||||||
```
|
|
||||||
|
|
||||||
## Copy/Rename the folder `example_config` to `config`
|
|
||||||
|
|
||||||
## Adjust `config/core.yaml`
|
|
||||||
|
|
||||||
1. Make sure to change the server `hostname` to be set to your local machine IP (ex.: 192.168.xxx.xxx)
|
|
||||||
- In case you want to run this only locally, set the following values:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
server:
|
|
||||||
listen_address: 0.0.0.0
|
|
||||||
title:
|
|
||||||
hostname: 192.168.xxx.xxx
|
|
||||||
```
|
|
||||||
|
|
||||||
1. Adjust the proper MySQL information you created earlier
|
|
||||||
```yaml
|
|
||||||
database:
|
|
||||||
host: "localhost"
|
|
||||||
username: "aime"
|
|
||||||
password: "<Enter Password Here>"
|
|
||||||
name: "aime"
|
|
||||||
```
|
|
||||||
3. Add the AimeDB key at the bottom of the file
|
|
||||||
4. If the webui is needed, change the flag from False to True
|
|
||||||
|
|
||||||
## Create the database tables for ARTEMiS
|
|
||||||
|
|
||||||
```shell
|
|
||||||
python dbutils.py create
|
|
||||||
```
|
|
||||||
|
|
||||||
## Firewall Adjustements
|
|
||||||
Make sure the following ports are open both on your router and local Windows firewall in case you want to use this for public use (NOT recommended):
|
|
||||||
> Port 80 (TCP), 443 (TCP), 8443 (TCP), 22345 (TCP), 8080 (TCP), 8090 (TCP) **webui, 8444 (TCP) **mucha
|
|
||||||
|
|
||||||
## Running the ARTEMiS instance
|
|
||||||
```shell
|
|
||||||
python index.py
|
|
||||||
```
|
|
||||||
|
|
||||||
# Troubleshooting
|
|
||||||
|
|
||||||
## Game does not connect to ARTEMiS Allnet server
|
|
||||||
1. Double-check your core.yaml, the listen_address is most likely either not binded to the proper IP or the port is not opened
|
|
||||||
|
|
||||||
## Game does not connect to Title Server
|
|
||||||
1. Verify that your core.yaml is setup properly for both the server listen_address and title hostname
|
|
||||||
2. Boot your game and verify that an AllNet response does show and if it does, attempt to open the URI that is shown under a browser such as Edge, Chrome & Firefox.
|
|
||||||
3. If a page is shown, the server is working properly and if it doesn't, double check your port forwarding and also that you have entered the proper local IP under the Title hostname in core.yaml.
|
|
||||||
|
|
||||||
## Unhandled command under AimeDB
|
|
||||||
1. Double check your AimeDB key under core.yaml, it is incorrect.
|
|
||||||
|
|
||||||
## AttributeError: module 'collections' has no attribute 'Hashable'
|
|
||||||
1. This means the pyYAML module is obsolete, simply rerun pip with the -U (force update) flag, as shown below.
|
|
||||||
- Change your work path to the artemis-master (or artemis-develop) folder using 'cd' and run the following commands:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
pip install -r requirements.txt -U
|
|
||||||
```
|
|
@ -17,8 +17,8 @@
|
|||||||
- `strict_ip_checking`: Rejects clients if there is no IP in the `arcade` table for the respective arcade. Default `False`
|
- `strict_ip_checking`: Rejects clients if there is no IP in the `arcade` table for the respective arcade. Default `False`
|
||||||
## Title
|
## Title
|
||||||
- `loglevel`: Logging level for the title server. Default `info`
|
- `loglevel`: Logging level for the title server. Default `info`
|
||||||
- `reboot_start_time`: 24 hour JST time that clients will see as the start of maintenance period, ex `04:00`. Leave blank for no maintenance time. Default: `""`
|
- `reboot_start_time`: 24 hour JST time that clients will see as the start of maintenance period, ex `04:00`. A few games or early version will report errors if it is empty, ex maimai DX 1.00
|
||||||
- `reboot_end_time`: 24 hour JST time that clients will see as the end of maintenance period, ex `05:00`. Leave blank for no maintenance time. Default: `""`
|
- `reboot_end_time`: 24 hour JST time that clients will see as the end of maintenance period, ex `07:00`. this must be set to 7:00 am for some game, please do not change it.
|
||||||
## Database
|
## Database
|
||||||
- `host`: Host of the database. Default `localhost`
|
- `host`: Host of the database. Default `localhost`
|
||||||
- `username`: Username of the account the server should connect to the database with. Default `aime`
|
- `username`: Username of the account the server should connect to the database with. Default `aime`
|
||||||
|
34
docs/migrating.md
Normal file
34
docs/migrating.md
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# Migrating from an older build of ARTEMiS
|
||||||
|
If you haven't updated artemis in a while, you may find that configuration options have moved, been renamed, or no longer exist. This document exists to help migrate from legacy versions of artemis to newer builds.
|
||||||
|
|
||||||
|
## Dependancies
|
||||||
|
Make sure your dependiences are up to date with what's required to run artemis. A simple `pip install -r requirements.txt` will get you up to date.
|
||||||
|
|
||||||
|
## Database
|
||||||
|
Database migration is required if you are using a version of artemis that still uses the old custom-rolled database versioning system (raw SQL scripts). Artemis now uses alembic to manage database versioning, and you will need to move to this new system.
|
||||||
|
|
||||||
|
**BEFORE DOING ANY DATABASE WORK, ALWAYS MAKE SURE YOU HAVE FUNCTIONAL, UP-TO-DATE BACKUPS!!**
|
||||||
|
|
||||||
|
For almost all situations, simply running `python dbutils.py migrate` will do the job. This will upgrade you to the latest version of the old system, move you over to alembic, then upgrade you to the newest alembic version. If you encounter any errors or data loss, you should report this as a bug to our issue tracker.
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
Configuration management is the sewage cleaning of the sysadmin world. It sucks and nobody likes to do it, but it needs to be done or everyone ends up in deep shit. This section will walk through what configuration options have changed, and how to set them properly.
|
||||||
|
|
||||||
|
### core.yaml
|
||||||
|
`title`->`hostname` is now `server`->`hostname`. This hostname is what gets sent to clients in response to auth requests, so it should be both accessable from whereever the client is, and point properly to the title server.
|
||||||
|
|
||||||
|
With the move to starlette and uvicorn, different services now run as seperate USGI applications. `billing`->`standalone` and `allnet`->`standalone` are flags that determine weather the service runs as a stand-alone service, on it's own seperate port, or as a part of the whole application. For example, setting `billing`->`standalone` to `True` will cause a seperate instance of the billing server to spin up listening on 8443 with SSL using the certs listed in the config file. Setting it to `False` will just allow the main server to also serve `/request/` and assumes that something is standing in front of it proxying 8443 SSL to whatever `server`->`port` is set to.
|
||||||
|
|
||||||
|
Beforehand, if `server`->`is_develop` was `False`, the server assumed that there was a proxy standing in front of it, proxying requests to proper channels. This was, in hindsight, a very dumb assumption. Now, `server`->`is_using_proxy` is what flags the server as having nginx or another proxy in front of it. The effects of setting this to true are somewhat game-dependant, but generally artemis will use the port listed in `server`->`proxy_port` (and `server`->`proxy_port_ssl` for SSL connections, as defined by the games) instead of `server`->`port`. If set to 0, `server`->`proxy_port` will default to what `server`->`port` (and `server`->`proxy_port_ssl` will default to 443) make sure to set them accordingly. Note that some title servers have their own needs and specify their own specific ports. Refer to [game_specific_info.md](docs/game_specific_info.md) for more infomation. (For example, pokken requires SSL using an older, weaker certificate, and always requires the port to be sent even if it's port 443)
|
||||||
|
|
||||||
|
`index.py`'s args have changed. You can now override what port the title server listens on with `-p` and tell the server to use ssl with `-s`.
|
||||||
|
|
||||||
|
Rather then having a `standalone` config variable, the frontend is a seperate wsgi app entirely. Having `enable` be `True` will launch it on the port specified in the config file. Otherwise, the fontend will not run.
|
||||||
|
|
||||||
|
`title`->`reboot_start_time`/`reboot_end_time` allow you to specify when the games should be told network maintanence is happening. It's exact implementation depends on the game. Do note that many games will beave unexpectly if `reboot_end_time` is not `07:00`.
|
||||||
|
|
||||||
|
If you wish to make use of aimedb's SegaAuthId system to better protect the few title servers that actually use it, set `aimedb`->`id_secret` to base64-encoded random bytes (32 is a good length) using something like `openssl rand -base64 64`. If you intend to use the frontend, the same thing must be done for `frontend`->`secret` or you won't be able to log in.
|
||||||
|
|
||||||
|
`mucha`'s only option is now just log level.
|
||||||
|
|
||||||
|
`aimedb` now has it's own `listen_address` field, in case you want to proxy everything but aimedb, so it can still listen on `0.0.0.0` instead of `127.0.0.1`.
|
@ -18,7 +18,7 @@ server:
|
|||||||
title:
|
title:
|
||||||
loglevel: "info"
|
loglevel: "info"
|
||||||
reboot_start_time: "04:00"
|
reboot_start_time: "04:00"
|
||||||
reboot_end_time: "05:00"
|
reboot_end_time: "07:00" # this must be set to 7:00 am for some game, please do not change it
|
||||||
|
|
||||||
database:
|
database:
|
||||||
host: "localhost"
|
host: "localhost"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
server:
|
server:
|
||||||
enable: True
|
enable: True
|
||||||
loglevel: "info"
|
loglevel: "info"
|
||||||
use:https: True
|
use_https: True
|
@ -2,12 +2,19 @@ server:
|
|||||||
enable: True
|
enable: True
|
||||||
loglevel: "info"
|
loglevel: "info"
|
||||||
auto_register: True
|
auto_register: True
|
||||||
|
photon_app_id: "7df3a2f6-d69d-4073-aafe-810ee61e1cea"
|
||||||
|
data_version: 1
|
||||||
|
game_version: 33
|
||||||
|
|
||||||
crypt:
|
crypt:
|
||||||
enable: False
|
enable: False
|
||||||
key: ""
|
key: ""
|
||||||
iv: ""
|
|
||||||
|
|
||||||
hash:
|
hash:
|
||||||
verify_hash: False
|
verify_hash: False
|
||||||
hash_base: ""
|
hash_base: ""
|
||||||
|
|
||||||
|
card:
|
||||||
|
enable: True
|
||||||
|
crypt_password: ""
|
||||||
|
crypt_salt: ""
|
||||||
|
@ -49,11 +49,12 @@ class ChuniConstants:
|
|||||||
|
|
||||||
|
|
||||||
class MapAreaConditionType(Enum):
|
class MapAreaConditionType(Enum):
|
||||||
UNLOCKED = "0"
|
UNLOCKED = 0
|
||||||
MAP_AREA_CLEARED = "2"
|
MAP_CLEARED = 1
|
||||||
TROPHY_OBTAINED = "3"
|
MAP_AREA_CLEARED = 2
|
||||||
|
TROPHY_OBTAINED = 3
|
||||||
|
|
||||||
|
|
||||||
class MapAreaConditionLogicalOperator(Enum):
|
class MapAreaConditionLogicalOperator(Enum):
|
||||||
OR = "0"
|
AND = 1
|
||||||
AND = "1"
|
OR = 2
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
|
from datetime import timedelta
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
|
|
||||||
from core.config import CoreConfig
|
from core.config import CoreConfig
|
||||||
from titles.chuni.sunplus import ChuniSunPlus
|
from titles.chuni.sunplus import ChuniSunPlus
|
||||||
from titles.chuni.const import ChuniConstants, MapAreaConditionLogicalOperator, MapAreaConditionType
|
from titles.chuni.const import ChuniConstants, MapAreaConditionLogicalOperator, MapAreaConditionType
|
||||||
from titles.chuni.config import ChuniConfig
|
from titles.chuni.config import ChuniConfig
|
||||||
|
|
||||||
|
|
||||||
@ -69,176 +70,229 @@ class ChuniLuminous(ChuniSunPlus):
|
|||||||
|
|
||||||
async def handle_get_game_map_area_condition_api_request(self, data: Dict) -> Dict:
|
async def handle_get_game_map_area_condition_api_request(self, data: Dict) -> Dict:
|
||||||
# There is no game data for this, everything is server side.
|
# There is no game data for this, everything is server side.
|
||||||
# TODO: Figure out conditions for 1UM1N0US ep.111
|
# However, we can selectively show/hide events as data is imported into the server.
|
||||||
return {
|
events = await self.data.static.get_enabled_events(self.version)
|
||||||
"length": "7",
|
event_by_id = {evt["eventId"]: evt for evt in events}
|
||||||
"gameMapAreaConditionList": [
|
conditions = []
|
||||||
# Secret AREA: MUSIC GAME
|
|
||||||
|
# The Mystic Rainbow of LUMINOUS map unlocks when any mainline LUMINOUS area
|
||||||
|
# (ep. I, ep. II, ep. III) are completed.
|
||||||
|
mystic_area_1_conditions = {
|
||||||
|
"mapAreaId": 3229301, # Mystic Rainbow of LUMINOUS Area 1
|
||||||
|
"length": 0,
|
||||||
|
"mapAreaConditionList": [],
|
||||||
|
}
|
||||||
|
mystic_area_1_added = False
|
||||||
|
|
||||||
|
# Secret AREA: MUSIC GAME
|
||||||
|
if 14029 in event_by_id:
|
||||||
|
start_date = event_by_id[14029]["startDate"].strftime(self.date_time_format)
|
||||||
|
mission_in_progress_end_date = "2099-12-31 00:00:00.0"
|
||||||
|
|
||||||
|
# The "MISSION in progress" trophy required to trigger the secret area
|
||||||
|
# is only available in the first CHUNITHM mission. If the second mission
|
||||||
|
# (event ID 14214) was imported into ARTEMiS, we disable the requirement
|
||||||
|
# for this trophy.
|
||||||
|
if 14214 in event_by_id:
|
||||||
|
mission_in_progress_end_date = (event_by_id[14214]["startDate"] - timedelta(hours=2)).strftime(self.date_time_format)
|
||||||
|
|
||||||
|
conditions.extend([
|
||||||
{
|
{
|
||||||
"mapAreaId": "2206201", # BlythE ULTIMA
|
"mapAreaId": 2206201, # BlythE ULTIMA
|
||||||
"length": "1",
|
"length": 1,
|
||||||
# Obtain the trophy "MISSION in progress", which is only available
|
# Obtain the trophy "MISSION in progress".
|
||||||
# when running the first CHUNITHM mission
|
|
||||||
"mapAreaConditionList": [
|
"mapAreaConditionList": [
|
||||||
{
|
{
|
||||||
"type": MapAreaConditionType.TROPHY_OBTAINED.value,
|
"type": MapAreaConditionType.TROPHY_OBTAINED.value,
|
||||||
"conditionId": "6832",
|
"conditionId": 6832,
|
||||||
"logicalOpe": MapAreaConditionLogicalOperator.AND.value,
|
"logicalOpe": MapAreaConditionLogicalOperator.AND.value,
|
||||||
"startDate": "2023-12-14 07:00:00.0",
|
"startDate": start_date,
|
||||||
"endDate": "2024-01-25 02:00:00.0",
|
"endDate": mission_in_progress_end_date,
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"mapAreaId": "2206202", # PRIVATE SERVICE ULTIMA
|
"mapAreaId": 2206202, # PRIVATE SERVICE ULTIMA
|
||||||
"length": "1",
|
"length": 1,
|
||||||
# Obtain the trophy "MISSION in progress", which is only available
|
# Obtain the trophy "MISSION in progress".
|
||||||
# when running the first CHUNITHM mission
|
|
||||||
"mapAreaConditionList": [
|
"mapAreaConditionList": [
|
||||||
{
|
{
|
||||||
"type": MapAreaConditionType.TROPHY_OBTAINED.value,
|
"type": MapAreaConditionType.TROPHY_OBTAINED.value,
|
||||||
"conditionId": "6832",
|
"conditionId": 6832,
|
||||||
"logicalOpe": MapAreaConditionLogicalOperator.AND.value,
|
"logicalOpe": MapAreaConditionLogicalOperator.AND.value,
|
||||||
"startDate": "2023-12-14 07:00:00.0",
|
"startDate": start_date,
|
||||||
"endDate": "2024-01-25 02:00:00.0",
|
"endDate": mission_in_progress_end_date,
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"mapAreaId": "2206203", # New York Back Raise
|
"mapAreaId": 2206203, # New York Back Raise
|
||||||
"length": "1",
|
"length": 1,
|
||||||
# SS NightTheater's EXPERT chart and get the title
|
# SS NightTheater's EXPERT chart and get the title
|
||||||
# "今宵、劇場に映し出される景色とは――――。"
|
# "今宵、劇場に映し出される景色とは――――。"
|
||||||
"mapAreaConditionList": [
|
"mapAreaConditionList": [
|
||||||
{
|
{
|
||||||
"type": MapAreaConditionType.TROPHY_OBTAINED.value,
|
"type": MapAreaConditionType.TROPHY_OBTAINED.value,
|
||||||
"conditionId": "6833",
|
"conditionId": 6833,
|
||||||
"logicalOpe": MapAreaConditionLogicalOperator.AND.value,
|
"logicalOpe": MapAreaConditionLogicalOperator.AND.value,
|
||||||
"startDate": "2023-12-14 07:00:00.0",
|
"startDate": start_date,
|
||||||
"endDate": "2099-12-31 00:00:00.0",
|
"endDate": "2099-12-31 00:00:00.0",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"mapAreaId": "2206204", # Spasmodic
|
"mapAreaId": 2206204, # Spasmodic
|
||||||
"length": "2",
|
"length": 2,
|
||||||
# - Get 1 miss on Random (any difficulty) and get the title "当たり待ち"
|
# - Get 1 miss on Random (any difficulty) and get the title "当たり待ち"
|
||||||
# - Get 1 miss on 花たちに希望を (any difficulty) and get the title "花たちに希望を"
|
# - Get 1 miss on 花たちに希望を (any difficulty) and get the title "花たちに希望を"
|
||||||
"mapAreaConditionList": [
|
"mapAreaConditionList": [
|
||||||
{
|
{
|
||||||
"type": MapAreaConditionType.TROPHY_OBTAINED.value,
|
"type": MapAreaConditionType.TROPHY_OBTAINED.value,
|
||||||
"conditionId": "6834",
|
"conditionId": 6834,
|
||||||
"logicalOpe": MapAreaConditionLogicalOperator.AND.value,
|
"logicalOpe": MapAreaConditionLogicalOperator.AND.value,
|
||||||
"startDate": "2023-12-14 07:00:00.0",
|
"startDate": start_date,
|
||||||
"endDate": "2099-12-31 00:00:00.0",
|
"endDate": "2099-12-31 00:00:00.0",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": MapAreaConditionType.TROPHY_OBTAINED.value,
|
"type": MapAreaConditionType.TROPHY_OBTAINED.value,
|
||||||
"conditionId": "6835",
|
"conditionId": 6835,
|
||||||
"logicalOpe": MapAreaConditionLogicalOperator.AND.value,
|
"logicalOpe": MapAreaConditionLogicalOperator.AND.value,
|
||||||
"startDate": "2023-12-14 07:00:00.0",
|
"startDate": start_date,
|
||||||
"endDate": "2099-12-31 00:00:00.0",
|
"endDate": "2099-12-31 00:00:00.0",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"mapAreaId": "2206205", # ΩΩPARTS
|
"mapAreaId": 2206205, # ΩΩPARTS
|
||||||
"length": "2",
|
"length": 2,
|
||||||
# - S Sage EXPERT to get the title "マターリ進行キボンヌ"
|
# - S Sage EXPERT to get the title "マターリ進行キボンヌ"
|
||||||
# - Equip this title and play cab-to-cab with another person with this title
|
# - Equip this title and play cab-to-cab with another person with this title
|
||||||
# to get "マターリしようよ"
|
# to get "マターリしようよ". Disabled because it is difficult to play cab2cab
|
||||||
|
# on data setups. A network operator may consider re-enabling it by uncommenting
|
||||||
|
# the second condition.
|
||||||
"mapAreaConditionList": [
|
"mapAreaConditionList": [
|
||||||
{
|
{
|
||||||
"type": MapAreaConditionType.TROPHY_OBTAINED.value,
|
"type": MapAreaConditionType.TROPHY_OBTAINED.value,
|
||||||
"conditionId": "6836",
|
"conditionId": 6836,
|
||||||
"logicalOpe": MapAreaConditionLogicalOperator.AND.value,
|
"logicalOpe": MapAreaConditionLogicalOperator.AND.value,
|
||||||
"startDate": "2023-12-14 07:00:00.0",
|
"startDate": start_date,
|
||||||
"endDate": "2099-12-31 00:00:00.0",
|
"endDate": "2099-12-31 00:00:00.0",
|
||||||
},
|
},
|
||||||
{
|
# {
|
||||||
"type": MapAreaConditionType.TROPHY_OBTAINED.value,
|
# "type": MapAreaConditionType.TROPHY_OBTAINED.value,
|
||||||
"conditionId": "6837",
|
# "conditionId": 6837,
|
||||||
"logicalOpe": MapAreaConditionLogicalOperator.AND.value,
|
# "logicalOpe": MapAreaConditionLogicalOperator.AND.value,
|
||||||
"startDate": "2023-12-14 07:00:00.0",
|
# "startDate": start_date,
|
||||||
"endDate": "2024-01-25 02:00:00.0",
|
# "endDate": "2099-12-31 00:00:00.0",
|
||||||
},
|
# },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"mapAreaId": "2206206", # Blow My Mind
|
"mapAreaId": 2206206, # Blow My Mind
|
||||||
"length": "1",
|
"length": 1,
|
||||||
# SS on CHAOS EXPERT, Hydra EXPERT, Surive EXPERT and Jakarta PROGRESSION EXPERT
|
# SS on CHAOS EXPERT, Hydra EXPERT, Surive EXPERT and Jakarta PROGRESSION EXPERT
|
||||||
# to get the title "Can you hear me?"
|
# to get the title "Can you hear me?"
|
||||||
"mapAreaConditionList": [
|
"mapAreaConditionList": [
|
||||||
{
|
{
|
||||||
"type": MapAreaConditionType.TROPHY_OBTAINED.value,
|
"type": MapAreaConditionType.TROPHY_OBTAINED.value,
|
||||||
"conditionId": "6838",
|
"conditionId": 6838,
|
||||||
"logicalOpe": MapAreaConditionLogicalOperator.AND.value,
|
"logicalOpe": MapAreaConditionLogicalOperator.AND.value,
|
||||||
"startDate": "2023-12-14 07:00:00.0",
|
"startDate": start_date,
|
||||||
"endDate": "2099-12-31 00:00:00.0",
|
"endDate": "2099-12-31 00:00:00.0",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"mapAreaId": "2206207", # VALLIS-NERIA
|
"mapAreaId": 2206207, # VALLIS-NERIA
|
||||||
"length": "6",
|
"length": 6,
|
||||||
# Finish the 6 other areas
|
# Finish the 6 other areas
|
||||||
"mapAreaConditionList": [
|
"mapAreaConditionList": [
|
||||||
{
|
{
|
||||||
"type": MapAreaConditionType.MAP_AREA_CLEARED.value,
|
"type": MapAreaConditionType.MAP_AREA_CLEARED.value,
|
||||||
"conditionId": str(x),
|
"conditionId": x,
|
||||||
"logicalOpe": MapAreaConditionLogicalOperator.AND.value,
|
"logicalOpe": MapAreaConditionLogicalOperator.AND.value,
|
||||||
"startDate": "2023-12-14 07:00:00.0",
|
"startDate": start_date,
|
||||||
"endDate": "2099-12-31 00:00:00.0",
|
"endDate": "2099-12-31 00:00:00.0",
|
||||||
}
|
}
|
||||||
for x in range(2206201, 2206207)
|
for x in range(2206201, 2206207)
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
# {
|
])
|
||||||
# "mapAreaId": "3229301", # Mystic Rainbow of LUMINOUS Area 1
|
|
||||||
# "length": "1",
|
# LUMINOUS ep. I
|
||||||
# # Unlocks when any of the mainline LUMINOUS maps are completed?
|
if 14005 in event_by_id:
|
||||||
# "mapAreaConditionList": [
|
start_date = event_by_id[14005]["startDate"].strftime(self.date_time_format)
|
||||||
# # TODO
|
|
||||||
# ]
|
if not mystic_area_1_added:
|
||||||
# },
|
conditions.append(mystic_area_1_conditions)
|
||||||
# {
|
mystic_area_1_added = True
|
||||||
# "mapAreaId": "3229302", # Mystic Rainbow of LUMINOUS Area 2
|
|
||||||
# "length": "5",
|
mystic_area_1_conditions["length"] += 1
|
||||||
# # Unlocks when LUMINOUS ep. I is completed
|
mystic_area_1_conditions["mapAreaConditionList"].append(
|
||||||
# "mapAreaConditionList": [
|
{
|
||||||
# {
|
"type": MapAreaConditionType.MAP_CLEARED.value,
|
||||||
# "type": MapAreaConditionType.MAP_AREA_CLEARED.value,
|
"conditionId": 3020701,
|
||||||
# "conditionId": str(x),
|
"logicalOpe": MapAreaConditionLogicalOperator.OR.value,
|
||||||
# "logicalOpe": MapAreaConditionLogicalOperator.AND.value,
|
"startDate": start_date,
|
||||||
# "startDate": "2023-12-14 07:00:00.0",
|
"endDate": "2099-12-31 00:00:00.0",
|
||||||
# "endDate": "2099-12-31 00:00:00.0",
|
}
|
||||||
# }
|
)
|
||||||
# for x in range(3220101, 3220106)
|
|
||||||
# ]
|
conditions.append(
|
||||||
# },
|
{
|
||||||
# {
|
"mapAreaId": 3229302, # Mystic Rainbow of LUMINOUS Area 2,
|
||||||
# "mapAreaId": "3229303", # Mystic Rainbow of LUMINOUS Area 3
|
"length": 1,
|
||||||
# "length": "5",
|
# Unlocks when LUMINOUS ep. I is completed.
|
||||||
# # Unlocks when LUMINOUS ep. II is completed
|
"mapAreaConditionList": [
|
||||||
# "mapAreaConditionList": [
|
{
|
||||||
# {
|
"type": MapAreaConditionType.MAP_CLEARED.value,
|
||||||
# "type": MapAreaConditionType.MAP_AREA_CLEARED.value,
|
"conditionId": 3020701,
|
||||||
# "conditionId": str(x),
|
"logicalOpe": MapAreaConditionLogicalOperator.AND.value,
|
||||||
# "logicalOpe": MapAreaConditionLogicalOperator.AND.value,
|
"startDate": start_date,
|
||||||
# "startDate": "2023-12-14 07:00:00.0",
|
"endDate": "2099-12-31 00:00:00.0",
|
||||||
# "endDate": "2099-12-31 00:00:00.0",
|
},
|
||||||
# }
|
],
|
||||||
# for x in range(3220201, 3220206)
|
}
|
||||||
# ]
|
)
|
||||||
# },
|
|
||||||
# {
|
# LUMINOUS ep. II
|
||||||
# "mapAreaId": "3229304", # Mystic Rainbow of LUMINOUS Area 4
|
if 14251 in event_by_id:
|
||||||
# "length": "5",
|
start_date = event_by_id[14251]["startDate"].strftime(self.date_time_format)
|
||||||
# # Unlocks when LUMINOUS ep. III is completed
|
|
||||||
# "mapAreaConditionList": [
|
if not mystic_area_1_added:
|
||||||
|
conditions.append(mystic_area_1_conditions)
|
||||||
# ]
|
mystic_area_1_added = True
|
||||||
# }
|
|
||||||
],
|
mystic_area_1_conditions["length"] += 1
|
||||||
|
mystic_area_1_conditions["mapAreaConditionList"].append(
|
||||||
|
{
|
||||||
|
"type": MapAreaConditionType.MAP_CLEARED.value,
|
||||||
|
"conditionId": 3020702,
|
||||||
|
"logicalOpe": MapAreaConditionLogicalOperator.OR.value,
|
||||||
|
"startDate": start_date,
|
||||||
|
"endDate": "2099-12-31 00:00:00.0",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
conditions.append(
|
||||||
|
{
|
||||||
|
"mapAreaId": 3229303, # Mystic Rainbow of LUMINOUS Area 3,
|
||||||
|
"length": 1,
|
||||||
|
# Unlocks when LUMINOUS ep. II is completed.
|
||||||
|
"mapAreaConditionList": [
|
||||||
|
{
|
||||||
|
"type": MapAreaConditionType.MAP_CLEARED.value,
|
||||||
|
"conditionId": 3020702,
|
||||||
|
"logicalOpe": MapAreaConditionLogicalOperator.AND.value,
|
||||||
|
"startDate": start_date,
|
||||||
|
"endDate": "2099-12-31 00:00:00.0",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
return {
|
||||||
|
"length": len(conditions),
|
||||||
|
"gameMapAreaConditionList": conditions,
|
||||||
}
|
}
|
||||||
|
@ -793,9 +793,9 @@ class ChuniProfileData(BaseData):
|
|||||||
versions = [row[0] for row in versions_raw]
|
versions = [row[0] for row in versions_raw]
|
||||||
return sorted(versions, reverse=True)
|
return sorted(versions, reverse=True)
|
||||||
|
|
||||||
async def put_net_battle(self, user_id: int, net_battle_data: Dict) -> Optional[int]:
|
async def put_net_battle(self, aime_id: int, net_battle_data: Dict) -> Optional[int]:
|
||||||
sql = insert(net_battle).values(
|
sql = insert(net_battle).values(
|
||||||
user=user_id,
|
user=aime_id,
|
||||||
isRankUpChallengeFailed=net_battle_data['isRankUpChallengeFailed'],
|
isRankUpChallengeFailed=net_battle_data['isRankUpChallengeFailed'],
|
||||||
highestBattleRankId=net_battle_data['highestBattleRankId'],
|
highestBattleRankId=net_battle_data['highestBattleRankId'],
|
||||||
battleIconId=net_battle_data['battleIconId'],
|
battleIconId=net_battle_data['battleIconId'],
|
||||||
@ -814,9 +814,9 @@ class ChuniProfileData(BaseData):
|
|||||||
result = await self.execute(conflict)
|
result = await self.execute(conflict)
|
||||||
if result:
|
if result:
|
||||||
return result.inserted_primary_key['id']
|
return result.inserted_primary_key['id']
|
||||||
self.logger.error(f"Failed to put net battle data for user {user_id}")
|
self.logger.error(f"Failed to put net battle data for user {aime_id}")
|
||||||
|
|
||||||
async def get_net_battle(self, user_id: int, net_battle_data: Dict) -> Optional[Row]:
|
async def get_net_battle(self, aime_id: int) -> Optional[Row]:
|
||||||
result = await self.execute(net_battle.select(net_battle.c.user == user_id))
|
result = await self.execute(net_battle.select(net_battle.c.user == aime_id))
|
||||||
if result:
|
if result:
|
||||||
return result.fetchone()
|
return result.fetchone()
|
||||||
|
@ -242,6 +242,8 @@ class ChuniScoreData(BaseData):
|
|||||||
# Calculates the ROM version that should be fetched for rankings, based on the game version being retrieved
|
# Calculates the ROM version that should be fetched for rankings, based on the game version being retrieved
|
||||||
# This prevents tracks that are not accessible in your version from counting towards the 10 results
|
# This prevents tracks that are not accessible in your version from counting towards the 10 results
|
||||||
romVer = {
|
romVer = {
|
||||||
|
15: "2.20%",
|
||||||
|
14: "2.15%",
|
||||||
13: "2.10%",
|
13: "2.10%",
|
||||||
12: "2.05%",
|
12: "2.05%",
|
||||||
11: "2.00%",
|
11: "2.00%",
|
||||||
|
@ -165,7 +165,8 @@ class PokkenBase:
|
|||||||
f"Register new card {access_code} (UserId {user_id}, CardId {card_id})"
|
f"Register new card {access_code} (UserId {user_id}, CardId {card_id})"
|
||||||
)
|
)
|
||||||
|
|
||||||
await self.data.card.set_chip_id_by_access_code(access_code, int(request.load_user.chip_id[:8], 16))
|
if int(request.load_user.chip_id[:8], 16) != 0x04030201:
|
||||||
|
await self.data.card.set_chip_id_by_access_code(access_code, int(request.load_user.chip_id[:8], 16))
|
||||||
|
|
||||||
elif card is None:
|
elif card is None:
|
||||||
self.logger.info(f"Registration of card {access_code} blocked!")
|
self.logger.info(f"Registration of card {access_code} blocked!")
|
||||||
@ -175,7 +176,7 @@ class PokkenBase:
|
|||||||
else:
|
else:
|
||||||
user_id = card['user']
|
user_id = card['user']
|
||||||
card_id = card['id']
|
card_id = card['id']
|
||||||
if not card['chip_id']:
|
if not card['chip_id'] and int(request.load_user.chip_id[:8], 16) != 0x04030201: # Default segatools sn:
|
||||||
await self.data.card.set_chip_id_by_access_code(access_code, int(request.load_user.chip_id[:8], 16))
|
await self.data.card.set_chip_id_by_access_code(access_code, int(request.load_user.chip_id[:8], 16))
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
from .index import SaoServlet
|
from .index import SaoServlet
|
||||||
from .const import SaoConstants
|
from .const import SaoConstants
|
||||||
from .database import SaoData
|
from .database import SaoData
|
||||||
|
from .frontend import SaoFrontend
|
||||||
from .read import SaoReader
|
from .read import SaoReader
|
||||||
|
|
||||||
index = SaoServlet
|
index = SaoServlet
|
||||||
database = SaoData
|
database = SaoData
|
||||||
|
frontend = SaoFrontend
|
||||||
reader = SaoReader
|
reader = SaoReader
|
||||||
game_codes = [SaoConstants.GAME_CODE]
|
game_codes = [SaoConstants.GAME_CODE]
|
||||||
|
3153
titles/sao/base.py
3153
titles/sao/base.py
File diff suppressed because it is too large
Load Diff
@ -30,9 +30,21 @@ class SaoServerConfig:
|
|||||||
)
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def use_https(self) -> bool:
|
def photon_app_id(self) -> str:
|
||||||
return CoreConfig.get_config_field(
|
return CoreConfig.get_config_field(
|
||||||
self.__config, "sao", "server", "use_https", default=False
|
self.__config, "sao", "server", "photon_app_id", default="7df3a2f6-d69d-4073-aafe-810ee61e1cea"
|
||||||
|
)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def data_version(self) -> int:
|
||||||
|
return CoreConfig.get_config_field(
|
||||||
|
self.__config, "sao", "server", "data_version", default=1
|
||||||
|
)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def game_version(self) -> int:
|
||||||
|
return CoreConfig.get_config_field(
|
||||||
|
self.__config, "sao", "server", "game_version", default=33
|
||||||
)
|
)
|
||||||
|
|
||||||
class SaoCryptConfig:
|
class SaoCryptConfig:
|
||||||
@ -50,12 +62,6 @@ class SaoCryptConfig:
|
|||||||
return CoreConfig.get_config_field(
|
return CoreConfig.get_config_field(
|
||||||
self.__config, "sao", "crypt", "key", default=""
|
self.__config, "sao", "crypt", "key", default=""
|
||||||
)
|
)
|
||||||
|
|
||||||
@property
|
|
||||||
def iv(self) -> str:
|
|
||||||
return CoreConfig.get_config_field(
|
|
||||||
self.__config, "sao", "crypt", "iv", default=""
|
|
||||||
)
|
|
||||||
|
|
||||||
class SaoHashConfig:
|
class SaoHashConfig:
|
||||||
def __init__(self, parent_config: "SaoConfig"):
|
def __init__(self, parent_config: "SaoConfig"):
|
||||||
@ -73,9 +79,31 @@ class SaoHashConfig:
|
|||||||
self.__config, "sao", "hash", "hash_base", default=""
|
self.__config, "sao", "hash", "hash_base", default=""
|
||||||
)
|
)
|
||||||
|
|
||||||
|
class SaoCardConfig:
|
||||||
|
def __init__(self, parent_config: "SaoConfig"):
|
||||||
|
self.__config = parent_config
|
||||||
|
|
||||||
|
@property
|
||||||
|
def enable(self) -> bool:
|
||||||
|
return CoreConfig.get_config_field(
|
||||||
|
self.__config, "sao", "card", "enable", default=True
|
||||||
|
)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def crypt_password(self) -> str:
|
||||||
|
return CoreConfig.get_config_field(
|
||||||
|
self.__config, "sao", "card", "crypt_password", default=""
|
||||||
|
)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def crypt_salt(self) -> str:
|
||||||
|
return CoreConfig.get_config_field(
|
||||||
|
self.__config, "sao", "card", "crypt_salt", default=""
|
||||||
|
)
|
||||||
|
|
||||||
class SaoConfig(dict):
|
class SaoConfig(dict):
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
self.server = SaoServerConfig(self)
|
self.server = SaoServerConfig(self)
|
||||||
self.crypt = SaoCryptConfig(self)
|
self.crypt = SaoCryptConfig(self)
|
||||||
self.hash = SaoHashConfig(self)
|
self.hash = SaoHashConfig(self)
|
||||||
|
self.card = SaoCardConfig(self)
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
from enum import Enum
|
from enum import IntEnum
|
||||||
|
|
||||||
|
|
||||||
class SaoConstants:
|
class SaoConstants:
|
||||||
GAME_CODE = "SDEW"
|
GAME_CODE = "SDEW"
|
||||||
@ -9,8 +8,8 @@ class SaoConstants:
|
|||||||
|
|
||||||
VER_SAO = 0
|
VER_SAO = 0
|
||||||
|
|
||||||
VERSION_NAMES = ("Sword Art Online Arcade")
|
VERSION_NAMES = ("Sword Art Online Arcade",)
|
||||||
|
|
||||||
SERIAL_IDENT_SATALITE = 4
|
SERIAL_IDENT_SATALITE = 4
|
||||||
SERIAL_IDENT_TERMINAL = 5
|
SERIAL_IDENT_TERMINAL = 5
|
||||||
|
|
||||||
@ -23,3 +22,653 @@ class SaoConstants:
|
|||||||
@classmethod
|
@classmethod
|
||||||
def game_ver_to_string(cls, ver: int):
|
def game_ver_to_string(cls, ver: int):
|
||||||
return cls.VERSION_NAMES[ver]
|
return cls.VERSION_NAMES[ver]
|
||||||
|
|
||||||
|
class RewardType(IntEnum):
|
||||||
|
None_ = 0
|
||||||
|
HeroLog = 1
|
||||||
|
Equipment = 2
|
||||||
|
Item = 3
|
||||||
|
Col = 4
|
||||||
|
VP = 5
|
||||||
|
YuiMadal = 6
|
||||||
|
VPGashaTicket = 7
|
||||||
|
SupportLog = 8
|
||||||
|
EpisodeAppend = 9
|
||||||
|
EventItem = 10
|
||||||
|
Ticket = 11
|
||||||
|
|
||||||
|
class ItemType(IntEnum):
|
||||||
|
ADD_HERO_PROPERTY = 1
|
||||||
|
ADD_WEAPON_PROPERTY = 2
|
||||||
|
ADD_ARMOR_PROPERTY = 3
|
||||||
|
UNLOCK_PROPERTY = 4
|
||||||
|
REMOVE_PROPERTY = 5
|
||||||
|
ADD_SKILL_SLOT = 6
|
||||||
|
ADD_XP = 7
|
||||||
|
REDEMPTION = 8
|
||||||
|
HERO_LEVEL_LIMIT_BREAK = 9
|
||||||
|
WEAPON_LEVEL_LIMIT_BREAK = 10
|
||||||
|
ARMOR_LEVEL_LIMIT_BREAK = 11
|
||||||
|
ADD_AWAKENING_XP = 12
|
||||||
|
|
||||||
|
class ExBonusCondition(IntEnum):
|
||||||
|
CLEAR_UNDER_X_SECS = 1
|
||||||
|
DEFEAT_X_MONSTER_Y_TIMES = 2
|
||||||
|
DEFEAT_X_MONSTERS = 3
|
||||||
|
CLEAR_X_MISSIONS = 4
|
||||||
|
CLEAR_MISSION_DIFFICULTY_X = 5
|
||||||
|
COLLECT_X_LOGS = 6
|
||||||
|
CLEAR_SKILL_LEVEL_X = 7
|
||||||
|
NO_LOSSES = 8
|
||||||
|
ACCEL_X_TIMES = 9
|
||||||
|
MAX_COMBO_X = 10
|
||||||
|
MULTIPLAYER_CLEAR_X = 11
|
||||||
|
|
||||||
|
class UnanalyzedLogGrade(IntEnum):
|
||||||
|
WHITE = 1
|
||||||
|
COPPER = 2
|
||||||
|
SILVER = 3
|
||||||
|
GOLD = 4
|
||||||
|
RAINBOW = 5
|
||||||
|
|
||||||
|
class QuestType(IntEnum):
|
||||||
|
EPISODE = 1
|
||||||
|
TRIAL_TOWER = 2
|
||||||
|
SIDE = 3
|
||||||
|
VERSUS = 4
|
||||||
|
EX_TOWER = 5
|
||||||
|
EPISODE_CHAPTER = 6 # Unused
|
||||||
|
|
||||||
|
class GameconnectCmd(IntEnum):
|
||||||
|
TICKET_REQUEST = 0xC000
|
||||||
|
TICKET_RESPONSE = 0xC001
|
||||||
|
GET_APP_VERSIONS_REQUEST = 0xC100
|
||||||
|
GET_APP_VERSIONS_RESPONSE = 0xC101
|
||||||
|
MASTER_DATA_VERSION_CHECK_REQUEST = 0xC102
|
||||||
|
MASTER_DATA_VERSION_CHECK_RESPONSE = 0xC103
|
||||||
|
LOGIN_REQUEST = 0xC104
|
||||||
|
LOGIN_RESPONSE = 0xC105
|
||||||
|
LOGOUT_REQUEST = 0xC106
|
||||||
|
LOGOUT_RESPONSE = 0xC107
|
||||||
|
LOGOUT_TICKET_UNPURCHASED_REQUEST = 0xC108
|
||||||
|
LOGOUT_TICKET_UNPURCHASED_RESPONSE = 0xC109
|
||||||
|
PAYING_PLAY_START_REQUEST = 0xC10A
|
||||||
|
PAYING_PLAY_START_RESPONSE = 0xC10B
|
||||||
|
PAYING_PLAY_END_REQUEST = 0xC10C
|
||||||
|
PAYING_PLAY_END_RESPONSE = 0xC10D
|
||||||
|
PURCHASE_TICKET_REQUEST = 0xC10E
|
||||||
|
PURCHASE_TICKET_RESPONSE = 0xC10F
|
||||||
|
CONSUME_TICKET_REQUEST = 0xC110
|
||||||
|
CONSUME_TICKET_RESPONSE = 0xC111
|
||||||
|
ADD_CREDIT_REQUEST = 0xC112
|
||||||
|
ADD_CREDIT_RESPONSE = 0xC113
|
||||||
|
CONSUME_CREDIT_REQUEST = 0xC114
|
||||||
|
CONSUME_CREDIT_RESPONSE = 0xC115
|
||||||
|
PURCHASE_TICKET_GUEST_REQUEST = 0xC116
|
||||||
|
PURCHASE_TICKET_GUEST_RESPONSE = 0xC117
|
||||||
|
CONSUME_TICKET_GUEST_REQUEST = 0xC118
|
||||||
|
CONSUME_TICKET_GUEST_RESPONSE = 0xC119
|
||||||
|
ADD_CREDIT_GUEST_REQUEST = 0xC11A
|
||||||
|
ADD_CREDIT_GUEST_RESPONSE = 0xC11B
|
||||||
|
CONSUME_CREDIT_GUEST_REQUEST = 0xC11C
|
||||||
|
CONSUME_CREDIT_GUEST_RESPONSE = 0xC11D
|
||||||
|
GET_AUTH_CARD_DATA_REQUEST = 0xC11E
|
||||||
|
GET_AUTH_CARD_DATA_RESPONSE = 0xC11F
|
||||||
|
GET_ACCESS_CODE_BY_KEITAI_REQUEST = 0xC120
|
||||||
|
GET_ACCESS_CODE_BY_KEITAI_RESPONSE = 0xC121
|
||||||
|
GET_MAINTENANCE_INFO_REQUEST = 0xC122
|
||||||
|
GET_MAINTENANCE_INFO_RESPONSE = 0xC123
|
||||||
|
GET_RESOURCE_PATH_INFO_REQUEST = 0xC124
|
||||||
|
GET_RESOURCE_PATH_INFO_RESPONSE = 0xC125
|
||||||
|
VALIDATION_ERROR_NOTIFICATION_REQUEST = 0xC126
|
||||||
|
VALIDATION_ERROR_NOTIFICATION_RESPONSE = 0xC127
|
||||||
|
POWER_CUTTING_RETURN_NOTIFICATION_REQUEST = 0xC128
|
||||||
|
POWER_CUTTING_RETURN_NOTIFICATION_RESPONSE = 0xC129
|
||||||
|
GIVE_FREE_TICKET_REQUEST = 0xC12A
|
||||||
|
GIVE_FREE_TICKET_RESPONSE = 0xC12B
|
||||||
|
MATCHING_ERROR_NOTIFICATION_REQUEST = 0xC12C
|
||||||
|
MATCHING_ERROR_NOTIFICATION_RESPONSE = 0xC12D
|
||||||
|
AC_CABINET_BOOT_NOTIFICATION_REQUEST = 0xC12E
|
||||||
|
AC_CABINET_BOOT_NOTIFICATION_RESPONSE = 0xC12F
|
||||||
|
FIRST_TUTORIAL_END_REQUEST = 0xC200
|
||||||
|
FIRST_TUTORIAL_END_RESPONSE = 0xC201
|
||||||
|
VARIOUS_TUTORIAL_END_REQUEST = 0xC202
|
||||||
|
VARIOUS_TUTORIAL_END_RESPONSE = 0xC203
|
||||||
|
GET_VARIOUS_TUTORIAL_DATA_LIST_REQUEST = 0xC204
|
||||||
|
GET_VARIOUS_TUTORIAL_DATA_LIST_RESPONSE = 0xC205
|
||||||
|
DISCHARGE_PROFILE_CARD_REQUEST = 0xC300
|
||||||
|
DISCHARGE_PROFILE_CARD_RESPONSE = 0xC301
|
||||||
|
DISCHARGE_RESOURCE_CARD_REQUEST = 0xC302
|
||||||
|
DISCHARGE_RESOURCE_CARD_RESPONSE = 0xC303
|
||||||
|
DISCHARGE_RESOURCE_CARD_COMPLETE_REQUEST = 0xC304
|
||||||
|
DISCHARGE_RESOURCE_CARD_COMPLETE_RESPONSE = 0xC305
|
||||||
|
SCAN_QR_QUEST_PROFILE_CARD_REQUEST = 0xC306
|
||||||
|
SCAN_QR_QUEST_PROFILE_CARD_RESPONSE = 0xC307
|
||||||
|
SCAN_QR_SHOP_RESOURCE_CARD_REQUEST = 0xC308
|
||||||
|
SCAN_QR_SHOP_RESOURCE_CARD_RESPONSE = 0xC309
|
||||||
|
SCAN_QR_QUEST_RESOURCE_CARD_REQUEST = 0xC30A
|
||||||
|
SCAN_QR_QUEST_RESOURCE_CARD_RESPONSE = 0xC30B
|
||||||
|
CHECK_YUI_MEDAL_GET_CONDITION_REQUEST = 0xC400
|
||||||
|
CHECK_YUI_MEDAL_GET_CONDITION_RESPONSE = 0xC401
|
||||||
|
GET_YUI_MEDAL_BONUS_USER_DATA_REQUEST = 0xC402
|
||||||
|
GET_YUI_MEDAL_BONUS_USER_DATA_RESPONSE = 0xC403
|
||||||
|
CHECK_COMEBACK_EVENT_REQUEST = 0xC404
|
||||||
|
CHECK_COMEBACK_EVENT_RESPONSE = 0xC405
|
||||||
|
CHANGE_MY_STORE_REQUEST = 0xC406
|
||||||
|
CHANGE_MY_STORE_RESPONSE = 0xC407
|
||||||
|
CHECK_TITLE_GET_DECISION_REQUEST = 0xC408
|
||||||
|
CHECK_TITLE_GET_DECISION_RESPONSE = 0xC409
|
||||||
|
CHECK_PROFILE_CARD_USED_REWARD_REQUEST = 0xC40A
|
||||||
|
CHECK_PROFILE_CARD_USED_REWARD_RESPONSE = 0xC40B
|
||||||
|
CHECK_AC_LOGIN_BONUS_REQUEST = 0xC40C
|
||||||
|
CHECK_AC_LOGIN_BONUS_RESPONSE = 0xC40D
|
||||||
|
GET_USER_BASIC_DATA_REQUEST = 0xC500
|
||||||
|
GET_USER_BASIC_DATA_RESPONSE = 0xC501
|
||||||
|
GET_VP_GASHA_TICKET_DATA_LIST_REQUEST = 0xC502
|
||||||
|
GET_VP_GASHA_TICKET_DATA_LIST_RESPONSE = 0xC503
|
||||||
|
GET_PRESENT_BOX_NUM_REQUEST = 0xC504
|
||||||
|
GET_PRESENT_BOX_NUM_RESPONSE = 0xC505
|
||||||
|
GET_HERO_LOG_USER_DATA_LIST_REQUEST = 0xC600
|
||||||
|
GET_HERO_LOG_USER_DATA_LIST_RESPONSE = 0xC601
|
||||||
|
GET_EQUIPMENT_USER_DATA_LIST_REQUEST = 0xC602
|
||||||
|
GET_EQUIPMENT_USER_DATA_LIST_RESPONSE = 0xC603
|
||||||
|
GET_ITEM_USER_DATA_LIST_REQUEST = 0xC604
|
||||||
|
GET_ITEM_USER_DATA_LIST_RESPONSE = 0xC605
|
||||||
|
GET_SUPPORT_LOG_USER_DATA_LIST_REQUEST = 0xC606
|
||||||
|
GET_SUPPORT_LOG_USER_DATA_LIST_RESPONSE = 0xC607
|
||||||
|
GET_EPISODE_APPEND_DATA_LIST_REQUEST = 0xC608
|
||||||
|
GET_EPISODE_APPEND_DATA_LIST_RESPONSE = 0xC609
|
||||||
|
GET_EVENT_ITEM_DATA_LIST_REQUEST = 0xC60A
|
||||||
|
GET_EVENT_ITEM_DATA_LIST_RESPONSE = 0xC60B
|
||||||
|
GET_GASHA_MEDAL_USER_DATA_LIST_REQUEST = 0xC60C
|
||||||
|
GET_GASHA_MEDAL_USER_DATA_LIST_RESPONSE = 0xC60D
|
||||||
|
GET_SHOP_RESOURCE_SALES_DATA_LIST_REQUEST = 0xC700
|
||||||
|
GET_SHOP_RESOURCE_SALES_DATA_LIST_RESPONSE = 0xC701
|
||||||
|
PURCHASE_SHOP_RESOURCE_REQUEST = 0xC702
|
||||||
|
PURCHASE_SHOP_RESOURCE_RESPONSE = 0xC703
|
||||||
|
DISCARD_SHOP_RESOURCE_REQUEST = 0xC704
|
||||||
|
DISCARD_SHOP_RESOURCE_RESPONSE = 0xC705
|
||||||
|
GET_TITLE_USER_DATA_LIST_REQUEST = 0xC800
|
||||||
|
GET_TITLE_USER_DATA_LIST_RESPONSE = 0xC801
|
||||||
|
CHANGE_TITLE_REQUEST = 0xC802
|
||||||
|
CHANGE_TITLE_RESPONSE = 0xC803
|
||||||
|
GET_PARTY_DATA_LIST_REQUEST = 0xC804
|
||||||
|
GET_PARTY_DATA_LIST_RESPONSE = 0xC805
|
||||||
|
CHANGE_PARTY_REQUEST = 0xC806
|
||||||
|
CHANGE_PARTY_RESPONSE = 0xC807
|
||||||
|
GET_SUPPORT_LOG_PARTY_DATA_LIST_REQUEST = 0xC808
|
||||||
|
GET_SUPPORT_LOG_PARTY_DATA_LIST_RESPONSE = 0xC809
|
||||||
|
CHANGE_SUPPORT_LOG_PARTY_REQUEST = 0xC80A
|
||||||
|
CHANGE_SUPPORT_LOG_PARTY_RESPONSE = 0xC80B
|
||||||
|
CHANGE_HERO_LOG_LAST_SETTING_SKILL_REQUEST = 0xC80C
|
||||||
|
CHANGE_HERO_LOG_LAST_SETTING_SKILL_RESPONSE = 0xC80D
|
||||||
|
LOCK_RESOURCE_REQUEST = 0xC80E
|
||||||
|
LOCK_RESOURCE_RESPONSE = 0xC80F
|
||||||
|
UNLOCK_RESOURCE_REQUEST = 0xC810
|
||||||
|
UNLOCK_RESOURCE_RESPONSE = 0xC811
|
||||||
|
DISPOSAL_RESOURCE_REQUEST = 0xC812
|
||||||
|
DISPOSAL_RESOURCE_RESPONSE = 0xC813
|
||||||
|
SYNTHESIZE_ENHANCEMENT_HERO_LOG_REQUEST = 0xC814
|
||||||
|
SYNTHESIZE_ENHANCEMENT_HERO_LOG_RESPONSE = 0xC815
|
||||||
|
SYNTHESIZE_ENHANCEMENT_EQUIPMENT_REQUEST = 0xC816
|
||||||
|
SYNTHESIZE_ENHANCEMENT_EQUIPMENT_RESPONSE = 0xC817
|
||||||
|
SYNTHESIZE_ENHANCEMENT_SUPPORT_LOG_REQUEST = 0xC818
|
||||||
|
SYNTHESIZE_ENHANCEMENT_SUPPORT_LOG_RESPONSE = 0xC819
|
||||||
|
SYNTHESIZE_ABILITY_HERO_LOG_REQUEST = 0xC81A
|
||||||
|
SYNTHESIZE_ABILITY_HERO_LOG_RESPONSE = 0xC81B
|
||||||
|
SYNTHESIZE_ABILITY_EQUIPMENT_REQUEST = 0xC81C
|
||||||
|
SYNTHESIZE_ABILITY_EQUIPMENT_RESPONSE = 0xC81D
|
||||||
|
SYNTHESIZE_ABILITY_SUPPORT_LOG_REQUEST = 0xC81E
|
||||||
|
SYNTHESIZE_ABILITY_SUPPORT_LOG_RESPONSE = 0xC820
|
||||||
|
GET_QUEST_SCENE_USER_DATA_LIST_REQUEST = 0xC900
|
||||||
|
GET_QUEST_SCENE_USER_DATA_LIST_RESPONSE = 0xC901
|
||||||
|
GET_QUEST_SCENE_PREV_SCAN_PROFILE_CARD_REQUEST = 0xC902
|
||||||
|
GET_QUEST_SCENE_PREV_SCAN_PROFILE_CARD_RESPONSE = 0xC903
|
||||||
|
EPISODE_PLAY_START_REQUEST = 0xC904
|
||||||
|
EPISODE_PLAY_START_RESPONSE = 0xC905
|
||||||
|
EPISODE_PLAY_CONTINUE_REQUEST = 0xC906
|
||||||
|
EPISODE_PLAY_CONTINUE_RESPONSE = 0xC907
|
||||||
|
EPISODE_PLAY_END_REQUEST = 0xC908
|
||||||
|
EPISODE_PLAY_END_RESPONSE = 0xC909
|
||||||
|
EPISODE_PLAY_END_UNANALYZED_LOG_FIXED_REQUEST = 0xC90A
|
||||||
|
EPISODE_PLAY_END_UNANALYZED_LOG_FIXED_RESPONSE = 0xC90B
|
||||||
|
SIDE_QUEST_PLAY_START_REQUEST = 0xC90C
|
||||||
|
SIDE_QUEST_PLAY_START_RESPONSE = 0xC90D
|
||||||
|
SIDE_QUEST_PLAY_CONTINUE_REQUEST = 0xC90E
|
||||||
|
SIDE_QUEST_PLAY_CONTINUE_RESPONSE = 0xC90F
|
||||||
|
SIDE_QUEST_PLAY_END_REQUEST = 0xC910
|
||||||
|
SIDE_QUEST_PLAY_END_RESPONSE = 0xC911
|
||||||
|
SIDE_QUEST_PLAY_END_UNANALYZED_LOG_FIXED_REQUEST = 0xC912
|
||||||
|
SIDE_QUEST_PLAY_END_UNANALYZED_LOG_FIXED_RESPONSE = 0xC913
|
||||||
|
TRIAL_TOWER_PLAY_START_REQUEST = 0xC914
|
||||||
|
TRIAL_TOWER_PLAY_START_RESPONSE = 0xC915
|
||||||
|
TRIAL_TOWER_PLAY_CONTINUE_REQUEST = 0xC916
|
||||||
|
TRIAL_TOWER_PLAY_CONTINUE_RESPONSE = 0xC917
|
||||||
|
TRIAL_TOWER_PLAY_END_REQUEST = 0xC918
|
||||||
|
TRIAL_TOWER_PLAY_END_RESPONSE = 0xC919
|
||||||
|
TRIAL_TOWER_PLAY_END_UNANALYZED_LOG_FIXED_REQUEST = 0xC91A
|
||||||
|
TRIAL_TOWER_PLAY_END_UNANALYZED_LOG_FIXED_RESPONSE = 0xC91B
|
||||||
|
DEFRAG_MATCH_QUEST_PLAY_START_REQUEST = 0xC91C
|
||||||
|
DEFRAG_MATCH_QUEST_PLAY_START_RESPONSE = 0xC91D
|
||||||
|
DEFRAG_MATCH_QUEST_PLAY_END_REQUEST = 0xC91E
|
||||||
|
DEFRAG_MATCH_QUEST_PLAY_END_RESPONSE = 0xC91F
|
||||||
|
DEFRAG_MATCH_QUEST_PLAY_END_UNANALYZED_LOG_FIXED_REQUEST = 0xC920
|
||||||
|
DEFRAG_MATCH_QUEST_PLAY_END_UNANALYZED_LOG_FIXED_RESPONSE = 0xC921
|
||||||
|
EX_TOWER_QUEST_PLAY_START_REQUEST = 0xC922
|
||||||
|
EX_TOWER_QUEST_PLAY_START_RESPONSE = 0xC923
|
||||||
|
EX_TOWER_QUEST_PLAY_CONTINUE_REQUEST = 0xC924
|
||||||
|
EX_TOWER_QUEST_PLAY_CONTINUE_RESPONSE = 0xC925
|
||||||
|
EX_TOWER_QUEST_PLAY_END_REQUEST = 0xC926
|
||||||
|
EX_TOWER_QUEST_PLAY_END_RESPONSE = 0xC927
|
||||||
|
EX_TOWER_QUEST_PLAY_END_UNANALYZED_LOG_FIXED_REQUEST = 0xC928
|
||||||
|
EX_TOWER_QUEST_PLAY_END_UNANALYZED_LOG_FIXED_RESPONSE = 0xC929
|
||||||
|
GET_EX_TOWER_USER_DATA_REQUEST = 0xC92A
|
||||||
|
GET_EX_TOWER_USER_DATA_RESPONSE = 0xC92B
|
||||||
|
REG_EX_TOWER_HALL_OF_FAME_CONFIRM_FLAG_REQUEST = 0xC92C
|
||||||
|
REG_EX_TOWER_HALL_OF_FAME_CONFIRM_FLAG_RESPONSE = 0xC92D
|
||||||
|
REG_EX_TOWER_CONFIRM_FLAG_REQUEST = 0xC92E
|
||||||
|
REG_EX_TOWER_CONFIRM_FLAG_RESPONSE = 0xC92F
|
||||||
|
GET_CHAT_SIDE_STORY_USER_DATA_LIST_REQUEST = 0xC930
|
||||||
|
GET_CHAT_SIDE_STORY_USER_DATA_LIST_RESPONSE = 0xC931
|
||||||
|
GET_USER_QUEST_EPISODE_STATUS_DATA_LIST_REQUEST = 0xC932
|
||||||
|
GET_USER_QUEST_EPISODE_STATUS_DATA_LIST_RESPONSE = 0xC933
|
||||||
|
APPLY_QUEST_DROP_BOOST_REQUEST = 0xC934
|
||||||
|
APPLY_QUEST_DROP_BOOST_RESPONSE = 0xC935
|
||||||
|
CREATE_QUEST_SCENE_MULTI_PLAY_ROOM_ID_REQUEST = 0xCA00
|
||||||
|
CREATE_QUEST_SCENE_MULTI_PLAY_ROOM_ID_RESPONSE = 0xCA01
|
||||||
|
GET_QUEST_SCENE_MULTI_PLAY_PHOTON_SERVER_REQUEST = 0xCA02
|
||||||
|
GET_QUEST_SCENE_MULTI_PLAY_PHOTON_SERVER_RESPONSE = 0xCA03
|
||||||
|
GET_QUEST_SCENE_MULTI_PLAY_PHOTON_SERVER_BY_ROOM_REQUEST = 0xCA04
|
||||||
|
GET_QUEST_SCENE_MULTI_PLAY_PHOTON_SERVER_BY_ROOM_RESPONSE = 0xCA05
|
||||||
|
GET_QUEST_BEST_SOCRE_RANKING_LIST_REQUEST = 0xCB00
|
||||||
|
GET_QUEST_BEST_SOCRE_RANKING_LIST_RESPONSE = 0xCB01
|
||||||
|
GET_QUEST_HIERARCHY_PROGRESS_DEGREES_RANKING_LIST_REQUEST = 0xCB02
|
||||||
|
GET_QUEST_HIERARCHY_PROGRESS_DEGREES_RANKING_LIST_RESPONSE = 0xCB03
|
||||||
|
GET_QUEST_POPULAR_HERO_LOG_RANKING_LIST_REQUEST = 0xCB04
|
||||||
|
GET_QUEST_POPULAR_HERO_LOG_RANKING_LIST_RESPONSE = 0xCB05
|
||||||
|
GET_QUEST_EX_TOWER_HIERARCHY_PROGRESS_DEGREES_STORE_RANKING_LIST_REQUEST = 0xCB06
|
||||||
|
GET_QUEST_EX_TOWER_HIERARCHY_PROGRESS_DEGREES_STORE_RANKING_LIST_RESPONSE = 0xCB07
|
||||||
|
GET_QUEST_EX_TOWER_HIERARCHY_PROGRESS_DEGREES_NATIONAL_RANKING_LIST_REQUEST = 0xCB08
|
||||||
|
GET_QUEST_EX_TOWER_HIERARCHY_PROGRESS_DEGREES_NATIONAL_RANKING_LIST_RESPONSE = 0xCB09
|
||||||
|
GET_TREASURE_HUNT_BASIC_DATA_REQUEST = 0xCC00
|
||||||
|
GET_TREASURE_HUNT_BASIC_DATA_RESPONSE = 0xCC01
|
||||||
|
GET_TREASURE_HUNT_WHOLE_TASK_DATA_LIST_REQUEST = 0xCC02
|
||||||
|
GET_TREASURE_HUNT_WHOLE_TASK_DATA_LIST_RESPONSE = 0xCC03
|
||||||
|
GET_TREASURE_HUNT_INDIVIDUAL_TASK_DATA_LIST_REQUEST = 0xCC04
|
||||||
|
GET_TREASURE_HUNT_INDIVIDUAL_TASK_DATA_LIST_RESPONSE = 0xCC05
|
||||||
|
TREASURE_HUNT_AD_CONFIRM_NOTIFICATION_REQUEST = 0xCC06
|
||||||
|
TREASURE_HUNT_AD_CONFIRM_NOTIFICATION_RESPONSE = 0xCC07
|
||||||
|
GET_TREASURE_HUNT_EVENT_POINT_RANKING_USER_DATA_REQUEST = 0xCC08
|
||||||
|
GET_TREASURE_HUNT_EVENT_POINT_RANKING_USER_DATA_RESPONSE = 0xCC09
|
||||||
|
GET_TREASURE_HUNT_EVENT_POINT_STORE_RANKING_LIST_REQUEST = 0xCC0A
|
||||||
|
GET_TREASURE_HUNT_EVENT_POINT_STORE_RANKING_LIST_RESPONSE = 0xCC0B
|
||||||
|
GET_TREASURE_HUNT_EVENT_POINT_NATIONAL_RANKING_LIST_REQUEST = 0xCC0C
|
||||||
|
GET_TREASURE_HUNT_EVENT_POINT_NATIONAL_RANKING_LIST_RESPONSE = 0xCC0D
|
||||||
|
GET_DEFRAG_MATCH_BASIC_DATA_REQUEST = 0xCD00
|
||||||
|
GET_DEFRAG_MATCH_BASIC_DATA_RESPONSE = 0xCD01
|
||||||
|
GET_DEFRAG_MATCH_RANKING_USER_DATA_REQUEST = 0xCD02
|
||||||
|
GET_DEFRAG_MATCH_RANKING_USER_DATA_RESPONSE = 0xCD03
|
||||||
|
GET_DEFRAG_MATCH_LEAGUE_POINT_RANKING_LIST_REQUEST = 0xCD04
|
||||||
|
GET_DEFRAG_MATCH_LEAGUE_POINT_RANKING_LIST_RESPONSE = 0xCD05
|
||||||
|
GET_DEFRAG_MATCH_LEAGUE_SCORE_RANKING_LIST_REQUEST = 0xCD06
|
||||||
|
GET_DEFRAG_MATCH_LEAGUE_SCORE_RANKING_LIST_RESPONSE = 0xCD07
|
||||||
|
DEFRAG_MATCH_AD_CONFIRM_NOTIFICATION_REQUEST = 0xCD08
|
||||||
|
DEFRAG_MATCH_AD_CONFIRM_NOTIFICATION_RESPONSE = 0xCD09
|
||||||
|
CHECK_GET_SEED_DEFRAG_MATCH_REQUEST = 0xCD0A
|
||||||
|
CHECK_GET_SEED_DEFRAG_MATCH_RESPONSE = 0xCD0B
|
||||||
|
REG_DEFRAG_MATCH_HALL_OF_FAME_CONFIRM_FLAG_REQUEST = 0xCD0C
|
||||||
|
REG_DEFRAG_MATCH_HALL_OF_FAME_CONFIRM_FLAG_RESPONSE = 0xCD0D
|
||||||
|
GET_EVENT_SCENE_USER_DATA_LIST_REQUEST = 0xCE00
|
||||||
|
GET_EVENT_SCENE_USER_DATA_LIST_RESPONSE = 0xCE01
|
||||||
|
REG_PLAYED_EVENT_SCENE_USER_DATA_LIST_REQUEST = 0xCE02
|
||||||
|
REG_PLAYED_EVENT_SCENE_USER_DATA_LIST_RESPONSE = 0xCE03
|
||||||
|
GET_GASHA_LIST_REQUEST = 0xCF00
|
||||||
|
GET_GASHA_LIST_RESPONSE = 0xCF01
|
||||||
|
EXEC_GASHA_REQUEST = 0xCF02
|
||||||
|
EXEC_GASHA_RESPONSE = 0xCF03
|
||||||
|
EXEC_CREDIT_GASHA_START_REQUEST = 0xCF04
|
||||||
|
EXEC_CREDIT_GASHA_START_RESPONSE = 0xCF05
|
||||||
|
EXEC_CREDIT_GASHA_EXTRA_PAYING_REQUEST = 0xCF06
|
||||||
|
EXEC_CREDIT_GASHA_EXTRA_PAYING_RESPONSE = 0xCF07
|
||||||
|
EXEC_CREDIT_GASHA_END_REQUEST = 0xCF08
|
||||||
|
EXEC_CREDIT_GASHA_END_RESPONSE = 0xCF09
|
||||||
|
EXEC_CREDIT_GASHA_CARD_DISCHARGE_STATE_MIGRATION_REQUEST = 0xCF0A
|
||||||
|
EXEC_CREDIT_GASHA_CARD_DISCHARGE_STATE_MIGRATION_RESPONSE = 0xCF0B
|
||||||
|
EXEC_CREDIT_GASHA_CARD_DISCHARGE_END_REQUEST = 0xCF0C
|
||||||
|
EXEC_CREDIT_GASHA_CARD_DISCHARGE_END_RESPONSE = 0xCF0D
|
||||||
|
GET_GASHA_MEDAL_SHOP_USER_DATA_LIST_REQUEST = 0xCF0E
|
||||||
|
GET_GASHA_MEDAL_SHOP_USER_DATA_LIST_RESPONSE = 0xCF0F
|
||||||
|
PURCHASE_GASHA_MEDAL_SHOP_ITEM_REQUEST = 0xCF10
|
||||||
|
PURCHASE_GASHA_MEDAL_SHOP_ITEM_RESPONSE = 0xCF11
|
||||||
|
GET_GASHA_FREE_CAMPAIGN_USER_DATA_REQUEST = 0xCF12
|
||||||
|
GET_GASHA_FREE_CAMPAIGN_USER_DATA_RESPONSE = 0xCF13
|
||||||
|
GET_ADVENTURE_EXEC_USER_DATA_REQUEST = 0xD000
|
||||||
|
GET_ADVENTURE_EXEC_USER_DATA_RESPONSE = 0xD001
|
||||||
|
GET_ADVENTURE_PARTY_DATA_LIST_REQUEST = 0xD002
|
||||||
|
GET_ADVENTURE_PARTY_DATA_LIST_RESPONSE = 0xD003
|
||||||
|
GET_YUI_MEDAL_SHOP_USER_DATA_LIST_REQUEST = 0xD100
|
||||||
|
GET_YUI_MEDAL_SHOP_USER_DATA_LIST_RESPONSE = 0xD101
|
||||||
|
PURCHASE_YUI_MEDAL_SHOP_ITEM_REQUEST = 0xD102
|
||||||
|
PURCHASE_YUI_MEDAL_SHOP_ITEM_RESPONSE = 0xD103
|
||||||
|
PURCHASE_EVENT_SHOP_ITEM_REQUEST = 0xD104
|
||||||
|
PURCHASE_EVENT_SHOP_ITEM_RESPONSE = 0xD105
|
||||||
|
GET_BEGINNER_MISSION_USER_DATA_REQUEST = 0xD200
|
||||||
|
GET_BEGINNER_MISSION_USER_DATA_RESPONSE = 0xD201
|
||||||
|
GET_BEGINNER_MISSION_PROGRESSES_USER_DATA_LIST_REQUEST = 0xD202
|
||||||
|
GET_BEGINNER_MISSION_PROGRESSES_USER_DATA_LIST_RESPONSE = 0xD203
|
||||||
|
GET_BEGINNER_MISSION_SEAT_PROGRESSES_USER_DATA_LIST_REQUEST = 0xD204
|
||||||
|
GET_BEGINNER_MISSION_SEAT_PROGRESSES_USER_DATA_LIST_RESPONSE = 0xD205
|
||||||
|
BEGINNER_MISSION_AD_CONFIRM_NOTIFICATION_REQUEST = 0xD206
|
||||||
|
BEGINNER_MISSION_AD_CONFIRM_NOTIFICATION_RESPONSE = 0xD207
|
||||||
|
RECEIVE_BEGINNER_MISSION_REWARD_REQUEST = 0xD208
|
||||||
|
RECEIVE_BEGINNER_MISSION_REWARD_RESPONSE = 0xD209
|
||||||
|
GET_RES_EARN_CAMPAIGN_SHOP_USER_DATA_LIST_REQUEST = 0xD300
|
||||||
|
GET_RES_EARN_CAMPAIGN_SHOP_USER_DATA_LIST_RESPONSE = 0xD301
|
||||||
|
PURCHASE_RES_EARN_CAMPAIGN_SHOP_ITEM_REQUEST = 0xD302
|
||||||
|
PURCHASE_RES_EARN_CAMPAIGN_SHOP_ITEM_RESPONSE = 0xD303
|
||||||
|
PAYING_YUI_MEDAL_BONUS_GET_CHECK_REQUEST = 0xD304
|
||||||
|
PAYING_YUI_MEDAL_BONUS_GET_CHECK_RESPONSE = 0xD305
|
||||||
|
PAYING_YUI_MEDAL_BONUS_AD_CONFIRM_NOTIFICATION_REQUEST = 0xD306
|
||||||
|
PAYING_YUI_MEDAL_BONUS_AD_CONFIRM_NOTIFICATION_RESPONSE = 0xD307
|
||||||
|
GET_PLAY_CAMPAIGN_USER_DATA_LIST_REQUEST = 0xD308
|
||||||
|
GET_PLAY_CAMPAIGN_USER_DATA_LIST_RESPONSE = 0xD309
|
||||||
|
GET_PLAY_CAMPAIGN_STORE_USER_DATA_LIST_REQUEST = 0xD30A
|
||||||
|
GET_PLAY_CAMPAIGN_STORE_USER_DATA_LIST_RESPONSE = 0xD30B
|
||||||
|
GET_PLAY_CAMPAIGN_REWARD_USER_DATA_LIST_REQUEST = 0xD30C
|
||||||
|
GET_PLAY_CAMPAIGN_REWARD_USER_DATA_LIST_RESPONSE = 0xD30D
|
||||||
|
APPLY_FIRST_TICKET_PURCHASE_CAMPAIGN_REQUEST = 0xD30E
|
||||||
|
APPLY_FIRST_TICKET_PURCHASE_CAMPAIGN_RESPONSE = 0xD30F
|
||||||
|
GET_FIRST_TICKET_PURCHASE_CAMPAIGN_USER_DATA_REQUEST = 0xD310
|
||||||
|
GET_FIRST_TICKET_PURCHASE_CAMPAIGN_USER_DATA_RESPONSE = 0xD311
|
||||||
|
GET_LINKED_SITE_REG_CAMPAIGN_USER_DATA_REQUEST = 0xD312
|
||||||
|
GET_LINKED_SITE_REG_CAMPAIGN_USER_DATA_RESPONSE = 0xD313
|
||||||
|
GET_HERO_LOG_UNIT_USER_DATA_LIST_REQUEST = 0xD400
|
||||||
|
GET_HERO_LOG_UNIT_USER_DATA_LIST_RESPONSE = 0xD401
|
||||||
|
GET_CHARA_UNIT_USER_DATA_LIST_REQUEST = 0xD402
|
||||||
|
GET_CHARA_UNIT_USER_DATA_LIST_RESPONSE = 0xD403
|
||||||
|
BNID_SERIAL_CODE_CHECK_REQUEST = 0xD404
|
||||||
|
BNID_SERIAL_CODE_CHECK_RESPONSE = 0xD405
|
||||||
|
BNID_SERIAL_CODE_ENTRY_BY_APPENDIX_CARD_REQUEST = 0xD406
|
||||||
|
BNID_SERIAL_CODE_ENTRY_BY_APPENDIX_CARD_RESPONSE = 0xD407
|
||||||
|
GET_M_PLAYER_RANKS_REQUEST = 0xD500
|
||||||
|
GET_M_PLAYER_RANKS_RESPONSE = 0xD501
|
||||||
|
GET_M_TITLES_REQUEST = 0xD502
|
||||||
|
GET_M_TITLES_RESPONSE = 0xD503
|
||||||
|
GET_M_FRAGMENTS_REQUEST = 0xD504
|
||||||
|
GET_M_FRAGMENTS_RESPONSE = 0xD505
|
||||||
|
GET_M_REWARD_TABLES_REQUEST = 0xD506
|
||||||
|
GET_M_REWARD_TABLES_RESPONSE = 0xD507
|
||||||
|
GET_M_REWARD_SETS_REQUEST = 0xD508
|
||||||
|
GET_M_REWARD_SETS_RESPONSE = 0xD509
|
||||||
|
GET_M_UNANALYZED_LOG_GRADES_REQUEST = 0xD50A
|
||||||
|
GET_M_UNANALYZED_LOG_GRADES_RESPONSE = 0xD50B
|
||||||
|
GET_M_APPOINT_LEADER_PARAMS_REQUEST = 0xD50C
|
||||||
|
GET_M_APPOINT_LEADER_PARAMS_RESPONSE = 0xD50D
|
||||||
|
GET_M_APPOINT_LEADER_EFFECTS_REQUEST = 0xD50E
|
||||||
|
GET_M_APPOINT_LEADER_EFFECTS_RESPONSE = 0xD50F
|
||||||
|
GET_M_APPOINT_LEADER_EFFECT_TYPES_REQUEST = 0xD510
|
||||||
|
GET_M_APPOINT_LEADER_EFFECT_TYPES_RESPONSE = 0xD511
|
||||||
|
GET_M_RARITIES_REQUEST = 0xD512
|
||||||
|
GET_M_RARITIES_RESPONSE = 0xD513
|
||||||
|
GET_M_COMPOSITION_EVENTS_REQUEST = 0xD514
|
||||||
|
GET_M_COMPOSITION_EVENTS_RESPONSE = 0xD515
|
||||||
|
GET_M_COMPOSITION_PARAMS_REQUEST = 0xD516
|
||||||
|
GET_M_COMPOSITION_PARAMS_RESPONSE = 0xD517
|
||||||
|
GET_M_GAME_PLAY_PRICES_REQUEST = 0xD518
|
||||||
|
GET_M_GAME_PLAY_PRICES_RESPONSE = 0xD519
|
||||||
|
GET_M_BUY_TICKETS_REQUEST = 0xD51A
|
||||||
|
GET_M_BUY_TICKETS_RESPONSE = 0xD51B
|
||||||
|
GET_M_TIPS_REQUEST = 0xD51C
|
||||||
|
GET_M_TIPS_RESPONSE = 0xD51D
|
||||||
|
GET_M_CAPS_REQUEST = 0xD51E
|
||||||
|
GET_M_CAPS_RESPONSE = 0xD51F
|
||||||
|
GET_M_HERO_LOG_REQUEST = 0xD520
|
||||||
|
GET_M_HERO_LOG_RESPONSE = 0xD521
|
||||||
|
GET_M_HERO_LOG_LEVELS_REQUEST = 0xD522
|
||||||
|
GET_M_HERO_LOG_LEVELS_RESPONSE = 0xD523
|
||||||
|
GET_M_HERO_LOG_ROLES_REQUEST = 0xD524
|
||||||
|
GET_M_HERO_LOG_ROLES_RESPONSE = 0xD525
|
||||||
|
GET_M_HERO_LOG_TRUST_RANKS_REQUEST = 0xD526
|
||||||
|
GET_M_HERO_LOG_TRUST_RANKS_RESPONSE = 0xD527
|
||||||
|
GET_M_CHARAS_REQUEST = 0xD528
|
||||||
|
GET_M_CHARAS_RESPONSE = 0xD529
|
||||||
|
GET_M_CHARA_FRIENDLY_RANKS_REQUEST = 0xD52A
|
||||||
|
GET_M_CHARA_FRIENDLY_RANKS_RESPONSE = 0xD52B
|
||||||
|
GET_M_EQUIPMENTS_REQUEST = 0xD52C
|
||||||
|
GET_M_EQUIPMENTS_RESPONSE = 0xD52D
|
||||||
|
GET_M_EQUIPMENT_LEVELS_REQUEST = 0xD52E
|
||||||
|
GET_M_EQUIPMENT_LEVELS_RESPONSE = 0xD52F
|
||||||
|
GET_M_WEAPON_TYPES_REQUEST = 0xD530
|
||||||
|
GET_M_WEAPON_TYPES_RESPONSE = 0xD531
|
||||||
|
GET_M_ITEMS_REQUEST = 0xD532
|
||||||
|
GET_M_ITEMS_RESPONSE = 0xD533
|
||||||
|
GET_M_ITEM_TYPES_REQUEST = 0xD534
|
||||||
|
GET_M_ITEM_TYPES_RESPONSE = 0xD535
|
||||||
|
GET_M_BUFF_ITEMS_REQUEST = 0xD536
|
||||||
|
GET_M_BUFF_ITEMS_RESPONSE = 0xD537
|
||||||
|
GET_M_ENEMIES_REQUEST = 0xD538
|
||||||
|
GET_M_ENEMIES_RESPONSE = 0xD539
|
||||||
|
GET_M_ENEMY_SETS_REQUEST = 0xD53A
|
||||||
|
GET_M_ENEMY_SETS_RESPONSE = 0xD53B
|
||||||
|
GET_M_ENEMY_KINDS_REQUEST = 0xD53C
|
||||||
|
GET_M_ENEMY_KINDS_RESPONSE = 0xD53D
|
||||||
|
GET_M_ENEMY_CATEGORIES_REQUEST = 0xD53E
|
||||||
|
GET_M_ENEMY_CATEGORIES_RESPONSE = 0xD53F
|
||||||
|
GET_M_UNITS_REQUEST = 0xD540
|
||||||
|
GET_M_UNITS_RESPONSE = 0xD541
|
||||||
|
GET_M_UNIT_GIMMICKS_REQUEST = 0xD542
|
||||||
|
GET_M_UNIT_GIMMICKS_RESPONSE = 0xD543
|
||||||
|
GET_M_UNIT_COLLISIONS_REQUEST = 0xD544
|
||||||
|
GET_M_UNIT_COLLISIONS_RESPONSE = 0xD545
|
||||||
|
GET_M_UNIT_POWERS_REQUEST = 0xD546
|
||||||
|
GET_M_UNIT_POWERS_RESPONSE = 0xD547
|
||||||
|
GET_M_GIMMICK_ATTACKS_REQUEST = 0xD548
|
||||||
|
GET_M_GIMMICK_ATTACKS_RESPONSE = 0xD549
|
||||||
|
GET_M_CHARA_ATTACKS_REQUEST = 0xD54A
|
||||||
|
GET_M_CHARA_ATTACKS_RESPONSE = 0xD54B
|
||||||
|
GET_M_BOSS_ATTACKS_REQUEST = 0xD54C
|
||||||
|
GET_M_BOSS_ATTACKS_RESPONSE = 0xD54D
|
||||||
|
GET_M_MONSTER_ATTACKS_REQUEST = 0xD54E
|
||||||
|
GET_M_MONSTER_ATTACKS_RESPONSE = 0xD54F
|
||||||
|
GET_M_MONSTER_ACTIONS_REQUEST = 0xD550
|
||||||
|
GET_M_MONSTER_ACTIONS_RESPONSE = 0xD551
|
||||||
|
GET_M_PROPERTIES_REQUEST = 0xD552
|
||||||
|
GET_M_PROPERTIES_RESPONSE = 0xD553
|
||||||
|
GET_M_PROPERTY_TABLES_REQUEST = 0xD554
|
||||||
|
GET_M_PROPERTY_TABLES_RESPONSE = 0xD555
|
||||||
|
GET_M_PROPERTY_TYPES_REQUEST = 0xD556
|
||||||
|
GET_M_PROPERTY_TYPES_RESPONSE = 0xD557
|
||||||
|
GET_M_SKILLS_REQUEST = 0xD558
|
||||||
|
GET_M_SKILLS_RESPONSE = 0xD559
|
||||||
|
GET_M_SKILL_TABLES_REQUEST = 0xD55A
|
||||||
|
GET_M_SKILL_TABLES_RESPONSE = 0xD55B
|
||||||
|
GET_M_SKILL_LEVELS_REQUEST = 0xD55C
|
||||||
|
GET_M_SKILL_LEVELS_RESPONSE = 0xD55D
|
||||||
|
GET_M_AWAKENINGS_REQUEST = 0xD55E
|
||||||
|
GET_M_AWAKENINGS_RESPONSE = 0xD55F
|
||||||
|
GET_M_SYNCHRO_SKILLS_REQUEST = 0xD560
|
||||||
|
GET_M_SYNCHRO_SKILLS_RESPONSE = 0xD561
|
||||||
|
GET_M_SOUND_SKILL_CUT_IN_VOICES_REQUEST = 0xD562
|
||||||
|
GET_M_SOUND_SKILL_CUT_IN_VOICES_RESPONSE = 0xD563
|
||||||
|
GET_M_QUEST_SCENES_REQUEST = 0xD564
|
||||||
|
GET_M_QUEST_SCENES_RESPONSE = 0xD565
|
||||||
|
GET_M_QUEST_EXIST_UNITS_REQUEST = 0xD566
|
||||||
|
GET_M_QUEST_EXIST_UNITS_RESPONSE = 0xD567
|
||||||
|
GET_M_QUEST_EPISODE_APPEND_REWARDS_REQUEST = 0xD568
|
||||||
|
GET_M_QUEST_EPISODE_APPEND_REWARDS_RESPONSE = 0xD569
|
||||||
|
GET_M_SIDE_QUESTS_REQUEST = 0xD56A
|
||||||
|
GET_M_SIDE_QUESTS_RESPONSE = 0xD56B
|
||||||
|
GET_M_EPISODES_REQUEST = 0xD56C
|
||||||
|
GET_M_EPISODES_RESPONSE = 0xD56D
|
||||||
|
GET_M_EPISODE_CHAPTERS_REQUEST = 0xD56E
|
||||||
|
GET_M_EPISODE_CHAPTERS_RESPONSE = 0xD56F
|
||||||
|
GET_M_EPISODE_PARTS_REQUEST = 0xD570
|
||||||
|
GET_M_EPISODE_PARTS_RESPONSE = 0xD571
|
||||||
|
GET_M_TRIAL_TOWERS_REQUEST = 0xD572
|
||||||
|
GET_M_TRIAL_TOWERS_RESPONSE = 0xD573
|
||||||
|
GET_M_EX_TOWERS_REQUEST = 0xD574
|
||||||
|
GET_M_EX_TOWERS_RESPONSE = 0xD575
|
||||||
|
GET_M_EX_TOWER_QUESTS_REQUEST = 0xD576
|
||||||
|
GET_M_EX_TOWER_QUESTS_RESPONSE = 0xD577
|
||||||
|
GET_M_MENU_DISPLAY_ENEMIES_REQUEST = 0xD578
|
||||||
|
GET_M_MENU_DISPLAY_ENEMIES_RESPONSE = 0xD579
|
||||||
|
GET_M_MISSIONS_REQUEST = 0xD57A
|
||||||
|
GET_M_MISSIONS_RESPONSE = 0xD57B
|
||||||
|
GET_M_MISSION_TABLES_REQUEST = 0xD57C
|
||||||
|
GET_M_MISSION_TABLES_RESPONSE = 0xD57D
|
||||||
|
GET_M_MISSION_DIFFICULTIES_REQUEST = 0xD57E
|
||||||
|
GET_M_MISSION_DIFFICULTIES_RESPONSE = 0xD57F
|
||||||
|
GET_M_BATTLE_CAMERAS_REQUEST = 0xD580
|
||||||
|
GET_M_BATTLE_CAMERAS_RESPONSE = 0xD581
|
||||||
|
GET_M_CHAT_MAIN_STORIES_REQUEST = 0xD582
|
||||||
|
GET_M_CHAT_MAIN_STORIES_RESPONSE = 0xD583
|
||||||
|
GET_M_CHAT_SIDE_STORIES_REQUEST = 0xD584
|
||||||
|
GET_M_CHAT_SIDE_STORIES_RESPONSE = 0xD585
|
||||||
|
GET_M_CHAT_EVENT_STORIES_REQUEST = 0xD586
|
||||||
|
GET_M_CHAT_EVENT_STORIES_RESPONSE = 0xD587
|
||||||
|
GET_M_NAVIGATOR_CHARAS_REQUEST = 0xD588
|
||||||
|
GET_M_NAVIGATOR_CHARAS_RESPONSE = 0xD589
|
||||||
|
GET_M_NAVIGATOR_COMMENTS_REQUEST = 0xD58A
|
||||||
|
GET_M_NAVIGATOR_COMMENTS_RESPONSE = 0xD58B
|
||||||
|
GET_M_EX_BONUS_TABLES_REQUEST = 0xD58C
|
||||||
|
GET_M_EX_BONUS_TABLES_RESPONSE = 0xD58D
|
||||||
|
GET_M_EX_BONUS_CONDITIONS_REQUEST = 0xD58E
|
||||||
|
GET_M_EX_BONUS_CONDITIONS_RESPONSE = 0xD58F
|
||||||
|
GET_M_QUEST_RARE_DROPS_REQUEST = 0xD590
|
||||||
|
GET_M_QUEST_RARE_DROPS_RESPONSE = 0xD591
|
||||||
|
GET_M_QUEST_SPECIAL_RARE_DROP_SETTINGS_REQUEST = 0xD592
|
||||||
|
GET_M_QUEST_SPECIAL_RARE_DROP_SETTINGS_RESPONSE = 0xD593
|
||||||
|
GET_M_QUEST_SPECIAL_RARE_DROPS_REQUEST = 0xD594
|
||||||
|
GET_M_QUEST_SPECIAL_RARE_DROPS_RESPONSE = 0xD595
|
||||||
|
GET_M_QUEST_TUTORIALS_REQUEST = 0xD596
|
||||||
|
GET_M_QUEST_TUTORIALS_RESPONSE = 0xD597
|
||||||
|
GET_M_QUEST_PLAYER_TRACE_TABLES_REQUEST = 0xD598
|
||||||
|
GET_M_QUEST_PLAYER_TRACE_TABLES_RESPONSE = 0xD599
|
||||||
|
GET_M_QUEST_STILLS_REQUEST = 0xD59A
|
||||||
|
GET_M_QUEST_STILLS_RESPONSE = 0xD59B
|
||||||
|
GET_M_GASHAS_REQUEST = 0xD59C
|
||||||
|
GET_M_GASHAS_RESPONSE = 0xD59D
|
||||||
|
GET_M_GASHA_HEADERS_REQUEST = 0xD59E
|
||||||
|
GET_M_GASHA_HEADERS_RESPONSE = 0xD59F
|
||||||
|
GET_M_GASHA_LOTTERY_RARITIES_REQUEST = 0xD5A0
|
||||||
|
GET_M_GASHA_LOTTERY_RARITIES_RESPONSE = 0xD5A1
|
||||||
|
GET_M_GASHA_PRIZES_REQUEST = 0xD5A2
|
||||||
|
GET_M_GASHA_PRIZES_RESPONSE = 0xD5A3
|
||||||
|
GET_M_COMEBACK_EVENTS_REQUEST = 0xD5A4
|
||||||
|
GET_M_COMEBACK_EVENTS_RESPONSE = 0xD5A5
|
||||||
|
GET_M_AD_BANNERS_REQUEST = 0xD5A6
|
||||||
|
GET_M_AD_BANNERS_RESPONSE = 0xD5A7
|
||||||
|
GET_M_EVENTS_REQUEST = 0xD5A8
|
||||||
|
GET_M_EVENTS_RESPONSE = 0xD5A9
|
||||||
|
GET_M_TREASURE_HUNTS_REQUEST = 0xD5AA
|
||||||
|
GET_M_TREASURE_HUNTS_RESPONSE = 0xD5AB
|
||||||
|
GET_M_TREASURE_HUNT_WHOLE_TASKS_REQUEST = 0xD5AC
|
||||||
|
GET_M_TREASURE_HUNT_WHOLE_TASKS_RESPONSE = 0xD5AD
|
||||||
|
GET_M_TREASURE_HUNT_INDIVIDUAL_TASKS_REQUEST = 0xD5AE
|
||||||
|
GET_M_TREASURE_HUNT_INDIVIDUAL_TASKS_RESPONSE = 0xD5AF
|
||||||
|
GET_M_TREASURE_HUNT_SPECIAL_EFFECTS_REQUEST = 0xD5B0
|
||||||
|
GET_M_TREASURE_HUNT_SPECIAL_EFFECTS_RESPONSE = 0xD5B1
|
||||||
|
GET_M_TREASURE_HUNT_EVENT_POINT_REWARD_COMMON_REWARDS_REQUEST = 0xD5B2
|
||||||
|
GET_M_TREASURE_HUNT_EVENT_POINT_REWARD_COMMON_REWARDS_RESPONSE = 0xD5B3
|
||||||
|
GET_M_TREASURE_HUNT_EVENT_POINT_REWARD_TITLES_REQUEST = 0xD5B4
|
||||||
|
GET_M_TREASURE_HUNT_EVENT_POINT_REWARD_TITLES_RESPONSE = 0xD5B5
|
||||||
|
GET_M_TREASURE_HUNT_TASK_TEXTS_REQUEST = 0xD5B6
|
||||||
|
GET_M_TREASURE_HUNT_TASK_TEXTS_RESPONSE = 0xD5B7
|
||||||
|
GET_M_BNID_SERIAL_CODES_REQUEST = 0xD5B8
|
||||||
|
GET_M_BNID_SERIAL_CODES_RESPONSE = 0xD5B9
|
||||||
|
GET_M_BNID_SERIAL_CODE_REWARDS_REQUEST = 0xD5BA
|
||||||
|
GET_M_BNID_SERIAL_CODE_REWARDS_RESPONSE = 0xD5BB
|
||||||
|
GET_M_SUPPORT_LOG_REQUEST = 0xD5BC
|
||||||
|
GET_M_SUPPORT_LOG_RESPONSE = 0xD5BD
|
||||||
|
GET_M_SUPPORT_LOG_TYPES_REQUEST = 0xD5BE
|
||||||
|
GET_M_SUPPORT_LOG_TYPES_RESPONSE = 0xD5BF
|
||||||
|
GET_M_EPISODE_APPENDS_REQUEST = 0xD5C0
|
||||||
|
GET_M_EPISODE_APPENDS_RESPONSE = 0xD5C1
|
||||||
|
GET_M_QUEST_DEFRAG_MATCH_QUESTS_REQUEST = 0xD5C2
|
||||||
|
GET_M_QUEST_DEFRAG_MATCH_QUESTS_RESPONSE = 0xD5C3
|
||||||
|
GET_M_QUEST_DEFRAG_MATCH_QUEST_BOSS_TABLES_REQUEST = 0xD5C4
|
||||||
|
GET_M_QUEST_DEFRAG_MATCH_QUEST_BOSS_TABLES_RESPONSE = 0xD5C5
|
||||||
|
GET_M_DEFRAG_MATCHES_REQUEST = 0xD5C6
|
||||||
|
GET_M_DEFRAG_MATCHES_RESPONSE = 0xD5C7
|
||||||
|
GET_M_DEFRAG_MATCH_SEED_REQUEST = 0xD5C8
|
||||||
|
GET_M_DEFRAG_MATCH_SEED_RESPONSE = 0xD5C9
|
||||||
|
GET_M_DEFRAG_MATCH_SPECIAL_EFFECTS_REQUEST = 0xD5CA
|
||||||
|
GET_M_DEFRAG_MATCH_SPECIAL_EFFECTS_RESPONSE = 0xD5CB
|
||||||
|
GET_M_DEFRAG_MATCH_GRADES_REQUEST = 0xD5CC
|
||||||
|
GET_M_DEFRAG_MATCH_GRADES_RESPONSE = 0xD5CD
|
||||||
|
GET_M_DEFRAG_MATCH_CPU_UNITS_REQUEST = 0xD5CE
|
||||||
|
GET_M_DEFRAG_MATCH_CPU_UNITS_RESPONSE = 0xD5CF
|
||||||
|
GET_M_DEFRAG_MATCH_CPU_SUPPORT_LOGS_REQUEST = 0xD5D0
|
||||||
|
GET_M_DEFRAG_MATCH_CPU_SUPPORT_LOGS_RESPONSE = 0xD5D1
|
||||||
|
GET_M_DEFRAG_MATCH_PERIOD_BONUSES_REQUEST = 0xD5D2
|
||||||
|
GET_M_DEFRAG_MATCH_PERIOD_BONUSES_RESPONSE = 0xD5D3
|
||||||
|
GET_M_DEFRAG_MATCH_RANDOM_BONUS_TABLES_REQUEST = 0xD5D4
|
||||||
|
GET_M_DEFRAG_MATCH_RANDOM_BONUS_TABLES_RESPONSE = 0xD5D5
|
||||||
|
GET_M_DEFRAG_MATCH_RANDOM_BONUS_CONDITIONS_REQUEST = 0xD5D6
|
||||||
|
GET_M_DEFRAG_MATCH_RANDOM_BONUS_CONDITIONS_RESPONSE = 0xD5D7
|
||||||
|
GET_M_DEFRAG_MATCH_RARE_DROPS_REQUEST = 0xD5D8
|
||||||
|
GET_M_DEFRAG_MATCH_RARE_DROPS_RESPONSE = 0xD5D9
|
||||||
|
GET_M_YUI_MEDAL_SHOPS_REQUEST = 0xD5DA
|
||||||
|
GET_M_YUI_MEDAL_SHOPS_RESPONSE = 0xD5DB
|
||||||
|
GET_M_YUI_MEDAL_SHOP_ITEMS_REQUEST = 0xD5DC
|
||||||
|
GET_M_YUI_MEDAL_SHOP_ITEMS_RESPONSE = 0xD5DD
|
||||||
|
GET_M_EVENT_SCENES_REQUEST = 0xD5DE
|
||||||
|
GET_M_EVENT_SCENES_RESPONSE = 0xD5DF
|
||||||
|
GET_M_GENERIC_CAMPAIGN_PERIODS_REQUEST = 0xD5E0
|
||||||
|
GET_M_GENERIC_CAMPAIGN_PERIODS_RESPONSE = 0xD5E1
|
||||||
|
GET_M_BEGINNER_MISSIONS_REQUEST = 0xD5E2
|
||||||
|
GET_M_BEGINNER_MISSIONS_RESPONSE = 0xD5E3
|
||||||
|
GET_M_BEGINNER_MISSION_CONDITIONS_REQUEST = 0xD5E4
|
||||||
|
GET_M_BEGINNER_MISSION_CONDITIONS_RESPONSE = 0xD5E5
|
||||||
|
GET_M_BEGINNER_MISSION_REWARDS_REQUEST = 0xD5E6
|
||||||
|
GET_M_BEGINNER_MISSION_REWARDS_RESPONSE = 0xD5E7
|
||||||
|
GET_M_BEGINNER_MISSION_SEAT_CONDITIONS_REQUEST = 0xD5E8
|
||||||
|
GET_M_BEGINNER_MISSION_SEAT_CONDITIONS_RESPONSE = 0xD5E9
|
||||||
|
GET_M_BEGINNER_MISSION_SEAT_REWARDS_REQUEST = 0xD5EA
|
||||||
|
GET_M_BEGINNER_MISSION_SEAT_REWARDS_RESPONSE = 0xD5EB
|
||||||
|
GET_M_EVENT_ITEMS_REQUEST = 0xD5EC
|
||||||
|
GET_M_EVENT_ITEMS_RESPONSE = 0xD5ED
|
||||||
|
GET_M_EVENT_MONSTERS_REQUEST = 0xD5EE
|
||||||
|
GET_M_EVENT_MONSTERS_RESPONSE = 0xD5EF
|
||||||
|
GET_M_YUI_MEDAL_BONUSES_REQUEST = 0xD5F0
|
||||||
|
GET_M_YUI_MEDAL_BONUSES_RESPONSE = 0xD5F1
|
||||||
|
GET_M_YUI_MEDAL_BONUS_CONDITIONS_REQUEST = 0xD5F2
|
||||||
|
GET_M_YUI_MEDAL_BONUS_CONDITIONS_RESPONSE = 0xD5F3
|
||||||
|
GET_M_GASHA_MEDALS_REQUEST = 0xD5F4
|
||||||
|
GET_M_GASHA_MEDALS_RESPONSE = 0xD5F5
|
||||||
|
GET_M_GASHA_MEDAL_TYPES_REQUEST = 0xD5F6
|
||||||
|
GET_M_GASHA_MEDAL_TYPES_RESPONSE = 0xD5F7
|
||||||
|
GET_M_GASHA_MEDAL_SETTINGS_REQUEST = 0xD5F8
|
||||||
|
GET_M_GASHA_MEDAL_SETTINGS_RESPONSE = 0xD5F9
|
||||||
|
GET_M_GASHA_MEDAL_BONUSES_REQUEST = 0xD5FA
|
||||||
|
GET_M_GASHA_MEDAL_BONUSES_RESPONSE = 0xD5FB
|
||||||
|
GET_M_GASHA_MEDAL_SHOPS_REQUEST = 0xD5FC
|
||||||
|
GET_M_GASHA_MEDAL_SHOPS_RESPONSE = 0xD5FD
|
||||||
|
GET_M_GASHA_MEDAL_SHOP_ITEMS_REQUEST = 0xD5FE
|
||||||
|
GET_M_GASHA_MEDAL_SHOP_ITEMS_RESPONSE = 0xD5FF
|
||||||
|
GET_M_RES_EARN_CAMPAIGN_APPLICATIONS_REQUEST = 0xD600
|
||||||
|
GET_M_RES_EARN_CAMPAIGN_APPLICATIONS_RESPONSE = 0xD601
|
||||||
|
GET_M_RES_EARN_CAMPAIGN_APPLICATION_PRODUCTS_REQUEST = 0xD602
|
||||||
|
GET_M_RES_EARN_CAMPAIGN_APPLICATION_PRODUCTS_RESPONSE = 0xD603
|
||||||
|
GET_M_RES_EARN_CAMPAIGN_SHOPS_REQUEST = 0xD604
|
||||||
|
GET_M_RES_EARN_CAMPAIGN_SHOPS_RESPONSE = 0xD605
|
||||||
|
GET_M_RES_EARN_CAMPAIGN_SHOP_ITEMS_REQUEST = 0xD606
|
||||||
|
GET_M_RES_EARN_CAMPAIGN_SHOP_ITEMS_RESPONSE = 0xD607
|
||||||
|
GET_M_PAYING_YUI_MEDAL_BONUSES_REQUEST = 0xD608
|
||||||
|
GET_M_PAYING_YUI_MEDAL_BONUSES_RESPONSE = 0xD609
|
||||||
|
GET_M_AC_LOGIN_BONUSES_REQUEST = 0xD60A
|
||||||
|
GET_M_AC_LOGIN_BONUSES_RESPONSE = 0xD60B
|
||||||
|
GET_M_PLAY_CAMPAIGNS_REQUEST = 0xD60C
|
||||||
|
GET_M_PLAY_CAMPAIGNS_RESPONSE = 0xD60D
|
||||||
|
GET_M_PLAY_CAMPAIGN_REWARDS_REQUEST = 0xD60E
|
||||||
|
GET_M_PLAY_CAMPAIGN_REWARDS_RESPONSE = 0xD60F
|
||||||
|
GET_M_GASHA_FREE_CAMPAIGNS_REQUEST = 0xD610
|
||||||
|
GET_M_GASHA_FREE_CAMPAIGNS_RESPONSE = 0xD611
|
||||||
|
GET_M_QUEST_DROP_BOOST_CAMPAIGNS_REQUEST = 0xD612
|
||||||
|
GET_M_QUEST_DROP_BOOST_CAMPAIGNS_RESPONSE = 0xD613
|
||||||
|
GET_M_FIRST_TICKET_PURCHASE_CAMPAIGNS_REQUEST = 0xD614
|
||||||
|
GET_M_FIRST_TICKET_PURCHASE_CAMPAIGNS_RESPONSE = 0xD615
|
||||||
|
GET_M_LINKED_SITE_REG_CAMPAIGNS_REQUEST = 0xD616
|
||||||
|
GET_M_LINKED_SITE_REG_CAMPAIGNS_RESPONSE = 0xD617
|
||||||
|
GET_M_LINKED_SITE_REG_CAMPAIGN_REWARDS_REQUEST = 0xD618
|
||||||
|
GET_M_LINKED_SITE_REG_CAMPAIGN_REWARDS_RESPONSE = 0xD619
|
||||||
|
BIN
titles/sao/data/1/AcLoginBonuses.csv
Normal file
BIN
titles/sao/data/1/AcLoginBonuses.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/AdBanners.csv
Normal file
BIN
titles/sao/data/1/AdBanners.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/AppointLeaderEffect.csv
Normal file
BIN
titles/sao/data/1/AppointLeaderEffect.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/AppointLeaderEffectType.csv
Normal file
BIN
titles/sao/data/1/AppointLeaderEffectType.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/AppointLeaderParam.csv
Normal file
BIN
titles/sao/data/1/AppointLeaderParam.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/Awakening.csv
Normal file
BIN
titles/sao/data/1/Awakening.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/BattleCamera.csv
Normal file
BIN
titles/sao/data/1/BattleCamera.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/BeginnerMissionConditions.csv
Normal file
BIN
titles/sao/data/1/BeginnerMissionConditions.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/BeginnerMissionRewards.csv
Normal file
BIN
titles/sao/data/1/BeginnerMissionRewards.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/BeginnerMissionSeatConditions.csv
Normal file
BIN
titles/sao/data/1/BeginnerMissionSeatConditions.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/BeginnerMissionSeatRewards.csv
Normal file
BIN
titles/sao/data/1/BeginnerMissionSeatRewards.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/BeginnerMissions.csv
Normal file
BIN
titles/sao/data/1/BeginnerMissions.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/BnidSerialCodeRewards.csv
Normal file
BIN
titles/sao/data/1/BnidSerialCodeRewards.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/BnidSerialCodes.csv
Normal file
BIN
titles/sao/data/1/BnidSerialCodes.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/BossAttack.csv
Normal file
BIN
titles/sao/data/1/BossAttack.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/BuffItem.csv
Normal file
BIN
titles/sao/data/1/BuffItem.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/BuyTicket.csv
Normal file
BIN
titles/sao/data/1/BuyTicket.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/Cap.csv
Normal file
BIN
titles/sao/data/1/Cap.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/Chara.csv
Normal file
BIN
titles/sao/data/1/Chara.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/CharaAttack.csv
Normal file
BIN
titles/sao/data/1/CharaAttack.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/CharaComment.csv
Normal file
BIN
titles/sao/data/1/CharaComment.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/CharaFriendlyRank.csv
Normal file
BIN
titles/sao/data/1/CharaFriendlyRank.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/ChatEventStory.csv
Normal file
BIN
titles/sao/data/1/ChatEventStory.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/ChatMainStory.csv
Normal file
BIN
titles/sao/data/1/ChatMainStory.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/ChatSideStory.csv
Normal file
BIN
titles/sao/data/1/ChatSideStory.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/ComebackEvent.csv
Normal file
BIN
titles/sao/data/1/ComebackEvent.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/CompositionEvent.csv
Normal file
BIN
titles/sao/data/1/CompositionEvent.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/CompositionParam.csv
Normal file
BIN
titles/sao/data/1/CompositionParam.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/CostumeType.csv
Normal file
BIN
titles/sao/data/1/CostumeType.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/DebugValidator.csv
Normal file
BIN
titles/sao/data/1/DebugValidator.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/DefragMatchAIPattern.csv
Normal file
BIN
titles/sao/data/1/DefragMatchAIPattern.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/DefragMatchBossTable.csv
Normal file
BIN
titles/sao/data/1/DefragMatchBossTable.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/DefragMatchChat.csv
Normal file
BIN
titles/sao/data/1/DefragMatchChat.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/DefragMatchCpuSupportLogs.csv
Normal file
BIN
titles/sao/data/1/DefragMatchCpuSupportLogs.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/DefragMatchCpuUnits.csv
Normal file
BIN
titles/sao/data/1/DefragMatchCpuUnits.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/DefragMatchGrade.csv
Normal file
BIN
titles/sao/data/1/DefragMatchGrade.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/DefragMatchPeriodBonuses.csv
Normal file
BIN
titles/sao/data/1/DefragMatchPeriodBonuses.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/DefragMatchQuest.csv
Normal file
BIN
titles/sao/data/1/DefragMatchQuest.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/DefragMatchRandomBonusConditions.csv
Normal file
BIN
titles/sao/data/1/DefragMatchRandomBonusConditions.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/DefragMatchRandomBonusTables.csv
Normal file
BIN
titles/sao/data/1/DefragMatchRandomBonusTables.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/DefragMatchRareDrops.csv
Normal file
BIN
titles/sao/data/1/DefragMatchRareDrops.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/DefragMatchSeed.csv
Normal file
BIN
titles/sao/data/1/DefragMatchSeed.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/DefragMatchSpecialEffects.csv
Normal file
BIN
titles/sao/data/1/DefragMatchSpecialEffects.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/DefragMatchs.csv
Normal file
BIN
titles/sao/data/1/DefragMatchs.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/Enemy.csv
Normal file
BIN
titles/sao/data/1/Enemy.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/EnemyKind.csv
Normal file
BIN
titles/sao/data/1/EnemyKind.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/EnemySet.csv
Normal file
BIN
titles/sao/data/1/EnemySet.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/Episode.csv
Normal file
BIN
titles/sao/data/1/Episode.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/EpisodeAppends.csv
Normal file
BIN
titles/sao/data/1/EpisodeAppends.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/EpisodeChapter.csv
Normal file
BIN
titles/sao/data/1/EpisodeChapter.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/EpisodePart.csv
Normal file
BIN
titles/sao/data/1/EpisodePart.csv
Normal file
Binary file not shown.
|
Binary file not shown.
BIN
titles/sao/data/1/EquipmentLevel.csv
Normal file
BIN
titles/sao/data/1/EquipmentLevel.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/Event.csv
Normal file
BIN
titles/sao/data/1/Event.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/EventItems.csv
Normal file
BIN
titles/sao/data/1/EventItems.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/EventMonsters.csv
Normal file
BIN
titles/sao/data/1/EventMonsters.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/EventScenes.csv
Normal file
BIN
titles/sao/data/1/EventScenes.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/ExBonusCondition.csv
Normal file
BIN
titles/sao/data/1/ExBonusCondition.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/ExBonusTable.csv
Normal file
BIN
titles/sao/data/1/ExBonusTable.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/ExTowerQuests.csv
Normal file
BIN
titles/sao/data/1/ExTowerQuests.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/ExTowers.csv
Normal file
BIN
titles/sao/data/1/ExTowers.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/FirstTicketPurchaseCampaigns.csv
Normal file
BIN
titles/sao/data/1/FirstTicketPurchaseCampaigns.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/FixedFormChat.csv
Normal file
BIN
titles/sao/data/1/FixedFormChat.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/FixedFormChatText.csv
Normal file
BIN
titles/sao/data/1/FixedFormChatText.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/Fragment.csv
Normal file
BIN
titles/sao/data/1/Fragment.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/GamePlayPrice.csv
Normal file
BIN
titles/sao/data/1/GamePlayPrice.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/GashaFreeCampaigns.csv
Normal file
BIN
titles/sao/data/1/GashaFreeCampaigns.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/GashaMedalBonuses.csv
Normal file
BIN
titles/sao/data/1/GashaMedalBonuses.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/GashaMedalSettings.csv
Normal file
BIN
titles/sao/data/1/GashaMedalSettings.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/GashaMedalShopItems.csv
Normal file
BIN
titles/sao/data/1/GashaMedalShopItems.csv
Normal file
Binary file not shown.
|
Binary file not shown.
BIN
titles/sao/data/1/GashaMedalTypes.csv
Normal file
BIN
titles/sao/data/1/GashaMedalTypes.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/GashaMedals.csv
Normal file
BIN
titles/sao/data/1/GashaMedals.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/GenericCampaignPeriods.csv
Normal file
BIN
titles/sao/data/1/GenericCampaignPeriods.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/GimmickAttack.csv
Normal file
BIN
titles/sao/data/1/GimmickAttack.csv
Normal file
Binary file not shown.
|
Binary file not shown.
BIN
titles/sao/data/1/HeroLogLevel.csv
Normal file
BIN
titles/sao/data/1/HeroLogLevel.csv
Normal file
Binary file not shown.
|
BIN
titles/sao/data/1/HeroLogRole.csv
Normal file
BIN
titles/sao/data/1/HeroLogRole.csv
Normal file
Binary file not shown.
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user