泰坦帝国

 找回密码
 加入帝国

QQ登录

只需一步,快速开始

查看: 6942|回复: 11

[教程文章] [代码][翻译]在对战中添加Kpr族(经典教程)

[复制链接]
发表于 2009-8-16 19:58:21 | 显示全部楼层 |阅读模式
[代码][翻译]在对战中添加Kpr族(经典教程)


在对战中添加Kpr族

Moe著 第九频道Hiigara译

原文出自:http://forums.relicnews.com/showthread.php?t=73876


我这里还存有doc档,如果唯一老大愿意加入教程集,我可以用电子邮件寄去。


我又来了!我想说,尽管这个论坛里有大量相关信息,但大部分都很散乱。而且我也找不到一份完全适用于新

手的教程。
因此我将尝试着写一份教程,注释,指南。欢迎大家来拍砖!(and "omg you moron that's totally wrong!"

posts are welcome!)
在下面的一系列教程中,我们将要尝试着做下面一些事情:

*把守护者设为可控制的种族
*将本图西母舰设为此族母舰
*使他们能够建在一些不同的舰船单位
*建立一个小的科技树

要达到这个目的,我们将要修改一些文件,我假定你知道如何将zip文件解压缩,也知道如
何向快捷方式里添加信息,除了这些,我会尽量让这份教程简单易懂。

第一部分:相关工具

事实上我们并不需要太多工具,lua文件(包含了编队,开始船只,种族等信息),ship文件(包含了每艘船只

的参数设置)和wepn(武器文件信息)都可以用文本编辑器编辑。我用的是windows自带的记事本,这个东东操

作简单,很适合干这活。
在开始的一部分里,我们将需要一个工具给船只加hardpoint,hardpoint是你放置武器,子系统等元素的位置

。所以,我们将用到一个叫做HardEd的东东,它是Pip同志制作的,你可以在这里下载到它:

http://www.relicnews.com/moe/files/hw2/modding/HardEd.exe
HardEd运行需要先安装微软的.NET framework

(本人查了查,20多M,不算大)
最后,我们需要一种能提取我们需要的文件的工具,大部分家园2的数据是被封装在big文件里的,一种类似于

大型zip格式的文件。虽然有N多工具能干这活,但你不得不编译这些文件(译者注:即用luadc解码)。我们不想

干这些烂活,所以我们要去下载一个已经进行删减和解码的data文件包,到这里下载:http://www.relicnews.com/moe/files/hw2/modding/data.exe
(译者注:经本人试验,安装这个包后无法进入游戏,故猜测这个data包是1.0版的,不支持1.1版,建议大家使

用1.1版data包,如果需要用到包里没有的文件,请自己用工具从big文件里提取)。这是一个rar自解文件而不

是zip文件,因为它的压缩率更好,下载下来双击就能解压了。(译者注:这写教程的人简直就是唐僧,不是一

般的罗嗦!可怜我这个翻译的,要敲那么多废话)
这就是我们需要的全部工具,现在让我们开始家园2的Moding吧。

第二部分:设置家园2使之能够运行MOD
这玩意相当简单,首先去家园2的文件夹,拷贝整个的data文件夹备份,以便以后我们出了什么错误,可以再把

原文件覆盖回来。
然后把下载的data包备份一下,它里面有很多文件,但我们只需要修改里面很少的一些,就是那些名字是ships

,weapons,和scripts的文件夹。
把解压后的data包放到家园2的data文件夹下。你的data文件夹看上去应该是这个样子:


(译者注:从图片来看,作者是德国人,所以这么罗嗦也就情有可原了,因为德国人向来如此)现在,按照一般

的处理规则,你的data文件夹里只能有这些文件,这很重要,因为如果有其它的MOD,可能会导致游戏退出。
打开scripts文件夹,除了除了下面的文件夹外把其它的一切都删掉:
+Building and Research
+startingfleet
+unitcaps
和这个文件:
-race.lua
现在你的scripts文件夹里应该是这个样子:


最后,你要让家园2能够运行这些解码后的数据(译者注:就是我们将要修改的)而不再是原来的那些,要实现

这个目标,你需要建立一个快捷方式,如果你没有的话。(译者注:我要疯了,后面居然是教你怎么建快捷方

式!)然后右键点击它,选择属性。这时弹出的属性窗口目标栏里应该是这个样子:
******
"X:\Program Files\Sierra\Homeworld 2\Bin\Release\Homeworld2.exe"
******
在它后面加上空格+-overrideBigFile,这时你的目标栏应该是这个样子:
******
"X:\Program Files\Sierra\Homeworld 2\Bin\Release\Homeworld2.exe" –overrideBigFile
******
如果你把家园2安装在其它地方,则必须重装到program files下也照此处理。
这两个引号很重要,克别忘了。
好了,完成了,现在你要准备Modding了!双击一下快捷方式确定能够正常进入游戏。从现在开始,你如果想玩

MOD,就用这个图标进入游戏。

接下来:使守护者种族能够在对战中可控制。

第三部分:使守护者可操作

这部分也很简单,守护者种族游戏种已经设置好了,你需要做的是把它们改为可控制。
进入HW2\data\scripts文件夹,找到race.lua文件,用记事本打开。
打开后应该是这个样子:
******
LuaDC version 0.9.19
-- 5/23/2004 7:23:16 PM
-- LuaDC by Age2uN
-- on error send source file (compiled lua) and this outputfile to Age2uN@gmx.net
--
NotPlayable = 0
Playable = 1
races =
{
{ "Invalid", "Invalid", "", "", 0, NotPlayable, "", },
{ "Hiigaran", "$1100", "hyperspace_gate", "etg/special/SPECIAL_ABILITIES_HYPERSPACE_IN", 9.5,

Playable, "HGN_", },
{ "Vaygr", "$1101", "hyperspace_gate_vgr", "etg/special/SPECIAL_ABILITIES_HYPERSPACE_IN", 9.5,

Playable, "VGR_", },
{ "Keeper", "Keeper", "hyperspace_gate_kpr", "etg/special/SPECIAL_ABILITIES_HYPERSPACE_IN", 12.5,

NotPlayable, "KPR_", },
{ "Bentusi", "$1103", "hyperspace_gate_bentusi", "etg/special/SPECIAL_ABILITIES_HYPERSPACE_IN",

18.5, NotPlayable, "BEN_", },
{ "Random", "$3226", "", "", 0, Playable, "", },
}
******
把"keeper"一行里的"NotPlayable"改为"Playable",这行应该改为这个样子:
******
{ "Keeper", "Keeper", "hyperspace_gate_kpr", "etg/special/SPECIAL_ABILITIES_HYPERSPACE_IN", 12.5,

Playable, "KPR_", },
******
改完后保存文件,这一部分就完了!用快捷方式打开对战,你会发现在种族选择的下拉菜单里除了H族和V族,

新增加了守护者种族。
这时你兴冲冲的打开游戏,你会被提示你被击败了!因为,进入游戏时你一无所有。电脑会认为你的舰队刚刚

被电脑消灭的一干二净。不要郁闷,下一部分我们就将解决这个问题。现在你拍拍自己的背安慰一下自己(译

者注:晕~怎么可能拍得到?外国人都是疯子!):至少你已经把原来不能控制的种族变为可控制了。

第四部分:开始时的舰队
你需要告知游戏程序,在对战开始时,你的守护者种族有那些舰船单位。就是要这么做,到HW2

\Data\Scripts\Startingfleet文件夹下,这时你会发现有两个文件,Hiigara00.lua和Vaygr00.lua。
你猜对了!再建立一个叫做Keeper00.lua的文件,把下面的内容粘贴到里面并保存,接下来我们会逐行进行解

释。
******
-- LuaDC version 0.9.19
-- 5/23/2004 7:23:48 PM
-- LuaDC by Age2uN
-- on error send source file (compiled lua) and this outputfile to Age2uN@gmx.net
--
PersistantData =
{
StrikeGroups = {},
Squadrons =
{
{
type = "Kpr_Bentus",
subsystems = {},
shiphold = {},
name = "",
size = 1,
number = 1, },

},
Research = {}, }
******
我们刚才说要做什么?让我们从头开始解释:
******
-- LuaDC version 0.9.19
-- 5/23/2004 7:23:48 PM
-- LuaDC by Age2uN
-- on error send source file (compiled lua) and this outputfile to Age2uN@gmx.net
--  
******
这几行对于我们的工作没什么用处,它们是由解码器自己加上的。我们可以从中了解到一个很重要的事情。很

明显,它们是起注释作用的!(译者注:靠,真是屁话!)
当然你也可以知道,再lua文件里一行字前面加上"--"符号,这一行将被程序忽略,你可以用这个东东来添加信

息,(译者注:比如对你做的修改的记录,这样你后来再看时就知道你为什么这样做。)或者你可以用它来给

某一行做注释,这在修正错误时很管用。
我们假设你刚刚加了五行新的代码到文件里,然后突然游戏罢工了。是由其中的一行导致的出错,但哪一行才

