From 90c2fa79cb715920ed741e5ce813b82c25abd116 Mon Sep 17 00:00:00 2001 From: ninemine <1371605831@qq.com> Date: Wed, 12 Nov 2025 23:49:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=86=92=E9=99=A9=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E4=BD=BF=E7=94=A8=E9=A3=9F=E7=89=A9=E7=9A=84=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../combat_plugin_adventure.py | 48 +++++++++++++++++-- Plugins/WPSCombatSystem/combat_service.py | 10 ++-- 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/Plugins/WPSCombatSystem/combat_plugin_adventure.py b/Plugins/WPSCombatSystem/combat_plugin_adventure.py index f463e4f..d25fe30 100644 --- a/Plugins/WPSCombatSystem/combat_plugin_adventure.py +++ b/Plugins/WPSCombatSystem/combat_plugin_adventure.py @@ -3,11 +3,13 @@ from __future__ import annotations from datetime import datetime -from typing import Optional, Sequence +from typing import List, Optional, Sequence from PWF.Convention.Runtime.GlobalConfig import ConsoleFrontColor, ProjectConfig +from PWF.Convention.Runtime.Architecture import Architecture from Plugins.WPSAPI import GuideEntry, GuideSection +from Plugins.WPSBackpackSystem import WPSBackpackSystem from .combat_plugin_base import WPSCombatBase from .combat_models import CombatConfig @@ -195,6 +197,42 @@ class WPSCombatAdventure(WPSCombatBase): food_items = tokens return await self._handle_continue_adventure(chat_id, user_id, food_items) + def _normalize_food_items(self, user_id: int, raw_items: List[str]) -> List[str]: + """将用户输入的食物标识转换为背包中的物品ID""" + if not raw_items: + return [] + + backpack: WPSBackpackSystem = Architecture.Get(WPSBackpackSystem) + try: + user_items = backpack.get_user_items(user_id) + except Exception: + return [item for item in raw_items if item] + + id_lookup = {item.item_id.lower(): item.item_id for item in user_items} + name_lookup = { + item.definition.name.lower(): item.item_id for item in user_items + if item.definition and item.definition.name + } + + normalized: List[str] = [] + for raw in raw_items: + token = raw.strip() + if not token: + continue + + lowered = token.lower() + if lowered in id_lookup: + normalized.append(id_lookup[lowered]) + continue + + if lowered in name_lookup: + normalized.append(name_lookup[lowered]) + continue + + normalized.append(token) + + return normalized + async def _handle_start_adventure( self, chat_id: int, @@ -207,11 +245,13 @@ class WPSCombatAdventure(WPSCombatBase): # 第1阶段 stage = 1 + normalized_food = self._normalize_food_items(user_id, food_items) + success, msg, adventure_id = service.start_adventure( user_id=user_id, chat_id=chat_id, stage=stage, - food_items=food_items, + food_items=normalized_food, register_callback=self ) @@ -355,11 +395,13 @@ class WPSCombatAdventure(WPSCombatBase): # 下一阶段 next_stage = last_record["stage"] + 1 + normalized_food = self._normalize_food_items(user_id, food_items) + success, msg, adventure_id = service.start_adventure( user_id=user_id, chat_id=chat_id, stage=next_stage, - food_items=food_items, + food_items=normalized_food, register_callback=self ) diff --git a/Plugins/WPSCombatSystem/combat_service.py b/Plugins/WPSCombatSystem/combat_service.py index 7ac7b87..987d38a 100644 --- a/Plugins/WPSCombatSystem/combat_service.py +++ b/Plugins/WPSCombatSystem/combat_service.py @@ -533,9 +533,9 @@ class CombatService: recommended_food = math.ceil(stage_time / food_support_time) # 如果没有提供食物,给出提示但允许继续 - if len(food_items) == 0: - msg = f"ℹ️ 未使用食物。推荐使用 {recommended_food} 个果酒以获得buff加成" - return True, msg, recommended_food + #if len(food_items) == 0: + # msg = f"ℹ️ 未使用食物。推荐使用 {recommended_food} 个果酒以获得buff加成" + # return True, msg, recommended_food return True, "", recommended_food @@ -696,9 +696,9 @@ class CombatService: # 验证拥有 user_items = backpack.get_user_items(user_id) for food_id, count in food_count.items(): - owned = sum(1 for item in user_items if item.item_id == food_id) + owned = sum(item.quantity for item in user_items if item.item_id == food_id) if owned < count: - return False, f"❌ {food_id} 数量不足,需要 {count} 个", None + return False, f"❌ {food_id} 数量不足,还需要 {count - owned} 个, 当前只有{owned}个", None # 消耗食物 for food_id, count in food_count.items():