From 178fcf48feea3e12ddfd033f1a74a3b8dac84ab1 Mon Sep 17 00:00:00 2001 From: shenlei Date: Fri, 16 Oct 2026 11:05:20 +0900 Subject: [PATCH] AVA2 unlock P1/P2: treasure boxes/keys and stone/Boss stones usable Keep ITEM_TREASURE_BOX/KEY and METIN_NORMAL rows; APPLY_ATTBONUS_STONE 139 / APPLY_ATTBONUS_BOSS 140 in ItemData.h, item module and tooltip (mt_applies). Co-Authored-By: Claude Opus 5.5 --- src/platform/ScriptLib/AppliesScript.inc | 22 +++++++++++++++++++++ src/platform/ScriptLib/PythonBoot.cpp | 2 ++ src/port/GameLib/ItemData.h | 4 ++++ src/port/UserInterface/PythonItemModule.cpp | 2 ++ tools/server/ava2-items/make_items.py | 8 ++++---- tools/server/ava2-items/tests/test_items.py | 13 +++++++++++- 6 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 src/platform/ScriptLib/AppliesScript.inc diff --git a/src/platform/ScriptLib/AppliesScript.inc b/src/platform/ScriptLib/AppliesScript.inc new file mode 100644 index 00000000..27af5377 --- /dev/null +++ b/src/platform/ScriptLib/AppliesScript.inc @@ -0,0 +1,22 @@ +// PORT: item bonuses added after 40250 (AVA2 numbering, server common/length.h). The packed uitooltip.py +// only knows 40250's applies; add the new ones to its AFFECT_DICT so item and socket tooltips show them. +static const char c_szAppliesScript[] = R"PY(# -*- coding: utf-8 -*- +import item +import player +import uiToolTip + +L = player.AutoHuntLocalize +TEXTS = ( + ("APPLY_ATTBONUS_STONE", "对陨石伤害 +%d%%"), + ("APPLY_ATTBONUS_BOSS", "对 Boss 伤害 +%d%%"), +) + + +def Text(text): + return lambda value: L(text % value) + + +for name, text in TEXTS: + if hasattr(item, name): + uiToolTip.ItemToolTip.AFFECT_DICT[getattr(item, name)] = Text(text) +)PY"; diff --git a/src/platform/ScriptLib/PythonBoot.cpp b/src/platform/ScriptLib/PythonBoot.cpp index a1ea1d40..3bbbe85b 100644 --- a/src/platform/ScriptLib/PythonBoot.cpp +++ b/src/platform/ScriptLib/PythonBoot.cpp @@ -1011,6 +1011,7 @@ namespace PythonBoot #include "VipScript.inc" #include "ModelPreviewScript.inc" #include "BattlePassScript.inc" +#include "AppliesScript.inc" static void install_script_module(const char* c_szModule, const char* c_szScript) { @@ -1093,6 +1094,7 @@ bool RunMainScript(const char* lpCmdLine, std::string* error) install_script_module("mt_vip", c_szVipScript); install_script_module("mt_preview", c_szModelPreviewScript); install_script_module("mt_battlepass", c_szBattlePassScript); + install_script_module("mt_applies", c_szAppliesScript); if (g_touch_input) install_script_module("mt_mobile_hud", c_szMobileHUDScript); } diff --git a/src/port/GameLib/ItemData.h b/src/port/GameLib/ItemData.h index 79772095..8ae3e0fb 100644 --- a/src/port/GameLib/ItemData.h +++ b/src/port/GameLib/ItemData.h @@ -350,6 +350,10 @@ class CItemData APPLY_ANTI_CRITICAL_PCT, //90 크리티컬 저항 APPLY_ANTI_PENETRATE_PCT, //91 관통타격 저항 + // PORT AVA2 bonus numbering, matching the server (common/length.h): 92-138 are not ported yet. + APPLY_ATTBONUS_STONE = 139, + APPLY_ATTBONUS_BOSS = 140, + MAX_APPLY_NUM, // }; diff --git a/src/port/UserInterface/PythonItemModule.cpp b/src/port/UserInterface/PythonItemModule.cpp index 0fd3d85c..4e6fb4da 100644 --- a/src/port/UserInterface/PythonItemModule.cpp +++ b/src/port/UserInterface/PythonItemModule.cpp @@ -852,4 +852,6 @@ void initItem() PyModule_AddIntConstant(poModule, "APPLY_RESIST_DARK", CItemData::APPLY_RESIST_DARK ); PyModule_AddIntConstant(poModule, "APPLY_ANTI_CRITICAL_PCT", CItemData::APPLY_ANTI_CRITICAL_PCT ); PyModule_AddIntConstant(poModule, "APPLY_ANTI_PENETRATE_PCT", CItemData::APPLY_ANTI_PENETRATE_PCT ); + PyModule_AddIntConstant(poModule, "APPLY_ATTBONUS_STONE", CItemData::APPLY_ATTBONUS_STONE ); + PyModule_AddIntConstant(poModule, "APPLY_ATTBONUS_BOSS", CItemData::APPLY_ATTBONUS_BOSS ); } diff --git a/tools/server/ava2-items/make_items.py b/tools/server/ava2-items/make_items.py index e1b9234e..70b178e1 100644 --- a/tools/server/ava2-items/make_items.py +++ b/tools/server/ava2-items/make_items.py @@ -10,9 +10,9 @@ HERE=Path(__file__).resolve().parent RANGES=((54001,54027,'时装强化石'),(54028,54078,'发型强化石'),(54079,54123,'武器外观强化石'), (54124,54174,'坐骑外观强化石'),(54175,54219,'披风外观强化石'),(54220,54267,'特效强化石')) # Kept with their 40250 meaning; everything else becomes ITEM_NONE (see module doc). -KEEP_TYPES={'ITEM_MATERIAL','ITEM_QUEST','ITEM_GIFTBOX','ITEM_NONE'} -KEEP_SUBTYPES={('ITEM_WEAPON',s) for s in ('WEAPON_SWORD','WEAPON_DAGGER','WEAPON_BOW','WEAPON_TWO_HANDED','WEAPON_BELL','WEAPON_FAN')}|{('ITEM_ARMOR','ARMOR_FOOTS')} -DESC={'ITEM_MATERIAL':'制作与升级材料。','ITEM_QUEST':'任务物品。','ITEM_GIFTBOX':'打开后可获得物品。','ITEM_WEAPON':'','ITEM_ARMOR':''} +KEEP_TYPES={'ITEM_MATERIAL','ITEM_QUEST','ITEM_GIFTBOX','ITEM_NONE','ITEM_TREASURE_BOX','ITEM_TREASURE_KEY'} +KEEP_SUBTYPES={('ITEM_WEAPON',s) for s in ('WEAPON_SWORD','WEAPON_DAGGER','WEAPON_BOW','WEAPON_TWO_HANDED','WEAPON_BELL','WEAPON_FAN')}|{('ITEM_ARMOR','ARMOR_FOOTS'),('ITEM_METIN','METIN_NORMAL')} +DESC={'ITEM_METIN':'可镶嵌到武器的空孔中。','ITEM_MATERIAL':'制作与升级材料。','ITEM_QUEST':'任务物品。','ITEM_GIFTBOX':'打开后可获得物品。','ITEM_TREASURE_BOX':'需要对应的钥匙才能打开。','ITEM_TREASURE_KEY':'可以打开对应的宝箱。','ITEM_WEAPON':'','ITEM_ARMOR':''} LOCKED='该物品所属的系统尚未开放,暂时无法使用。' def enums(proto_reader): @@ -53,7 +53,7 @@ def convert(cols,E,imported): flags=[f for f in flags if f in ('ITEM_STACKABLE','LOG')] else: if t in ('ITEM_QUEST','ITEM_GIFTBOX','ITEM_NONE','ITEM_MATERIAL') and st not in E['sub'][E['type'].index(t)]:st='0' - wear=[w for w in tokens(c[7]) if w in E['wear']] if t in ('ITEM_WEAPON','ITEM_ARMOR') else [] + wear=[w for w in tokens(c[7]) if w in E['wear']] if t in ('ITEM_WEAPON','ITEM_ARMOR','ITEM_METIN') else [] imm=[i for i in tokens(c[8]) if i in E['imm']] applies=[(a,v) if a in E['apply'] else ('APPLY_NONE','0') for a,v in zip(c[18:24:2],c[19:24:2])] values=[str(number(v)) for v in c[24:30]] diff --git a/tools/server/ava2-items/tests/test_items.py b/tools/server/ava2-items/tests/test_items.py index 200e665c..3faad9d1 100644 --- a/tools/server/ava2-items/tests/test_items.py +++ b/tools/server/ava2-items/tests/test_items.py @@ -14,7 +14,7 @@ class ConvertTests(unittest.TestCase): s,c,kept=m.convert(row(320,'ITEM_WEAPON','WEAPON_SWORD','ANTI_MUDANG | ANTI_WOLFMAN','ITEM_TUNABLE','WEAR_WEAPON', ('APPLY_ATT_SPEED','18','APPLY_ATTBONUS_BOSS','5','APPLY_NONE','0'),refine=('321','81')),self.E,{320}) self.assertTrue(kept);self.assertEqual(s[5],'ANTI_MUDANG');self.assertEqual(s[7],'WEAR_WEAPON') - self.assertEqual(s[18:22],['APPLY_ATT_SPEED','18','APPLY_NONE','0']) + self.assertEqual(s[18:22],['APPLY_ATT_SPEED','18','APPLY_ATTBONUS_BOSS','5']) # ported apply kept self.assertEqual(s[11:13],['0','0']) # the +1 item is not imported self.assertEqual(c[1:3],[self.E['type'].index('ITEM_WEAPON'),0]);self.assertEqual(c[4],1<