BadWolf-LootFilter.txt (S14V1.70) 深度复审与构建工具链审计报告(附完整 PDF 报告与前轮 P3 勘误) #3
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
📎 完整排版 PDF 复审报告附件
S14V1.70(commit5b10b9eec0),我们在第一时间完成了全量回归验证与新增构建工具链(build/build.ps1+build/build.bat)审计:Issue #2 中的 全部 30 项核心缺陷与build/分片同步已100%清零!同时我们针对 Issue #2 中关于{...}悬浮文本机制的讨论对BH.dll(1.9.19) 进行了完整反汇编复核——确认您的实机结论完全正确(先对前轮那35条独立道具的误判致歉勘误),并顺着同一段机器码找到了真正会抹除前置%CONTINUE%提示的36条漏写{%NAME%}终结规则,以及新构建脚本与护身符规则中的几处改进点,整理如下供参考。一、
S14V1.68➔S14V1.70修复闭环核验(30 / 30核心问题全部通过)S14V1.70复审状态build/00..39-*.txt分片滞后于主文件40个分片按序拼接后为4,406行、538,366字节,与根目录BadWolf-LootFilter.txt逐字节100%一致(MD5 同为e83bfbb4df81197a5a4f70665d9a6d50)。Alias[RIN_CAST_5_1]PREFIX=412)SUFFIX=174致L32415★ 黄戒整行瘫痪PREFIX=412) SUFFIX=174,展开进L3238后BuildConditionAST栈深恢复为1,7组 5★ 黄戒全部恢复激活。PREFIX=~421-422、德鲁伊木棒SK224=3ORPREFIX~421-422;L443 已改为SK224=3 OR。BH.dllAND/OR等优先级逃逸与底材漏写ORL2048洗点精华、L667RIN_UBER_4_3、L716GLOVE_SKILL_4_1、L733..739全部 6 条黄鞋别名、L4301开荒长柄底材两处漏OR均已精确修复。13个底材子章节星级升序倒置 +TOWN误写 +THROWINGBASE3_1样式错位13个小节已严格翻转为4★ ➔ 3★ ➔ 2★ ➔ 1★ ➔ 0★降序;L4016已改为GROUND;L4136..4137已升为//3星与%BORDER-62%...%TIER-3%。同时新增了$f(CHARSTAT...)动态超红/超蓝过滤(经核验CHARSTAT6..9均采用<<8定点数,CHARSTAT6*5>=CHARSTAT7*4与153600 = 600<<8/102400 = 400<<8计算完全精确)。L2608)、守护天使 (L2418)、钢铁甲壳 (L2421)、地狱之火 (L2522IF(MULTI151,102==27,0.5,0))、C_WAA(L874)、C_SIN(L884)、RBE_A(L940) 全部修复;已移除SCEPTERBASE4_4、SHIELD_SKILL_4_2、JEW_CAST_2_1克隆定义;L193/L204/L205/L216面板开关名已全部消歧。二、
BH.dll(1.9.19) 机器码实证:{...}与{%NAME%}的真实运行机制(含前轮 P3 勘误)针对 Issue #2 中关于非
%CONTINUE%规则悬浮窗{...}是否需要%NAME%的讨论,我们对 ZYLPD2 S14 客户端BH.dll进行了完整调用链反汇编复核:2.1 机器码级控制流与前轮勘误说明
BH::TooltipHook(0x10153a4e) 双缓冲区并列机制:wscDesc缓冲区中;BH 过滤器通过ItemDescriptionCache(0x10294af4) 调用ItemDisplay::GetItemDescription(0x1016bbe0) 计算出自定义悬浮字符串后,是拼接在原生属性文本旁侧渲染,绝不会覆盖暗黑 2 原生的词缀属性或堆叠数量。S14V1.68报告 §5.4 中认为“打孔器 (lbox)、可堆叠珠宝碎片 (jewf)、红门钥匙/器官、任务道具等35条独立规则在{...}内不写%NAME%会导致原生属性与堆叠数量丢失”的推断不成立。作者在游戏内的实机验证完全准确,这35条材料与任务道具规则在此前并无任何非空{...}%CONTINUE%规则命中,直接写{自定义提示}100% 安全且合理。那为什么全文件仍有
905条终结规则必须写{%NAME%}?BH.dll初始化函数0x10064dc3与求值函数0x1016bbe0可见:ItemDescriptionCache(0x10294af4) 与物品名缓存共享同一个包含全部2,561条ItemDisplay规则的主数组0x10294894(并非只遍历写了{...}的规则);GetItemDescription(0x1016bbe0) 将上下文ctx.accumulatedText([ebp-0x34]) 初始化为空串L""(0x102485ec),随后顺序遍历0x10294894;{...}内部,%NAME%token (NameToken::Evaluate0x10164170) 返回的正是ctx.accumulatedText(即前面所有命中的%CONTINUE%规则累积下来的{...}悬浮提示文本);0x1016bce6..0x1016bced都会调用Rule::EvaluateDescription(0x10171800) 并通过std::wstring::operator=无条件覆写ctx.accumulatedText,一旦该规则未带%CONTINUE%(BYTE PTR [rule+0x0c] != 0) 则立即break终止。L1480..1757符文之语配方、打孔/腐化概率、武器基础速度/攻击范围)或第 8 章(L4147..4169恰西灌注提示)的%CONTINUE%规则,在ctx.accumulatedText中积累了悬浮提示,但最后命中的终结规则完全没写{...}(rule->descTokens为空,0x10171800返回L""),指令0x1016bced就会把ctx.accumulatedText清空为L"",导致前置%CONTINUE%注入的所有悬浮提示彻底蒸发!二(续)、量化问题总览(
S14V1.70新发现与残留项全景)build/build.ps1目录层级错位build/子目录而非仓库根目录,$Root = $PSScriptRoot导致Get-ModuleDir搜索子目录失败直接抛出异常(退出码2),且$MergedPath错误指向build/BadWolf-LootFilter.txt。.gitattributes致纯LF入库 +Get-Lines仅按`r`n切行.txt/.ps1均为纯LF;未开启autocrlf或直接下载 ZIP 时,build因40个模块报“裸 LF”直接中止,而check因Get-Lines把4,406行塌缩成1行注释,误报规则 0 条 │ 别名 0 个 │ 无错误(自检彻底失明)。L3180元素小符 (cm1) 副词缀阈值照搬中符 (cm2) 上限3% FRW、5% FHR、2 DEX、2 STR,L3180却写成FRW>4 OR FHR>7 OR DEX>4 OR STR>4,导致除生命外的 4 类复合元素小符100%漏检。{%NAME%}抹除前置%CONTINUE%悬浮提示36条规则(1+35)L4389城镇地面白板规则漏写{%NAME%},底材扔在城镇地上时丢失全部符文之语配方、打孔概率、恰西灌注与武器攻速提示;(2)L3268..3326全部35条未鉴定 4★/5★ 极品亮金武器漏写{%NAME%},反而比普通未鉴定黄武少了武器基础速度 / 攻击范围悬浮窗。%CONTINUE%元素神符 (Veng) 之前cm3/cm2/cm1)L3139、L3162、L3180虽写了%CONTINUE%,却位于L3112..3136、L3150..3159、L3171..3177终结规则之后;双词缀极品元素符(如高电伤+7MF 小符、高元素伤+准确率大符)被前序终结规则截胡,丢失Veng标记与Ilvl 90+洗符提示。build.ps1静态自检盲区与残留配置ItemDisplay计括号数,未校验Alias括号及展开后词法粘连;(2)$phRe漏检带连字符宏(如%BORDER-xx%拼写错误);(3)L189残留已废弃白名单SPEARBASE2_3,且仓库未提交item_codes.txt。ED注释与条件不一致、未引用定义、手工配方拼写微瑕SPEARBASE4_1/4_2等注释仍写15ED(实际条件为 PD2 满变ED=20);Formula[C_STE]与Alias[AMASTAFF]未被引用;L3048将 1# 符文El误写为Ei;L3044Ko漏写[18];L3089火炬%NAME%%CL%位置颠倒;L147注释与L3013..3017引号微瑕。三、构建工具链(
build/build.ps1&build/build.bat)深度审计3.1 [P0] 脚本放置目录与路径解析错位,直接运行必报退出码
2L59定义$Root = $PSScriptRoot。由于build.ps1与build.bat被提交到了build/子目录内(与00-版本及过滤等级设置.txt同级),此时$Root为<repo>/build;Get-ModuleDir(L79) 执行Get-ChildItem -LiteralPath $Root -Directory仅扫描$Root下的子文件夹,不会检查$Root自身。由于build/下没有任何子文件夹,函数必在L91抛出找不到模块目录,L834直接exit 2;$MergedPath = Join-Path $Root 'BadWolf-LootFilter.txt'(L61) 与导出映射表路径 (L823) 也会读写build/BadWolf-LootFilter.txt,而非仓库根目录下的主文件<repo>/BadWolf-LootFilter.txt。build.ps1中自动探测——若$PSScriptRoot自身已含≥10个^\d{2}-.*\.txt$文件,则令$moduleDir = $PSScriptRoot、$Root = Split-Path -Parent $PSScriptRoot;否则維持现有逻辑。build.bat与build.ps1移至仓库根目录。3.2 [P1] 缺失
.gitattributes导致 Git 存为纯LF,引发build中止与Get-Lines自检失明.gitattributes)+ build/build.ps1 L128–129、L154–161。BadWolf-LootFilter.txt(4,406行)、全部40个build/NN-*.txt模块以及build/build.ps1(873行)在仓库内存储的全部是纯LF(crlf = 0),仅build/build.bat为CRLF。core.autocrlf=false环境下克隆仓库时,所有模块均为纯LF,L129对全部40个模块报存在裸 LF 换行,Invoke-Build(L710–717) 直接中止构建;Get-Lines(L155) 硬编码了$a = $Text -split "`r`n":当输入文件为纯LF时,整份538,366字节的合并版不会被切行,而是塌缩为长度538,366的单行字符串($catLines.Count == 1)!由于第 1 个字符是//═══...,Invoke-SelfCheck将整份文件当成 1 行注释跳过,输出规则 0 条 | 别名 0 个 | 公式 0 个 | 行 1 | 无错误的假阴性报告!.gitattributes,强制归档与检出统一使用CRLF:build.ps1L155改为$a = $Text -split "\r?\n",确保即便模块含裸LF(仍由L129独立报错),静态语法自检与差异定位也不会失明。3.3 [P2]
build.ps1静态自检覆盖盲区与残留配置Alias做括号平衡与展开后词法粘连检查(L320–335):Invoke-SelfCheck仅统计ItemDisplay[...]原始文本中的(与)数量。像S14V1.68的Alias[RIN_CAST_5_1](PREFIX=412)SUFFIX=174)在字符层面左右括号数相等,但在BH.dll词法切分时吞掉了),当前build.ps1无法检出此类阻断级缺陷,亦无法检出PREFIX=~421-422或SK224=3OR。建议增加正则扫描:(?<![\s(!])([()])、[A-Z0-9_]+=(?:~|-[^\d])与=\d+[A-Za-z]。L242vsL303):Get-PercentFault(L242) 用%[A-Za-z][A-Za-z0-9_\-]*%屏蔽所有含-的占位符,而Invoke-SelfCheck(L303) 仅用%([A-Za-z][A-Za-z0-9_]*)%校验不含-的占位符。这意味着若误写出%BORDRE-62%、%SOUND-4715%、%TIRE-4%等带连字符的拼写错误,两处检查都会静默放行(仅需放行^(MAP|DOT|BORDER|BG)-[0-9A-Fa-f]{2}$、^SOUNDID-\d+$、^(TIER|PX|PY)-\d+$即可严密兜底)。L189、L219、L429):L189$IgnoreUndef = @('SPEARBASE2_3')中的SPEARBASE2_3已在S14V1.70清理完毕,应置为空数组@();同时item_codes.txt未随仓库提交(若置于build/,还需注意Get-Modules会将其作为非NN-文件打印黄色跳过警告,建议改用item_codes.lst或在SkippedModules中排除'item_codes.txt')。四、
BadWolf-LootFilter.txt(S14V1.70) 规则层新发现与残留缺陷4.1 [P1]
L3180元素伤小型神符 (cm1) 照搬大型神符 (cm2) 词缀上限,4 个副词缀分支永久死代码25-护身符.txt)。pd2data.mpq(MagicSuffix.txt) 数据表实证:lcha=cm2,L3162) 上,后缀满变为:5% 高跑 (FRW)、8% 打击恢复 (FHR)、+5 敏捷 (DEX)、+5 力量 (STR),因此L3162写FRW>4 OR FHR>7 OR DEX>4 OR STR>4恰好匹配满变;scha=cm1,L3180) 上,MagicSuffix.txt允许生成的最高后缀上限严格为:of Inertia(move1,FRW):固定3%(绝不可能>4);of Balance(balance1,FHR):固定5%(绝不可能>7);of Dexterity(dex):最高+2(绝不可能>4);of Strength(str):最高+2(绝不可能>4)!L3180第二分支直接复制了L3162(cm2) 的括号条件,导致高元素伤搭配 3 高跑 / 5 打击恢复 / 2 力量 / 2 敏捷 的极品复仇小符100%无法命中Veng高亮!应按cm1满变阈值修正为:4.2 [P2]
36条终结规则漏写{%NAME%},意外清空前置%CONTINUE%悬浮提示基于第二节
BH.dll(0x1016bbe0➔0x1016bced) 的实证机制,以下两处终结规则因完全未写{...},会把前序%CONTINUE%规则写入的悬浮提示抹除为空串:L4389(城镇地面白板/底材防屏蔽兜底规则):
L4390可见,L4389漏写了{%NAME%}。当玩家把未达星级的普通白板/有孔底材扔在城镇地面 (TOWN GROUND) 整理时,命中L4389终止,导致L1480..1568(224条符文之语配方与公式打孔/腐化概率)、L1756..1757(武器基础攻速/攻击范围)、L4147..4169(恰西灌注提示)及L4307..4309(拉苏克 4 孔提示)全部在城镇地面悬停时消失(捡回背包命中L4390又重新出现)。此外(INVENTORY OR CUBE OR STASH) GROUND在逻辑上恒假,可一并精简为:L3268..3287、L3296..3299、L3307、L3309..3326(全部
35条未鉴定 4★/5★ 极品亮金武器规则):L1756..1757均通过%CONTINUE%注入了{武器基础速度: %WPNSPD% , 攻击范围: %RANGE%}。普通未鉴定亮金武器在背包/地面展示时落入L4390(%NAME%{%NAME%})均可正常查看基础攻速与攻击范围;唯独这35条SHOW_GOODRARE !ID4★/5★ 极品亮金武器规则 末尾只写了%GREEN%★ %NAME% %GREEN%★(或☆)而未写{%NAME%},导致极品黄武未鉴定时悬停反而看不到武器基础攻速与攻击范围!建议在这35条规则动作末尾补齐{%NAME%}(注:L3326需补在//强化法球、九头蛇法球注释之前)。4.3 [P2] 魔法护身符终结规则截胡
%CONTINUE%元素神符 (Veng) 与Ilvl 90+洗符提示cm3)、L3150..3162(cm2)、L3171..3185(cm1)。L3139(cm3元素大符)、L3162(cm2元素中符) 与L3180(cm1元素小符) 专门设计了%CORAL%V%TEAL%e%SAGE%n%YELLOW%g %NAME%{%NAME%}%CONTINUE%(带%CONTINUE%,本意是叠加前缀后再由后续规则收敛);L3112..3136、L3150..3159、L3171..3177全部是不带%CONTINUE%的终结规则!7% MF后缀 (SUFFIX=291) 的极品小型护身符,在L3177(ItemDisplay[cm1 MAG SUFFIX=291]:%GREEN%%MFIND%MF%CL%%BLUE%%NAME%)直接命中并终止,永远走不到 3 行之后的L3180(Veng)!同理,带准确率前缀 (PREFIX~225-226) + 元素伤后缀的超大型护身符在L3114提前终止;且所有命中L3112..3177的已鉴定高物等魔法护身符都走不到L3183..3185(Ilvl 90+ 护身符 必定双缀洗符提示)!L3183..3185(ILVL>89洗符提示)以及L3139、L3162、L3180(均已自带%CONTINUE%)上移至各自护身符分节的终结规则(L3112、L3150、L3171)之前(并将终结规则补上{%NAME%}以保留Ilvl 90+悬浮提示)。4.4 [P3] 注释一致性、未引用定义与展示文案细节(9 处)
ED阈值注释未同步 PD2QualityItems.txt20% 上限(4 处):pd2data.mpq中QualityItems.txt(单属性超强武器与防具均可骰出10–20% ED),L547SPEARBASE4_1与 L548SPEARBASE4_2条件已升级为ED=20,但行尾注释仍写//3技能15ED4孔亚马逊矛、//15ED 3~6孔矛/长柄;MACEBASE2_1条件为ED>9 ED<19(实际匹配10~18ED),注释写//5~6孔9~14ED;L476SWORDBASE2_2与 L478SWORDBASE2_4条件为ED>9 ED<16(实际匹配10~15ED),注释写9~14ED。Formula[C_STE]与 L249Alias[AMASTAFF]在全文件中0次被引用(L134..137JUST_TAG1..4为 BH 面板分组标题占位,属正常设计)。gpw/gpws闪耀系手工公式):盔甲: %ORANGE%Ei%GRAY%[%TAN%1%GRAY%]将 1# 符文El误拼为Ei;gpy/gpys丰饶系手工公式):项链: %ORANGE%Ko%CL%漏写了符文编号%GRAY%[%TAN%18%GRAY%](其余全部 62 个槽位配方均标有编号)。cm2 UNI ID地狱火炬):{%TAN%提示...%ORANGE%火炬碎片%NAME%%CL%}将%NAME%%CL%放在了末尾(若未来有前置%CONTINUE%规则写入提示,会直接粘连在“火炬碎片”四字之后,且末尾%CL%多余;若无前置提示则%NAME%为空,可直接删去%NAME%%CL%或移至开头%NAME%%CL%%TAN%提示...);SHOW_HP5注释写生命值或法力值低于80%时显示(实际L2972仅检测生命值,SHOW_MP5检测法力值);”在无尽...、“法师...“、色泽...魔法”、“生命...死亡。“)。