版本说明改为单行提示(不再逐条列清单);build.ps1 v1.11 新增「版本说明每行宽度」自查(上限 72,box 一行 37 宽即丢字);box 断行改用 CL 惰性换行,避免 NL NL NAME 重开块重印标题;sync 脚本改用无 BOM 的 UTF-8 写提交说明
This commit is contained in:
parent
1a13f3e08b
commit
65b79f1fb0
|
|
@ -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,自定义配置|
|
||||
|
|
|
|||
|
|
@ -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,自定义配置|
|
||||
|
|
|
|||
157
build/build.ps1
157
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]@{
|
||||
|
|
|
|||
Loading…
Reference in New Issue