RAT红警社区

查看: 268|回复: 9

[MOD教程] 由机位系统改造的人口系统

[复制链接]

933

积分

841

好评

259

帖子

版主

积分
933
QQ
发表于 2017-10-13 17:04:21 | 显示全部楼层 |阅读模式
本帖最后由 Ngen 于 2017-10-13 17:05 编辑

由机位系统改造的人口系统

作者:Ngen



摘要:人口限制是RTS中重要的运营机制之一,在《帝国时代》《魔兽争霸》《星际争霸》等游戏中,人口的限制考验着玩家的运营节奏,摧毁对手提供人口的建筑以限制生产甚至成为一种可行战术。在红警系列中,并没有所谓的人口系统而有相近的电力系统,但电力系统更多的是在限制玩家扩张和开矿,而对产能的限制却是次要,在玩法上与人口系统有很大差别。虽然说至今没有方法在红警3中建立一个独立的人口系统,但确实可以通过对机位系统的改造来实现对人口系统的高度模仿,主要原理是:
1.利用<Behaviors>中的<ParkingPlaceBehavior>字段赋予单位提供机位的能力
2.在 KindOf 函数中添加 LIMITED_PRODUCTION_AIRCRAFT 值,使该单位被视为占用机位的“飞机”
3.在<Behaviors>中添加<SpawnBehavior>字段使单位附着额外的人口单位





一、单位提供人口的原理
    在机场的代码中,<Behaviors>字段中有如下<ParkingPlaceBehavior>字段


                        <ParkingPlaceBehavior
                                id="ModuleTag_ParkingPlaceBehavior"
                                NumRows="2"
                                NumCols="2"
                                ApproachHeight="130"
                                ParkInHangars="true"
                                DoorOpenTime="2s"
                                DoorCloseTime="2s"
                                HelipadBoneName="RUNWAY2PARK0HAN"
                                LimitedProductionAircraftSpots="4">
                                <CanParkHereFilter
                                        Rule="ALL"
                                        Relationship="SAME_PLAYER"
                                        Exclude="SUMMONED"
                                        StatusBitFlagsExclude="CANNOT_LAND_AT_AIRFIELD">
                                        <ExcludeThing>AlliedSupportAircraft</ExcludeThing>
                                        <ExcludeThing>SovietAntiGroundAircraft</ExcludeThing>
                                        <ExcludeThing>SovietBomberAircraft</ExcludeThing>

                                </CanParkHereFilter>
                        </ParkingPlaceBehavior>


    该字段是红警3中机场提供机位的原理,在游戏过程中,我们知道阿波罗、维和、世纪会共用机场的机位,一旦飞机数量综合超过机位数量就不能再生产,这和人口系统十分类似,即不同种类的单位共用某一个限制。其中函数LimitedProductionAircraftSpots的值表示这个单位提供的机位数量,把这段代码复制到其他单位中就可以让该单位提供一定数量的机位。

二、单位占用人口的原理
在阿波罗等飞机的代码中,KindOf 函数中存在 LIMITED_PRODUCTION_AIRCRAFT 值,该值表明该单位属于被限制生产的飞行器,将 LIMITED_PRODUCTION_AIRCRAFT 值赋予任一单位的KindOf 函数,这个单位就被视为被限制生产的飞行器。玩家最多只能同时拥有n个KindOf 函数中有 LIMITED_PRODUCTION_AIRCRAFT 值的单位,n为总共拥有的机位数量,而KindOf 函数中没有该值单位的生产不受限制。配合生产建筑中的<ParkingPlaceBehavior>字段,单位的生产就受到了限制,可以做到基本的一单位一人口系统。

三、单位消耗多人口的原理
    在盟军机场的代码中,<Behaviors>字段中有如下<SpawnBehavior>字段

                        <SpawnBehavior
                                id="ModuleTag_SpawnRepairDrones"
                                SpawnNumberData="3"
                                InitialBurst="3"
                                SpawnReplaceDelayData="10s"
                                SpawnedRequireSpawner="true"
                                KillSpawnsOnCaptured="true"
                                SpawnInsideBuilding="true"
                                KillSpawnsOnDisabled="true">
                                <Die
                                        DeathTypes="ALL" />
                                <SpawnTemplate>AlliedAirfieldRepairDrone</SpawnTemplate>
                        </SpawnBehavior>

    该字段表示该单位能产生维修无人机,其中SpawnNumberData函数表示产生单位的总个数,InitialBurst函数表明每次产生单位的个数,SpawnReplaceDelayData函数表示产生的延迟时间,<SpawnTemplate>字段表明了产生的单位是维修无人机。为了表达明确。我把产生维修无人机的机场称为“领主单位”,把维修无人机称为“附庸单位”。要做出一个单位占用人口的效果,只需要让领主单位通过<SpawnBehavior>字段产生多个占用人口的附庸单位。其修改如下:


                        <SpawnBehavior
                                id="ModuleTag_SpawnRepairDrones"
                                SpawnNumberData="3"
                                InitialBurst="3"
                                SpawnReplaceDelayData="0s"
                                SpawnedRequireSpawner="true"
                                KillSpawnsOnCaptured="true"
                                SpawnInsideBuilding="true"
                                KillSpawnsOnDisabled="true">
                                <Die
                                        DeathTypes="ALL" />
                                <SpawnTemplate>PopulationObject</SpawnTemplate>
                        </SpawnBehavior>



    通过更改SpawnNumberData函数,让领主单位产生n-1个占用人口的附庸单位,n为领主单位理论上(设计上)占用的人口数。通过更改SpawnReplaceDelayData函数,让领主单位一被生产出来就立刻产生占用人口的附庸单位。通过更改<SpawnTemplate>字段,使领主产生的单位是专门设计的、只占用人口而不影响游戏的空壳单位。该空壳单位代码如下:


