Files
NewWPSBot/Plugins/WPSCrystalSystem/crystal_models.py

498 lines
17 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""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]