红色警戒2 DIY 中的 art.ini 文件(尤里的复仇中是 artmd.ini 文件)提供泰伯利亚之日游戏引擎处理其相关的图像资源、单位模型以及如何使用这些资源的信息;art(md).ini 规则包含了几个板块:“游戏对象美术(Game Object Art)”、“步兵动作序列(Infantry Sequences)”、“弹道对象(Projectile Objects)”、“动画覆盖物(Animation Overlays)”、“过场电影(Movies)”,因为这些板块下的项有些具有相同的名称容易造成歧义,所以此篇文章只对该文件中的“游戏对象美术”(Game Object Art)板块下的规则语句作释义内容,下面是正文。
Cameo
单位在建造栏中的普通建造图标,指向一个 SHP 图标;默认是 none。
AltCameo
单位在建造栏中的一星建造图标,就是被间谍偷了过后的升级图标,指向一个 SHP 图标。
Image
指向一个 SHP 文件资源;在 art(md).ini 中,默认使用英文方括号 [] 中的名称作为资源文件的查找方式,比如火箭飞行兵 [LUNR] 就是要使用 rock.shp 这一资源文件作为模型,而 Image 属性则可以更改此约定,比如尤里工程师 [YENGINEER] 的此项就是 Image=ENGINEER,但这仅对 SHP 起作用,VXL 模型则不会生效。
Voxel
指示该资源是否是个 VXL 模型;默认是 no。
Remapable
指示该资源是否能够被重映射为拥有者国家的颜色,要想实现此功能还需要求模型里具有独特的红色像素点,那时渲染时就会把这些红色点替换为各拥有者的颜色;默认是 no,为 no 时那么模型是什么颜色游戏中就会呈现什么样的颜色。
注:下面就是盟军作战实验室的 Remapable=yes 效果图:

Normalized 待测试
指示动画是否以其恒定速度播放,据说此项受游戏速度调节的影响,但实际好像看上去没有什么区别;默认是 no。
Theater 待测试
指示是否视作为环境图像资源,视作为环境资源的模型似乎会影响单位的寻路模式,比如矿石、树木等;默认是 no,如果设为 yes 表示在加载此资源时考虑根据不同的地形选择不同的后缀名作为模型资源,而不是 SHP。
NewTheater
指示是否自动找寻并使用多场景的资源;默认是 no;红色警戒2中雪地场景与普通场景的建筑物通常具有不同的样式,这种逻辑默认以名称的第二个字母作区分,比如 mgrefn、marefn,约定是第二个字母为 A 表示雪地场景、为 G 表示普通场景,原版中好像只用到了这两个,但据有关资料记载,红色警戒2中还可以使用 U 作为城市场景、T 作为温和场景,尤里的复仇中还可以使用 D 作为沙漠场景、L 作为月球场景。
注:下面是战斗碉堡的普通场景和雪地场景的图示,普通场景的源文件名称是 ngbnkr.shp,雪地场景的源文件名称是 nabnkr.shp。

