跳转到内容

文明/文明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
华夏公益教科书