地图 INI 简介

RA2MAP:本文转载自 FA2SP HDM Edition 地编内教程附件

文章包括:

1注册表小节
1.1漂移与重复
1.2输出真实注册表
1.3特殊注册表
2ini覆盖
2.1不完整覆盖bug
2.1.1光棱塔秒杀
2.1.2导弹三星弹头
2.1.3步兵pip漂移
2.1.4鲍里斯空袭
2.1.5杂项
2.2注册表小节
2.2.1[Countries] 国家
2.3Image图像覆盖
2.4特殊INI小节
2.4.1AI相关小节
2.4.2[VariableNames]变量
3杂项内容

本文将简述地图 ini 与 rulesmd.ini 的合并关系与常见问题。本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,转载请注明作者。

作者:Handama

最后修订:2025.1.26

红警地图,无论其拓展名如何,本质上都是一个ini文件,由多个小节和小节下的键值对组成。

ini
[小节(section)]
键(key)=值(value)

因此,它也遵守绝大多数红警一般ini的规则。

1     注册表小节

INI分为两种小节:注册表小节和一般小节。在注册表小节中,ini的键除了互相区分外,没有任何意义。游戏自上而下读取注册表小节,并将值放入对应的游戏内注册表中。注册表小节主要有:

ini
Rules注册表:
[AircraftTypes]
[Animations]
[BuildingTypes]
[Countries]
[InfantryTypes]
[OverlayTypes]
[Particles]
[ParticleSystems]
[SmudgeTypes]
[SuperWeaponTypes]
[TerrainTypes]
[VehicleTypes]
[VoxelAnims]
[Warheads]
AI注册表:
[TaskForces]
[TeamTypes]
[ScriptTypes]
Art注册表:
[Movies]
Sound注册表:
[SoundList]
EVA注册表:
[DialogList]
Theme注册表:
[Themes]
地图注册表:
[Aircraft]
[Houses]
[Infantry]
[Structures]
[Units]

特殊:
[WeaponTypes]
[Projectiles]
[VariableNames]

由于注册表小节的键没有实际意义,因此也可以是除了数字外的其他文本。但一般建议与游戏内索引相对应,即从0开始,并且不间断不重复。

1.1  漂移与重复

许多脚本、事件、行为,参数所填的索引都是游戏内注册表的索引,而不是ini中的键。游戏内注册表为从0开始不中断的列表,因此往往会与ini键对应不上,称为注册表漂移。当ini注册表中的值产生重复时,会以第一次出现的为准,后面的重复值不会重复注册。例如在尤复rules中:

ini
 [BuildingTypes]
 185=NAPSYA
 241=NAPSYA

NAPSYA的真实注册表索引为184。

1.2  输出真实注册表

大部分注册表索引可以通过ares的转储类型(Type Data Dumping)功能输出,在键盘-发展中为这个功能设置快捷键,然后在游戏中按下即可。对应内容会输出到debug.log中(需要在启动参数中添加-LOG)。

1.3  特殊注册表

[WeaponTypes]与[Projectiles]并不存在于尤复rules中,而是游戏内置注册表。在解析单位时,游戏会自动将单位的武器和抛射体添加进这两个注册表中。因此,光棱坦克的溅射武器才需要挂载到XCOMET下。行为42“武器(弹头)爆炸在…”使用的就是[WeaponTypes]。Ares环境下可以直接查阅转储类型的输出,或者直接在rules中添加这个注册表;而在原版环境中,由于武器注册顺序与ares可能有差别,一部分序号并不能对应上。因此,不建议在原版环境中使用本行为。

地图注册表[Houses]存储所属方信息,[Aircraft]等其余四个存储摆在地图上的各种单位信息。尤复所有与国家、所属方有关的触发、脚本均使用[Countries]注册表。多个所属方可以共用一个国家,但在执行有关触发、脚本时会报错,不推荐使用。

[VariableNames]虽然形式上也是从0开始的索引,但并不是注册表,而是一个特殊的“名字”(键)。在rules中,游戏只会读取键为0~49的全局变量,在地图中,则只会读取键为0~99的局部变量,超出这个范围的变量不会被计入,并且值恒为1。例如:

ini
[VariableNames]
0=变量0,0
1=变量1,0
3=变量3,0

在这个例子中,事件37“局部变量被清除”的参数若填2,则会被触发,因为游戏找不到ini键为“2”的变量,而未定义局部变量的默认值为0。

Phobos增加了两个注册表:[AITargetTypes]与[AIScriptsList],主要用于新增的脚本中。这两个注册表也遵循一般规则。

2     ini 覆盖

地图中的INI小节会覆盖rules中对应的内容。例如,通过添加:

ini
[HTNK]
Strength=1000

即可以让犀牛坦克的血量变为1000,而其他未被修改的属性不会改变。但是,某些小节会产生bug或特殊现象:

2.1  不完整覆盖 bug

本小节内容只在原版尤复下进行测试,拓展平台可能修复了部分bug

2.1.1   光棱塔秒杀

可见于官方图“埃及之旅”中,两个光棱塔串联后,伤害足以秒杀尤复中的所有单位。

原因:这张图覆盖了[General]的部分内容(修改了幻影坦克的伪装树木),但是没有重新定义PrismSupportModifier=,产生的原理可以参考modenc

