code = CustomColumn(db.String(32), primary_key=True, mapper_key="코드") # Link seal option to table. Used to reference the table later. # This is done in the update_database.py loop. seal_option_type = CustomColumn(db.Enum(SealOptionType), nullable=False, mapper_key="_seal_option_type") # Add columns with data dynamically for i in range(0, 63): # Option code setattr( SealOption, f"option_{i}_code", CustomColumn(db.String(32), db.ForeignKey("seal_option_data.code"), mapper_key=f"옵션코드{i}")) # Option probability setattr( SealOption, f"option_{i}_chance", CustomColumn(db.Float, mapper_key=f"확률{i}", transform=(lambda v: florensia_probability_transform(v) if v != 0 else None))) # Option relationship setattr( SealOption, f"option_{i}", db.relationship("SealOptionData", foreign_keys=[getattr(SealOption,
class Essence( db.Model, BaseMixin, BonusMixin, DroppedByMixin, NeededForMixin, ProducedByMixin, RandomBoxMixin, ): __tablename__ = "essence" _mapper_utils = { "files": { "server": ["s_ArtifactItem.bin"], "client": ["c_ArtifactRes.bin"], "string": ["ArtifactStr.dat"], }, } equip_type = CustomColumn(db.Enum(EssenceEquipType), nullable=False, mapper_key="장착대상", transform=lambda v: EssenceEquipType(int(v))) required_weapon_level = CustomColumn(db.Integer, nullable=False, mapper_key="육상LV") is_core_essence = CustomColumn(db.Boolean, nullable=False, mapper_key="AtI타입") mounting_cost = CustomColumn(db.Integer, nullable=False, mapper_key="고정비용") mounting_item_level_cost = CustomColumn(db.Integer, nullable=False, mapper_key="LV비용") mounting_unit_cost = CustomColumn(db.Integer, nullable=False, mapper_key="비용단위") def to_dict(self, minimal: bool = False) -> dict: minimal_dict = { **BaseMixin.to_dict(self, minimal), **BonusMixin.to_dict(self), "equip_type": self.equip_type.to_dict(), "is_core_essence": self.is_core_essence, "required_weapon_level": self.required_weapon_level, } if minimal: return minimal_dict return { **minimal_dict, **DroppedByMixin.to_dict(self), **ProducedByMixin.to_dict(self), **NeededForMixin.to_dict(self), **RandomBoxMixin.to_dict(self), }
class Npc(db.Model): __tablename__ = "npc" _mapper_utils = { "files": { "server": [ "s_MerchantChar.bin", "s_GuardChar.bin", "s_CitizenChar.bin" ], "client": [ "c_MerchantCharRes.bin", "c_GuardCharRes.bin", "c_CitizenCharRes.bin" ], "string": [ "MerchantCharStr.dat", "GuardCharStr.dat", "CitizenCharStr.dat" ], }, "options": { "image_key": "모델명" } } index = db.Column(db.Integer, nullable=False) code = CustomColumn(db.String(32), primary_key=True, nullable=False, mapper_key="코드") name = CustomColumn(db.String(128), nullable=False, mapper_key="_name") icon = CustomColumn(db.String(128), nullable=False, mapper_key="_icon") level = CustomColumn(db.Integer, nullable=False, mapper_key="기준레벨") shop_items = db.relationship( "NpcShopItem", primaryjoin="foreign(NpcShopItem.npc_code) == Npc.code" ) quests = db.relationship( "Quest", primaryjoin="foreign(Quest.start_npc_code) == Npc.code" ) def to_dict(self, minimal: bool = False) -> dict: minimal_dict = { "code": self.code, "name": self.name, "icon": self.icon, "level": self.level, } if minimal: return minimal_dict return { **minimal_dict, "shop_items": [shop_item.to_dict(item_dict=True) for shop_item in self.shop_items # Some NPCs sell items that do no longer exist # or are not included in the database (like # commerce goods), so those will be filtered # out for now to prevent errors. if shop_item.item], "quests": [quest.to_dict(minimal=True) for quest in self.quests], }
"operator": self.operator, "intervalls": intervalls, } # Dynamically add all those columns to the model COLUMN_NAMES = [ "Interval0101", "Interval0102", "Interval0103", "Interval0104", "Interval0105", "Interval0201", "Interval0202", "Interval0203", "Interval0204", "Interval0205", "Interval0301", "Interval0302", "Interval0303", "Interval0304", "Interval0305", "Interval0401", "Interval0402", "Interval0403", "Interval0404", "Interval0405", "Interval0501", "Interval0502", "Interval0503", "Interval0504", "Interval0505", "Interval0601", "Interval0602", "Interval0603", "Interval0604", "Interval0605", "Interval0701", "Interval0702", "Interval0703", "Interval0704", "Interval0705", "Interval0801", "Interval0802", "Interval0803", "Interval0804", "Interval0805", "Interval0901", "Interval0902", "Interval0903", "Interval0904", "Interval0905", "Interval1001", "Interval1002", "Interval1003", "Interval1004", "Interval1005", "Interval1101", "Interval1102", "Interval1103", "Interval1104", "Interval1105" ] for column_name in COLUMN_NAMES: setattr( SealOptionData, column_name.lower(), CustomColumn(db.Float, mapper_key=column_name, transform=lambda v: convert_integer(v) if v != 0 else None))
class Recipe( db.Model, BaseMixin, DroppedByMixin, RandomBoxMixin, SoldByMixin, ): __tablename__ = "recipe" _mapper_utils = { "files": { "server": ["s_RecipeItem.bin"], "client": ["c_RecipeItemRes.bin"], "string": ["RecipeItemStr.dat"] }, } result_item_code = CustomColumn(db.String(32), db.ForeignKey("item_list.code"), nullable=False, mapper_key="결과물코드") result_item_quantity = CustomColumn(db.Integer, nullable=False, mapper_key="결과물수량") result_item = db.relationship("ItemList", foreign_keys=[result_item_code]) # Material 1 material_1_code = CustomColumn(db.String(32), db.ForeignKey("item_list.code"), mapper_key="재료1", transform=lambda v: v if v != "#" else None) material_1_quantity = CustomColumn(db.Integer, mapper_key="필요량1", transform=lambda v: v if v != 0 else None) material_1 = db.relationship("ItemList", foreign_keys=[material_1_code]) # Material 2 material_2_code = CustomColumn(db.String(32), db.ForeignKey("item_list.code"), mapper_key="재료2", transform=lambda v: v if v != "#" else None) material_2_quantity = CustomColumn(db.Integer, mapper_key="필요량2", transform=lambda v: v if v != 0 else None) material_2 = db.relationship("ItemList", foreign_keys=[material_2_code]) # Material 3 material_3_code = CustomColumn(db.String(32), db.ForeignKey("item_list.code"), mapper_key="재료3", transform=lambda v: v if v != "#" else None) material_3_quantity = CustomColumn(db.Integer, mapper_key="필요량3", transform=lambda v: v if v != 0 else None) material_3 = db.relationship("ItemList", foreign_keys=[material_3_code]) # Material 4 material_4_code = CustomColumn(db.String(32), db.ForeignKey("item_list.code"), mapper_key="재료4", transform=lambda v: v if v != "#" else None) material_4_quantity = CustomColumn(db.Integer, mapper_key="필요량4", transform=lambda v: v if v != 0 else None) material_4 = db.relationship("ItemList", foreign_keys=[material_4_code]) # Material 5 material_5_code = CustomColumn(db.String(32), db.ForeignKey("item_list.code"), mapper_key="재료5", transform=lambda v: v if v != "#" else None) material_5_quantity = CustomColumn(db.Integer, mapper_key="필요량5", transform=lambda v: v if v != 0 else None) material_5 = db.relationship("ItemList", foreign_keys=[material_5_code]) # Material 6 material_6_code = CustomColumn(db.String(32), db.ForeignKey("item_list.code"), mapper_key="재료6", transform=lambda v: v if v != "#" else None) material_6_quantity = CustomColumn(db.Integer, mapper_key="필요량6", transform=lambda v: v if v != 0 else None) material_6 = db.relationship("ItemList", foreign_keys=[material_6_code]) def to_dict(self, minimal: bool = False) -> dict: minimal_dict = BaseMixin.to_dict(self, minimal) if minimal: return minimal_dict materials = [] for i in range(1, 7): material_code = getattr(self, f"material_{i}_code") if material_code: materials.append({ "item": getattr(self, f"material_{i}").to_dict(), "quantity": getattr(self, f"material_{i}_quantity"), }) return { **minimal_dict, "result_item": self.result_item.to_dict(), "result_item_quantity": self.result_item_quantity, "materials": materials, **DroppedByMixin.to_dict(self), **SoldByMixin.to_dict(self), **RandomBoxMixin.to_dict(self), }
def bonus_5_operator(cls): return CustomColumn( String(4), mapper_key="수치연산자_5", transform=lambda v: v if v != "#" else None)
def bonus_5_code(cls): return CustomColumn( Enum(EffectCode), mapper_key="효과코드_5", transform=lambda v: EffectCode(v) if v != MAX_INT else None)
def bonus_4_value(cls): return CustomColumn( Float, mapper_key="효과값_4", transform=bonus_value_transform)
def magic_defense(cls): return CustomColumn(Integer, nullable=False, mapper_key="마항력")
def physical_defense(cls): return CustomColumn(Integer, nullable=False, mapper_key="물방력")