Beispiel #1
0
    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,
Beispiel #2
0
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),
        }
Beispiel #3
0
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],
        }
Beispiel #4
0
            "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))
Beispiel #5
0
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),
        }
Beispiel #6
0
 def bonus_5_operator(cls):
     return CustomColumn(
         String(4), mapper_key="수치연산자_5",
         transform=lambda v: v if v != "#" else None)
Beispiel #7
0
 def bonus_5_code(cls):
     return CustomColumn(
         Enum(EffectCode), mapper_key="효과코드_5",
         transform=lambda v: EffectCode(v) if v != MAX_INT else None)
Beispiel #8
0
 def bonus_4_value(cls):
     return CustomColumn(
         Float, mapper_key="효과값_4",
         transform=bonus_value_transform)
Beispiel #9
0
 def magic_defense(cls):
     return CustomColumn(Integer, nullable=False, mapper_key="마항력")
Beispiel #10
0
 def physical_defense(cls):
     return CustomColumn(Integer, nullable=False, mapper_key="물방력")