RotCount 待测试
指定旋转的级数,红色警戒2中似乎不再使用;默认是 32。
ShadowIndex
仅用于 VXL 模型,当单位存在多个 VXL 模型组合时决定使用哪一个作为阴影的绘制参考,值为索引号,从 0 开始,比如一个坦克具有车身、炮台、炮管这 3 个 VXL 模型,为 0 时则绘制阴影时使用车身作为阴影;默认是 0。
TurretOffset
指定炮塔中心位置的偏移量,沿车体中心线的前后偏移量;默认是 0。
FireAngle
指定炮管沿直线向上提升的角度;默认是 10。
BarrelLength
指定炮管的长度,在红色警戒2中使用的是下一项;默认是 0。
PBarrelLength 待测试
指定主武器炮管的长度,这可能影响炮台和炮管组合使用时的开火偏移位置;默认是 0。
SBarrelLength
同上,但指的是副武器炮管的长度。
PBarrelThickness
指定主武器炮管的粗细程度,这可能影响炮台和炮管组合使用时的开火偏移位置。
PrimaryFireFLH
指定主武器开火时的起始位置偏移量,就是单位开火时枪口火花的位置,值为使用英文逗号 , 分隔的 3 个数字,分别是前向、横向、纵向,具有连发效果的武器将会改变其横向值作为连发时的偏移位置,比如火箭 多功能步兵车;默认是 0,0,0。
SecondaryFireFLH
同上,但指的是副武器开火时的起始位置偏移量。
ElitePrimaryFireFLH
同上,但指的是精英主武器开火时的起始位置偏移量。
EliteSecondaryFireFLH
同上,但指的是精英副武器开火时的起始位置偏移量。
AlternateFLH0、AlternateFLH1、AlternateFLH2、AlternateFLH3、AlternateFLH4
指定特殊武器的开火位置偏移量,比如像战斗要塞中的乘客向外开火时这允许从不同的位置开火,而不是使用同样的开火点,对于心灵控制的多个控制线条也有影响,值的格式同上;似乎只支持 0 ~ 4 也就是 5 个不同的位置,其它的会被忽略。
WalkFrames
指定单位移动每个方向需要使用的模型帧数,这通常被用于使用 SHP 模型的非步兵单位,比如海豚,这和步兵单位的动作序列的作用类似,不过和步兵模型不同,使用这种解释方式的模型执行的是顺时针方向,正好与步兵相反,而且模型的动作顺序几乎是被硬编码的,必须严格按照其顺序格式来,相比之下,步兵动作序列就灵活些。
FiringFrames
同上,但指的是每个方向开火需要使用的模型帧数。
SpawnDelay
指定每一次绘制轨迹拖尾的间隔帧数,此项值越小会带来更平滑和精细的效果,但同时也会造成更大的性能消耗,建议在高速的弹道中让此值变小,不然弹道看起来会存在不好看的空隙,此项值不能为 0。
DetailLevel 待测试
设置此动画的视觉细节级别要求,当动画的视觉细节级别高于游戏中设置的级别时此动画将不会绘制以提高性能,在红色警戒2中玩家并不能更改视觉细节级别,所以这个也就没有用。
YDrawOffset
设置此图像绘制在 Y 轴上的偏移位置,值为负数时向上,正数时向下,这好像也会影响图像的层级顺序,向上时层级会更高。
*** 下面的项通常用于步兵单位 ***
Sequence
指定步兵动画模型动作序列的名称,步兵 SHP 模型的动画序列此前在单独的文章中已发布,这里不再解释。
Crawls
指定步兵是否具有匍匐动画,虽然这是出现在 art 规则中,但此项不仅仅指动画效果,甚至能影响单位的匍匐减伤效果;默认是 yes。
FireUp
开火需要的帧数,可能用于避免攻击速度快于攻击动画的情况,此值不能大于攻击动画的实际帧数,不然会造成无法开火的问题;默认是 0。
*** 下面的项通常用于车辆单位 ***
VisibleLoad 待测试
指定车辆是否具有其形状的副本以用于其弹药的装载状态,应该用于 V3 火箭发射车类的具有单独装载样式的单位;默认是 no。
UseTurretShadow
指定车辆是否使用炮台对象渲染阴影;默认是 no。
*** 下面的项通常用于多武器的单位 ***
WeaponXFLH、EliteWeaponXFLH
同 PrimaryFireFLH 类似,其中 X 指代数字,表示几号武器;后面的是精英武器。
WeaponXBarrelLength
同 PBarrelLength 类似,其中 X 指代数字,表示几号武器。
WeaponXBarrelThickness
同 PBarrelThickness 类似,其中 X 指代数字,表示几号武器。
WeaponXTurretLocked 待测试
指示炮台不可旋转,通常用于非武器类的炮台,其中 X 指代数字,表示几号武器;默认是 false。
*** 下面的项通常用于建筑单位 ***
Foundation
指定建筑物的尺寸大小,格式为 宽x高;默认是 1x1。
Height
指定建筑物的高度级别;默认是 2。
Shadow
指定是否为该动画绘制阴影效果,填 yes 或 no。
*** 下面的项影响对遮挡单位的处理
OccupyHeight
指定建筑物提示遮挡单位的的高度级别,当有飞行单位在这个高度内时会提示被遮挡;默认与 Height 值相同。
CanHideThings
指定建筑物是否能够遮住背后的单位,填 yes 或 no;如果有其它单位藏在该建筑物的后面,那么这会影响其后面是否绘制被遮住单位的提示效果,前提是游戏中开启了“显示隐藏物件”功能。
CanBeHidden
与上一项类似,但指的是该单位本身是否绘制出被遮住单位的提示效果,填 yes 或 no;常见的应用是机枪碉堡藏在某比较高大的建筑物后面,此项为 yes 时就会显示出效果。
AddOccupyX
X 指代数字,表示在某单元格子上绘制可能有被遮住单位的提示效果,格式为 X,Y。
RemoveOccupyX
同上,但指的是移除这些单元格子上被遮住单位的提示效果,意思就是当单位在这些格子上时不提示被遮挡。
*** *** *** *** *** *** ***
注:这里以尤里兵营为例,假设把 Foundation 改为 4x4、Height 改为 2、OccupyHeight 改为 10,下图是修改后的实况效果;可以看到 Foundation 和 Height 属性也会影响血条的绘制,上面的火箭飞行兵离得那么远还是被提示成了被遮挡的单位,这就是 OccupyHeight 属性的作用;而下面的火箭飞行兵位置在建筑正上方却没有提示被遮挡,如果想要让下面的那个火箭飞行兵也显示出被遮挡的效果,还需修改 AddOccupyX 属性,比如 AddOccupy1=1,1、AddOccupy2=2,2。

