"""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, ) def _build_green_color_definition() -> CrystalColorDefinition: """Construct default chain definition for green crystal.""" stage1 = CrystalRecipeStage( identifier="green_stage_1", materials=( "combat_fruit_battle_flower", "combat_fruit_battle_flower", CRYSTAL_TINT_POWDER_ID, ), result_item="crystal_green_dust_stage1", fail_item=WPSAlchemyGame.ASH_ITEM_ID, base_success_rate=0.9, description="将战斗之花果实与变色粉尘融合成初阶绿色粉尘。", ) stage2 = CrystalRecipeStage( identifier="green_stage_2", materials=( stage1.result_item, stage1.result_item, CRYSTAL_RESONANCE_POWDER_ID, ), result_item="crystal_green_dust_stage2", fail_item=WPSAlchemyGame.ASH_ITEM_ID, base_success_rate=0.75, description="压缩初阶粉尘并注入共鸣粉形成高阶粉尘。", ) scroll_stage = CrystalRecipeStage( identifier="green_scroll_alchemy", materials=( stage2.result_item, stage2.result_item, CRYSTAL_BASE_SCROLL_ID, ), result_item="crystal_green_scroll", fail_item=WPSAlchemyGame.ASH_ITEM_ID, base_success_rate=0.65, description="将高阶粉尘灌注到卷轴之上,得出绿色变色卷轴。", ) wait_stage = CrystalWaitStage( identifier="green_scroll_nurturing", consumed_items={ "combat_fruit_battle_flower": 3, "crystal_green_scroll": 1, }, produced_item="crystal_green_scroll_charged", delay_minutes=40, message="绿色变色卷轴正在吸收自然能量,预计40分钟后完成。", ) final_fusion = CrystalFinalFusion( identifier="green_crystal_fusion", materials=( wait_stage.produced_item, wait_stage.produced_item, CRYSTAL_BASE_ITEM_ID, ), result_item="crystal_green_core", fail_item=WPSAlchemyGame.ASH_ITEM_ID, base_success_rate=0.7, description="两张绿色卷轴共鸣后唤醒基础晶核,形成绿水晶。", ) return CrystalColorDefinition( color_key="green", display_name="绿色水晶", chain_stages=[stage1, stage2, scroll_stage], wait_stage=wait_stage, final_fusion=final_fusion, ) def _build_orange_color_definition() -> CrystalColorDefinition: """Construct default chain definition for orange crystal.""" stage1 = CrystalRecipeStage( identifier="orange_stage_1", materials=( "combat_material_essence", "combat_material_essence", CRYSTAL_TINT_POWDER_ID, ), result_item="crystal_orange_dust_stage1", fail_item=WPSAlchemyGame.ASH_ITEM_ID, base_success_rate=0.85, description="将精华与变色粉尘融合成初阶橙色粉尘。", ) stage2 = CrystalRecipeStage( identifier="orange_stage_2", materials=( stage1.result_item, stage1.result_item, CRYSTAL_RESONANCE_POWDER_ID, ), result_item="crystal_orange_dust_stage2", fail_item=WPSAlchemyGame.ASH_ITEM_ID, base_success_rate=0.75, description="压缩初阶粉尘并注入共鸣粉形成高阶粉尘。", ) scroll_stage = CrystalRecipeStage( identifier="orange_scroll_alchemy", materials=( stage2.result_item, stage2.result_item, CRYSTAL_BASE_SCROLL_ID, ), result_item="crystal_orange_scroll", fail_item=WPSAlchemyGame.ASH_ITEM_ID, base_success_rate=0.65, description="将高阶粉尘灌注到卷轴之上,得出橙色变色卷轴。", ) wait_stage = CrystalWaitStage( identifier="orange_scroll_energizing", consumed_items={ "combat_material_essence": 2, "crystal_orange_scroll": 1, }, produced_item="crystal_orange_scroll_charged", delay_minutes=55, message="橙色变色卷轴正在吸收活力能量,预计55分钟后完成。", ) final_fusion = CrystalFinalFusion( identifier="orange_crystal_fusion", materials=( wait_stage.produced_item, wait_stage.produced_item, CRYSTAL_BASE_ITEM_ID, ), result_item="crystal_orange_core", fail_item=WPSAlchemyGame.ASH_ITEM_ID, base_success_rate=0.7, description="两张橙色卷轴共鸣后唤醒基础晶核,形成橙水晶。", ) return CrystalColorDefinition( color_key="orange", 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="浓缩黑暗能量的晶体,可在多系统中作为高级材料。", ), # 绿色水晶相关物品 "crystal_green_dust_stage1": CrystalItemDefinition( item_id="crystal_green_dust_stage1", name="绿色粉尘-初阶", tier=BackpackItemTier.RARE, description="微量绿色素的粉尘,需要进一步压缩。", ), "crystal_green_dust_stage2": CrystalItemDefinition( item_id="crystal_green_dust_stage2", name="绿色粉尘-高阶", tier=BackpackItemTier.EPIC, description="高纯度绿色粉尘,可用于制作绿色卷轴。", ), "crystal_green_scroll": CrystalItemDefinition( item_id="crystal_green_scroll", name="绿色变色卷轴", tier=BackpackItemTier.EPIC, description="封装绿色粉尘力量的卷轴,但仍需自然能量淬炼。", ), "crystal_green_scroll_charged": CrystalItemDefinition( item_id="crystal_green_scroll_charged", name="淬炼绿色卷轴", tier=BackpackItemTier.EPIC, description="经历自然能量淬炼的绿色卷轴,适合唤醒晶核。", ), "crystal_green_core": CrystalItemDefinition( item_id="crystal_green_core", name="绿水晶", tier=BackpackItemTier.LEGENDARY, description="浓缩自然能量的晶体,可在多系统中作为高级材料。", ), # 橙色水晶相关物品 "crystal_orange_dust_stage1": CrystalItemDefinition( item_id="crystal_orange_dust_stage1", name="橙色粉尘-初阶", tier=BackpackItemTier.RARE, description="微量橙色素的粉尘,需要进一步压缩。", ), "crystal_orange_dust_stage2": CrystalItemDefinition( item_id="crystal_orange_dust_stage2", name="橙色粉尘-高阶", tier=BackpackItemTier.EPIC, description="高纯度橙色粉尘,可用于制作橙色卷轴。", ), "crystal_orange_scroll": CrystalItemDefinition( item_id="crystal_orange_scroll", name="橙色变色卷轴", tier=BackpackItemTier.EPIC, description="封装橙色粉尘力量的卷轴,但仍需活力能量淬炼。", ), "crystal_orange_scroll_charged": CrystalItemDefinition( item_id="crystal_orange_scroll_charged", name="淬炼橙色卷轴", tier=BackpackItemTier.EPIC, description="经历活力能量淬炼的橙色卷轴,适合唤醒晶核。", ), "crystal_orange_core": CrystalItemDefinition( item_id="crystal_orange_core", name="橙水晶", tier=BackpackItemTier.LEGENDARY, description="浓缩活力能量的晶体,可在多系统中作为高级材料。", ), } DEFAULT_CRYSTAL_COLOR_MAP: Dict[str, CrystalColorDefinition] = { "black": _build_black_color_definition(), "green": _build_green_color_definition(), "orange": _build_orange_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]