文明/文明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