跳轉到內容

文明/文明IV/Modding/教程/入門

來自華夏公益教科書,開放世界開放書籍

此頁面將成為 Civilization IV 模組入門的好幫手。它以半邏輯格式排列(儘可能在維基中),從調整事物的基礎(使用 XML)到使用 Python 建立場景和重做 GUI 的更高階的 Modding。

XML入門

[編輯 | 編輯原始碼]

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 與它無關。沒錯,但您會驚訝地發現它與它有多麼相似。

Python入門

[編輯 | 編輯原始碼]

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
華夏公益教科書