2.1.2   导弹三星弹头

在覆盖[CombatDamage]时,如果没有重新定义导弹的三星弹头,包括V3EliteWarhead=、DMislEliteWarhead=和CrushWarhead=,会导致他们的三星弹头变为初始弹头。

2.1.3   步兵pip漂移

在覆盖任何步兵小节时,如果没有重新定义Pip=和OccupyPip=,就会导致pip漂移,如下图右侧:

2.1.4   鲍里斯空袭

在覆盖有空袭逻辑的步兵小节时,如果没有重新定义EliteAirstrikeTeam=,则三星空袭飞机数量仍然为初始数量。

2.1.5   杂项

修改全局的粒子系统(如[SmallGreySSys])或地形类型(如[Water])时,也需要在地图中全部重新定义,否则无法正常工作。

以上总结可能并不全,因此建议在覆盖小节,特别是全局ini小节时,尽量复制rules中的全部内容,以避免同类bug。

2.2  注册表小节

与普通小节不同,注册表小节并不会覆盖相同键的内容,而是会将地图ini中的值按顺序添加全局注册表最后。因此,地图注册表小节的键可以与全局重复。如下注册表,通过ares转储输出后可以看到:

地图ini:
[BuildingTypes]
0=TESTB1
1=TESTB2
2=TESTB3
Ares输出:
……
401=CALUNR02
402=TESTB1
403=TESTB2
404=TESTB3

需要注意的是,部分全局注册表小节中的内容并不是完整内容,除了注册表外,游戏还会通过其他途径为对象进行注册,并将其添加至游戏内注册表中。例如,使用ares输出[Animations]可以看到:

Rules注册表:
[Animations]
……
1069=NANRCT_PD
1070=YAPOWR_BD
1071=YAPOWR_CD
Ares输出:
……
606=YAPOWR_CD
607=D
608=SMOKEY2
609=gtpowexp
610=tstlexp
611=CAWA15DM
612=CACH06DM
613=BBBLELRG
614=MINDANIMR

在ares环境中,地图ini中新注册的动画实际从615开始(而在尤复环境中,甚至是从621开始!)。因此,建议所有注册表都在rules中注册,以免在使用时无法确定正确的索引。

2.2.1   [Countries] 国家

同其余注册表小节一样,地图的[Countries]也与全局注册表合并。在尤复中,全局国家有14个,因此新建国家的索引从14开始。由于地编的特性,只有注册在地图[Countries]中的国家才能被正常引用(只是地编显示问题)。如果同时也使用了全局国家,如Neutral,由于1.1提到的原理,他们的索引仍为原本的全局索引号。下面是两个例子:

[Countries]          ;索引号
0=Player             ;14
1=Neutral            ;12
2=GoodLeft1       ;15
3=GoodMid1       ;16
[Countries]          ;索引号
9=YuriCountry     ;9
10=GoodGuy1     ;14
12=Neutral          ;12
13=Special           ;13

左侧的例子是不使用标准所属方时常见的情况,而右侧则是使用标准所属方后又新增国家的情况。

2.3  Image 图像覆盖

在地图中重设Image=时,游戏将新的Image定义的Art小节覆盖已有的Art小节,但是并不能修改原有的Cameo=、AltCameo=与Foundation=。此外,如果原Art中定义了某个ActiveAnim,但在新的Art小节中并未重新定义,则仍会保留原有的ActiveAnim

2.4  特殊 INI 小节

地图INI中的某些特殊小节,并不会覆盖rules中的对应内容。

2.4.1   AI 相关小节

AI注册表[TaskForces]、[TeamTypes]、[ScriptTypes]、[AITriggerTypes]会被合并到AI中。脚本行为18 - 更改小队所使用的索引,是包含ai中[TeamTypes]的合并索引。地图中的小队可以直接引用全局AI中的特遣和脚本,地图中的AI触发可以直接引用全局AI中的小队。特遣、小队、脚本小节并不遵循合并规则,而是直接替换。如果你想修改全局特遣、小队、脚本的内容,需要在地图对应注册表中注册,并在地图中写入完整的小节(本质上是引用了地图ini中的小节,忽略了AI中的)。

2.4.2   [VariableNames]变量

[VariableNames]并不是注册表小节。在rules中添加的为全局变量,在地图ini中添加的为局部变量,并且他们的格式也不相同。

3     杂项内容

地图ini支持ares的include和冒号继承,注册表小节支持+=注册,但为了地编的兼容性,不推荐在地图中这样做。

Ini键值对的总长有限制。在尤复平台中,除了[Actions]、[Events]和[AITriggerTypes]以外的小节,键值对最大长度均为128,而前面三个小节为512。超出长度的内容会被忽略掉,因此可能会产生意外情况。Ares将所有小节的限制均拓展至512。

如果ini小节名出现重复,游戏仅会读取第一次出现的小节。但是FA2会读取第二个,并且保存后也仅会保存第二个。小节中出现重复键时,尤复中会读取第一个值,FA2和ares平台会读取第二个值。

  • 地图 INI 简介
  • 作者:Handama  发布于:2025-02-11  更新于:2025-02-21  许可协议:若无特别说明,均为 CC BY-NC-SA
CJ的触发入门实例教程3篇
触发系统的组成和运行机制