PrimaryFirePixelOffset 待测试
建筑物开火时的枪口火焰位置偏移量,通常只用于无炮台的固定位置,格式为 X,Y。
SecondaryFirePixelOffset
同上,但指的副武器。
PrimaryFireDualOffset
填 yes 或 no,此项同 PrimaryFirePixelOffset、PrimaryFireFLH 结合使用;如果单位具有 PrimaryFireFLH 属性且 PrimaryFireDualOffset=yes,那么 PrimaryFirePixelOffset 将与 PrimaryFireFLH 相等;如果 PrimaryFireDualOffset=no,那么会忽略 PrimaryFireFLH,弹道将直接在偏移位置绘制。
SimpleDamage 待测试
指定建筑物是否具有简单的损坏图像,作用不明;默认是 yes。
ExtraDamageStage
指定建筑物是否具有 3 次损坏图像,这是一个失效的项,红色警戒2中建筑物只有一种受损状态的图像,就是黄血以下时,据说在泰伯利亚之日中很多建筑有三次损坏的图像,但也没有用上。
Buildup
指定建筑物的建造动画,建筑物被卖掉时将会使用此动画倒放;默认是 none。
DemandLoadBuildup
设置此建筑的建造动画资源在进入战场被需要时才加载,而不是在游戏加载界面就加载,填 yes 或 no,红色警戒2中似乎已不再使用。
FreeBuildup
设置此建筑的建造动画资源在动画完成后就释放以节约内存消耗,填 yes 或 no,红色警戒2中似乎已不再使用。
AuxAnim
指定覆盖动画状态的动画,红色警戒2中似乎已不再使用。
AltImage
指定是否具有当被敌方玩家看到时所使用的交换图像,使用 SHP 的第 2 帧,红色警戒2中似乎已不再使用;默认是 no。
ChargeAnim
指定是否具有类似磁暴线圈的充能动画,这个已被 DelayedFire 系统取代,红色警戒2中似乎已不再使用;默认是 no。
SiloDamage
指定损坏图像是否基于矿石存量的等级,红色警戒2中似乎已不再使用;默认是 no。
Flat 待测试
指定建筑是否是平铺在地面上的,这可能影响建筑物的绘制逻辑;默认是 no。
Recoilless 待测试
指定建筑是否没有炮管的伸缩动画,即使建筑有炮台;默认是 no。
ToOverlay
指定建筑被放置后将被转化成哪种覆盖物,填地形覆盖物的名称,比如围墙、沙袋就是地形覆盖物逻辑;默认是 none。
DamageLevels
指定有多少个受损的级别,仅用于围墙,此项会间接影响围墙的耐击打程度。
PowerUp1Anim、PowerUp1AnimDamaged
指定当建筑的升级级别达到 1 时加入的动画效果,后面的指受损状态播放的动画。
PowerUp1LocX、PowerUp1LocY、PowerUp1LocZ、PowerUp1YSort
这些 X、Y、Z 分别是当建筑的升级级别达到 1 时的动画绘制位置偏移量,YSort 指如果建筑物存在多个动画时,此动画相对于其它动画的播放先后顺序。
注:建筑的升级级别应该指的是建筑的扩展逻辑,在第三方MOD平台中可见到,原版红色警戒2并没有这一功能,就是在原有的建筑物上面再建造附加的建筑物,达到增强、或是改变武器一类的目的;还有类似的项只是数字不一样,PowerUp2、PowerUp3,意义应该是一样的;有争议的是最后一个 X、Y、Z 字母在另一处是复写的,如 PowerUp1LocXX、PowerUp2LocZZ,这可能是原开发者的错误导致,建议通测以免出错。
ActiveAnim、ActiveAnimDamaged
指定建筑物运行时播放的动画,Damaged 同上。
ActiveAnimX、ActiveAnimY、ActiveAnimYSort、ActiveAnimZAdjust
这些 X、Y 分别是建筑运行动画在两个方向的位置偏移量,YSort 同上,ZAdjust 指该动画在底部到顶部层级的位置,更低的值会被更高值的动画遮挡。
ActiveAnimPowered
指定建筑的运行动画是否需要足够的电力,也就是说停电时动画就会暂停,类似苏联雷达那种;默认是 yes。
注:红色警戒2中的建筑物模型通常是由多个 SHP 部分组合拼凑起来的,如果存在多个运行动画,则用 ActiveAnimTwo、ActiveAnimThree、ActiveAnimFour 这种格式指定代换,好像最多只有这么 4 个。
ProductionAnim、ProductionAnimDamaged
指定建筑物的生产动画,Damaged 同上;据测试,主要建造厂在每次建筑物被放置后会播放一次这个动画,战车工厂在每次车辆被建造后会播放一次这个动画,矿厂在每次矿车卸矿时会播放一次这个动画,矿车在这个动画没有播放完成前不能离开矿厂,维修厂则会使用 SpecialAnim 逻辑作替代,兵营和空指部没有这种逻辑。
ProductionAnimYSort、ProductionAnimZAdjust
YSort 同上,ZAdjust 同上。
注:红色警戒2中建筑物动画项的命名方式都可以尝试使用这种 Anim 后跟 Damaged、YSort、ZAdjust 甚至是 X、Y 这种,比如 ProductionAnimDamagedZAdjust 可能表示受损状态下生产动画的 ZAdjust 属性,或者是 ProductionAnimX、ProductionAnimY 这种,甚至是 ProductionAnimTwo、ProductionAnimThree 这种,反正这些项即使不存在也不会报错,想要尝试的朋友们可以这样做。
IdleAnim、IdleAnimYSort、IdleAnimZAdjust …
指定建筑物的闲置动画;此项最初被红色警戒2中的维修厂和主要建造厂作为特殊动画使用,通常用于修复原有动画带来的一些问题,可以理解为补丁项,同 SpecialAnim 逻辑类似。
SpecialAnim、SpecialAnimZAdjust、SpecialAnimX …
同上,通常作为补丁动画。
LowPower、LowPowerDamaged、LowPowerPowered …
同上,但指的是缺电状态下的动画。
SuperAnim、SuperAnimZAdjust、SuperAnimX …
同上,不过这些特指当该建筑的超级武器即将就绪时的动画,而且同 ActiveAnim 一样,使用 Two、Three 这类后缀表示多个动画,也支持 Powered 后缀;但是超级武器的动画使用 SuperLowPower、SuperLowPowerDamaged … 这类项表示在缺电状态下呈现的动画。
注:目前尚不清楚这些动画究竟存在哪些硬编码约定,比如天气控制机的超武动画只是在注释里写了不带序号的是闲置时、Two 是启动时、Three 是循环动画、Four 是关闭时,建议 DIY 的玩家结合模型资源具体分析;下面贴出 SuperAnimTwo=GAWETH_F、SuperAnimFour=GAWETH_H 指向的图像资源图示,源文件分别是 ggweth_f.shp、ggweth_h.shp。

