update normalized name resolving logic

This commit is contained in:
bridge
2025-11-11 23:45:13 +08:00
parent 1a98678c4c
commit 24d397d86c
8 changed files with 182 additions and 9 deletions

View File

@@ -4,6 +4,7 @@ from src.classes.action import InstantAction
from src.classes.event import Event
from src.classes.battle import decide_battle, get_effective_strength_pair
from src.classes.story_teller import StoryTeller
from src.classes.normalize import normalize_avatar_name
class Battle(InstantAction):
@@ -16,8 +17,13 @@ class Battle(InstantAction):
)
def _get_target(self, avatar_name: str):
"""
根据名字查找目标角色;找不到返回 None。
会自动规范化名字(去除括号等附加信息)以提高容错性。
"""
normalized_name = normalize_avatar_name(avatar_name)
for v in self.world.avatar_manager.avatars.values():
if v.name == avatar_name:
if v.name == normalized_name:
return v
return None

View File

@@ -4,6 +4,7 @@ from src.classes.action import InstantAction
from src.classes.event import Event
from src.classes.battle import get_escape_success_rate
from src.classes.action.event_helper import EventHelper
from src.classes.normalize import normalize_avatar_name
class Escape(InstantAction):
@@ -18,8 +19,13 @@ class Escape(InstantAction):
PARAMS = {"avatar_name": "AvatarName"}
def _find_avatar_by_name(self, name: str) -> "Avatar|None":
"""
根据名字查找角色;找不到返回 None。
会自动规范化名字(去除括号等附加信息)以提高容错性。
"""
normalized_name = normalize_avatar_name(name)
for v in self.world.avatar_manager.avatars.values():
if v.name == name:
if v.name == normalized_name:
return v
return None

View File

@@ -3,6 +3,7 @@ from __future__ import annotations
from src.classes.action import TimedAction, Move
from src.classes.event import Event
from src.classes.action.move_helper import clamp_manhattan_with_diagonal_priority
from src.classes.normalize import normalize_avatar_name
from typing import TYPE_CHECKING
if TYPE_CHECKING:
@@ -21,8 +22,13 @@ class MoveAwayFromAvatar(TimedAction):
PARAMS = {"avatar_name": "AvatarName"}
def _find_avatar_by_name(self, name: str) -> "Avatar | None":
"""
根据名字查找角色;找不到返回 None。
会自动规范化名字(去除括号等附加信息)以提高容错性。
"""
normalized_name = normalize_avatar_name(name)
for v in self.world.avatar_manager.avatars.values():
if v.name == name:
if v.name == normalized_name:
return v
return None

View File

@@ -5,6 +5,7 @@ from src.classes.event import Event
from src.classes.action import Move
from src.classes.action_runtime import ActionResult, ActionStatus
from src.classes.action.move_helper import clamp_manhattan_with_diagonal_priority
from src.classes.normalize import normalize_avatar_name
class MoveToAvatar(DefineAction, ActualActionMixin):
@@ -19,9 +20,11 @@ class MoveToAvatar(DefineAction, ActualActionMixin):
def _get_target(self, avatar_name: str):
"""
根据名字查找目标角色;找不到返回 None。
会自动规范化名字(去除括号等附加信息)以提高容错性。
"""
normalized_name = normalize_avatar_name(avatar_name)
for v in self.world.avatar_manager.avatars.values():
if v.name == avatar_name:
if v.name == normalized_name:
return v
return None

View File

@@ -5,6 +5,7 @@ from src.classes.event import Event
from src.classes.region import CityRegion
from src.classes.item import items_by_name
from src.classes.prices import prices
from src.classes.normalize import normalize_item_name
class SellItems(InstantAction):
@@ -22,8 +23,11 @@ class SellItems(InstantAction):
if not isinstance(region, CityRegion):
return
# 规范化物品名称(去除境界等附加信息)
normalized_name = normalize_item_name(item_name)
# 找到物品
item = items_by_name.get(item_name)
item = items_by_name.get(normalized_name)
if item is None:
return
@@ -51,14 +55,22 @@ class SellItems(InstantAction):
# 用于动作空间:只要背包非空即可
ok = bool(self.avatar.items)
return (ok, "" if ok else "背包为空,无可出售物品")
item = items_by_name.get(item_name)
# 规范化物品名称
normalized_name = normalize_item_name(item_name)
item = items_by_name.get(normalized_name)
if item is None:
return False, f"未知物品: {item_name}"
ok = self.avatar.get_item_quantity(item) > 0
return (ok, "" if ok else "该物品数量为0")
def start(self, item_name: str) -> Event:
return Event(self.world.month_stamp, f"{self.avatar.name} 在城镇出售 {item_name}", related_avatars=[self.avatar.id])
# 规范化物品名称用于显示(与执行逻辑一致)
normalized_name = normalize_item_name(item_name)
# 尝试获取标准物品名(如果存在)
item = items_by_name.get(normalized_name)
display_name = item.name if item is not None else normalized_name
return Event(self.world.month_stamp, f"{self.avatar.name} 在城镇出售 {display_name}", related_avatars=[self.avatar.id])
# InstantAction 已实现 step 完成

View File

@@ -4,6 +4,7 @@ from typing import Optional, Iterable
from src.classes.tile import get_avatar_distance
from src.classes.observe import get_observable_avatars
from src.classes.normalize import normalize_avatar_name
class TargetingMixin:
@@ -13,8 +14,15 @@ class TargetingMixin:
注意:不做异常吞噬,失败路径返回 None 或 False由调用方决策。
"""
def find_avatar_by_name(self, name: str) -> "Avatar|None":
"""
根据名字查找角色。
会自动规范化名字(去除括号等附加信息)以提高容错性。
例如:查找 "张三(元婴)" 会自动匹配到名为 "张三" 的角色
"""
normalized_name = normalize_avatar_name(name)
for v in self.world.avatar_manager.avatars.values():
if v.name == name:
if v.name == normalized_name:
return v
return None