<?xml version="1.0" encoding="us-ascii"?>
<AssetDeclaration xmlns="uri:ea.com:eala:asset" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <Tags></Tags>
        <Includes>
                <Include
                        type="instance"
                        source="DATA:BaseObjects/BaseRepairDrone.xml" />
        </Includes>
        <GameObject
                id="PopulationObject"
                inheritFrom="BaseRepairDrone"
                Side="Allies"
                KindOf="DRONE NO_COLLIDE NOT_AUTOACQUIRABLE LIMITED_PRODUCTION_AIRCRAFT"
                EditorName="PopulationObject"
                Description="Desc:AlliedWarFactoryRepairDrone">
<Behaviors>
                <SlowDeath
                                id="ModuleTag_Death"
                                DestructionDelay="0s"
                                Fade="true"
                                FadeTime="0s">
                        <DieMuxData
                                        DeathTypes="ALL" />
                </SlowDeath>
</Behaviors>
        </GameObject>
</AssetDeclaration>



    该单位更改自盟军重工维修无人机,在KindOf 函数中添加 LIMITED_PRODUCTION_AIRCRAFT值,使其成为占用人口的单位。在<Behaviors>字段中添加<SlowDeath>字段,并将DestructionDelay函数值设为0s,使该单位在领主单位死亡后即时死去,尽快释放占用的人口。完全删除<Draws>字段,使该单位不可见。


四、不足与讨论
    该方法可以较高程度地模仿RTS中的人口系统,但它是由游戏中原本自带的机位系统拓展而来,这样的更改势必会摧毁机场的四机位制度,使飞机和一般单位混同,通通计算入这个人口系统,一个机场提供四个机位的设计不能和本方法改制的人口系统并存。另外,由于占用判定某单位能否生产的条件是“有机位空缺”而不是“生产完成后没有机位过载”,所以利用本方法实现的多人口设计会出现少量超人口现象。例如在人口7/8的时候,依然可以生产设计为占用人口3的单位,生产完改单位后人口将变为10/8,其原因是一个单位占用多人口是通过<SpawnBehavior>字段来实现的,从原理上讲建筑物生产时只需要考虑领主单位占用的那一个人口,而不用考虑附庸单位占用的人口
    除此之外,用本方法实现的人口系统没有办法做到所谓的“人口上限”设计,如果要强行模仿,只能通过在提供人口的单位或建筑上添加MaxSimultaneousOfType函数,但这只是强行限制该种单位的存在数量,而不是真正的“人口上限”。


来自群组: mod以及WB讨论组

评分

参与人数 3好评 +6 贡献 +2 收起 理由
矛式迷你潜艇 + 2 + 2
牧Star + 2 很给力!
Beats + 2 赞一个!

查看全部评分

混乱中立

401

积分

310

好评

244

帖子

钢铁洪流

Rank: 3Rank: 3

积分
401
QQ
发表于 2017-10-13 20:40:43 | 显示全部楼层
嗯,厉害,辛苦了
让更多人知道ra3和RTS系列游戏的魅力!

361

积分

298

好评

101

帖子

钢铁洪流

Rank: 3Rank: 3

积分
361
发表于 2017-10-13 20:41:24 | 显示全部楼层
nbnb
回复

使用道具 举报

221

积分

204

好评

104

帖子

游骑先锋

Rank: 2

积分
221
QQ
发表于 2017-10-13 21:52:17 | 显示全部楼层
牛逼
钠。
回复

使用道具 举报

720

积分

599

好评

199

帖子

鹰击长空

Rank: 4

积分
720
发表于 2017-10-14 00:32:20 | 显示全部楼层
ca,怎么在写论文
世界上最好的语言?

80

积分

72

好评

48

帖子

游骑先锋

Rank: 2

积分
80
发表于 2017-10-14 01:32:19 | 显示全部楼层
万能RA3系列

361

积分

298

好评

101

帖子

钢铁洪流

Rank: 3Rank: 3

积分
361
发表于 2017-10-14 16:10:23 | 显示全部楼层
。。。单纯用mod来做这种人口效果 有些不理想的。。。
用地编的话,写的脚本是很麻烦很麻烦的。
如果能用地编的mod结合起来,估计会方便很多。地编的优势在于可以直接用脚本来判断人口,当人口达到一定时,来限制单位的购买。。不过它每次也只能判断一种类型的单位,写起来也是很麻烦的。。。
用mod的 spawn 可以把这些判定都转化为同一种物体的判定,就能解决掉每一种单位都要进行一次判定。。
效果也是令人满的。

361

积分

298

好评

101

帖子

钢铁洪流

Rank: 3Rank: 3

积分
361
发表于 2017-10-14 16:21:05 | 显示全部楼层
伊吹風 发表于 2017-10-14 16:10
。。。单纯用mod来做这种人口效果 有些不理想的。。。
用地编的话,写的脚本是很麻烦很麻烦的。
如果能用地 ...

然而首先得抓得到一只mapper

933

积分

841

好评

259

帖子

版主

积分
933
QQ
 楼主| 发表于 2017-10-15 23:48:33 | 显示全部楼层
伊吹風 发表于 2017-10-14 16:21
然而首先得抓得到一只mapper

有道理,有空研究一下地编,完善一下这个系统
混乱中立

401

积分

310

好评

244

帖子

钢铁洪流

Rank: 3Rank: 3

积分
401
QQ
发表于 2017-10-16 16:08:31 | 显示全部楼层
Ngen 发表于 2017-10-15 23:48
有道理,有空研究一下地编,完善一下这个系统

小奏就是WB大佬
让更多人知道ra3和RTS系列游戏的魅力!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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