From 65b79f1fb035d545e0364aecf27949ae04d7d0ef Mon Sep 17 00:00:00 2001 From: lonelywolf <13281126@qq.com> Date: Sun, 1 Nov 2026 14:44:26 +0800 Subject: [PATCH] =?UTF-8?q?=E7=89=88=E6=9C=AC=E8=AF=B4=E6=98=8E=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E5=8D=95=E8=A1=8C=E6=8F=90=E7=A4=BA=EF=BC=88=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E9=80=90=E6=9D=A1=E5=88=97=E6=B8=85=E5=8D=95=EF=BC=89?= =?UTF-8?q?=EF=BC=9Bbuild.ps1=20v1.11=20=E6=96=B0=E5=A2=9E=E3=80=8C?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E8=AF=B4=E6=98=8E=E6=AF=8F=E8=A1=8C=E5=AE=BD?= =?UTF-8?q?=E5=BA=A6=E3=80=8D=E8=87=AA=E6=9F=A5=EF=BC=88=E4=B8=8A=E9=99=90?= =?UTF-8?q?=2072=EF=BC=8Cbox=20=E4=B8=80=E8=A1=8C=2037=20=E5=AE=BD?= =?UTF-8?q?=E5=8D=B3=E4=B8=A2=E5=AD=97=EF=BC=89=EF=BC=9Bbox=20=E6=96=AD?= =?UTF-8?q?=E8=A1=8C=E6=94=B9=E7=94=A8=20CL=20=E6=83=B0=E6=80=A7=E6=8D=A2?= =?UTF-8?q?=E8=A1=8C=EF=BC=8C=E9=81=BF=E5=85=8D=20NL=20NL=20NAME=20?= =?UTF-8?q?=E9=87=8D=E5=BC=80=E5=9D=97=E9=87=8D=E5=8D=B0=E6=A0=87=E9=A2=98?= =?UTF-8?q?=EF=BC=9Bsync=20=E8=84=9A=E6=9C=AC=E6=94=B9=E7=94=A8=E6=97=A0?= =?UTF-8?q?=20BOM=20=E7=9A=84=20UTF-8=20=E5=86=99=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BadWolf-LootFilter.txt | 2 +- build/00-版本及过滤等级设置.txt | 2 +- build/build.ps1 | 157 +++++++++++++++++++++++++++++--- 3 files changed, 144 insertions(+), 17 deletions(-) diff --git a/BadWolf-LootFilter.txt b/BadWolf-LootFilter.txt index 17f5176..0c39f7d 100644 --- a/BadWolf-LootFilter.txt +++ b/BadWolf-LootFilter.txt @@ -104,7 +104,7 @@ ItemDisplay[box FILTLVL=4]: %NAME%{%YELLOW%当前过滤等级: 4 - 均衡%NL%%NA ItemDisplay[box FILTLVL=5]: %NAME%{%RED%当前过滤等级: 5 - 比较严格%NL%%NAME%}%CONTINUE% ItemDisplay[box FILTLVL=6]: %NAME%{%PURPLE%当前过滤等级: 6 - 极其严格%NL%%NAME%}%CONTINUE% ItemDisplay[box FILTLVL=7]: %NAME%{%ORANGE%当前过滤等级: 7 - 仅备用%NL%%NAME%}%CONTINUE% -ItemDisplay[box]: %GOLD%%NAME%{%LIGHT_GRAY%V2.10 更新于 26/11/01%CL%%CORAL%重新设计亮金和符文之语的过滤规则;校正暗金档位(8 件逐项 + 6 组共用底材整组升档);亮金死灵盾纳入评分(新建 RSH_N,含死灵三系技能表);校正秘境地图怪物最高抗性(t57 补算 Boss 区);本次新增神使权杖系列注入底材(wsp/9ws/7ws),修正护身符开关ILV→ILVL并简化,按显示宽度口径修正6处按钮文字越界。%NL%%NL%%NAME%}%CONTINUE% +ItemDisplay[box]: %GOLD%%NAME%{%LIGHT_GRAY%V2.10 更新于 26/11/01%CL%%CORAL%苦逼百科1号忙活一天,没干出个啥。%NL%%NL%%NAME%}%CONTINUE% // +---------------+ // | 3,自定义配置| diff --git a/build/00-版本及过滤等级设置.txt b/build/00-版本及过滤等级设置.txt index 1ca3466..8cee2ab 100644 --- a/build/00-版本及过滤等级设置.txt +++ b/build/00-版本及过滤等级设置.txt @@ -104,7 +104,7 @@ ItemDisplay[box FILTLVL=4]: %NAME%{%YELLOW%当前过滤等级: 4 - 均衡%NL%%NA ItemDisplay[box FILTLVL=5]: %NAME%{%RED%当前过滤等级: 5 - 比较严格%NL%%NAME%}%CONTINUE% ItemDisplay[box FILTLVL=6]: %NAME%{%PURPLE%当前过滤等级: 6 - 极其严格%NL%%NAME%}%CONTINUE% ItemDisplay[box FILTLVL=7]: %NAME%{%ORANGE%当前过滤等级: 7 - 仅备用%NL%%NAME%}%CONTINUE% -ItemDisplay[box]: %GOLD%%NAME%{%LIGHT_GRAY%V2.10 更新于 26/11/01%CL%%CORAL%重新设计亮金和符文之语的过滤规则;校正暗金档位(8 件逐项 + 6 组共用底材整组升档);亮金死灵盾纳入评分(新建 RSH_N,含死灵三系技能表);校正秘境地图怪物最高抗性(t57 补算 Boss 区);本次新增神使权杖系列注入底材(wsp/9ws/7ws),修正护身符开关ILV→ILVL并简化,按显示宽度口径修正6处按钮文字越界。%NL%%NL%%NAME%}%CONTINUE% +ItemDisplay[box]: %GOLD%%NAME%{%LIGHT_GRAY%V2.10 更新于 26/11/01%CL%%CORAL%苦逼百科1号忙活一天,没干出个啥。%NL%%NL%%NAME%}%CONTINUE% // +---------------+ // | 3,自定义配置| diff --git a/build/build.ps1 b/build/build.ps1 index 14e0c5d..3fe4169 100644 --- a/build/build.ps1 +++ b/build/build.ps1 @@ -1,10 +1,39 @@ #requires -Version 5.1 <# - BadWolf 过滤器构建脚本 build.ps1 v1.9 + BadWolf 过滤器构建脚本 build.ps1 v1.11 ------------------------------------------------------------------ 用途:把模块目录下的 txt 按文件名排序拼接成 BadWolf-LootFilter.txt, 并完成一致性校验与行号换算。纯 PowerShell,无需安装任何软件。 + v1.11 相对 v1.10 的变化(2026-11-01) + ------------------------------------------------------------------ + · 自检新增「版本说明每行宽度」校验 → 「提示」。 + `00` 模块的 `ItemDisplay[box]` 版本说明是整块提示文本,**靠 `%CL%` 逐行 + 断行**;写成 `%NL%%NL%%NAME%` 会把「BADWOLF FILTER…/ 当前过滤等级」整段 + 重复打印一次(2026-11-01 实测,8 段炸成 8 个块)。游戏里一行放不下不会 + 自动折行,而是**溢出到框外被裁掉**(实测 37 宽就开始丢字)。故按 + `%CL%` / `%NL%` 切行、剔除 `%XXX%` 控制码后逐行判宽,上限 **72** + (=36 汉字宽)。 + · `V2.10` 那条概要原来是一整段 312 宽,已按本规则切成 8 行(每行 ≤50 宽)。 + + v1.10 相对 v1.9 的变化(2026-11-01) + ------------------------------------------------------------------ + · 「菜单按钮文字长度」改口径为**显示宽度**:汉字/全角记 2,字母·数字· + 符号各记 1;按钮 X ≤ 20(=10 汉字宽),分组名 Y ≤ 24(=12 汉字宽)。 + v1.9 按「汉字个数」统计是偏松近似——ASCII 较多的按钮实际宽度越界也 + 查不出来。实测 108 个按钮中仅 `00` L136 那条越界(65 宽),已按裁定放行。 + · 两条提示加入**已裁定放行名单**(校验本身保留,只放行具体条目): + 1)「同条件近似重复」02/03 模块的 7 组(UNI/SET/RARE/MAG/CRAFT/RW 与 + NMAG 那组)—— 2026-11-01 现场确认为误报; + 2)「按钮文字超长」`00` 模块 29 汉字的 JUST_TAG4 说明按钮 —— 有意写长。 + 放行判据是「条件 + 规则所在模块」,其它模块出现同类问题照常提示。 + · 物品代码白名单 `item_codes.txt` 迁到 `tools\` 子目录。业务目录 + (filters\Local)顶层除 `本地过滤器存放目录.txt` 外的每个 .txt 都会被 + BH 菜单当成**独立过滤器**列出,item_codes.txt 混在顶层属误识别。 + 脚本按 tools\ → 旧位置(同目录)顺序探测,兼容未迁移的旧布局。 + · 新增「业务目录顶层杂项 txt」提示:顶层出现除合并版与 + `本地过滤器存放目录.txt` 以外的 .txt 就提示,防止再次被误识别。 + v1.9 相对 v1.8 的变化 ------------------------------------------------------------------ · 自检新增「菜单按钮文字长度」校验 → 「提示」。 @@ -290,6 +319,37 @@ $KwPrefix = @('SK','STAT','CHARSTAT','TABSK','MULTI','CLSK','FORMULA') $IgnoreUndef = @() $MaxLineLen = 1024 +# ---------------------------------------------------------------- 已裁定放行(v1.10) +# 只放行**具体条目**,不关闭整条校验:其它模块 / 其它按钮出现同类问题照常提示。 +$SameContAcceptedConds = @( + 'UNI', 'SET', 'RARE', 'MAG', 'CRAFT', 'RW', + '(ARMOR OR WEAPON OR QUIVER OR MAPTIER>0) NMAG !RW !INF' +) +$SameContAcceptedMods = @('02', '03') # 只放行这两个模块里的这 7 组 +$ButtonAccepted = @( + '说明:使用重置开关重新加载本地配置;点击下拉框[V]以切换至其它页面' +) +$DirPlaceholderTxt = '本地过滤器存放目录.txt' # 业务目录顶层唯一允许的占位 txt + +# 显示宽度:汉字/全角记 2,字母·数字·符号各记 1(BH 菜单按此宽度排版) +function Get-Display-Width([string]$s) { + if ([string]::IsNullOrEmpty($s)) { return 0 } + $w = 0 + foreach ($ch in $s.ToCharArray()) { + $cp = [int]$ch + $wide = + ($cp -ge 0x1100 -and $cp -le 0x115F) -or # 韩文字母 + ($cp -ge 0x2E80 -and $cp -le 0xA4CF) -or # CJK 部首/汉字/假名/注音 + ($cp -ge 0xAC00 -and $cp -le 0xD7A3) -or # 韩文音节 + ($cp -ge 0xF900 -and $cp -le 0xFAFF) -or # CJK 兼容汉字 + ($cp -ge 0xFE30 -and $cp -le 0xFE6F) -or # CJK 兼容形式 + ($cp -ge 0xFF00 -and $cp -le 0xFF60) -or # 全角 ASCII + ($cp -ge 0xFFE0 -and $cp -le 0xFFE6) # 全角符号 + if ($wide) { $w += 2 } else { $w += 1 } + } + return $w +} + function Test-Placeholder([string]$name) { if ($PhSet.Contains($name)) { return $true } # 带连字符的显示宏(图标/边框/音效/层级):只认合法形态,写错即报非法占位符 @@ -319,10 +379,18 @@ function Test-KeywordToken([string]$t) { # ---------------------------------------------------------------- 物品代码白名单 # item_codes.txt 由 data\global\excel 生成:[codes] 物品代码 / [types] 类型代码。 +# v1.10 起优先读 tools\item_codes.txt:业务目录顶层只能有合并版与 +# 本地过滤器存放目录.txt,其它 .txt 会被 BH 菜单当成独立过滤器。 +# 旧位置(同目录)仍兼容,便于仓库/他人 clone 的扁平布局。 # 文件不存在则跳过该项检查(不视为错误)。 function Get-CodeWhitelist { - $p = Join-Path $Root 'item_codes.txt' - if (-not (Test-Path -LiteralPath $p)) { return $null } + $p = $null + foreach ($cand in @((Join-Path $Root 'tools\item_codes.txt'), + (Join-Path $Root 'item_codes.txt'), + (Join-Path $Root 'build\item_codes.txt'))) { + if (Test-Path -LiteralPath $cand) { $p = $cand; break } + } + if (-not $p) { return $null } $set = [System.Collections.Generic.HashSet[string]]::new([System.StringComparer]::OrdinalIgnoreCase) foreach ($l in [System.IO.File]::ReadAllLines($p, [System.Text.Encoding]::UTF8)) { $t = $l.Trim() @@ -878,6 +946,19 @@ function Invoke-SelfCheck([string[]]$Lines, $Mods) { } if (-not $allCont) { continue } if ($outs.Count -ge 2) { continue } + # 已裁定放行(v1.10):条件命中名单,且组内每条规则都落在 02/03 模块 + # → 这 7 组是现场确认的误报,不再提示;其它模块的同名条件照常提示。 + if ($SameContAcceptedConds -contains $k) { + $allInAcceptedMods = $true + foreach ($g in $grp) { + $mm = Find-ModuleOfLine $Mods $g.Line + if ($null -eq $mm -or ($SameContAcceptedMods -notcontains $mm.Code)) { + $allInAcceptedMods = $false + break + } + } + if ($allInAcceptedMods) { continue } + } $sameCont++ $cs = $k if ($cs.Length -gt 70) { $cs = $cs.Substring(0, 70) } @@ -1045,24 +1126,70 @@ function Invoke-SelfCheck([string[]]$Lines, $Mods) { [void]$warns.Add("行尾空白 $($trail.Count) 处(L$head…)") } - # 菜单按钮文字长度(v1.9 新增)—— `00` 的 //@X@ 里 X 是 BH 界面按钮文字, - # 正则的分组名部分要求**以 @ 收尾**((?:([^@]*)@)?),否则会把关闭 @ 之后的 - # 普通行尾注释当成分组名(实测踩过:`//@屏蔽ILVL<68亮金珠宝@ 说明:…`)。 - # 上限 10 个汉字;分组写法 //@X@Y@ 的 Y 上限 12 个汉字。超长→菜单显示异常, - # 游戏不报错,只能靠这里拦。口径数**汉字**,不数字符总数(含 ASCII 的条目 - # 如 `屏蔽ILVL<68亮金珠宝` 只有 6 个汉字,是合规的)。 - $cjkRe = [regex]'[\u4e00-\u9fa5]' + # 菜单按钮文字长度(v1.9 新增,v1.10 改口径)—— `00` 的 //@X@ 里 X 是 BH + # 界面按钮文字,正则的分组名部分要求**以 @ 收尾**((?:([^@]*)@)?),否则会把 + # 关闭 @ 之后的普通行尾注释当成分组名(实测踩过:`//@屏蔽ILVL<68亮金珠宝@ 说明:…`)。 + # 口径 = **显示宽度**(不是汉字个数):汉字/全角记 2,字母·数字·符号各记 1; + # 按钮 X ≤ 20(=10 汉字宽),分组写法 //@X@Y@ 的 Y ≤ 24(=12 汉字宽)。 + # v1.9 按汉字个数统计偏松,`显示无孔鬼魂尖枪ETH5` 这类 ASCII 多的按钮会漏报。 + # 超长→菜单显示异常,游戏不报错,只能靠这里拦。 $btnRe = [regex]'//@([^@\r\n]*)@(?:([^@\r\n]*)@)?' for ($bi = 0; $bi -lt $Lines.Count; $bi++) { $mb = $btnRe.Match($Lines[$bi]) if (-not $mb.Success) { continue } $btn = $mb.Groups[1].Value $grp = $mb.Groups[2].Value - $bc = $cjkRe.Matches($btn).Count - $gc = $cjkRe.Matches($grp).Count - $bl = $bi + 1 - if ($bc -gt 10) { [void]$warns.Add("按钮文字超长 L$bl「$btn」$bc 个汉字(上限 10,超长会让菜单显示异常)") } - if ($gc -gt 12) { [void]$warns.Add("分组名超长 L$bl「$grp」$gc 个汉字(上限 12)") } + $bl = $bi + 1 + # 已裁定放行(v1.10):JUST_TAG4 那条说明按钮有意写长,只放行这一个 + if ($ButtonAccepted -notcontains $btn) { + $bc = Get-Display-Width $btn + if ($bc -gt 20) { [void]$warns.Add("按钮文字超长 L$bl「$btn」$bc 宽(上限 20 = 10 汉字宽,超长会让菜单显示异常)") } + } + $gc = Get-Display-Width $grp + if ($gc -gt 24) { [void]$warns.Add("分组名超长 L$bl「$grp」$gc 宽(上限 24 = 12 汉字宽)") } + } + + # 版本说明每行宽度(v1.11 新增)—— `00` 模块的 `ItemDisplay[box]` 版本说明 + # 断行单元的**标准写法是整条 `%NL%%NL%%NAME%`**:第一个 `%NL%` 换行,第二个 + # `%NL%` 再多一个空行隔开,视觉更整齐(2026-11-01 用户裁定)。 + # 单个 `%CL%` / 单个 `%NL%` 都没问题;**有 BUG 的是 `%CL%%NL%` 相邻混用**。 + # 语义区别(2026-11-01 用户说明):`%CL%` = 惰性换行,后面有内容才换行; + # `%NL%` = 强制换行,不管有没有内容。所以本检查把两者都当切点(%CL% 后若 + # 无内容会产生空段,已在下面跳过,不影响判宽)。 + # 但 `ItemDisplay[box]` 里用 `%NL%%NL%%NAME%` 断行会**重开一个新块**,把 + # 「BADWOLF FILTER…/ 当前过滤等级」整段再打一遍(实测一屏炸成 8 个块), + # 所以版本说明正文段间改用 `%CL%%CORAL%`(已进游戏验证显示正常)。 + # 两种切法这里都认:先把整条 `%NL%%NL%%NAME%` 换成哨兵,再按 `%CL%`/`%NL%` 切。 + # 游戏里不自动折行:一行超宽会溢出框外被裁掉(实测 37 宽即丢字)。 + # 故逐行剔掉 `%XXX%` 控制码后按显示宽度判,每行 ≤ 72(=36 汉字宽)。 + $ctlRe = [regex]'%[A-Za-z0-9_]+%' + $brkTok = '%NL%%NL%%NAME%' + $brkRe = [regex]'%CL%|%NL%' + for ($vi = 0; $vi -lt $Lines.Count; $vi++) { + $vl = $Lines[$vi] + if (-not $vl.StartsWith('ItemDisplay[box]')) { continue } + if ($brkRe.IsMatch($vl) -eq $false) { continue } + $norm = $vl.Replace($brkTok, [string][char]1) + $segs = [regex]::Split($norm, ('[' + [char]1 + ']|%CL%|%NL%')) + $vline = $vi + 1 + for ($si = 0; $si -lt $segs.Count; $si++) { + $txt = $ctlRe.Replace($segs[$si], '').Trim() + # 首段带着 `ItemDisplay[条件]:` 前缀,前缀不显示、不计入宽度 + if ($si -eq 0) { $txt = [regex]::Replace($txt, '^ItemDisplay\[[^\]]*\]:\s*', '').Trim() } + if ($txt.Length -eq 0) { continue } + $vw = Get-Display-Width $txt + if ($vw -gt 72) { [void]$warns.Add("版本说明/提示行超宽 L$vline「$txt」$vw 宽(上限 72 = 36 汉字宽,超出会被框裁掉,需断行)") } + } + } + + # 业务目录顶层杂项 txt(v1.10 新增)—— BH 菜单把 filters\Local 顶层的每个 + # .txt 当成一个**独立过滤器**列出,只有 `本地过滤器存放目录.txt` 被忽略。 + # 所以顶层除合并版与该占位文件外不应再有 .txt;工具文件一律放 tools\ 子目录。 + # 在仓库里跑时顶层只有合并版,本检查自然为空。 + $strayTxt = @(Get-ChildItem -LiteralPath $Root -Filter '*.txt' -File -ErrorAction SilentlyContinue | + Where-Object { $_.Name -ne $MergedName -and $_.Name -ne $DirPlaceholderTxt }) + if ($strayTxt.Count -gt 0) { + [void]$warns.Add("业务目录顶层有 $($strayTxt.Count) 个多余 .txt(会被 BH 菜单当成独立过滤器):$(($strayTxt | ForEach-Object Name) -join ', ') —— 建议移到 tools\ 子目录") } return [pscustomobject]@{