Files
NewWPSBot/Plugins/WPSCrystalSystem/crystal_models.py

288 lines
9.1 KiB
Python

"""Core data models and default configuration for the crystal system."""
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Dict, List, Mapping, Optional, Sequence, Tuple
from Plugins.WPSAlchemyGame import WPSAlchemyGame
from Plugins.WPSBackpackSystem import BackpackItemTier
from Plugins.WPSGardenSystem import GardenCropDefinition, GardenExtraReward
@dataclass(frozen=True)
class CrystalItemDefinition:
"""Definition of a crystal-related item."""
item_id: str
name: str
tier: BackpackItemTier
description: str
@dataclass(frozen=True)
class CrystalRecipeStage:
"""A single stage recipe that is registered into the alchemy system."""
identifier: str
materials: Tuple[str, str, str]
result_item: str
fail_item: str
base_success_rate: float
description: str = ""
@dataclass(frozen=True)
class CrystalWaitStage:
"""A stage describing a delayed transformation outside the alchemy system."""
identifier: str
consumed_items: Mapping[str, int]
produced_item: str
delay_minutes: int
message: str = ""
@dataclass(frozen=True)
class CrystalFinalFusion:
"""Final fusion recipe that converts scrolls and base crystals to coloured crystals."""
identifier: str
materials: Tuple[str, str, str]
result_item: str
fail_item: str
base_success_rate: float
description: str = ""
@dataclass(frozen=True)
class CrystalExchangeEntry:
"""Definition of a crystal barter/exchange offer."""
identifier: str
required_items: Mapping[str, int]
reward_item: str
reward_amount: int = 1
metadata: Mapping[str, str] = field(default_factory=dict)
@dataclass(frozen=True)
class CrystalColorDefinition:
"""Full definition for a colour pipeline."""
color_key: str
display_name: str
chain_stages: Sequence[CrystalRecipeStage]
wait_stage: CrystalWaitStage
final_fusion: CrystalFinalFusion
CRYSTAL_BASE_ITEM_ID = "crystal_base_core"
CRYSTAL_BASE_SCROLL_ID = "crystal_base_scroll"
CRYSTAL_TINT_POWDER_ID = "crystal_tint_powder"
CRYSTAL_RESONANCE_POWDER_ID = "crystal_resonance_powder"
CRYSTAL_TREE_SEED_ID = "crystal_seed_tree"
CRYSTAL_TREE_FRUIT_ID = "crystal_fruit_glimmer"
CRYSTAL_TREE_DISPLAY_NAME = "水晶树"
def _build_black_color_definition() -> CrystalColorDefinition:
"""Construct default chain definition for black crystal."""
stage1 = CrystalRecipeStage(
identifier="black_stage_1",
materials=(
WPSAlchemyGame.ASH_ITEM_ID,
WPSAlchemyGame.ASH_ITEM_ID,
CRYSTAL_TINT_POWDER_ID,
),
result_item="crystal_black_dust_stage1",
fail_item=WPSAlchemyGame.ASH_ITEM_ID,
base_success_rate=0.9,
description="将炉灰与变色粉尘融合成初阶黑色粉尘。",
)
stage2 = CrystalRecipeStage(
identifier="black_stage_2",
materials=(
stage1.result_item,
stage1.result_item,
CRYSTAL_RESONANCE_POWDER_ID,
),
result_item="crystal_black_dust_stage2",
fail_item=WPSAlchemyGame.ASH_ITEM_ID,
base_success_rate=0.75,
description="压缩初阶粉尘并注入共鸣粉形成高阶粉尘。",
)
scroll_stage = CrystalRecipeStage(
identifier="black_scroll_alchemy",
materials=(
stage2.result_item,
stage2.result_item,
CRYSTAL_BASE_SCROLL_ID,
),
result_item="crystal_black_scroll",
fail_item=WPSAlchemyGame.ASH_ITEM_ID,
base_success_rate=0.65,
description="将高阶粉尘灌注到卷轴之上,得出黑色变色卷轴。",
)
wait_stage = CrystalWaitStage(
identifier="black_scroll_darkening",
consumed_items={
WPSAlchemyGame.ASH_ITEM_ID: 99,
"crystal_black_scroll": 1,
},
produced_item="crystal_black_scroll_charged",
delay_minutes=60,
message="黑色变色卷轴正在吸收阴焰,预计一小时后完成。",
)
final_fusion = CrystalFinalFusion(
identifier="black_crystal_fusion",
materials=(
wait_stage.produced_item,
wait_stage.produced_item,
CRYSTAL_BASE_ITEM_ID,
),
result_item="crystal_black_core",
fail_item=WPSAlchemyGame.ASH_ITEM_ID,
base_success_rate=0.7,
description="两张黑色卷轴共鸣后唤醒基础晶核,形成黑水晶。",
)
return CrystalColorDefinition(
color_key="black",
display_name="黑色水晶",
chain_stages=[stage1, stage2, scroll_stage],
wait_stage=wait_stage,
final_fusion=final_fusion,
)
DEFAULT_CRYSTAL_ITEMS: Dict[str, CrystalItemDefinition] = {
CRYSTAL_BASE_ITEM_ID: CrystalItemDefinition(
item_id=CRYSTAL_BASE_ITEM_ID,
name="未调谐晶核",
tier=BackpackItemTier.RARE,
description="天然形成的晶核,等待注入颜色与秩序。",
),
CRYSTAL_BASE_SCROLL_ID: CrystalItemDefinition(
item_id=CRYSTAL_BASE_SCROLL_ID,
name="空白变色卷轴",
tier=BackpackItemTier.RARE,
description="允许运色粉尘封印其上,作为变色的载体。",
),
CRYSTAL_TINT_POWDER_ID: CrystalItemDefinition(
item_id=CRYSTAL_TINT_POWDER_ID,
name="变色粉尘",
tier=BackpackItemTier.COMMON,
description="常见的变色媒介,可与炉灰混合产生初阶粉尘。",
),
CRYSTAL_RESONANCE_POWDER_ID: CrystalItemDefinition(
item_id=CRYSTAL_RESONANCE_POWDER_ID,
name="共鸣粉末",
tier=BackpackItemTier.RARE,
description="能触发粉尘的共鸣性,有助于稳定高阶色谱。",
),
CRYSTAL_TREE_SEED_ID: CrystalItemDefinition(
item_id=CRYSTAL_TREE_SEED_ID,
name=f"{CRYSTAL_TREE_DISPLAY_NAME}的种子",
tier=BackpackItemTier.LEGENDARY,
description=f"{CRYSTAL_TREE_DISPLAY_NAME}的种子,可在菜园培育晶体之树。",
),
CRYSTAL_TREE_FRUIT_ID: CrystalItemDefinition(
item_id=CRYSTAL_TREE_FRUIT_ID,
name=f"{CRYSTAL_TREE_DISPLAY_NAME}的果实",
tier=BackpackItemTier.LEGENDARY,
description=f"{CRYSTAL_TREE_DISPLAY_NAME}结出的果实,可作为高级炼金材料。",
),
"crystal_black_dust_stage1": CrystalItemDefinition(
item_id="crystal_black_dust_stage1",
name="黑色粉尘-初阶",
tier=BackpackItemTier.RARE,
description="微量黑色素的粉尘,需要进一步压缩。",
),
"crystal_black_dust_stage2": CrystalItemDefinition(
item_id="crystal_black_dust_stage2",
name="黑色粉尘-高阶",
tier=BackpackItemTier.EPIC,
description="高纯度黑色粉尘,可用于制作黑色卷轴。",
),
"crystal_black_scroll": CrystalItemDefinition(
item_id="crystal_black_scroll",
name="黑色变色卷轴",
tier=BackpackItemTier.EPIC,
description="封装黑色粉尘力量的卷轴,但仍需阴焰淬炼。",
),
"crystal_black_scroll_charged": CrystalItemDefinition(
item_id="crystal_black_scroll_charged",
name="淬炼黑色卷轴",
tier=BackpackItemTier.EPIC,
description="经历阴焰淬炼的黑色卷轴,适合唤醒晶核。",
),
"crystal_black_core": CrystalItemDefinition(
item_id="crystal_black_core",
name="黑水晶",
tier=BackpackItemTier.LEGENDARY,
description="浓缩黑暗能量的晶体,可在多系统中作为高级材料。",
),
}
DEFAULT_CRYSTAL_COLOR_MAP: Dict[str, CrystalColorDefinition] = {
"black": _build_black_color_definition(),
}
DEFAULT_CRYSTAL_EXCHANGE_ENTRIES: Dict[str, CrystalExchangeEntry] = {
"exchange_black_scroll": CrystalExchangeEntry(
identifier="exchange_black_scroll",
required_items={
"crystal_black_dust_stage2": 2,
"crystal_tint_powder": 5,
},
reward_item="crystal_black_scroll",
metadata={
"category": "scroll",
"display_name": "黑色变色卷轴兑换",
},
),
"exchange_black_core": CrystalExchangeEntry(
identifier="exchange_black_core",
required_items={
"crystal_black_scroll_charged": 1,
CRYSTAL_BASE_ITEM_ID: 1,
"combat_material_crystal": 2,
},
reward_item="crystal_black_core",
metadata={
"category": "crystal",
"display_name": "黑水晶兑换",
},
),
}
def build_default_crystal_crops() -> List[GardenCropDefinition]:
"""Return the default crystal-themed garden crops."""
crystal_tree = GardenCropDefinition(
seed_id=CRYSTAL_TREE_SEED_ID,
fruit_id=CRYSTAL_TREE_FRUIT_ID,
display_name=CRYSTAL_TREE_DISPLAY_NAME,
tier="legendary",
growth_minutes=480,
seed_price=600,
base_yield=2,
extra_reward=GardenExtraReward(
kind="points",
payload={"min": 300, "max": 900},
base_rate=0.35,
),
extra_item_id=None,
wine_item_id=None,
wine_tier=None,
)
return [crystal_tree]