refactor item ids
This commit is contained in:
@@ -89,7 +89,7 @@ def _load_auxiliaries() -> tuple[Dict[int, Auxiliary], Dict[str, Auxiliary]]:
|
||||
realm = Realm.Qi_Refinement
|
||||
|
||||
a = Auxiliary(
|
||||
id=get_int(row, "id"),
|
||||
id=get_int(row, "item_id"),
|
||||
name=get_str(row, "name"),
|
||||
realm=realm,
|
||||
desc=get_str(row, "desc"),
|
||||
@@ -99,6 +99,10 @@ def _load_auxiliaries() -> tuple[Dict[int, Auxiliary], Dict[str, Auxiliary]]:
|
||||
|
||||
auxiliaries_by_id[a.id] = a
|
||||
auxiliaries_by_name[a.name] = a
|
||||
|
||||
# 注册到全局注册表
|
||||
from src.classes.item_registry import ItemRegistry
|
||||
ItemRegistry.register(a.id, a)
|
||||
|
||||
return auxiliaries_by_id, auxiliaries_by_name
|
||||
|
||||
|
||||
@@ -166,7 +166,7 @@ def _load_elixirs() -> tuple[Dict[int, Elixir], Dict[str, List[Elixir]]]:
|
||||
effect_desc = format_effects_to_text(effects)
|
||||
|
||||
elixir = Elixir(
|
||||
id=elixir_id,
|
||||
id=get_int(row, "item_id"),
|
||||
name=name,
|
||||
realm=realm,
|
||||
type=elixir_type,
|
||||
@@ -176,11 +176,15 @@ def _load_elixirs() -> tuple[Dict[int, Elixir], Dict[str, List[Elixir]]]:
|
||||
effect_desc=effect_desc
|
||||
)
|
||||
|
||||
elixirs_by_id[elixir_id] = elixir
|
||||
elixirs_by_id[elixir.id] = elixir
|
||||
|
||||
if name not in elixirs_by_name:
|
||||
elixirs_by_name[name] = []
|
||||
elixirs_by_name[name].append(elixir)
|
||||
|
||||
# 注册到全局注册表
|
||||
from src.classes.item_registry import ItemRegistry
|
||||
ItemRegistry.register(elixir.id, elixir)
|
||||
|
||||
return elixirs_by_id, elixirs_by_name
|
||||
|
||||
|
||||
24
src/classes/item_registry.py
Normal file
24
src/classes/item_registry.py
Normal file
@@ -0,0 +1,24 @@
|
||||
from typing import Dict, Type, TYPE_CHECKING, Optional
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from src.classes.item import Item
|
||||
|
||||
class ItemRegistry:
|
||||
"""全局物品注册表"""
|
||||
|
||||
_items_by_id: Dict[int, "Item"] = {}
|
||||
|
||||
@classmethod
|
||||
def register(cls, item_id: int, item: "Item"):
|
||||
if item_id in cls._items_by_id:
|
||||
# 允许重复注册(覆盖),但在开发环境中最好打印警告
|
||||
pass
|
||||
cls._items_by_id[item_id] = item
|
||||
|
||||
@classmethod
|
||||
def get(cls, item_id: int) -> Optional["Item"]:
|
||||
return cls._items_by_id.get(item_id)
|
||||
|
||||
@classmethod
|
||||
def get_all(cls) -> Dict[int, "Item"]:
|
||||
return cls._items_by_id
|
||||
@@ -215,19 +215,11 @@ class CultivateRegion(Region):
|
||||
@dataclass(eq=False)
|
||||
class CityRegion(Region, StoreMixin):
|
||||
"""城市区域"""
|
||||
sell_items: str = field(default="[]")
|
||||
sell_item_ids: list[int] = field(default_factory=list)
|
||||
|
||||
def __post_init__(self):
|
||||
super().__post_init__()
|
||||
try:
|
||||
import ast
|
||||
items_list = ast.literal_eval(self.sell_items)
|
||||
if isinstance(items_list, list):
|
||||
self.init_store(items_list)
|
||||
else:
|
||||
self.init_store([])
|
||||
except Exception:
|
||||
self.init_store([])
|
||||
self.init_store(self.sell_item_ids)
|
||||
|
||||
def get_region_type(self) -> str:
|
||||
return "city"
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
from collections import defaultdict
|
||||
from typing import Any, List
|
||||
from typing import Any, List, Union
|
||||
|
||||
from src.utils.resolution import resolve_query
|
||||
from src.classes.elixir import Elixir
|
||||
from src.classes.weapon import Weapon
|
||||
from src.classes.auxiliary import Auxiliary
|
||||
from src.classes.prices import prices
|
||||
from src.classes.item_registry import ItemRegistry
|
||||
|
||||
class StoreMixin:
|
||||
"""
|
||||
@@ -13,20 +14,25 @@ class StoreMixin:
|
||||
赋予区域售卖物品的能力
|
||||
"""
|
||||
|
||||
def init_store(self, item_names: list[str]):
|
||||
def init_store(self, item_ids: list[int]):
|
||||
"""
|
||||
初始化商店物品
|
||||
:param item_names: 物品名称列表
|
||||
:param item_ids: 物品ID列表
|
||||
"""
|
||||
self.store_items = []
|
||||
if not item_names:
|
||||
if not item_ids:
|
||||
return
|
||||
|
||||
for name in item_names:
|
||||
# 期望类型:丹药、武器、辅助
|
||||
res = resolve_query(name, expected_types=[Elixir, Weapon, Auxiliary])
|
||||
if res.is_valid and res.obj:
|
||||
self.store_items.append(res.obj)
|
||||
for item_id in item_ids:
|
||||
item = ItemRegistry.get(item_id)
|
||||
if item:
|
||||
self.store_items.append(item)
|
||||
else:
|
||||
# 兼容旧逻辑:如果列表中混入了字符串名称(虽然根据迁移脚本不应该发生)
|
||||
if isinstance(item_id, str):
|
||||
res = resolve_query(item_id, expected_types=[Elixir, Weapon, Auxiliary])
|
||||
if res.is_valid and res.obj:
|
||||
self.store_items.append(res.obj)
|
||||
|
||||
def get_store_info(self) -> str:
|
||||
"""
|
||||
|
||||
@@ -93,7 +93,7 @@ def _load_weapons() -> tuple[Dict[int, Weapon], Dict[str, Weapon]]:
|
||||
realm = Realm.Qi_Refinement
|
||||
|
||||
w = Weapon(
|
||||
id=get_int(row, "id"),
|
||||
id=get_int(row, "item_id"),
|
||||
name=get_str(row, "name"),
|
||||
weapon_type=weapon_type,
|
||||
realm=realm,
|
||||
@@ -104,6 +104,10 @@ def _load_weapons() -> tuple[Dict[int, Weapon], Dict[str, Weapon]]:
|
||||
|
||||
weapons_by_id[w.id] = w
|
||||
weapons_by_name[w.name] = w
|
||||
|
||||
# 注册到全局注册表
|
||||
from src.classes.item_registry import ItemRegistry
|
||||
ItemRegistry.register(w.id, w)
|
||||
|
||||
return weapons_by_id, weapons_by_name
|
||||
|
||||
|
||||
Reference in New Issue
Block a user