refactor item ids

This commit is contained in:
bridge
2026-01-11 23:12:48 +08:00
parent fa4c0340fd
commit 5241f70ef3
12 changed files with 281 additions and 89 deletions

View File

@@ -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

View File

@@ -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

View 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

View File

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

View File

@@ -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:
"""

View File

@@ -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