196 lines
5.9 KiB
Python
196 lines
5.9 KiB
Python
"""Garden system crop definitions and configuration models."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Dict, List, Tuple
|
|
|
|
from PWF.Convention.Runtime.Architecture import Architecture
|
|
from PWF.Convention.Runtime.GlobalConfig import ConsoleFrontColor, ProjectConfig
|
|
from PWF.CoreModules.plugin_interface import DatabaseModel
|
|
from pydantic import BaseModel, Field
|
|
|
|
# Shared logger/config
|
|
_config: ProjectConfig = Architecture.Get(ProjectConfig)
|
|
_config.SaveProperties()
|
|
|
|
|
|
class GardenExtraReward(BaseModel):
|
|
kind: str = Field(..., description="points 或 item")
|
|
payload: Dict[str, int] = Field(default_factory=dict)
|
|
base_rate: float = Field(..., ge=0.0, le=1.0)
|
|
|
|
class Config:
|
|
allow_mutation = False
|
|
|
|
|
|
class GardenCropDefinition(BaseModel):
|
|
seed_id: str
|
|
fruit_id: str
|
|
display_name: str
|
|
tier: str # common / rare
|
|
growth_minutes: int
|
|
seed_price: int
|
|
base_yield: int
|
|
extra_reward: GardenExtraReward
|
|
extra_item_id: str | None = None
|
|
wine_item_id: str | None = None
|
|
wine_tier: str | None = None
|
|
|
|
class Config:
|
|
allow_mutation = False
|
|
|
|
|
|
GARDEN_CONFIG_DEFAULTS: Dict[str, int | float] = {
|
|
"garden_max_plots_per_user": 4,
|
|
"garden_sale_multiplier": 10,
|
|
"garden_fortune_coeff": 0.03,
|
|
"garden_theft_threshold_ratio": 0.5,
|
|
"garden_seed_store_limit": 5,
|
|
}
|
|
|
|
for key, value in GARDEN_CONFIG_DEFAULTS.items():
|
|
_config.FindItem(key, value)
|
|
_config.SaveProperties()
|
|
|
|
COMMON_HERB_CROPS: Tuple[GardenCropDefinition, ...] = (
|
|
GardenCropDefinition(
|
|
seed_id="garden_seed_mint",
|
|
fruit_id="garden_fruit_mint",
|
|
display_name="薄荷",
|
|
tier="common",
|
|
growth_minutes=30,
|
|
seed_price=30,
|
|
base_yield=4,
|
|
extra_reward=GardenExtraReward(kind="points", payload={"min": 10, "max": 120}, base_rate=0.6),
|
|
wine_item_id="garden_wine_mint",
|
|
wine_tier="rare",
|
|
),
|
|
GardenCropDefinition(
|
|
seed_id="garden_seed_basil",
|
|
fruit_id="garden_fruit_basil",
|
|
display_name="罗勒",
|
|
tier="common",
|
|
growth_minutes=40,
|
|
seed_price=36,
|
|
base_yield=5,
|
|
extra_reward=GardenExtraReward(kind="points", payload={"min": 15, "max": 150}, base_rate=0.55),
|
|
wine_item_id="garden_wine_basil",
|
|
wine_tier="rare",
|
|
),
|
|
GardenCropDefinition(
|
|
seed_id="garden_seed_sage",
|
|
fruit_id="garden_fruit_sage",
|
|
display_name="鼠尾草",
|
|
tier="common",
|
|
growth_minutes=50,
|
|
seed_price=42,
|
|
base_yield=5,
|
|
extra_reward=GardenExtraReward(kind="points", payload={"min": 20, "max": 180}, base_rate=0.5),
|
|
wine_item_id="garden_wine_sage",
|
|
wine_tier="rare",
|
|
),
|
|
GardenCropDefinition(
|
|
seed_id="garden_seed_rosemary",
|
|
fruit_id="garden_fruit_rosemary",
|
|
display_name="迷迭香",
|
|
tier="common",
|
|
growth_minutes=60,
|
|
seed_price=50,
|
|
base_yield=6,
|
|
extra_reward=GardenExtraReward(kind="points", payload={"min": 30, "max": 220}, base_rate=0.45),
|
|
wine_item_id="garden_wine_rosemary",
|
|
wine_tier="rare",
|
|
),
|
|
)
|
|
|
|
RARE_TREE_CROPS: Tuple[GardenCropDefinition, ...] = (
|
|
GardenCropDefinition(
|
|
seed_id="garden_seed_ginkgo",
|
|
fruit_id="garden_fruit_ginkgo",
|
|
display_name="银杏",
|
|
tier="rare",
|
|
growth_minutes=120,
|
|
seed_price=120,
|
|
base_yield=3,
|
|
extra_reward=GardenExtraReward(kind="item", payload={"min": 2, "max": 6}, base_rate=0.5),
|
|
extra_item_id="garden_wood_ginkgo",
|
|
wine_item_id="garden_wine_ginkgo",
|
|
wine_tier="epic",
|
|
),
|
|
GardenCropDefinition(
|
|
seed_id="garden_seed_sakura",
|
|
fruit_id="garden_fruit_sakura",
|
|
display_name="樱花",
|
|
tier="rare",
|
|
growth_minutes=160,
|
|
seed_price=150,
|
|
base_yield=3,
|
|
extra_reward=GardenExtraReward(kind="item", payload={"min": 3, "max": 8}, base_rate=0.45),
|
|
extra_item_id="garden_wood_sakura",
|
|
wine_item_id="garden_wine_sakura",
|
|
wine_tier="epic",
|
|
),
|
|
GardenCropDefinition(
|
|
seed_id="garden_seed_maple",
|
|
fruit_id="garden_fruit_maple",
|
|
display_name="红枫",
|
|
tier="rare",
|
|
growth_minutes=180,
|
|
seed_price=180,
|
|
base_yield=4,
|
|
extra_reward=GardenExtraReward(kind="item", payload={"min": 4, "max": 10}, base_rate=0.4),
|
|
extra_item_id="garden_wood_maple",
|
|
wine_item_id="garden_wine_maple",
|
|
wine_tier="epic",
|
|
),
|
|
)
|
|
|
|
GARDEN_CROPS: Dict[str, GardenCropDefinition] = {
|
|
crop.seed_id: crop for crop in (*COMMON_HERB_CROPS, *RARE_TREE_CROPS)
|
|
}
|
|
GARDEN_FRUITS: Dict[str, GardenCropDefinition] = {
|
|
crop.fruit_id: crop for crop in (*COMMON_HERB_CROPS, *RARE_TREE_CROPS)
|
|
}
|
|
|
|
GARDEN_MISC_ITEMS = {
|
|
"garden_item_rot_fruit": {
|
|
"name": "腐败的果实",
|
|
"tier": "common",
|
|
}
|
|
}
|
|
|
|
|
|
def get_garden_db_models() -> List[DatabaseModel]:
|
|
return [
|
|
DatabaseModel(
|
|
table_name="garden_plots",
|
|
column_defs={
|
|
"user_id": "INTEGER NOT NULL",
|
|
"chat_id": "INTEGER NOT NULL",
|
|
"plot_index": "INTEGER NOT NULL",
|
|
"seed_id": "TEXT NOT NULL",
|
|
"seed_quality": "TEXT NOT NULL DEFAULT 'common'",
|
|
"planted_at": "TEXT NOT NULL",
|
|
"mature_at": "TEXT NOT NULL",
|
|
"is_mature": "INTEGER NOT NULL DEFAULT 0",
|
|
"base_yield": "INTEGER NOT NULL",
|
|
"extra_type": "TEXT",
|
|
"extra_payload": "TEXT",
|
|
"remaining_fruit": "INTEGER NOT NULL",
|
|
"theft_users": "TEXT DEFAULT '[]'",
|
|
"scheduled_task_id": "INTEGER",
|
|
"PRIMARY KEY (user_id, plot_index)": "",
|
|
},
|
|
),
|
|
]
|
|
|
|
|
|
__all__ = [
|
|
"GardenCropDefinition",
|
|
"GardenExtraReward",
|
|
"GARDEN_CROPS",
|
|
"GARDEN_FRUITS",
|
|
"GARDEN_MISC_ITEMS",
|
|
"get_garden_db_models",
|
|
]
|