是呢?
我们不用删除代码,你可以一行一行的往代码前面加"--"。游戏则会忽略这一行,就像你从没添加这行代码一

样,但它却是在那里的。如果你想让代码恢复功能,就不再用干Ctrl+C和V的活了,把"--"删了就是了(译者

注:受不了了,真不是一般的罗嗦!)。

让我们继续分析代码,
******
PersistantData =
{
StrikeGroups = {},  
******
"PersistantData"是真正的游戏信息开始位置,在lua文件里,函数被大括号"{}"封装的,就像C++一样。在一

对大括号里的东西属于这个函数。只要你愿意,你可以无限制的嵌套函数。
"StrikeGroups"可以被用来定义开始时的攻击单位(译者注:我认为的)。如果你想做更复杂的对战任务。比

如说你决定你的母舰一出来就要被一群轰炸机猛打,你可以用这个函数。现在我们用不到它,就让他空着吧。
******
Squadrons =
{
{
type = "Kpr_Bentus",
subsystems = {},
shiphold = {},
name = "",
size = 1,
number = 1, },

},
******
"Squadrons"使用来定义对战开始时,你起始的舰船编队。在这个例子里,刚开始只有一种母舰,那就

是"Kpr_Bentus",我们将要修改的本图西母舰。
就像你看到的,这些函数的用法相当直观。"type"决定了你想要的船只的类型。"subsystems"和"shiphold"则

告知游戏某些子系统已经建好和母舰是否有飞机停泊位。我不知道"size"是什么东东,所以我让他保留了默认

值。(译者注:我猜可能与ship文件和过关文件里船只里的"size"相同,因为它们的格式基本是一样的。比如

侦察机是3架一队,拦截机为5架一队。)最后" number "决定了这种船只起始时的数量。

这时再进入游戏仍然会出错,因为没有"Kpr_Bentus"这种东东,接下来的下一部分,我们会看到将如何修正。
 楼主| 发表于 2009-8-16 20:05:11 | 显示全部楼层
第五部分:本图西,我们的母舰

当你打开Data\Ships文件夹时,你会发现有大量的子文件夹,每一个对应一种船只。让我们快速的了解一下这些文件夹名称的前缀是什么意思。
Kpr = 守护者 (咄!)
Hgn = H族 (继续咄!)
Vgr = V族 (还咄!)
Meg = 遗迹 (比如说坦尼斯基地本图西遗迹等等)
Neu = 中立单位(大呼啦圈传送器)
SP = 单人任务的剧情单位(译者注:比如什么运输船主教1-6号)
马上我们就要看看那个叫Meg_Bentus的文件夹,复制一下,然后把它重命名为Kpr_Bentus,然后打开它。里面应该有两个带着meg_前缀的文件,你也要把它们重命名为Kpr_前缀。完成后,你的Kpr_Bentus文件夹里应该包含这两个文件:
******
Kpr_Bentus.events
Kpr_Bentus.ship
******
实际上,如果是你自己用Archive解开big的话,那么还应该有第三个文件叫做meg_ Bentus.hod,也要改做Kpr_Bentus.hod,hod文件包含了材质和hardpoint数据,我们过会会对其进行修改,因为这个文件也是必须的,到下载它:http://www.relicnews.com/moe/fil ... rial/kpr_bentus.hod
然后把它放到Kpr_Bentus文件夹里,这时Kpr_Bentus文件夹里就有了三个文件:
******
Kpr_Bentus.events
Kpr_Bentus.ship
Kpr_Bentus.hod
******
events文件包含了舰船的相关FX动画效果信息。这些动画是一系列的FX,能够被设置的延迟触发,然后按一定的顺序播放(尽管常常会是一个单独的效果)(译者注:本人也认为如果能像星战MOD那样重复调用效果一定很爽)。
这些动画主要包括诸如损坏,爆炸等动画和枪口喷焰以及一些其它效果动画。所以,我们无需修改这个文件,让它呆在那就行。
最后,ship文件包含的是所有舰船本身信息的设置,例如速度,生命值,武器等众多信息。

双击ship文件,因为windows不能识别此文件格式,所以你要选择记事本来打开,然后选中以后只用此程序打开选项卡,然后确定,从此以后,当你双击ship文件,就会自动用记事本打来了。Ship文件相当大,我们看到里面有很多参数值,特别是有些数据相当复杂,你根本不能立刻了解。
现在关上你打开的文件,打开家园2,开始对战游戏,选择守护者种族。现在你就有一个大的本图西母舰作为你的起始舰船了。但是,你会发现,本图西母舰什么也作不了,仅仅呆在那里,动都不能动,也不能超太空跳跃,最重要的是它根本就不能开火打任何东西。因为本图西本在原游戏中就设置为什么也不能干,它缺少做这些事情的数据。那么我们就教它该怎么做。
接下来,就是让你的飞船动起来!

第六部分:让本图西动起来
本图西母舰为什么不动,有两方面原因。第一,游戏程序不知道这艘船应该怎样移动;第二,这艘船没有设置为可接受移动命令。好了,让我们来纠正它。
看下面这行:
******
NewShipType.controllerType = "None"

现在吧那个"None"改为"Ship",同时在文件任意位置加上这么一行:
******
addAbility(NewShipType,"MoveCommand", 1, 0)
******
最后加上这么两行:
******
addAbility(NewShipType,"HyperSpaceCommand", 1, 10, 100, 400, 10, 15)
addAbility(NewShipType,"CanBuildShips",1,"","");
******
我们刚才作了什么?
好的,第一行(我自己的观点,不能保证一定正确)告诉游戏程序这艘船被定义为该如何进行运动。第二行是让船能够接受移动命令。再下一行是告知本图西如何进行超太空跳跃。你不用关心那些数据,如果你真想知道的话,到http://wiki.hw2.info/KarosGraveyard去查阅。
最后一行是给本图西建造能力,这一行也是必须的,因为对战中你需要的是一艘拥有建造能力的母舰,否则你很快就会被击败。因为我们还没有任何的建造目录,所以你还是什么也造不了,那么那些数据是关于此项的呢?
总起来说,我们要做以下的更改:
******
NewShipType.controllerType = "Ship"
addAbility(NewShipType, "MoveCommand", 1, 0)
addAbility(NewShipType, "HyperSpaceCommand", 1, 10, 100, 400, 10, 15)
addAbility(NewShipType,"CanBuildShips",1,"","");
******
好了,现在本图西知道该如何移动了,为了检测一下它确实能动,而且为了更明显,我们需要修改一下的代码:
******
NewShipType.thrusterMaxSpeed = 50
NewShipType.mainEngineMaxSpeed = 50
NewShipType.rotationMaxSpeed = 40
NewShipType.thrusterAccelTime = 1
NewShipType.thrusterBrakeTime = 1
NewShipType.mainEngineAccelTime = 6
NewShipType.mainEngineBrakeTime = 1
NewShipType.rotationAccelTime = 0.2
NewShipType.rotationBrakeTime = 0.2
******
这些代码看名字就很清楚了,我搞不明白为什么要同时有推进器和主发动机,也许是因为这艘船两者都要用到(译者注:真是废话!)
出于安全原因,我们把它们两个设为相同的值,把它们都设为900。Rotation是控制旋转的(译者注:以角速度为单位),为了保证速度,我们把它设为90。(译者注:一秒钟旋转90度,的确够快的!)
AccelTime和BrakeTime是控制加速和减速时间的,让我们把推进器和主发动机的这两个值设为1,意思是在一秒内飞船能够达到最大速度或者从最大速度刹车到0速度。
最后两个行代码是控制旋转的加速和减速时间的,道理和上面说的一样。2秒怎么样?听上去能满足我们的要求。
在这些修改之后,代码应该是这样子:
******
NewShipType.thrusterMaxSpeed = 900
NewShipType.mainEngineMaxSpeed = 900
NewShipType.rotationMaxSpeed = 90
NewShipType.thrusterAccelTime = 1
NewShipType.thrusterBrakeTime = 1
NewShipType.mainEngineAccelTime = 1
NewShipType.mainEngineBrakeTime = 1
NewShipType.rotationAccelTime = 0.2
NewShipType.rotationBrakeTime = 0.2
******
保存好文件,进入游戏,你现在能够让本图西运动了,而且它看上去跑的相当快,别忘了试一下超太空跳跃。当然这些修改后的速度对母舰来说有点变态。但是这是不得已的,我可不想让本图西跑十分钟的路,然后才能进入火力范围,以测试下面教程里我们要修改的武器。(当然,它也不需要离射击的目标太近了)
现在移动已经很完美了,但我们想去打仗怎么办?下面一部分,我们将为这艘船装上武器。

第七部分:设置武器

不要怀疑,本图西需要武装起来。但是用游戏里现有的武器岂不是很无聊?因此我们要发展自己的武器装备。我们将对H族母舰上用的防卫武器进行大改,大改就意味着要改的体无完肤。打开Data\weapon文件夹,与ship文件相同,每个子文件夹都对应着一种武器。建立一个新的文件夹,命名为hgn_bentushulldefense,然后再打开那个叫hgn_mshulldefensegun的文件夹,粘贴里面的wepn文件到我们新建的hgn_bentushulldefense文件夹里,然后重命名为hgn_bentushulldefense.wepn。
按照打开ship文件的方法打开wepn文件,这时在记事本里会有如下代码:
******
StartWeaponConfig(NewWeaponType, "Gimble", "Bullet", "HDefense", "Normal", 2500, 2200, 0, 0, 0, 0, 1, 1, 0, 2, 0, 0, 1, 0, 0, 0, 0.1, "Normal", 0, 0, 0)
AddWeaponResult(NewWeaponType, "Hit", "DamageHealth", "Target", 20, 20, "")
setPenetration(NewWeaponType, 5, 1,
{
PlanetKillerArmour = 0,
},
{
ResArmour = 0.75,
},
{
TurretArmour = 3, })
setAccuracy(NewWeaponType, 1,
{
Fighter = 0.14,
},
{
Corvette = 0.45,
},
{
munition = 0.2, })
setAngles(NewWeaponType, 90, 0, 0, 0, 0)
******
最重要的设置都在第一行的代码里,StartWeaponConfig函数里几乎决定了所有的数值,包括开火速度,时间,火力范围,武器类型等等。
如你所见,这个StartWeaponConfig函数里有很多变量,都排列在一行里面,让我们一个一个的分析,这些变量的解释都来自于http://wiki.hw2.info/KarosGraveyard这个地方。
下面的列表是从左向右解释的,<>符号里面是项目名(argument name),而[ ]里面是相应数值,再后面就是相应的解释:

******
1<sWeaponName> [NewWeaponType]: 提及武器,一般都设为NewWeaponType

2<sWeaponType> [Gimble]: 武器是如何打击目标的,可选值为Gimble,AnimatedTurret,或者Fixed。Gimble指武器不是以炮塔的形式,是非可见的,它在某个特定的圆锥范围内能够瞄准打击目标;AnimatedTurret指武器是可见的炮塔形式,它通过转动炮塔瞄准打击目标;Fixed 指武器只能朝固定的方向开火,例如离子炮。

3<sWeaponFireType>[Bullet]: 发射形式,可选值为InstantHit,Bullet,Mine,Missile,或者SphereBurst。InstantHit一般被用于光束武器, and causes the weapon's damage or other effects to take place immediately upon firing. Bullet指非制导发射;Mine指地雷武器;Missile指制导武器;SphereBurst指对某一区域有杀伤效果的武器, SphereBurst武器需要两个".wepn"文件来定义,第一个".wepn" 文件定义了如何开火,第二个".wepn" 文件定义了打击或脱靶的效果,比如防空护卫舰,请参考"hgn_smallemp.wepn"和"hgn_smallempburst.wepn"文件。

4<sWeaponFireName>[HDefense]: 武器开火脚本的名字,(即".wf"文件)它指定了效果的细节。

5<sActivation>[Normal]: 当武器被使用时,可能值为Normal, Special Attack, Normal Only,或者Dropped。Normal是指武器在任何攻击时都会使用;Special Attack是指被特殊的科技或者热键激活后才能使用;Normal Only是指武器只有在特殊攻击未研究出时才能使用;Dropped是指武器只有在布雷热键按下时才能开火,仅用于布雷艇。

6<fWeaponFireSpeed>[2500]: 弹丸速度,对于Missile武器,则是初速度。对于InstantHit 和SphereBurst武器,则设为0。

7<fWeaponFireRange>[2200]: 最大火力射程,请注意它指的不是弹丸的最大射程。

8<fWeaponFireRadius>[0]: 只用于范围杀伤武器,它决定了爆炸半径,在半径内的目标都会受到伤害,参考H族防空护卫舰。

9<fWeaponFireLifetime>[0]: 子弹存在时间,以秒为单位,因为子弹不可能立刻消失,所以只适用于光束武器,这里是指光线持续时间。

10<fWeaponFireMisc1>[0]: 对于光束武器,这是一个预发射时间,这个数值决定了开火程序开始后到光束发射之间的时间。

11<iWeaponFireAxis>[0]: 仅适用于导弹类武器,是指发射的时候导弹的弹射出机舱的方向。可能的值有:0,1,2。0是向前,1是向左,2是向上。例如H族的鱼雷是向前发射的,而VBC上的导弹是向上弹射的。

12<iMaxEffectsSpawned>[1]: 武器的生命周期内的打击效果的最大数,如果生命周期为0,那么1效果就会执行。(译者注:我也不知道他说了些什么)

13<iUseVelocityPred>[1]: 如果开启此功能,武器会在瞄准目标后再开火,否则将直接开火。

14<iCheckLineOfFire>[0]: 如果开启此功能,将在开火前确认弹道上没有友军,有则不开火,关闭此功能则可能会打到自己人。

15<fFireTime>[2]: 单发开火时间,以秒为单位。

16<fBurstFireTime>[0]: 一次持续射击的时间,其间可进行多次单发开火,以秒为单位,

17<fBurstWaitTime>[0]: ;两次持续射击之间的等待时间,以秒为单位。

18<iShootAtSecondaries>[1]: 如果开启此功能,当武器无法射击主要目标时,自动射击次要目标。

19<iShootAtSurroundings>[0]: 如果开启此功能,当武器射击无法向你给定的目标时继续攻击其它周围敌人。(会导致飞船减速).

20<fMaxAzimuthSpeed>[0]: 水平方向武器跟踪速度。

21<fMaxDeclinationSpeed>[0]: 垂直方向武器跟踪速度。

22<fSpeedMultiplierWhenPointingAtTarget>[0.1]: 当武器瞄准目标后,其速度可以在此修改,用< 1 让光束缓慢地在目标上扫动。

23<sWeaponShieldPenetration>[Normal]: 可选数值为Normal,Enhanced,或者 Bypass,这个东西没有明显的效果,因为要改变武器穿透防御场的能力可以在setPenetration函数里设定。

24<iTrackTargetsOutsideRange>[0]: 开启此选项,武器在设成范围外就开始追踪目标。

25<fWaitUntillCodeRedState>[0]: 动画连接,在这项设置中,武器必须在完成开火准备动画后才能开火,参考V族导弹护卫舰开火前要打开武器舱盖的动画。

26<iInstantHitThreshold>[0]: 低于此数值HP的时候,光线武器穿透目标。
******

这么多数据啊,不是么?不过我们很走运,不用全部修改。
在我们进行到这里时,想让我们想象一下我们的武器应该是什么样子的,本图西人无疑科技非常发达,据对不可能靠那些小弹丸的武器来保护他们舰队里最重要的母舰。所以我们选择光束武器,游戏里已经有具备点防御功能的光束武器了,比如H族的HC,我们要做的就是这玩意的升级版。
下面是我们要替换的武器文件内容:
******
StartWeaponConfig(NewWeaponType, "Gimble", "InstantHit", "Laser", "Normal", 0, 20000, 0, 0.4, 0, 0, 1, 0, 1, 0.4, 0.0, 0.0, 1, 1, 120, 120, 0.1, "Normal", 1, 0, 300)
AddWeaponResult(NewWeaponType, "Hit", "DamageHealth", "Target", 50, 50, "")
setPenetration(NewWeaponType, 5, 1,
{
PlanetKillerArmour = 0, })
setAccuracy(NewWeaponType, 1,
{
Fighter = 0.11,
},
{
Corvette = 0.5,
},
{
munition = 0.1, })
setAngles(NewWeaponType, 90, -180, 180, -180, 180)
setMiscValues(NewWeaponType, 0, 0)
******
下面让我们来解释一下,Gimble是指我们的武器不像重型光束塔那样的有炮塔,但是却能瞄准并攻击已设置的锥形范围内的目标。因为我们不想往舰体上加上大炮塔,所以我们选择了Gimble类型。
在我们这个例子中,Bullet则被InstantHit类型取代了,因为我们用激光,所以就没有弹丸。我们的武器是光速的,它在远距离上可以进行瞬间打击。
Laser是指武器的攻击方式,在我们这个例子里,它将是一种美丽的蓝色的定向能武器方式
Normal是指我们的飞船将用之为普通的武器,而不是那些必须由玩家来控制的特殊攻击武器。
解释完这些,我们就要解释那些杂乱无章的数字了。
我们武器速度本质上是无穷的,通过InstantHit就能看出来,因为没有一种武器的速度是静止地,所以我们用0来表示无穷大。
我们的武器射程设为20000,这个射程很不公正,但这只是为了检测的目的。
接下来的一个0是这个设置只用在范围攻击武器里例如EMP装置,所以我们把它设为0即可。
再下一个,武器开火时间,0.4是指光束能够持续射击0.4秒,在未修改实的原来的武器里数值为0,因为原来用的是弹丸武器,弹丸不会消失,所以设为0。
接下来两个值与我们这种武器无关,设为0即可。
再下面的数值我们不打算改它,保留为一。
下面的值是一个布尔类型,它只能设为0(关)或1(开),因为我们的光束是一种远距离打击武器,我们不需要引导目标,即保持指向它并开火。我们希望关闭这个功能,所以设为0。
再一个条目里的数值也是布尔类型,这次我们设为1(开),因为我们可不想在保为自己时误伤友军,设为1即是说在开火之前会检查友军是否处于己方弹道上。

在下面的三个数值控制了武器的设计速度,通过修改这三个数值,我们可以随意修改武器的开火频率(比如说间隔两秒后开火一秒,)和一次开火时间里的攻击次数(译者注:比如一次开火时间里打两发三发等等)。在这个例子里我们需要一种稳定,持续,高速率的开火,所以我们设置为开火0.4秒,剩下的两个设为0。(译者注:那就意味着没有射击间隔)
剩下的数值在我们这个例子里就不太重要了,我们就不讨论了。

现在来看第二行,,它是用来设置命中率的,我们可以不用改它,数值1.0,就意味着100%的命中率,0.11就意味着11%的命中率。你可以以自己需要来设置。
来看下面一行:
******
setAngles(NewWeaponType, 90, -180, 180, -180, 180)
******
这是我们需要操心的最后一行,它的功能是定义武器偏转角度,即定义了武器的锥形火力范围。因为我们用的是Gimble类型的武器,那么只有第一个值比较重要,它决定了火力范围的最大角度与默认角度的夹角。
如果设置为90度,则武器可攻击半球范围内的所有敌人,我们不需要设为360度全球面攻击,因为那会伤到自己,这听上去有点不可思议。

以上这些总结了武器的配置,现在我们要为本图西母舰安装武器了。
 楼主| 发表于 2009-8-16 20:05:41 | 显示全部楼层
第八部分:武装本图西母舰

武装本图西母舰包括包括两部分内容,第一是要加入hardpoint点,hardpoint就是一种类似武器基座的东西,它是不可见的,但却决定了武器的放置位置。
要加入hardpoint,我们要用到一款极好的工具,它是由Pipakin同志制作的,名字叫做HardEd。想知道如何获得并安装这款工具请看文章的第一部分。

打开HardEd,会出现一个小窗口,选择File"再选择"open",进到kpr_bentus目录,打开kpr_bentus.hod文件。

等一会文件打开了,目前我们只看到一个叫做"Root"的条目。点击它前面的加号,hardpoint树状结构就展开了,它与资源管理器的结构是一样的。因为本图西母舰没有任何hardpoint,那么接下来的工作很基础也很重要。下面是HardEd工具的图片:


你会注意到一个叫"children"的条目,点击它使之高亮显示,再打开菜单栏里的"Entry"栏,选择"add child"项。
一个child就被添加到了children条目里去,它会有一个无特征的属名,一般可能为NewEntry 0或者其它类似的格式。
点击新条目,然后慢慢的双击,你就能为它重命名了(译者注:然后是教你怎么慢慢的双击之类的的废话)。
我们将其重命名为Weapon_HullDefense1_Position,现在点击其前面的加号展开它。
你会注意到有一个树状的目录,其中的有些还能够被展开。


现在这个东东到底是做什么的?让我们复习并解释一下我们刚才所做的。
首先,我们建立了一个child条目,在这个例子里,它意味着其是父条目的一部分。
第二步,我们给它重命名,Weapon_意味着这个hardpoint使用来放置武器的而不是子系统什么的。HullDefense1是我们给它起的名字,因为它可以放置一个点防御武器,当然你可以随便给它起名字,只要你在看到它时知道它是干什么就可以,我建议还是根据其作用起个具有描述性的名字。
最后,_Position是指这个条目将要用于确定武器在这艘船上的放置,名字的前两部分随便你起,但是后面一定要以_Position结尾。
点击"Children"条目里的Weapon_HullDefense1_Position,让其高亮显示,再一次选择菜单栏里的Entry,建立三个新的child。
从上到下依次将其重命名为Weapon_HullDefense1_Direction,Weapon_HullDefense1_Rest和Weapon_HullDefense1_Muzzle。
在这里的命名很重要,其前两部分必须与父条目的相同,而第三部分则必须为_Rest,_Direction和_Muzzle。一定要仔细检查号,现在,确定你的条目树状结构看上去是下面这样:


现在返回Weapon_HullDefense1_Position条目并且打开它的"Data"子条目,单击里面的"Position"让其高亮显示,然后按键盘T键打开位置选择器(PointPicker)。


选择器会显示这艘船的线状图,提供了底视角(右图)和前视角(左图),那个红色的叉状标记就是那个hardpoint点,如果你在选择器上移动鼠标,左下方会有x,y,z的坐标数字在变化。
现在左键点击那个红叉,然后拖动,把它放到本图西母舰左侧支撑结构的左下角然后点击"ok"。


我们现在要放置武器了,但我们还不知道该把它放到哪。这就是我们要创建children的目的了,然我们看看相关子条目。
首先,_Muzzle这个东西看上去倒不怎么重要,你可以忽略它,然而剩下的两个,_Rest和 _Direction才是真正性命攸关的,它决定的是你的武器要面对的方向。
这两个children是主要的矢量,不要担心你的数学成绩,其实很简单的。
一个矢量就是一个箭头,因为家园2是一个三维的RTS,我们的矢量也是三维的。
它是什么原理呢?我确信你一定知道在三维空间中表示一个点要有三个坐标x,y,z。举个例子(0,10,0)标是一个离原点距离为10的点。(当然这个点在y轴的坐标轴上)
因为我们在讨论把武器放到船上,那我们就把坐标与船连系起来,我们设定原点就是这艘船的重心(船的最中央位置),则各方向如下:


Z轴表示向前和向后,是从船的中心算起的,如果你的船长度为500米,Z坐标上的+250就是箭头方向,-250则是船尾方向。而X意味着左右,就是航海术语上的左舷和右舷。正的X是指左舷,负的X指右舷。如果你的船宽度为200米,则+100为船只的最左边,-100为船只的最右边。


最后,Y轴指上下方向,正Y为上,负Y为下。-50即为我们在船的下方50米的位置,+50即为我们在船的上方50米的位置。
现在我们知道了家园2船只的坐标系,可以回到我们原来的问题了,利用位置选择器(PointPicker)工具,我们可以设定我们武器的位置,但是我们还没谈到该怎么添加武器,我们目前仅仅知道要把武器上下颠倒地放到hardpoint上。
这个_Direction矢量决定了武器能够正确放置,从数学上讲,这个矢量对于我们的武器来说就是一个法向矢量。它就像我们的武器的顶部是直着向上延伸的。
而其它的矢量_Rest,在指定了默认方向后,它就像炮塔的炮筒一样指向相同的方向。比如说,它从来不会冲自己开火。
这写矢量完全可以用HBC的前主炮一图来表示:


这些稍微有些复杂,因此我就再多解释解释。来看看HBC的前主炮,有两座,一座在上面的前部另一座在下面的后部,那么它们的_Direction和_Rest矢量值为多少?我们先从前面的那座说起,它的(炮筒)直冲前方,所以_Rest矢量也是直指向前的,就是说X和Y的坐标为零,即炮塔(炮筒)既不朝上也不朝下,也不偏向两侧。这就只留下Z坐标了。从数学上讲,你在这里的设任何值都是正确的,无论是1还是10。(译者注:不考虑大小,只考虑正副),我们在这里将用10,因为我觉得他是个很不错的数字。(译者注:你怎么不用13?)
因此这里的_Rest矢量就是(0,0,10)。如果炮塔向后,那么就是(0,0,-10)。如果你想让炮塔朝向右舷,那么就是(-10,0,0)。如果想让炮塔朝向右舷45度角位置,那么就设为(-10,0,10)。
那么_Direction矢量应该是怎样的呢?好的,炮塔的顶部是冲上的,上就意味着为正值,因此你的_Direction矢量就应该为(0,10,0)。
HBC下面的炮塔也是朝前的,那么_Rest矢量也为(0,0,10)。这就是那种所谓的上下颠倒?就是说炮塔的顶部是冲着下方的,那么_Direction矢量就是(0,-10,0)
我们最终能够再回到本图西母舰上来了,我们在母舰地左边尾部放了个hardpoint,我们还没有在上面放置武器,因为我们的武器还没设置好向量,它仍然在中心线高度方向上,我们要我们要让我们的炮塔顶直冲上方,打开Hulldefenseweapon1_Direction条目,点击加号展开,我们在此看到了熟悉的Data和Children子条目。展开Data子条目,再展开position条目,你将看到三个数值,他们全部都为0,他们从上到下分别代表X,Y和Z坐标。第一个是X,最后一个是Z。(唐僧又来了,快跑啊!)
我们需要让_Direction矢量指向上方,所以要设为(0,10,0),好了,照此修改便是,把第二个0换为10,这时条目看起来应该是这样:


现在我们需要在考虑一下我们的武器应该放在哪,在我们的.wepn文件里,我们设定为180度的锥形(译者注:即半球体)的火力范围。因为武器被放置在飞船的一边,所以我们需要它有个正确地朝向船体外侧的角度,如果我们把它设定为朝前,那么180度的角度就涵盖了一部分船体,即可能导致穿透船体射击,也可能会伤及自身。
这里需要一些空间感,因为从我们自身的主观角度看自己的,是在右边的东西。而换到他人客观角度观察你,就会变成左边,因此,观察角度不同,方向也相反。
这个炮塔在飞船的右侧,也就是右舷,就是意味着负的X,打开_Rest矢量条目,展开Data并找到Position条目。打开它找到三个0,把第一个改为-10(记住,第一个是X,我们让它为负,就用-10吧,如果是+10则意味着指向左舷)
操作完后请对照下面的图片:


如我所讲,我们不需要再考虑muzzle条目了,保存你的修改然后退出HardEd。

现在回到第二步,把武器放到hardpoint上,这就很简单了,只需要往ship文件里加一行代码就可以了。
打开Kpr_Bentus.ship文件,把下面一行放到里面(我推荐放到文件尾部,便于以后查找修改,其实当那里都不重要,你自己随便好了)
******
StartShipWeaponConfig(NewShipType, "Hgn_BentusHullDefense", "Weapon_HullDefense1", "Weapon_HullDefense1")
******
这行代码告诉游戏程序把"Hgn_BentusHullDefense"这种武器(前面我们已设置好了)加到"Weapon_HullDefense1"的hardpoint上。
本图西现在已经有武装了,但它还不知该怎么用这种武器,我们需要设置一下让他能执行攻击命令,方法与添加移动命令一样。
把下面代码添加入Kpr_Bentus.ship里:
******
addAbility(NewShipType, "CanAttack", 1, 1, 0, 0, 0.35, 1.2, "Capturer, Frigate, SmallCapitalShip, BigCapitalShip, Mothership, Utility, Corvette, Fighter", "MoveToTargetAndShoot")
******
它让本图西母舰能够攻击,但是是怎样攻击的呢?我们来看一下里面的(数字)参数:

1<bIsActive[1]>: 可能是默认的主动攻击能力, (0 为被动,1 为主动)

2<iNumberOfShips[1]>: 舰船在战斗中小编队的相关数字,这个东东很有用,如果你有一队舰船,比如说一个六架编队的战斗机,数值2可使其编为两组,一组3架(译者注:就像英国空军的三机编队作战模式);数字3则使其变为长僚机模式的2机编队,一共三组,一组两架;如果是数字6,则战斗时每架飞机都会单干。
3<bKamikaze[0]>: 自杀功能,这个数值已经废弃了,家园2不再教唆自杀。

4<bInterpolate[0]>: 飞船是否能篡改目标,不能确定其意思,但我想它与飞船在两袈敌机间瞄准和转换目标有关。

5<fSplitDelay[0]>: 编队分裂时的延迟,我们这个例子里不需要,因为本图西就一艘船。

6<fDistanceMultiplier[0.35]>: 在进入攻击方式前离目标的距离乘数。the distance multiplier from target before attack styles get control. 我也不能那个确定这个东东是干什么的,但我想它是告诉船只在接近目标时何时开始进行攻击机动。

7<sAttackFamilies>: 用逗号分隔的攻击目标种类,指定对各级别船只的攻击优先级。本图西能攻击什么?我们让它能攻击所有类型船只,所以就都列上得了。

8<sAttackStyle>: 用于获得目标后的默认攻击方式,它控制了本图西母舰在攻击时得动作,有七种预定义的攻击方式,有一种叫做"move towards the target and blow the crap out of it"的直接攻击方式,它看起来很适合我们的本图西母舰。总之,如果让这个大家伙像只有它千分之一大小的战斗机一样做空中缠斗(译者注:dogfight),那一定很荒谬。

9<tStyleException1> 到 <tStyleExceptionN>: 用于对目标的特殊级别进行设置,可以替代原<sDefaultAttack>的设置。如果想让你的船只对特定级别的船只进行不同形势的攻击,就可以在这里定义,举个例子,如果你想让BC在攻击敌战机时保持不动,但是对主力舰却要移动过去攻击,在这里你就可以为其设置不同的攻击方式。

全部完成!保存ship文件打开家园2游戏,开始与电脑对战,选择己方为守护者种族,敌方为V族,把本图西母舰移向敌人,设置为攻击模式并执行攻击命令,如果你正确按上边说所的正确操作,那么你就不用再采集那些该死的资源,仅用那一件武器,就把敌人送进地狱,你会喜欢本图西族的表现的。

只用一件武器感觉会不怎么爽,让我们继续按照下面的纲要进行修改,让我们再加上五件武器,那么第二个hardpoint就该叫做Weapon_HullDefense2,并且应该放在原来武器相对的船舷上,再下一对武器要尽量靠近本图西(译者注:横着的)的中间线,最后一对放在那个大钥匙环上面,你参考一下下面的截图:


如你所见,一共有六个武器hardpoint,一边三个。用位置选择器(PointPicker)把它们放到图上标记的点,我们当然也需要为每一个hardpoint建三个相应名称的children,六个hardpoint的_Direction条目,都是相同的,但是_Rest值却是不怎么相同,让我们仔细考虑一下该怎么设置吧。
第一个条目在船的右舷,武器放置的方向是相同的,因此Position条目的_Rest矢量应该是(-10,0,0)
Weapon_HullDefense2则在船相对的一边,也就是它在左舷并且面向左舷,则_Rest矢量为(10,0,0)
Weapon_HullDefense3的设置也是相同的,Weapon_HullDefense4在和Weapon_HullDefense1相同的一侧,因此它们的_Rest矢量都是(-10,0,0)
名字是Weapon_HullDefense5和6的最后两门武器,设置在45度角,我们也需要它们的指向角度也是45度,那么就是说指向一半的左舷或右舷。
Weapon_HullDefense5设在右舷指向左前方,因此它的_Rest矢量应该为(10,0,10),以相同的方式,Weapon_HullDefense6指向右前方,它的_Rest矢量应该为(-10,0,10)。
在HardEd应该显示如下:

******
这些新武器都需要加到ship文件里,所以我们要加入下面几行代码:
StartShipWeaponConfig(NewShipType, "Hgn_BentusHullDefense", "Weapon_HullDefense2", "Weapon_HullDefense2")
StartShipWeaponConfig(NewShipType, "Hgn_BentusHullDefense", "Weapon_HullDefense3", "Weapon_HullDefense3")
StartShipWeaponConfig(NewShipType, "Hgn_BentusHullDefense", "Weapon_HullDefense4", "Weapon_HullDefense4")
StartShipWeaponConfig(NewShipType, "Hgn_BentusHullDefense", "Weapon_HullDefense5", "Weapon_HullDefense5")
StartShipWeaponConfig(NewShipType, "Hgn_BentusHullDefense", "Weapon_HullDefense6", "Weapon_HullDefense6")
******
保存hod文件和ship文件,进入游戏,如果一切运行正常的话,你会看到下面的图景:


顺便提一下,这是目前为止教程里最难的部分,下一部分就不会那么难了,在下一节中我们将会设置建造列表。

第九部分:建造飞船

在我们开始享受建造的乐趣之前,我们需要调整一下scripts文件夹里的内容,打开Data\Scripts\Building and Research\Keeper文件夹,你会看到下面所示的文件:



如果你没有看到最后那个文件,举例来说你只看到一个叫做"build"的文件,那么你需要调节一下windows explore以显示出文件的扩展名。
1在打开“我的电脑”工具栏,选择“文件夹选项”。
2点击查看
3去掉“隐藏已知文件类型的扩展名”前的选择框
好了,回到眼来的文件夹,双击build.lua,因为你已经设置将此类文件用记事本打开,所以你会看到如下的内容:

******
Lua@       &aelig;[&iexcl;°&sup1;&sup2;AC @X:\Homeworld2\Data\Scripts\Building and Research\Keeper\build.lua
******

这就是全部内容了,(是不是看不懂?)你看到的都是被编译过的lua文件,当你用archive解开big文档后得到的就是这种文件。还记得我们说过的如何获得解码后的文件吗?我们现在还不用作这件事,因为我们正在用的data包里的已经有解码过的了,就是那些后缀名是luadc的同名文件。
如果是你自己做的解压和解码工作,那么你的文件夹里也是这个样子。

让我们继续,回到原来的文件夹,把build.lua和research.lua删除(就是用红箭头指着的那两个),把剩下的两个luadc文件的后缀名去掉。现在你的文件夹里只有两个文件了,就是新的build.lua和research.lua。因为我们要创建一个建造列表,所以,打开build.lua文件。
下面是它的内容:

******
Ship = 0
SubSystem = 1
build = {}
******
就这么点东西?其实很好理解,原来地守护者是不支持建造的,所以就什么也造不了。好了,让我们把它跟H族的建造列表比较一下。进入H族的build and research文件夹,打开它的build.lua.luadc文件,是不是很大?下面列出部分内容:
******
Ship = 0
SubSystem = 1
build =
{
-- (红色部分上界)
{
Type = SubSystem,
ThingToBuild = "Hgn_C_Production_Fighter",
RequiredResearch = "",
RequiredShipSubSystems = "",
DisplayPriority = 0,
DisplayedName = "$7000",
Description = "$7001", },
-- (红色部分下界)
-- (蓝色部分上界)
{
Type = Ship,
ThingToBuild = "Hgn_Scout",
RequiredResearch = "",
RequiredShipSubSystems = "",
DisplayPriority = 10,
DisplayedName = "$7030",
Description = "$7031", },
-- (蓝色部分下界)
-- (绿色部分上界)
{
Type = Ship,
ThingToBuild = "Hgn_Interceptor",
RequiredResearch = "",
RequiredShipSubSystems = "FighterProduction",
DisplayPriority = 20,
DisplayedName = "$7032",
Description = "$7033", },
-- (绿色部分下界)
-- (黑色部分上界)
{
Type = Ship,
ThingToBuild = "Hgn_MinelayerCorvette",
RequiredResearch = "GraviticAttractionMines",
RequiredShipSubSystems = "CorvetteProduction",
DisplayPriority = 52,
DisplayedName = "$7042",
Description = "$7043", },
-- (黑色部分下界)
******
(译者注:本人敲些汉字指示文字颜色,不是因为本人是色盲,而是为了方便在论坛发布)
哇!这么多东西。注意,我去掉了大部分内容,因为它们对我们的讲解没有意义。我用颜色标记出了各个小节,以便于我们识别.
让我们从头开始分析,头两行对于各个种族都是一样的,我们忽略它们。但我们却要讲解一下整个文件的结构。
这个文件被分成了多个小节,每一个代表着一个可建造的条目,比如子系统或者船只,每一小节又包括以下几行:
******
Type
ThingToBuild ,
RequiredResearch ,
RequiredShipSubSystems ,
DisplayPriority = ,
DisplayedName = ,
Description = ,
******
它们都很好理解,Type建造项目的类型,分为subsystem(子系统)和ship(舰船)两种。
RequiredResearch和RequiredShipSubSystems是指要使此项目可建造所需的科技和子系统。
DisplayPriority就有点意思了,我想它与项目在建造列表里的排列有关。比如说航母就排在船坞的上面。在这里我们需要记住的就是不要把两个建造条目的优先级数字搞成一样的。
DisplayedName和Description是舰船类型的名字和对舰船的简介(译者注:就是那些善于对付什么,不善于对付什么),在游戏里点击建造管理器左边的小箭头就会显示出来了。
你会注意到,这里没有真正的文本,而是一些怪异的字符串,这是因为这些文本信息被储存在别的地方的另一个大的表格里,而这些$5676之类的代号只是告诉程序该到哪里去找这些文字。
我们没有这些不知道这些相关信息在哪,所以你也可以把正常的文本填进去来代替那些索引符号。

现在让我们看几个例子,上面文字的红色部分是子系统的,因为我们不想为守护者种族添加任何子系统,我们就不需要为它浪费时间了。是为了参考目的,我才把它列出来的。
蓝色部分是H族的侦察机建造条目,侦察机肯定是船了,所以Type就设为ship,我们可以立即建造它,因为他不需要任何科技和子系统。
可是,你需要一个战斗机模块来建造拦截机,让我们来看绿色部分,我们看到RequiredResearch里是空的,就是说我们造拦截机不需要任何科技,但是RequiredShipSubSystem里写着"FighterProduction",这个"FighterProduction"就是战斗机建造子系统,有了它才能建造拦截机。
讲一个需要RequiredResearch(研究科技)的例子,在黑色文字部分的布雷艇里,RequiredResearch里写着"GraviticAttractionMines"(重力感应雷),这就是技术的名字,我们在下面的research.lua文件里还将见到它,布雷艇需要护航艇建造模块,在RequiredResearch下面就可以看到。
看上去很简单,不是么?现在我们要设计我们自己的建造列表了,在开始之前,我们先考虑一下,我们该造那些船呢?
守护者种族应该有下面这些船:
战机级:雄蜂战机
护航艇级:漫步者
护航舰级:(没有)
驱逐舰级:守护者
主力舰级:无畏舰
一般舰船:(没有)

接下来有个大问题,我们没有资源采集船!不要担心,我们可以从H族那里偷两艘过来,但是我们还是没有资源灌注点,就不能卸载资源到本图西母舰上。很遗憾,我也不知该怎么做,但是我想你可以把它和停泊路径联系起来,也可以用其它什么鬼主意,我会去问问怎么解决这个问题,如果是在搞不定,就只好再偷艘H族的资源控制船来用了。

下面就是总结如何做建造列表了。另外,下面来自一个如何做建造飞船AI的简略教程,是由Classicthunder写的,感谢他允许我在这篇文章里引用。(译者注:下面的内容就是引用的Classicthunder的教程,相关链接在:http://forums.relicnews.com/showthread.php?t=95007

第一步:准备好再对战中要用到的飞船
现在我们设定kpr_mover, kpr_capture_mover,kpr_attackdroid,kpr_sajuuk和kpr_Destroyer要用在对战游戏中。
在这之前我们要修改每艘飞船的unit caps family和display family:

1,修改unit cap
打开kpr_mover的ship文件把下面一行:
******
NewShipType.UnitCapsFamily = "SPMovers"
******
修改为
******
NewShipType.UnitCapsFamily = "Corvette"
******
现在漫步者又可用的最大建造数了,如果我们不这么改,那么漫步者的建造上限是0。

2,修改Display Type
我们需要修改的还有这么一行:
******
NewShipType.DisplayFamily
******
这一行控制的是建造管理器里飞船的级别,比如说"Capital"是指其在建造管理器的主力舰生产栏中,对于漫步者,我们把它设为:
******
NewShipType.DisplayFamily = “Corvette”.
******
现在给所有的船重复这项工作,把它改为相应级别的船只。
对于雄蜂战斗机:
******
NewShipType.DisplayFamily = "Fighter"
NewShipType.UnitCapsFamily = "Fighter"
******
对于H族的漫步者(Capture Mover):
******
NewShipType.DisplayFamily = "Corvette "
NewShipType.UnitCapsFamily = "Corvette "
******
萨尤克:
******
NewShipType.DisplayFamily = "Capital"
NewShipType.UnitCapsFamily = "Capital"
******
守护者:
******
NewShipType.DisplayFamily = "Capital"
NewShipType.UnitCapsFamily = "Capital"
******

第二步:把所有船只加入建造列表:
现在我们到scripts\building and research\keeper目录,打开build.lua,内容应该是这样:
******
-- LuaDC version 1.0.1
-- 6/1/2006 2:57:06 PM
-- LuaDC by Age2uN
-- on error send source file (compiled lua) and this outputfile to Age2uN@gmx.net
--
Ship = 0
SubSystem = 1
build = {}
******
好了,现在往里面加我们的船吧,首先,把最后那个大括号的右半部分换个位置:让他变成下面这样:
******
-- LuaDC version 1.0.1
-- 6/1/2006 2:57:06 PM
-- LuaDC by Age2uN
-- on error send source file (compiled lua) and this outputfile to Age2uN@gmx.net
--
Ship = 0
SubSystem = 1
build = {

}
******

把下面的内容拷到你改动过的大括号里面,然后填写你想写的信息:
******
Type = Ship,
ThingToBuild = "飞船名称 ",
RequiredResearch = "",
RequiredShipSubSystems = "",
DisplayPriority = 从低到高排列数字,决定你飞船在列表里出现的顺序,
DisplayedName = "输入在建造管理器里出现的名字",
Description = "<b>Description:</b> 输入描述性文字 \n\n<b>Prerequisites:</b> 输入建造的先决条件", },
******
现在打开hiigaran\build.lua文件然后拷贝资源采集船和资源控制船的建造代码加到你的keeper\build.lua文件里。
你的build.lua已经完成了,他应该是下面这个样子:

******
Ship = 0
SubSystem = 1
build =
  {
  {
    Type = Ship,
    ThingToBuild = "Kpr_AttackDroid",
    RequiredResearch = "",
    RequiredShipSubSystems = "",
    DisplayPriority = 60,
    DisplayedName = "Keeper Attackdroid",
       Description = "<b>Description:</b> Advanced Multi-Purpose Fighter. \n\n<b>Prerequisites:</b> None.", },
  {
       Type = Ship,
    ThingToBuild = "Hgn_ResourceCollector",
    RequiredResearch = "",
    RequiredShipSubSystems = "",
    DisplayPriority = 120,
    DisplayedName = "$7066",
    Description = "$7067", },
  {
    Type = Ship,
    ThingToBuild = "Hgn_ResourceController",
    RequiredResearch = "",
    RequiredShipSubSystems = "",
    DisplayPriority = 130,
    DisplayedName = "$7068",
    Description = "$7069", },
  {
    Type = Ship,
    ThingToBuild = "Kpr_Destroyer",
    RequiredResearch = "",
    RequiredShipSubSystems = "",
    DisplayPriority = 116,
    DisplayedName = "Destroyer",
       Description = "<b>Description:</b> Multipurpose Light Destroyer and Build Capable Ship. \n\n<b>Prerequisites:</b> None.", },
  {
    Type = Ship,
    ThingToBuild = "Kpr_Mover",
    RequiredResearch = "",
    RequiredShipSubSystems = "",
    DisplayPriority = 116,
    DisplayedName = "Mover",
       Description = "<b>Description:</b> Keeper Attack Corvette. \n\n<b>Prerequisites:</b> None.", },
  {
    Type = Ship,
    ThingToBuild = "Kpr_Mover_Capture",
    RequiredResearch = "",
    RequiredShipSubSystems = "",
    DisplayPriority = 150,
    DisplayedName = "Infiltration Mover",
       Description = "<b>Description:</b> Keeper Infiltration Corvette. \n\n<b>Prerequisites:</b> None.", },
   {
    Type = Ship,
    ThingToBuild = "Kpr_Sajuuk",
    RequiredResearch = "",
    RequiredShipSubSystems = "",
    DisplayPriority = 150,
    DisplayedName = "Sajuuk",
       Description = "<b>Description:</b> The Ultimate Battle Ship. \n\n<b>Prerequisites:</b> None.", },
}
******
 楼主| 发表于 2009-8-16 20:05:59 | 显示全部楼层
第三步:把守护者种族的船只放入classdef.lua文件里

你应该要下载了Evillejedi的ai和script文件,但是如果你现在没有,那么请马上下载(译者注:目前我也不知道到哪下载)。现在打开AI文件夹里的classdef.lua文件,从头到尾仔细检查它,无论何时都要保证你所加入的舰船能够完美地符合其级别。记得在每一艘船后面加上逗号。
最后的classdef.lua文件应该是这样:

******
--
-- classdef.lua
--
-- This file only contains ship classfication lists that allow the AI script writer to seperate each ship
-- into different subclasses (fighters, corvettes, anti-fighter, fast, slow,...) This is done to make it easier
-- (and faster) to refer to a ship based on its generalized properties.
--
-- Custom classes can be added at the end but have to be added in a very specific way.
--

aitrace("CPU: CLASSDEF LOADED")


-- table of all squadron class lists
squadclass = {}

-- is mothership
squadclass[eMotherShip] = {
  HGN_MOTHERSHIP,
  
  VGR_MOTHERSHIP,
  VGR_MOTHERSHIP_MAKAAN,
}

-- can harvest
squadclass[eCollector] = {
  HGN_RESOURCECOLLECTOR,
  
  VGR_RESOURCECOLLECTOR,
}

-- is a good scout/explorer
squadclass[eScout] = {
  HGN_SCOUT,
  HGN_SUPERSCOUT,
  HGN_PROBE,
  HGN_PROXIMITYSENSOR,
  HGN_ECMPROBE,
  
  VGR_SCOUT,
  VGR_PROBE,
  VGR_PROBE_PROX,
  VGR_PROBE_ECM,
  
  KPR_ATTACKDROID,
}

-- is a refinery
squadclass[eRefinery] = {
  HGN_RESOURCECONTROLLER,
  
  VGR_RESOURCECONTROLLER,
}

-- can build ships
squadclass[eBuilder] = {
  HGN_MOTHERSHIP,
  HGN_CARRIER, -- will need subsystem
  HGN_SHIPYARD,
   
  VGR_MOTHERSHIP,
  VGR_MOTHERSHIP_MAKAAN,
  VGR_CARRIER, -- will need subsystem
  VGR_SHIPYARD,
  
  KPR_BENTUS,
  KPR_DESTROYER,
}

-- can be used as a resource dropoff
squadclass[eDropOff] = {
  HGN_MOTHERSHIP,
  HGN_CARRIER, -- will need subsystem
  HGN_SHIPYARD,
  HGN_RESOURCECONTROLLER,
  
  VGR_MOTHERSHIP,
  VGR_MOTHERSHIP_MAKAAN,
  VGR_CARRIER, -- will need subsystem
  VGR_SHIPYARD,
  VGR_RESOURCECONTROLLER,
}

-- can be used as a salvage dropoff
squadclass[eSalvageDropOff] = {
  HGN_MOTHERSHIP,
  HGN_CARRIER,
  HGN_SHIPYARD,
  VGR_MOTHERSHIP,
  VGR_MOTHERSHIP_MAKAAN,
  VGR_CARRIER,
  VGR_SHIPYARD,
}

-- is a fighter
squadclass[eFighter] = {
  HGN_INTERCEPTOR,
  HGN_ATTACKBOMBER,
  HGN_ATTACKBOMBERELITE,
  
  VGR_INTERCEPTOR,
  VGR_BOMBER,
  VGR_LANCEFIGHTER,
  
  KPR_ATTACKDROID,
}

-- is a corvette
squadclass[eCorvette] = {
  HGN_ASSAULTCORVETTE,
  HGN_PULSARCORVETTE,
  HGN_MINELAYERCORVETTE,
  
  VGR_MISSILECORVETTE,
  VGR_LASERCORVETTE,
  VGR_MINELAYERCORVETTE,
  VGR_COMMANDCORVETTE,
  
  KPR_MOVER,
}

-- is a frigate
squadclass[eFrigate] = {
  HGN_ASSAULTFRIGATE,
  HGN_DEFENSEFIELDFRIGATE,
  HGN_IONCANNONFRIGATE,
  HGN_MARINEFRIGATE,
  HGN_MARINEFRIGATE_SOBAN,
  HGN_TORPEDOFRIGATE,
  HGN_TORPEDOFRIGATEELITE,
  
  VGR_ASSAULTFRIGATE,
  VGR_HEAVYMISSILEFRIGATE,
  VGR_INFILTRATORFRIGATE,
  
}

-- can capture other ships
squadclass[eCapture] = {
  HGN_MARINEFRIGATE,
  HGN_MARINEFRIGATE_SOBAN,
  VGR_INFILTRATORFRIGATE,
  KPR_MOVER_CAPTURE,
}

-- has shields
squadclass[eShield] = {
  HGN_DEFENSEFIELDFRIGATE,
}

-- is a platform
squadclass[ePlatform] = {
  HGN_GUNTURRET,
  HGN_IONTURRET,
  
  VGR_WEAPONPLATFORM_GUN,
  VGR_WEAPONPLATFORM_MISSILE,
  VGR_HYPERSPACE_PLATFORM,
}

-- good at attacking fighters
squadclass[eAntiFighter] = {
  HGN_INTERCEPTOR,
  HGN_ASSAULTCORVETTE,
  HGN_ASSAULTFRIGATE,
  HGN_GUNTURRET,
  
  VGR_INTERCEPTOR,
  VGR_ASSAULTFRIGATE,
  VGR_WEAPONPLATFORM_GUN,
  
  KPR_ATTACKDROID,
}

-- good at killing corvettes
squadclass[eAntiCorvette] = {
  HGN_PULSARCORVETTE,
  HGN_TORPEDOFRIGATE,
  HGN_TORPEDOFRIGATEELITE,
  HGN_DESTROYER,
  
  VGR_LANCEFIGHTER,
  VGR_LAZERCORVETTE,
  VGR_DESTROYER,
  
  KPR_MOVER,
}

-- good at killing frigates
squadclass[eAntiFrigate] = {
  HGN_IONTURRET,
  HGN_ATTACKBOMBER,
  HGN_ATTACKBOMBERELITE,
  HGN_IONCANNONFRIGATE,
  HGN_MARINEFRIGATE,
  HGN_MARINEFRIGATE_SOBAN,
  HGN_DEFENSEFIELDFRIGATE,
  HGN_DESTROYER,
  HGN_BATTLECRUISER,
  
  VGR_BOMBER,
  VGR_HEAVYMISSILEFRIGATE,
  VGR_INFILTRATORFRIGATE,
  VGR_DESTROYER,
  VGR_BATTLECRUISER,
  VGR_WEAPONPLATFORM_MISSILE,
  
  KPR_DESTROYER,
}

-- is a capital ship
squadclass[eCapital] = {
  HGN_CARRIER,
  HGN_MOTHERSHIP,
  HGN_SHIPYARD,
  HGN_DESTROYER,
  HGN_BATTLECRUISER,
  HGN_DREADNAUGHT,
  
  VGR_CARRIER,
  VGR_MOTHERSHIP,
  VGR_MOTHERSHIP_MAKAAN,
  VGR_SHIPYARD,
  VGR_DESTROYER,
  VGR_BATTLECRUISER,
  
  KPR_DESTROYER,
  KPR_SAJUUK,
}

-- eCollector + eScout (maybe refineries - but those things are pretty tough?)
-- this is currently only used to count the number of 'military units' the player/enemy has
squadclass[eNonThreat] = {
  HGN_RESOURCECOLLECTOR,
  VGR_RESOURCECOLLECTOR,
  HGN_RESOURCECONTROLLER,
  VGR_RESOURCECONTROLLER,
  
  HGN_CARRIER,
  HGN_MOTHERSHIP,
  HGN_SHIPYARD,
  VGR_CARRIER,
  VGR_MOTHERSHIP,
  VGR_MOTHERSHIP_MAKAAN,
  VGR_SHIPYARD,
  
  KPR_BENTUS,
  
  HGN_SCOUT,
  HGN_SUPERSCOUT,
  HGN_PROBE,
  HGN_PROXIMITYSENSOR,
  HGN_ECMPROBE,
   
  VGR_SCOUT,
  VGR_PROBE,
  VGR_PROBE_PROX,
  VGR_PROBE_ECM,
  
  VGR_HYPERSPACE_PLATFORM,
}

-- is a hyperspace gate
squadclass[eHyperspaceGate] =
{
  VGR_HYPERSPACE_PLATFORM
}

-- good at killing subsystems
squadclass[eSubSystemAttackers] =
{
  HGN_ATTACKBOMBER,
  HGN_ATTACKBOMBERELITE,
  VGR_BOMBER,
}

-- non critical subsystems
squadclass[eNonCriticalSubSys] =
{
  CLOAKGENERATOR,
  FIRECONTROLTOWER,
  HYPERSPACEINHIBITOR,
  ADVANCEDARRAY,
  CLOAKSENSOR
}

-- good at killing repairing collectors
squadclass[eGoodRepairAttackers] =
{
  HGN_INTERCEPTOR,
  HGN_ASSAULTFRIGATE,
  HGN_IONCANNONFRIGATE,
  HGN_DESTROYER,
  HGN_BATTLECRUISER,
  
  VGR_INTERCEPTOR,
  VGR_MISSILECORVETTE,
  VGR_ASSAULTFRIGATE,
  VGR_DESTROYER,
  VGR_BATTLECRUISER,

}

-------------------------------------------
-- CUSTOM classes

-- do not exceed eMaxUserCount(32)

eUselessShips = eMaxCount
eBattleCruiser = eMaxCount + 1
-- this number should be one greater then the highest class
sg_maxClasses = eBattleCruiser+1

-- ships that the AI should not build because they are not used properly
squadclass[ eUselessShips ] =
{
  HGN_MINELAYERCORVETTE,
  
  VGR_MINELAYERCORVETTE,
  VGR_COMMANDCORVETTE,
}

-- is a battlecruiser
squadclass[eBattleCruiser] =
{
  HGN_BATTLECRUISER,
  VGR_BATTLECRUISER,
  KPR_SAJUUK,
}

--
-- FUNCTIONS TO ADD SQUADRON TYPES TO CLASS SYSTEM
--

function FastAddToClass( tbl, classid )
  for a,b in tbl do
    AddToClass( b, classid )
  end
end

function ClassInitialize()

  for i=0, sg_maxClasses do
    if (squadclass) then
        FastAddToClass( squadclass, i )
    end
  end
  
  -- debug: name all the classes to be displayed on screen
  AddClassName( eMotherShip, "Motherships")
  AddClassName( eCollector, "Collectors")
  AddClassName( eDropOff, "DropOffs")
  AddClassName( eFighter, "Fighters")
  AddClassName( eFrigate, "Frigates")
  AddClassName( eCorvette, "Corvettes")
  AddClassName( eCapital, "Capital")
  AddClassName( eAntiFighter, "AntiFighter")
  AddClassName( eAntiCorvette, "AntiCorvette")
  AddClassName( eAntiFrigate, "AntiFrigate")
  AddClassName( ePlatform, "Platform")
  AddClassName( eRefinery, "Refinery")
  AddClassName( eHyperspaceGate, "HypGates")
  AddClassName( eShield, "Shields")
  AddClassName( eCapture, "Capture")
  AddClassName( eSubSystemAttackers, "SubSysKillas")
  AddClassName( eBattleCruiser, "BattleCruiser")
  
  
end
******

第四步:给守护者种族加入AI
这是最后的一项工作,但不是一项必要的工作,我再次要求你去取下载Eviljedi的文件。
打开cpubuild.lua文件浏览一下,是不是有点惶恐?幸运的是,我们只需要在CreateBuildDefinitions函数里加上几行就是了。
现在删除函数CreateBuildDefinitions(),包括接近函数底部的表示结束函数的end。现在把下面的内容添加到文件里:
******
function CreateBuildDefinitions()

  if (s_race == Race_Hiigaran) then
  
    kCollector = HGN_RESOURCECOLLECTOR
    kRefinery = HGN_RESOURCECONTROLLER
    kScout = HGN_SCOUT
    kInterceptor = HGN_INTERCEPTOR
    kBomber = HGN_ATTACKBOMBER
    kCarrier = HGN_CARRIER
    kShipYard = HGN_SHIPYARD
    kDestroyer = HGN_DESTROYER
    kBattleCruiser = HGN_BATTLECRUISER
   
  elseif (s_race == Race_Vaygr) then
  
    kCollector = VGR_RESOURCECOLLECTOR
    kRefinery = VGR_RESOURCECONTROLLER
    kScout = VGR_SCOUT
    kInterceptor = VGR_INTERCEPTOR
    kBomber = VGR_BOMBER
    kCarrier = VGR_CARRIER
    kShipYard = VGR_SHIPYARD
    kDestroyer = VGR_DESTROYER
    kBattleCruiser = VGR_BATTLECRUISER
   
  else
  
    kCollector = HGN_RESOURCECOLLECTOR
    kRefinery = HGN_RESOURCECONTROLLER
    kScout = KPR_ATTACKDROID
    kInterceptor = KPR_ATTACKDROID
    kBomber = KPR_MOVER
    kCarrier = KPR_DESTROYER
    kShipYard = KPR_DESTROYER
    kDestroyer = KPR_DESTROYER
    kBattleCruiser = KPR_DESTROYER
   
  end
  
end
******

我们注意到,有很多的船只被用来扮演不同的角色,因此你下一步要做的就是设一个可控制的守护者种族船只的变量,然后加到这里。当然,这些都不用着急,等你运行一下这个MOD并看到守护者种族能够自己造船后,然后再做这件事。

欢迎任何的建议和补充,希望得到大家的帮助!

------------------------

译者后记:此教程虽然详细,但是还有一些细节问题没解决,
特别是加入建造列表一部分。大家要多多注意。
发表于 2009-11-26 06:44:58 | 显示全部楼层
真是經典,受教了!!~我研究研究看看!!~有問題時再做提問,謝謝!!~
[s:132]
发表于 2010-7-26 12:08:22 | 显示全部楼层
受教了...  这是我见过最详细的..
发表于 2010-7-28 17:39:30 | 显示全部楼层
不明= =
慢慢研究[s:59]
发表于 2010-7-28 18:34:46 | 显示全部楼层
本帖最后由 Miss_魂 于 2010-7-28 18:36 编辑

乃祖坟被几个新人刨了...........  皇帝君发此贴心里一定顶着巨大鸭梨
另:大呼啦圈传送器.........  萨尤克现在要是活着会飞来掐死某人的.......
发表于 2010-8-12 16:03:31 | 显示全部楼层
哇塞!这么多字啊,。。不过提取精华就很容易弄了把
发表于 2011-7-15 23:25:55 | 显示全部楼层
同楼上,一样的问题
发表于 2011-7-16 02:51:08 | 显示全部楼层
本帖最后由 fan_ 于 2011-7-16 03:16 编辑

已经有解决建造的问题的办法了,要建造的话,原文把addAbility后两个""放空是有问题的,需要指定建造的东西

(这个德国人好象也木有想象中那么严谨的感觉```)
比如在原文回帖里有

addAbility(NewShipType, "CanBuildShips", 1, "Fighter_Hgn, Corvette_Hgn, Frigate_Hgn, Utility_Hgn, Platform_Hgn, SubSystem_Hgn,Shipyard_Hgn, Probe_Hgn", "Utility, Fighter, Corvette, Frigate, Platform, SubSystemModule, SubSystemSensors, Capital")

这样就可以建造了 主力舰好象还需要增加增加~~

要增加什么需要这个""里表示的东西
NewShipType.BuildFamily = "Flagship_Hgn"

比如撒究克就是这个,
增加Flagship_Hgn,


另外一个主力舰的这项是"NotBuildable",直接写成NewShipType.BuildFamily = "Flagship_Hgn"就可以了,应该在addAbility里标的那几类都可以
您需要登录后才可以回帖 登录 | 加入帝国

本版积分规则

小黑屋|手机版|Archiver|泰坦帝国

GMT+8, 2023-6-9 13:22 , Processed in 0.198830 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.4 Designed by 999test

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表