Counter-Strike

如何找出 CounterStrike 1.6 中的 BSP(地圖)文件有效使用了哪些 WAD(紋理)文件?

  • October 11, 2022

使用以下命令…

HLExtract.exe -p "fy_office.bsp" -e "root\fy_office.ent"

…可以找出哪些 WAD 文件(紋理)被 BSP(地圖)文件列為正在使用的輸出範例(在上述命令中提取的“fy_office.ent”文件內容)…

{
"wad" "\programme\valve\valve\thwc_hl.wad;\programme\valve\cstrike\sourcebuero.wad;\programme\valve\cstrike\villaggio.wad;"
"mapversion" "220"
"MaxRange" "4096"
"skyname" "tornsky"
"classname" "worldspawn"
"classname" "worldspawn"
}
[...]

請注意,在項目“wad”中列出了幾個 WAD 文件(紋理)。事實證明,即使列出了這些 WAD 文件,也不需要它們。許多 BSP(地圖)文件都會發生這種情況。

我已經嘗試了幾個實用程序,但沒有找到任何可以讓我正確設置此資訊的工具。我需要一個可以通過命令行使用的實用程序,因為我需要這個文本輸出。

是否有任何實用程序或策略(通過命令行)可用於正確定義此資訊,即 BSP(地圖)文件實際使用了哪些 WAD 文件(紋理)?

這是一個老問題,答案很簡單,

**為什麼?**因為 BSP 文件沒有這個資訊。

實際上,BSP 文件只有它使用的 WAD 文件列表和紋理名稱,但沒有特定紋理屬於哪個 WAD 文件的資訊。這些紋理的名稱在 BSP 中是唯一的。


GoldSrc (CS 1.6) 的工作方式給人一種錯誤的印象,即它“知道”需要哪些 WAD 文件。但不完全…

要了解 GoldSrc (CS 1.6) 的工作原理,讓我們想像以下場景:您已經載入了一個 BSP 文件,但您還沒有使任何引用的 WAD 文件可用…

[...]
"wad" "\programme\valve\valve\thwc_hl.wad;\programme\valve\cstrike\sourcebuero.wad;\programme\valve\cstrike\villaggio.wad;"
[...]

…在“cstrike”或“valve”文件夾中。

所以,仍然在這個場景中,讓我們想像一些更多的情況來展示 GoldSrc (CS 1.6) 在嘗試載入 BSP 文件中指向的每個紋理時會如何操作:

  • 嘗試載入“cstrike”或“valve”文件夾中所有引用的 WAD 文件。無法載入任何;
  • 嘗試載入每個引用的紋理。找不到第一個;
  • 搜尋 WAD 文件列表,發現第一個文件沒有載入。然後它警告該文件失去(消息框);
  • 使用者將此 WAD 文件放在“cstrike”文件夾中並嘗試再次載入 BSP;
  • 載入可用 WAD 文件中所有引用的紋​​理,但意識到仍然存在不可用的紋理;
  • 請求列表中的下一個 WAD 文件;
  • 等等…

可能的解決方案(Linux 方法):

以程式方式確定(例如,通過 Bash 腳本)需要哪些 WAD 文件的唯一可能解決方案是使用諸如HLExtract.exe

例子

WINEDEBUG=-all wine "<PATH>/HLExtract.exe" -p "<PATH>\SOME_WAD.wad" -l | grep -i ".bmp" | cut -d\\ -f2 | cut -d. -f1 > "SOME_WAD_TEXTURES_LIST.txt"

…並根據獲得的列表使用“字元串”之類的實用程序檢查 BSP 內的每個紋理…

例子

strings "<PATH>/SOME_BSP.bsp" | grep -iw -- "SOME_TEXTURE_NAME" >> "SOME_BSP_TEXTURES_IN_USE.txt" 2>&1

…因此,如果找到,則 BSP 文件正在使用此 WAD 文件。

筆記

  • 第一個命令列出“SOME_WAD.wad”文件中的所有紋理並輸出到“SOME_WAD_TEXTURES_LIST.txt”文件。第二個命令檢查紋理名稱是否在文件“SOME_BSP.bsp”中,並輸出到文件“SOME_BSP_TEXTURES_IN_USE.txt”中,如果它已經存在則進行附加 - 對於按順序執行相同的命令很有用;
  • BSP 文件可以將其紋理嵌入其中,這樣就不需要引用的 WAD 文件;
  • WAD 文件可以具有與另一個 WAD 文件中的紋理同名的紋理。載入紋理的優先級始終是最後載入的 WAD - 遵循的順序與具有引用 WAD 文件列表的“wad”屬性相同。如果之前的 WAD 已經有同名的紋理,這可能會給人一種錯誤的印象,即不需要 WAD,但是這可能會導致載入錯誤的紋理。

引用自:https://gaming.stackexchange.com/questions/399649