Start、End、LoopStart、LoopEnd、LoopCount
这些项为建筑的 SHP 模型资源指定帧的解释方式,通常是对 ActiveAnim 所指定动画的解释;LoopCount 指定播放次数,值为 -1 时表示无限循环,这时会用上 LoopStart 和 LoopEnd,LoopStart 指 SHP 模型的开始帧序号,从 0 开始,LoopEnd 指结束帧序号,意思就是循环播放 LoopStart ~ LoopEnd 指定的序号帧动画;当 LoopCount 值为 1 时表示只播放 1 次该动画,这时就会用上 Start 和 End。
Reverse
填 yes 或 no,指定该动画是否是反向播放的。
NormalZAdjust
指定建筑物在层级上的位置,类似于其它 ZAdjust,低层级更容易被高层级的图像挡住。
Rate
指定动画播放的速率,值越大动画播放得越快;默认是 900;在默认的游戏速度(15 FPS)下,Rate=900 表示每秒播放 15 帧,Rate=60 表示每秒播放 1 帧,Rate=1 表示每分钟播放 1 帧。
IsAnimDelayedFire、DelayedFireDelay
前一项指定武器的实际开火是否等待到开火动画之后再执行,这里的开火动画使用的是 SpecialAnim,填 yes 或 no;后一项则是设置等待的时间帧数,典型的应用是磁暴线圈开火前的蓄力动画。
StartSound
指定动画开始播放时同时也播放的声音资源,这个项要求指定 sound(md).ini 中定义的声音。
Report 待测试
这个应该也是指定动画开始播放时同时也播放的声音资源,但好像没有使用,一般用的是上面那个。
AnimActive
指定建筑处于运行状态时播放哪些帧当作动画,这是早期泰伯利亚之日开发中的遗留物,格式为 A,B,C,A 指从第几帧开始播放,序号从 0 开始,B 指共播放多少帧,C 指播放速率,这个速率值越小,播放得越快。
UnderDoorAnim、DeployingAnim、UnderRoofDoorAnim、RoofDeployingAnim
这些仅用于战车工厂类的建筑,指定当单位生产出来时让建筑呈现不同形态的动画样式;UnderDoorAnim 指单位从前门出来时的前门外观,DeployingAnim 指单位从前门出来时的主体外观,UnderRoofDoorAnim 指单位从顶棚出来时的顶棚外观,RoofDeployingAnim 指单位从顶棚出来时的主体外观;这些项的名称后可以加 Damaged 表示受损状态使用的动画,比如 UnderDoorAnimDamaged;也可以加 ZAdjust 表示动画在 Z 方向的偏移量,比如 UnderDoorAnimZAdjust。
注:这些都是红色警戒2中很糟糕的硬编码逻辑,毫无程序逻辑可言,建议尽量不碰这些东西,实在要改的话最好就按照之前的格式来;下面 4 张图为盟军战车工厂用的 SHP 资源,从左到右依次是 UnderDoorAnim=GAWEAP_1、DeployingAnim=GAWEAP_2、RoofDeployingAnim=GAWEAP_3、UnderRoofDoorAnim=GAWEAP_4,源文件名称从左到右依次为 ggweap_1.shp、ggweap_2.shp、ggweap_3.shp、ggweap_4.shp。

