文明/文明IV/Modding/教程/入門
此頁面將成為 Civilization IV 模組入門的好幫手。它以半邏輯格式排列(儘可能在維基中),從調整事物的基礎(使用 XML)到使用 Python 建立場景和重做 GUI 的更高階的 Modding。
Civ4 配置的很大一部分是透過 XML 完成的。所有文字(不同語言)、單位屬性、建築成本等都以 XML 編碼,並儲存在純文字檔案中,副檔名為 .xml。
這很好,但 XML 是什麼樣子的,它是如何工作的呢?如果您熟悉 HTML,甚至您在帖子中使用的 VB 程式碼,那麼學習 XML 應該沒有問題。它包含像 ... 這樣的標籤,它們包裹著資訊片段來描述它們。要檢視一個使用 XML 的好例子,請檢視您的 PM!您可以以 XML 格式下載 PM - 在您刪除它們的選單中有一個選項。
例如,這是我發給自己的 PM
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!-- Civilization Fanatics' Forums;http://forums.civfanatics.com -->
<!-- Private Message Dump for User Weasel Op; Oct 25, 2005 09:31 AM -->
<privatemessages>
<folder name="Inbox">
<privatemessage>
<datestamp>2005-10-25 09:31</datestamp>
<title>XML in Civ4</title>
<fromuser>Weasel Op</fromuser>
<touser />
<message>Hey, did you know that Civ4 uses XML? :D</message>
</privatemessage>
</folder>
</privatemessages>
現在這可能看起來很複雜,尤其是如果您以前從未見過 HTML,但不用擔心。我會解釋它的工作原理。
<?xml version="1.0" encoding="ISO-8859-1" ?> <!-- Civilization Fanatics' Forums;http://forums.civfanatics.com --> <!-- Private Message Dump for User Weasel Op; Oct 25, 2005 09:31 AM -->
這部分只是告訴讀取檔案的程式,以及您作為編碼人員,這是什麼。第一個標籤通知程式這是一個 XML 檔案,使用版本 1.0 編寫,並使用西歐字元集。接下來的兩行是註釋 - 注意 . 兩者之間的所有內容都是註釋,程式會忽略它。它只是為了您,讓您知道這是什麼。
接下來是好東西
<privatemessages>
<folder name="Inbox">
第一個真正起作用的標籤是 <privatemessages> 標籤。此標籤告訴計算機從該標籤到結束標籤(帶有 / 的標籤,在本例中為 </privatemessages>)之間的一切都是一個元素。元素是一段資訊。它可以包含其他元素、文字或兩者。在本例中,<privatemessages> 開始了一個包含檔案中所有私信的元素。(這裡只有一個,但如果我儲存了我的整個收件箱,它們都會在那裡。)
接下來是 <folder> 標籤。請注意,此標籤不僅有名稱,還有描述。此描述稱為屬性。屬性是包含在元素標籤中的一個小資訊片段。它賦予元素一個特徵,在本例中是名稱“Inbox”。這是 XML 靈活性的一個例子。“Inbox” 可以是“folder” 中的獨立元素,像這樣
<privatemessages>
<folder>
<Inbox>
這裡,“Inbox” 是“folder” 中的一個元素。但是,“Inbox” 作為屬性更好,因為從邏輯上講,“Inbox” 是一個特定的資料夾,而不是資料夾的一部分。
您是否開始理解它了呢?讓我們繼續。這是事情開始變得有趣的地方
<privatemessage>
<datestamp>2005-10-25 09:31</datestamp>
<title>XML in Civ4</title>
<fromuser>Weasel Op</fromuser>
<touser />
<message>Hey, did you know that Civ4 uses XML? :D</message>
</privatemessage>
這是一大塊程式碼,但如果您仔細觀察,它遵循相同的模式。這是 PM 本身,我發給自己的實際資訊。注意 <privatemessage> 標籤。它與 <privatemessages> 不同。該標籤將它內部的所有內容定義為一組私信,但該標籤將自身定義為單個 PM。請看最底部的行。看到那個結束標籤了嗎?它有相同的名稱,但在它之前有一個斜槓:</privatemessage>。這是 <privatemessage> 的結束標籤,表示該元素的結束。中間的所有內容,包括標籤本身,都是元素的一部分。
第二行給出傳送訊息的日期和時間。<datestamp> 標籤將其包圍,表示它也是一個元素。同樣,下一行是 PM 的標題,下一行表示訊息來自誰。請記住,這些元素中的每一個都是 <privatemessage> 元素的一部分,它是 <folder> 元素的一部分,而 <folder> 元素又是 <privatemessages> 元素的一部分。
下一行看起來有點不同。此標籤將開始和結束標籤組合成一個。由於該行是空白的,因此不需要兩個單獨的標籤。在斜槓之後新增斜槓就像 xml 簡寫 - 它使用相同的標籤開啟和關閉元素。“touser” 元素是空的,因為這是我自己的 PM。如果它發給了其他人,它就不會在我的收件箱中!
下一個元素是它的核心。這是 PM 的實際文字,包含在 <message> 標籤中。根據 PM 的不同,此元素可以包含幾行文字、VB 程式碼等。但需要注意的是,它都是文字。XML 沒有什麼神奇的地方。沒有編譯器、沒有函式、沒有特殊字元。所有內容都以文字格式儲存、傳送和編輯。
正如我提到的,最後一行表示 <privatemessage> 元素的結束。
現在讓我們看一下最後一段程式碼
</folder> </privatemessages>
現在您可能已經猜到它們的作用了。</folder> 關閉了“folder” 元素。請注意,這裡沒有包含屬性“Inbox”。屬性是元素的一部分,而不是元素本身。事實上,它不能被關閉,因為它從未被開啟過。它只是“folder” 元素的一個特徵。如果沒有更多“folder”,它就不能是“Inbox”。最後一行關閉了 <privatemessages> 元素。
現在您可能想知道,為什麼會有三個元素相互包含?如果您回顧整個程式碼段,您將看到這三個主要元素一起開啟和關閉
<privatemessages>
<folder name="Inbox">
<privatemessage>
. . .
</privatemessage>
</folder>
</privatemessages>
為什麼它們不能成為一個元素?實際上,它們以這種方式出現的原因僅僅是因為我只儲存了一個 PM。如果我將所有 PM 下載到一個檔案中,它就會不同。<privatemessages> 仍然包含所有內容,因為它是根元素。這僅僅意味著它是檔案的初級、基本元素。整個檔案本質上是一個元素,<privatemessages>。在 <privatemessages> 中將是兩個 <folder> 元素:<folder name-"Inbox"> 和 <folder name="Sent Items">。在第一個 </folder> 標籤之後,第二個資料夾將開始
</folder> <folder name="Sent Items">
同樣適用於 <privatemessage>。每個 PM 都是一個獨立的元素,在每個元素關閉後,下一個元素將開始,直到資料夾結束。
現在這並不難,對吧?一旦您理解了 XML 的基本概念,它就是一個簡單的過程。
現在我知道您可能想知道,這如何幫助我修改 Civ4?PM 與它無關。沒錯,但您會驚訝地發現它與它有多麼相似。
Civilization IV 使用 Python 作為其大部分 GUI 和事件系統的一大優勢在於,您不需要做任何其他事情,只需在文字編輯器(例如記事本)中開啟 .py 檔案,編輯它們並儲存它。無需編譯。
Python 檔案位於 Assets\Python 中。此目錄的根目錄各不相同,因為它可能是 Civilization 4 根遊戲目錄,或者是一個 Mod 目錄,但 Assets\Python 下的目錄佈局不應改變。
以下是目錄的示例
\...\Civilization 4\Assets\Python . |-- EntryPoints |-- PitBoss |-- Screens |-- System | |-- email | |-- encodings | `-- wx | |-- build | |-- lib | | |-- colourchooser | | |-- editor | | |-- floatcanvas | | |-- masked | | |-- mixins | | `-- ogl | |-- py | | `-- tests | `-- tools | `-- XRCed |-- _DebugTools |-- pyHelper |-- pyUnit `-- pyWB