diff --git a/build/build.bat b/build/build.bat new file mode 100644 index 0000000..e6d817d --- /dev/null +++ b/build/build.bat @@ -0,0 +1,122 @@ +@echo off +setlocal EnableExtensions +title BadWolf ¹ýÂËÆ÷¹¹½¨¹¤¾ß + +rem ============================================================ +rem BadWolf ¹ýÂËÆ÷¹¹½¨Èë¿Ú build.bat v1.2 +rem ±¾ÎļþΪ GBK(cp936) + CRLF ±àÂ룻¸ÄÎݸÇ뱣³ָñàÂ룬·ñÔòÖÐÎÄÂÒÂ롣 +rem ============================================================ + +rem ---- ¼Ç¼ԭ´úÂëҳ£¬Í˳öǰ»¹ԭ¡£±¾ÎļþÊÇ GBK£¬¿ØÖÆ̨·Ç 936 ÏÈÇйýȥ¡£ +rem chcp ^nul 2>nul + +set "RC=0" +set "HERE=%~dp0" +set "PS1=%HERE%build.ps1" +set "MENU=" +if "%~1"=="" set "MENU=1" + +if not exist "%PS1%" goto nops1 +if /i "%~1"=="help" goto help +if "%~1"=="/?" goto help +if "%~1"=="?" goto help + +if defined MENU goto menu +goto run + +rem ---------------------------------------------------------------- ²˵¥ +:menu +cls +echo ============================================================ +echo BadWolf ¹ýÂËÆ÷¹¹½¨¹¤¾ß +echo ============================================================ +echo. +echo 1. УÑé ֻ¶Á¼ì²飬²»дÈκÎÎļþ +echo 2. ¹¹½¨ °´ģ¿éÖؽ¨ºϲ¢°棬×Զ¯±¸·ݣ¬ֻÁô×î½ü 2 ·Ý +echo 3. ÐкŻ»Ëã ºϲ¢°æÐкÅ Óë ģ¿éÐкÅ »¥Ï໻Ëã +echo 4. µ¼³ö Éú³ÉÐкÅӳÉä±í +echo 0. Í˳ö +echo. +set "SEL=" +set /p "SEL=ÇëÊäÈëÐòºźó»سµ£¬ֱ½ӻسµ = УÑ飺" +if "%SEL%"=="0" goto done +if "%SEL%"=="2" goto mBld +if "%SEL%"=="3" goto mMap +if "%SEL%"=="4" goto mExp +goto mChk + +:mChk +set "ARGS=check" +goto run2 + +:mBld +set "ARGS=build" +goto run2 + +:mMap +echo. +set "Q=" +set /p "Q=ÇëÊäÈëÐкţ¬ÀýÈç 1939 »ò 16:139£¬ֱ½ӻسµ·µ»ز˵¥£º" +if "%Q%"=="" goto menu +set "ARGS=map %Q%" +goto run2 + +:mExp +set "ARGS=export" +goto run2 + +rem ---------------------------------------------------------------- ִÐÐ +:run +set "ARGS=%*" + +:run2 +echo. +powershell -NoProfile -ExecutionPolicy Bypass -File "%PS1%" %ARGS% +set "RC=%ERRORLEVEL%" +echo. +if "%RC%"=="0" echo [Íê³É] Í˳öÂë 0£ºУÑéͨ¹ý +if "%RC%"=="1" echo [עÒâ] Í˳öÂë 1£º·¢ÏÖÎÊÌ⣬¼ûÉÏÃæµÄ x Ïî»ò²îÒì¿é +if "%RC%"=="2" echo [ʧ°Ü] Í˳öÂë 2£º»·¾³ÎÊÌ⣬ȱÎļþ»òģ¿é±àºÅÖظ´ +if not defined MENU goto done +echo. +pause +goto menu + +rem ---------------------------------------------------------------- °ïÖú +:help +echo. +echo BadWolf ¹ýÂËÆ÷¹¹½¨½ű¾ ÃüÁîÐÐÓ÷¨ +echo. +echo build.bat ´򿪲˵¥ +echo build.bat check УÑ飬²»дÎļþ +echo build.bat build Öؽ¨ºϲ¢°棬×Զ¯±¸·Ý +echo build.bat map 1939 ºϲ¢°æÐкÅ ת ģ¿éÐкÅ +echo build.bat map 16:139 ģ¿éÐкÅ ת ºϲ¢°æÐкÅ +echo build.bat export µ¼³öÐкÅӳÉä±í +echo. +echo ¸½¼ӲÎÊý +echo -NoBackup build ʱ²»±¸·ÝԭÎļþ +echo -KeepBackups 3 ±¸·ݱ£Áô·ÝÊý£¬ĬÈÏ 2 +echo -Strict ÓÐÌáʾÏîҲË㲻ͨ¹ý +echo. +echo Í˳öÂë 0 ͨ¹ý 1 ÓÐÎÊÌâ 2 »·¾³ÎÊÌâ +echo. +goto done + +rem ---------------------------------------------------------------- ȱÎļþ +:nops1 +echo. +echo [´íÎó] ͬĿ¼ÏÂÕҲ»µ½ build.ps1 +echo ÇëȷÈÏ build.bat Óë build.ps1 ·ÅÔÚͬһ¸öÎļþ¼ÐÀ +echo. +pause +set "RC=2" +goto done + +:done +if defined OLDCP chcp %OLDCP% nul 2>nul +exit /b %RC% diff --git a/build/build.ps1 b/build/build.ps1 new file mode 100644 index 0000000..3e6c468 --- /dev/null +++ b/build/build.ps1 @@ -0,0 +1,901 @@ +#requires -Version 5.1 +<# + BadWolf 过滤器构建脚本 build.ps1 v1.2 + ------------------------------------------------------------------ + 用途:把模块目录下的 txt 按文件名排序拼接成 BadWolf-LootFilter.txt, + 并完成一致性校验与行号换算。纯 PowerShell,无需安装任何软件。 + + v1.2 相对 v1.1 的变化 + ------------------------------------------------------------------ + · 自检新增:孤立 % / 未闭合 % 扫描(半截百分号会吞颜色或漏出明文) + 判定:先整体屏蔽合法占位符 %NAME%,剩下的 % 只放行四种写字面百分号的情形 + (数值后 40%ED / 右括号后 [4-6]%物理减伤 / 夹在两个占位符之间 / + 「物理减伤%」「魔法减伤%」后的百分比示意符) + + v1.1 相对 v1.0 的变化 + ------------------------------------------------------------------ + · 模块白名单:只拼 NN-*.txt,其它 txt 一律跳过并黄字警告(不再静默混入) + · 备份轮转:build 只保留最近 2 份 .bak,可用 -KeepBackups N 调整 + · 临时文件:写盘失败也会清理 .tmp + · 自检新增:物品代码白名单(item_codes.txt)/ 死规则 / Formula 引用完整性 + · 版本行联动:版本行日期落后于最晚模块改动时间时提示 + + 用法(二选一) + ------------------------------------------------------------------ + A. 双击 build.bat → 直接校验(窗口不关) + B. 命令行: + powershell -NoProfile -ExecutionPolicy Bypass -File build.ps1 + powershell -NoProfile -ExecutionPolicy Bypass -File build.ps1 build + powershell -NoProfile -ExecutionPolicy Bypass -File build.ps1 map 1939 + powershell -NoProfile -ExecutionPolicy Bypass -File build.ps1 map 16:139 + powershell -NoProfile -ExecutionPolicy Bypass -File build.ps1 export + + 命令 + ------------------------------------------------------------------ + check 校验(默认,不写任何文件) + build 重建合并版(自动备份 .bak,只保留最近 2 份;-NoBackup 关闭备份) + map 行号换算: 1939(合并→模块) 或 16:139(模块→合并) + export 导出行号映射表 + + 参数 + ------------------------------------------------------------------ + -NoBackup build 时不备份原文件 + -KeepBackups N 备份保留份数,默认 2 + -Strict 有提示项也算不通过(退出码 1) + + 退出码:0 一致 / 1 有问题 / 2 环境问题 +#> +param( + [Parameter(Position = 0)][string]$Command = 'check', + [Parameter(Position = 1)][string]$Arg = '', + [switch]$NoBackup, + [switch]$Strict, + [int]$KeepBackups = 2 +) + +$ErrorActionPreference = 'Stop' + +# ---------------------------------------------------------------- 基础路径 +$Root = $PSScriptRoot +$MergedName = 'BadWolf-LootFilter.txt' +$MergedPath = Join-Path $Root $MergedName +$MapName = [char]0x884C + [char]0x53F7 + [char]0x6620 + [char]0x5C04 + [char]0x8868 + '.md' + +function Write-Line([string]$s) { Write-Host $s } +function Format-N([long]$n) { return $n.ToString('N0', [System.Globalization.CultureInfo]::InvariantCulture) } +function Get-Bar { return ('=' * 74) } +function Write-Head([string]$t) { Write-Host ""; Write-Host "[$t]"; Write-Host ('-' * 74) } + +function Get-Md5Hex([byte[]]$Bytes) { + $md5 = [System.Security.Cryptography.MD5]::Create() + try { $h = $md5.ComputeHash($Bytes) } finally { $md5.Dispose() } + return (-join ($h | ForEach-Object { $_.ToString('x2') })) +} + +# ---------------------------------------------------------------- 模块目录 +# 只认「≥10 个 数字-xxx.txt」的目录;多个候选直接报错,绝不猜 +function Get-ModuleDir { + $cands = @() + foreach ($d in @(Get-ChildItem -LiteralPath $Root -Directory -ErrorAction SilentlyContinue)) { + $n = @(Get-ChildItem -LiteralPath $d.FullName -Filter '*.txt' -File -ErrorAction SilentlyContinue | + Where-Object { $_.Name -match '^\d{2}-' }).Count + if ($n -gt 0) { $cands += [pscustomobject]@{ Path = $d.FullName; Count = $n } } + } + $good = @($cands | Where-Object { $_.Count -ge 10 } | Sort-Object -Descending Count) + + # 兼容「模块与脚本平铺在同一目录」的布局(仓库里可能没有子文件夹) + $flat = @(Get-ChildItem -LiteralPath $Root -Filter '*.txt' -File -ErrorAction SilentlyContinue | + Where-Object { $_.Name -match '^\d{2}-' }).Count + if ($flat -ge 10) { return $Root } + if ($good.Count -eq 0) { + $tip = '' + if ($cands.Count -gt 0) { + $tip = ';候选目录(文件数不足):' + (($cands | ForEach-Object { "$($_.Path)($($_.Count)个)" }) -join ',') + } + throw "找不到模块目录:$Root 下没有包含 ≥10 个 `00-xxx.txt` 形式文件的文件夹$tip" + } + if ($good.Count -gt 1) { + $list = ($good | ForEach-Object { "$($_.Path)($($_.Count) 个)" }) -join ';' + throw "检测到多个可能的模块目录,为避免用错目录构建,已停止:$list。请把多余的移走或改名。" + } + return $good[0].Path +} + +# ---------------------------------------------------------------- 载入模块 +# 白名单:只认「NN-名称.txt」;名字里带 副本/备份/copy/bak/(1) 的视为复制品,同样跳过 +$script:SkippedModules = @() +$CopyNameRe = '副本|备份|复制|copy|bak|backup|\(\d+\)' + +function Get-Modules([string]$Dir) { + $allTxt = @(Get-ChildItem -LiteralPath $Dir -Filter '*.txt' -File) + $files = @($allTxt | Where-Object { + $_.Name -match '^\d{2}-.*\.txt$' -and $_.Name -notmatch $CopyNameRe + } | Sort-Object Name) + $script:SkippedModules = @($allTxt | Where-Object { + -not ($_.Name -match '^\d{2}-.*\.txt$') -or ($_.Name -match $CopyNameRe) + } | Sort-Object Name | ForEach-Object { $_.Name }) + $list = New-Object System.Collections.ArrayList + $cursor = 1 + $strict = [System.Text.UTF8Encoding]::new($false, $true) + + foreach ($f in $files) { + $bytes = [System.IO.File]::ReadAllBytes($f.FullName) + $text = [System.Text.Encoding]::UTF8.GetString($bytes) + $errors = New-Object System.Collections.ArrayList + + try { [void]$strict.GetString($bytes) } + catch { [void]$errors.Add('不是合法的 UTF-8 编码') } + + if ($bytes.Length -ge 3 -and $bytes[0] -eq 0xEF -and $bytes[1] -eq 0xBB -and $bytes[2] -eq 0xBF) { + [void]$errors.Add('含 UTF-8 BOM') + } + $lfOnly = ([regex]::Matches($text, "(?.bak(文件名时间戳可直接按名倒序) +function Remove-OldBackup([int]$Keep) { + $dir = Split-Path -Parent $MergedPath + $pat = (Split-Path -Leaf $MergedPath) + '.*.bak' + $all = @(Get-ChildItem -LiteralPath $dir -Filter $pat -File -ErrorAction SilentlyContinue | + Sort-Object Name -Descending) + if ($all.Count -le $Keep) { return @() } + $gone = @($all | Select-Object -Skip $Keep) + foreach ($g in $gone) { Remove-Item -LiteralPath $g.FullName -Force -ErrorAction SilentlyContinue } + return $gone +} + +# ---------------------------------------------------------------- build +function Invoke-Build($Mods) { + Write-Line (Get-Bar) + Write-Line " BadWolf 过滤器 构建" + Write-Line (Get-Bar) + + $bad = @($Mods | Where-Object { $_.Errors.Count -gt 0 }) + if ($bad.Count -gt 0) { + Write-Line " [中止] 以下模块存在编码/换行问题:" + foreach ($m in $bad) { + Write-Line " $($m.Name)" + foreach ($e in $m.Errors) { Write-Line " ! $e" } + } + return 1 + } + + $cat = Join-Bytes $Mods + $old = @() + if (Test-Path -LiteralPath $MergedPath) { $old = [System.IO.File]::ReadAllBytes($MergedPath) } + + $same = $false + if ($old.Length -eq $cat.Length) { + $same = $true + for ($i = 0; $i -lt $cat.Length; $i++) { if ($cat[$i] -ne $old[$i]) { $same = $false; break } } + } + if ($same) { + Write-Line " 合并版已是最新,无需重建。" + Write-Line "" + return Invoke-Check $Mods + } + + if (-not $NoBackup -and (Test-Path -LiteralPath $MergedPath)) { + $stamp = Get-Date -Format 'yyyyMMdd-HHmmss' + $bak = "$MergedPath.$stamp.bak" + Copy-Item -LiteralPath $MergedPath -Destination $bak -Force + Write-Line " 已备份 → $(Split-Path -Leaf $bak)" + if ($KeepBackups -gt 0) { + $gone = @(Remove-OldBackup $KeepBackups) + if ($gone.Count -gt 0) { + Write-Line " 轮转 删除旧备份 $($gone.Count) 份(保留最近 $KeepBackups 份):$(($gone | ForEach-Object { $_.Name }) -join ', ')" + } else { + Write-Line " 轮转 现有备份未超过 $KeepBackups 份,无需删除" + } + } + } + + $tmp = "$MergedPath.tmp" + try { + [System.IO.File]::WriteAllBytes($tmp, $cat) + Move-Item -LiteralPath $tmp -Destination $MergedPath -Force + } finally { + if (Test-Path -LiteralPath $tmp) { Remove-Item -LiteralPath $tmp -Force -ErrorAction SilentlyContinue } + } + + $new = [System.IO.File]::ReadAllBytes($MergedPath) + $lineN = ([regex]::Matches([System.Text.Encoding]::UTF8.GetString($new), "\n")).Count + Write-Line " 已写入 $(Format-N $new.Length) B / $(Format-N $lineN) 行 MD5 $(Get-Md5Hex $new)" + + $okWrite = $false + if ($new.Length -eq $cat.Length) { + $okWrite = $true + for ($i = 0; $i -lt $cat.Length; $i++) { if ($new[$i] -ne $cat[$i]) { $okWrite = $false; break } } + } + if ($okWrite) { Write-Line " 写入校验通过(逐字节一致)" } else { Write-Line " [错误] 写入校验失败"; return 1 } + + Write-Line "" + return Invoke-Check $Mods +} + +# ---------------------------------------------------------------- map +function Invoke-Map($Mods, [string]$Q) { + if ($Q -match ':') { + $parts = $Q.Split(':') + $code = $parts[0]; $ln = 0 + if (-not [int]::TryParse($parts[1], [ref]$ln)) { Write-Line "无法解析行号:$Q"; return 1 } + $m = $Mods | Where-Object { $_.Code -eq $code -or $_.Name.StartsWith($code) } | Select-Object -First 1 + if ($null -eq $m) { Write-Line "找不到模块:$code"; return 1 } + if ($ln -lt 1 -or $ln -gt $m.LineCount) { Write-Line "$($m.Name) 只有 $($m.LineCount) 行"; return 1 } + $merged = $m.Start + $ln - 1 + Write-Line "$($m.Name) 第 $ln 行 → 合并版 L$merged" + $lines = Get-Lines $m.Text + if ($ln -le $lines.Count) { Write-Line " $($lines[$ln - 1])" } + return 0 + } + + $ln = 0 + if (-not [int]::TryParse($Q, [ref]$ln)) { Write-Line "无法解析行号:$Q"; return 1 } + $m = Find-ModuleOfLine $Mods $ln + if ($null -eq $m) { Write-Line "L$ln 超出范围(1-$($Mods[$Mods.Count-1].End))"; return 1 } + Write-Line "合并版 L$ln → $($m.Name) 第 $($ln - $m.Start + 1) 行" + return 0 +} + +# ---------------------------------------------------------------- export +function Invoke-Export($Mods) { + $cat = Join-Bytes $Mods + $end = $Mods[$Mods.Count - 1].End + $sb = New-Object System.Text.StringBuilder + [void]$sb.AppendLine('# BadWolf 过滤器行号映射表') + [void]$sb.AppendLine('') + [void]$sb.AppendLine("- 生成时间:$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')") + [void]$sb.AppendLine("- 模块数:$($Mods.Count)") + [void]$sb.AppendLine("- 模块拼接:$(Format-N $cat.Length) 字节 / $(Format-N $end) 行 / MD5 ``$(Get-Md5Hex $cat)``") + [void]$sb.AppendLine('- 换算:`合并行 = 模块起始行 + 模块行 - 1`') + [void]$sb.AppendLine('') + [void]$sb.AppendLine('| 模块 | 合并版起 | 合并版止 | 行数 | 字节 |') + [void]$sb.AppendLine('|---|---:|---:|---:|---:|') + foreach ($m in $Mods) { + [void]$sb.AppendLine("| $($m.Name) | $($m.Start) | $($m.End) | $($m.LineCount) | $(Format-N $m.ByteLen) |") + } + [void]$sb.AppendLine("| **合计** | 1 | $end | $end | $(Format-N $cat.Length) |") + [void]$sb.AppendLine('') + [void]$sb.AppendLine('## 常用锚点') + [void]$sb.AppendLine('') + foreach ($m in $Mods) { + if (@('00','09','16','22','28','37','39') -contains $m.Code) { + [void]$sb.AppendLine("- ``$($m.Code)`` $($m.Name) → L$($m.Start)–L$($m.End)") + } + } + $path = Join-Path $Root $MapName + [System.IO.File]::WriteAllText($path, $sb.ToString(), (New-Object System.Text.UTF8Encoding($false))) + Write-Line "已导出 $path" + return 0 +} + +# ---------------------------------------------------------------- 主流程 +try { + $moduleDir = Get-ModuleDir +} catch { + Write-Line "[错误] $($_.Exception.Message)" + exit 2 +} + +Write-Line (Get-Bar) +Write-Line " BadWolf 过滤器构建工具(PowerShell 版)" +Write-Line (Get-Bar) +Write-Line " 脚本位置 $PSCommandPath" +Write-Line " 模块目录 $moduleDir" +Write-Line " 合并版 $MergedPath" + +$mods = Get-Modules $moduleDir +if ($mods.Count -eq 0) { Write-Line "[错误] 模块目录里没有 NN-*.txt 模块文件"; exit 2 } + +if ($script:SkippedModules.Count -gt 0) { + Write-Host "" + Write-Host " [警告] 以下 txt 不符合「NN-名称.txt」,已跳过(不会进入合并版):" -ForegroundColor Yellow + foreach ($n in $script:SkippedModules) { Write-Host " - $n" -ForegroundColor Yellow } + Write-Host " 若是正式模块,请改名成 40-xxx.txt 这种形式。" -ForegroundColor Yellow +} + +# 编号必须唯一:两个 16-xxx.txt 会让合并版多出一整段,且顺序取决于文件名,必须人工处理 +$dupCodes = @($mods | Group-Object Code | Where-Object { $_.Count -gt 1 }) +if ($dupCodes.Count -gt 0) { + Write-Line "" + Write-Line "[错误] 模块编号重复,已停止(避免把两份内容都拼进合并版):" + foreach ($g in $dupCodes) { + $names = ($g.Group | ForEach-Object { $_.Name }) -join ' / ' + Write-Line (" [$($g.Name)] $names") + } + Write-Line " 处理办法:把多余的那份移出模块目录,或改成未占用的编号。" + exit 2 +} + +switch ($Command.ToLowerInvariant()) { + 'build' { exit (Invoke-Build $mods) } + 'map' { if ([string]::IsNullOrWhiteSpace($Arg)) { Write-Line "用法:build.bat map 1939 或 build.bat map 16:139"; exit 2 }; exit (Invoke-Map $mods $Arg) } + 'export' { exit (Invoke-Export $mods) } + 'check' { exit (Invoke-Check $mods) } + default { Write-Line "[错误] 未知命令:$Command(可用 check / build / map / export)"; exit 2 } +} diff --git a/build/item_codes.txt b/build/item_codes.txt new file mode 100644 index 0000000..b750e8f --- /dev/null +++ b/build/item_codes.txt @@ -0,0 +1,1295 @@ +# BadWolf 过滤器 —— 合法物品/类型代码白名单 +# 来源:data\global\excel 的 Weapons.txt / Armor.txt / Misc.txt 的 code 列 +# + ItemTypes.txt 的 Code 与 ItemType 列(共 833 个 item code,453 个 type) +# 用法:build.ps1 自检时读取本文件,比对规则条件里的小写标识;缺失文件则跳过该项检查 +# 更新:游戏版本升级、新增物品后,重新生成本文件即可(每行一个,大小写不敏感,# 开头为注释) + +[codes] +0sc +2ax +2hs +6bs +6cb +6cs +6hb +6hx +6l7 +6lb +6ls +6lw +6lx +6mx +6rx +6s7 +6sb +6ss +6sw +6ws +72a +72h +7ar +7ax +7b7 +7b8 +7ba +7bk +7bl +7br +7bs +7bt +7bw +7cl +7cm +7cr +7cr2 +7cs +7dg +7di +7fb +7fc +7fl +7ga +7gd +7gi +7gl +7gm +7gs +7gw +7h7 +7ha +7ja +7kr +7la +7ls +7lw +7m7 +7ma +7mp +7mt +7o7 +7p7 +7pa +7pi +7qr +7qs +7s7 +7s8 +7sb +7sc +7sm +7sp +7sr +7ss +7st +7ta +7tk +7tr +7ts +7tw +7vo +7wa +7wb +7wc +7wd +7wh +7wn +7ws +7xf +7yw +8bs +8cb +8cs +8hb +8hx +8l8 +8lb +8ls +8lw +8lx +8mx +8rx +8s8 +8sb +8ss +8sw +8ws +92a +92h +9ar +9ax +9b7 +9b8 +9b9 +9ba +9bk +9bl +9br +9bs +9bt +9bw +9cl +9cm +9cr +9cs +9dg +9di +9fb +9fc +9fl +9ga +9gd +9gi +9gl +9gm +9gs +9gw +9h9 +9ha +9ja +9kr +9la +9ls +9lw +9m9 +9ma +9mp +9mt +9p9 +9pa +9pi +9qr +9qs +9s8 +9s9 +9sb +9sc +9sm +9sp +9sr +9ss +9st +9ta +9tk +9tr +9ts +9tw +9vo +9wa +9wb +9wc +9wd +9wh +9wn +9ws +9xf +9yw +aar +am1 +am2 +am3 +am4 +am5 +am6 +am7 +am8 +am9 +ama +amb +amc +amd +ame +amf +amu +aqv +aqv2 +aqv3 +ass +axe +axf +ba1 +ba2 +ba3 +ba4 +ba5 +ba6 +ba7 +ba8 +ba9 +baa +bab +bac +bad +bae +baf +bal +bar +bax +bbb +bet +bey +bhm +bkd +bkf +bks +bld +box +bpl +bps +brn +brs +brz +bsd +bsh +bst +bsw +btl +btx +buc +bwn +cap +cbw +ceh +ces +chn +ci0 +ci1 +ci2 +ci3 +clb +clm +clw +cm1 +cm1p +cm2 +cm2f +cm2p +cm3 +cm3p +cqv +cqv2 +cqv3 +crfb +crfc +crfh +crfp +crfs +crfu +crfv +crn +crs +cst +cwss +d33 +dcbl +dcho +dcma +dcso +dgr +dhn +dir +dr1 +dr2 +dr3 +dr4 +dr5 +dr6 +dr7 +dr8 +dr9 +dra +drb +drc +drd +dre +drf +ear +elx +eyz +fed +fhl +fla +flb +flc +fld +flg +fng +fort +ful +g33 +g34 +gax +gcb +gcg +gcr +gcv +gcw +gcy +gfb +gfg +gfr +gfv +gfw +gfy +ghm +gis +gix +glb +glbs +gld +glg +glgs +glr +glrs +glv +glw +glws +gly +glys +gma +gpb +gpbs +gpg +gpgs +gpl +gpm +gpr +gprs +gps +gpv +gpvs +gpw +gpws +gpy +gpys +gsb +gsc +gsd +gsg +gsr +gsv +gsw +gsy +gth +gts +gwn +gzv +gzvs +hal +hax +hbl +hbt +hbw +hdm +hfh +hgl +hla +hlm +hp1 +hp2 +hp3 +hp4 +hp5 +hpf +hpo +hrb +hrn +hrt +hst +hxb +ibk +ice +imma +imra +imrn +irma +irra +irrn +isc +ivea +iveb +ived +iven +ivep +ives +ivez +iwss +j34 +jav +jaw +jew +jewf +key +kit +kri +ktr +lax +lbb +lbl +lbox +lbt +lbw +lea +leg +lgl +llmr +lmal +lpp +lrg +lsd +lst +lsvl +ltp +luca +lucb +lucc +lucd +luv +lwb +lxb +mac +mau +mbl +mbr +mbt +mgl +mp1 +mp2 +mp3 +mp4 +mp5 +mpf +mpi +mpo +msf +msk +mss +mst +mxb +ne1 +ne2 +ne3 +ne4 +ne5 +ne6 +ne7 +ne8 +ne9 +nea +neb +ned +nee +nef +neg +ob1 +ob2 +ob3 +ob4 +ob5 +ob6 +ob7 +ob8 +ob9 +oba +obb +obc +obd +obe +obf +opl +opm +ops +pa1 +pa2 +pa3 +pa4 +pa5 +pa6 +pa7 +pa8 +pa9 +paa +pab +pac +pad +pae +paf +pax +pik +pil +pk1 +pk2 +pk3 +plt +pvpp +qbr +qey +qf1 +qf2 +qhr +qll +qui +r01 +r01s +r02 +r02s +r03 +r03s +r04 +r04s +r05 +r05s +r06 +r06s +r07 +r07s +r08 +r08s +r09 +r09s +r10 +r10s +r11 +r11s +r12 +r12s +r13 +r13s +r14 +r14s +r15 +r15s +r16 +r16s +r17 +r17s +r18 +r18s +r19 +r19s +r20 +r20s +r21 +r21s +r22 +r22s +r23 +r23s +r24 +r24s +r25 +r25s +r26 +r26s +r27 +r27s +r28 +r28s +r29 +r29s +r30 +r30s +r31 +r31s +r32 +r32s +r33 +r33s +ram +rar +rbe +rera +rid +rin +rkey +rng +rpl +rps +rrra +rtma +rtmf +rtmo +rtmv +rtp +rvl +rvs +rxb +sbb +sbr +sbw +scl +scm +scou +scp +scrb +scy +scz +skc +skf +skl +skls +skp +skr +sku +skz +skzs +sml +sol +spc +spe +spk +spl +spr +spt +ssd +ssp +sst +std +stu +swb +t11 +t12 +t13 +t14 +t15 +t16 +t17 +t18 +t21 +t22 +t23 +t24 +t25 +t26 +t27 +t28 +t29 +t2a +t31 +t32 +t33 +t34 +t35 +t36 +t37 +t38 +t39 +t3a +t3b +t41 +t42 +t43 +t44 +t51 +t52 +t53 +t54 +t55 +t56 +t57 +t58 +t61 +t62 +t69 +t99 +tal +tax +tbk +tbl +tbt +tch +tes +tgl +tkf +toa +tow +tpcl +tpcm +tpcs +tpfl +tpfm +tpfs +tpgl +tpgm +tpgs +tpll +tplm +tpls +tr1 +tr2 +tri +tsc +tsp +uap +uar +uba +ubaa +ubab +ubac +ubtm +ucl +uea +uh9 +uhb +uhc +uhg +uhl +uhm +uhn +uit +ukp +ula +ulb +ulc +uld +ulg +ulm +ult +umb +umc +umg +uml +ung +uow +upk +upl +upma +upmp +urg +urma +urn +urs +ush +usk +utb +utc +utg +uth +utp +uts +utu +uuc +uui +uul +uvb +uvc +uvg +vbl +vbt +vgl +vip +vou +vps +wax +whm +wms +wnd +wrb +wsc +wsd +wsp +wss +wst +xap +xar +xcl +xea +xh9 +xhb +xhg +xhl +xhm +xhn +xit +xkp +xla +xlb +xld +xlg +xlm +xlt +xmb +xmg +xml +xng +xow +xpk +xpl +xrg +xrn +xrs +xsh +xsk +xtb +xtg +xth +xtp +xts +xtu +xuc +xui +xul +xvb +xvg +xyz +yps +ywn +zhb +zlb +zmb +ztb +zvb + +[types] +1han +1handed melee weapon +2h crystal sword +2h sword +2han +2handed melee weapon +2hcs +2hsw +abow +ajav +amaz +amazon bow +amazon item +amazon javelin +amazon spear +amethyst +amn rune generic +amul +amulet +amulet [s] +amus +antidote potion +any armor +any shield +apot +armo +armor +ashd +asm +aspe +assassin item +assassin mastery +assn +auric shields +axe +barb +barbarian item +bels +belt +belt [s] +ber rune generic +blun +blunt +body +body part +bone shield +book +boot +boots +bow +bow quiver +bowq +box +bshi +cham rune generic +chap +char +charm +chipped gem +circ +circlet +clas +class specific +cloa +cloak +club +cm2f +comb +combo weapon +corr +craft ingredient +crft +crossbow +crossbow quiver +crys +crystal swords +diamond +dol rune generic +drui +druid item +dungeon scarab +el rune generic +eld rune generic +elix +elixir +emerald +eth rune generic +expansion +fal rune generic +flawed gem +flawless gem +fort +fortify map +gem +gem0 +gem1 +gem2 +gem3 +gem4 +gema +gemd +geme +gemr +gems +gemt +gemz +gen +general melee +general weapon +generic amethyst +generic diamond +generic emerald +generic f amethyst +generic f diamond +generic f emerald +generic f ruby +generic f sapphire +generic f skull +generic f topaz +generic flawless gem +generic gem +generic p amethyst +generic p diamond +generic p emerald +generic p ruby +generic p sapphire +generic p skull +generic p topaz +generic perfect gem +generic ruby +generic rune +generic sapphire +generic skull +generic topaz +gg3a +gg3d +gg3e +gg3r +gg3s +gg3t +gg3z +gg4a +gg4d +gg4e +gg4r +gg4s +gg4t +gg4z +ggm +ggm3 +ggm4 +ggma +ggmd +ggme +ggmr +ggms +ggmt +ggmz +glov +gloves +gold +gsm +gsm3 +gsm4 +gsma +gsmd +gsme +gsmr +gsms +gsmt +gsmz +gul rune generic +h2h +h2h2 +hamm +hammer +hand to hand +hand to hand 2 +harm +head +healing potion +heavy armor +heavy shield +hel rune generic +helm +herb +hpot +hshi +imbuemag +imbuemag ready +imbuerandom +imbuerandom ready +imbuerare +imbuerare ready +imma +imra +imrn +io rune generic +irma +irra +irrn +ist rune generic +ith rune generic +jah rune generic +jave +javelin +jewel +jewel fragments +jewel generic +jewf +jewg +jewl +key +knif +knife +ko rune generic +large charm +large charm pvp +larm +larzuks malus +lbox +lcha +lchp +lem rune generic +light armor +light shield +lmal +lo rune generic +lpp +lshi +lum rune generic +mace +magic bow quiv +magic xbow quiv +mal rune generic +mana potion +map +map t1 +map t1 exc +map t2 +map t2 exc +map t3 +map t3 exc +map t4 +map t4 exc +map t5 +map t5 exc +marm +mboq +mcha +mchp +medium armor +medium charm +medium charm pvp +medium shield +mele +melee weapon +mgen +misc +miscellaneous +misl +miss +missile +missile potion +missile weapon +mpot +mshi +mxbq +necr +necromancer item +nef rune generic +none +not used +ohm rune generic +orb +ort rune generic +pala +paladin item +pas +pelt +perfect gem +phlm +play +player body part +pole +polearm +polearm and spear +poti +potion +primal helm +pul rune generic +puzzlebox +puzzlepiece +pvp charm +pvp map +pvp map desert +pvpd +pvpm +ques +quest +r01g +r02g +r03g +r04g +r05g +r06g +r07g +r08g +r09g +r10g +r11g +r12g +r13g +r14g +r15g +r16g +r17g +r18g +r19g +r1pg +r20g +r21g +r22g +r23g +r24g +r25g +r26g +r27g +r28g +r29g +r30g +r31g +r32g +r33g +ral rune generic +ranged mastery +rejuv potion +rera +rerollrare +rerollrare ready +ring +rng +rod +rpot +rrra +ruby +rune +rune ten plus generic +rung +runs +sapphire +sc9 +scep +scepter +scha +schp +scou +scour +scrb +scro +scroll +scythe type +seco +second hand +shael rune generic +shie +shield +shld +skull +small charm +small charm pvp +sock +socket filler +sol rune generic +sorc +sorceress item +spea +spear +spiked shield +spot +sshi +stack amethyst +stack diamond +stack emerald +stack flawless gem +stack gem +stack perfect gem +stack ruby +stack rune +stack sapphire +stack skull +stack topaz +staf +staff +stamina potion +standard gem +staves and rods +sur rune generic +swor +sword +t1m +t1me +t2m +t2me +t3m +t3me +t4m +t4me +t5m +t5me +tal rune generic +taxe +thawing potion +thro +throwing axe +throwing knife +thrown weapon +thul rune generic +tir rune generic +tkni +toa +token +topaz +torc +torch +torch fragment +tors +tpot +uber +ubermap +uberorgan +uberunique +ubmp +ubor +ubr +ubru +um rune generic +upgrade map +upgrademag +upgrademag ready +upma +upmp +urma +vex rune generic +voodoo heads +wand +weap +weapon +worldstone shard +wpot +xboq +xbow +zod rune generic