BibShape
指定 bib 使用的模型名称,bib 是红色警戒2中建筑物能够通过的一块小区域,比如苏盟矿厂停矿车的那个平台,战车工厂出口前面能过车的底部平台。
注:下面是苏联矿厂的 bib 模型图,其 art 代码为 BibShape=NAREFNBB;源文件的名称是 ngrefnbb.shp,这是一个多帧的 SHP 模型,第一帧是正常状态,第二帧是受损状态,后面还有几帧,没有外部规则项指定使用哪一帧,所以这个应该也是内部硬编码的约定。

ZShapePointMove 待测试
据说此项主要用于具有 bib 的建筑,比如战车工厂,调整此项值能够解决建筑物底部视觉上被裁剪的问题,格式为 X,Y。
QueueingCell
当多个矿车返回苏盟矿厂卸矿时,因为同一时间只能允许一辆矿车停在卸矿平台上,所以此项指定这些等待的矿车暂时会在哪一单元格上停留,格式为 X,Y;使用 WaitingOffsetX 可以单独指定每一个等待单位的停留位置,不过这个格式为 X,Y,Z。
DockingOffsetX
对于具有停靠功能的建筑,此项指定每一个停靠的位置相对于该建筑的位置偏移量,其中 X 指代数字,典型的应用是空指部,有 0 ~ 3 共 4 个停靠位置,格式为 X,Y,Z。
DamageFireOffsetX
指建筑受损状态冒烟着火的起始点位置偏移量,其中 X 指代数字,表示第几个着火点,格式为 X,Y;默认是建筑物的中心也就是 0,0。
MuzzleFlashX
此项设置枪口开火时火光点的位置偏移量,其中 X 指代数字,表示第几个枪口火焰点,典型的应用是可进驻建筑比如战斗碉堡,格式为 X,Y。
Layer
指定应在哪一层面播放动画,这可能影响动画是否被遮挡,从低到高依次是:Underground(地下)、Surface(水面)、Ground(地表)、Air(空中)、Top(顶层);默认是 Air;红色警戒2中没有地下,顶层意味着层级最高,甚至高于护罩类的。
TerrainPalette
指定是否使用地形色盘而不是建筑物色盘绘制;默认是 no。
AltPalette
填 yes 或 no,指定是否使用单位色盘而不是建筑物色盘绘制。
DoubleThick 待测试
填 yes 或 no,此项影响建筑物被超时空传送冻结时的半透明状态样式,据说当建筑物存在模型重叠时,此项会使重叠部分显示出更优的半透明效果。
ExtraLight 待测试
指定建筑物的额外光照值,填正负数值,这可以使建筑物变得更亮或更暗,但不适用于建筑的动画。
TurretNotExportedOnGround
填 yes 或 no,此项作用不明,看起来和炮台有关。
SpecialZOverlay
此项似乎是早期开发的残留物,把闸门当作是地图覆盖物对待,现应该已经没有了作用。
GateStages
此项影响闸门的开合程度,填数值。
MidPoint
填数值,此项作用不明,看起来和图像的定位点有关。
*** 下面的项通常用于飞行器单位 ***
Rotors 待测试
指定这个飞行器是否具有附加的螺旋桨动画;默认是 no。
CustomRotor 待测试
指定这个飞行器是否具有不同朝向的螺旋桨外观;默认是 no。
UseBuffer 待测试
仅用于 VXL 模型,如果设置了此项,则表示该 VXL 模型将使用另外的绘制模式,填 yes 或 no;用于直升机的螺旋桨,据说这样可以提高绘制性能,但看上去这个使用与否没有什么区别。
DisableVoxelCache 待测试
指示是否禁用 VXL 缓存,填 yes 或 no;这个缓存好像并不影响呈现的效果,据说当屏幕中存在大量的 VXL 模型时,缓存能够提高绘制性能。
DisableShadowCache 待测试
指示是否禁用阴影的绘制缓存,填 yes 或 no;与上一项不同,此缓存可能会影响实际的呈现效果。
注:art(md).ini 中指向资源名称的项通常不区分大小写,也不加文件名称后缀;指定的动画可能需要在 rules(md).ini 的动画列表作名称注册,否则可能无效;文中提到“通常用于”的板块不一定就只能用于那种情况,可自行尝试能否用于其它地方;此篇文章的参考环境是红色警戒2尤里的复仇1.001,尤里的复仇1.000和1.001的 artmd.ini 相同。