# 4.art词典 ```{hint} 前言,art代码一堆,绝对不要试图在本文中摘取代码从零开始写,请复制原版art已有的项进行修改 ``` ```{note} 注意:SHP建筑等非Ares环境下必须打包进mix才能正常使用,非FA2SPHE的FA2/FA2SP也是如此 ``` art(md).ini文件用于指定游戏的图画如何显示到用户的屏幕上。游戏中大部分的图像数据都位于这里。art(md).ini文件的某些部分甚至用于创建附加的特效,例如播放矿的产生的动画。 就像rules(md).ini一样,art(md).ini文件也由片断组成。每个独立的对象必须拥有自己的片断。然而,在art(md).ini文件中,片断头更加重要——在绝大多数情况下,它指定了该对象使用的图像。如果某个步兵的片断头叫做“[SOMEGUY]”,那么游戏将希望有个叫做“someguy.shp”的文件能够与之相对应,而这个shp文件中或许包含了显示该步兵单位的所有需要的图像。另外,在rules(md).ini中,如果一个对象没有“Image=”这一条标签,那么游戏默认使用art.ini中片断头与之相同的代码。如果某个单位的片断头叫做“[MEGATANK]”,那么游戏将会在art(md).ini中寻找片断头叫做“[MEGATANK]”的片断来决定如何显示该单位,当然最后也会寻找同名的图片。然而,在art(md).ini文件中动画对象可能使用另外的图像,此时通过“Image=”的值来指定。 Image同样可以在art中使用,建筑动画均可使用,步兵和载具等需要Phobos引擎支持,但WW原始残留的代码中有相关的使用,如果直接开启会导致诸如战斗要塞使用光棱坦克皮,骆驼变成猴子等莫名的错误,可前往https://gitee.com/PB_LAB/yrstandard-ini获取标准的修复后的INI文件作为YRMOD开发基底 建议不要删除已经存在的片断头,因为游戏会引用某些片断头,删除的话有可能由于游戏找不到其引用的头而导致崩溃。(这句话的意思就是别没事找事胡乱删除原本就有的东西,哪怕你觉得这部分没啥作用……存在必有道理……) 游戏中的坐标系大多有XYZ和FLH两种 FLH就是前左高,常用于开火坐标和炮塔偏移位置等涉及根据本体朝向更改实际位置的计算,单位Lepton XYZ则有多种细分,一种最典型的X,Y,Z就是+X代表正东(屏幕右下)方向,+Y代表正南(平面左下)方向,+Z代表高度向上,单位Lepton 也常用X,Y的形式,此时+X代表屏幕右方向,+Y代表屏幕下方向,单位Pixel,即像素值,也就是你直接用疼逊截个图一框都能立即读数使用 这种情况下YSort和ZAdjust用于调整图层遮挡关系 Lepton与Cell换算关系见全局词典顶端 Lepton与Pixel换算关系见AlternateFLH词条下 每个Cell为横向60纵向30Pixel的菱形,因此视角与地平线夹角为30°,2Height恰好纵向30Pixel得1Height=256*√2/√3/2≈104Leptons 用于FLH的Lepton与Pixel换算可见RA2DIY论坛帖子https://bbs.ra2diy.com/forum.php?mod=viewthread&tid=16961 Shape 文件也有两套压缩模式,详见RA2DIY论坛帖子https://bbs.ra2diy.com/forum.php?mod=viewthread&tid=16338 压缩保存的 Shape 文件会带来一些问题,详见RA2DIY论坛帖子https://bbs.ra2diy.com/forum.php?mod=viewthread&tid=19379 想要不进游戏即预览 Voxel 模型 Ingame 效果可以使用全新的S imple vxl viewer,详见RA2DIY论坛帖子https://bbs.ra2diy.com/forum.php?mod=viewthread&tid=22491 如果你不想用 Shape 与 Voxel 这两种古董格式,你也可以使用 png、dds、jpeg.etc与mech,详见RA2DIY论坛帖子https://bbs.ra2diy.com/forum.php?mod=viewthread&tid=17820 Voxel 模型计算 FLH 可以使用 Yvory 与 HvaBuilder 自带的开火坐标测量工具 Shape 模型计算 FLH 与着火位置等可使用附件包中 ImageShaper 自带的坐标测量工具 建筑动画只要加上ShouldUseCellDrawer=no就可以使用Ares的CustomPalette=xxx~~~.pal否则跟随建筑体自身色盘 建筑体自身色盘指定见本文档Palette相关部分,注意使用了自定义色盘的对象如果所属色处于[Colors]后一半则不跟随地图光照变化,你可以直接复制一遍颜色丢到下面占位,Phobos已直接修复 所有动画必须至少拥有一个语句(哪怕实际上是无效语句)否则这个动画无法正常被使用 ## 通用标签 ```ini Image = 这个ART段落实际使用的文件名称 例如原版很多建筑的动画_A和_AD代表健康和残损,但是_AD中Image=_A通过设定播放的帧数来与_A区分 [NAPOWR_AD] Image=NAPOWR_A 那么NAPOWR_AD这个动画实际上使用napowr_a.shp 可用于动画和建筑,Phobos下也支持了所有TechnoType(Infantry、Vehicle、Aircraft、Building) Cameo = 指定该单位使用哪个SHP文件作为图标(就是你点的那个东西来建造它)。如果该对象没有图标,游戏默认使用“Missing Cameo”图标(文件名为xxicon.shp)作为它的图标(就是那个红警2样的图标)。每个图标都必须是SHP格式,并且调色盘要求是红警2的cameo.pal文件 Ares允许微观定义每个ART对象的图标色盘,但是无法分离定义Cameo与AltCameo的色盘 然而Ares允许使用256索引PCX作为图标抛弃SHP格式 Phobos更是允许使用24位全彩RGB的PCX文件作为图标 另外,原版Westwood图标的大小标准是60*48像素,即宽60像素,高48像素,虽然并不强制,但更大的尺寸还是更多的帧数在RA2中并没有任何特殊效果,除非你改程序对侧边栏的结构进行大幅度修改 原游戏中的图标排序规则如下: 对于超级武器: →RechargeTime 更短的优先 →UIName 字母顺序在前优先 对于单位列表: →AIBasePlanningSide 为玩家阵营的优先 →非建筑情况下常规单位优先,Naval=yes的其后,ConsideredAircraft=yes的再后 →TechLevel 更低的优先 →Cost 更低的优先 →UIName 字母顺序在前优先 AltCameo = 指定当该单位升级之后使用的图标。升级是指玩家使用间谍渗透对方的兵营或战车工厂之后,单位所产生的变化。规则和Cameo=标签相同。建筑也可以正常使用,例如奴隶矿场就有AltCameo Voxel = 指定该图像是否使用 Voxel 资源文件而不是 Shape。部分语句仅在该标签为 yes 的情况下才生效 Shape 载具自动调用 Voxel 炮管并不需要这句,但与 Voxel 单位一样仅在炮塔朝向玩家时炮管的图层才在炮塔之上 UseBuffer = YR新增 游戏是否使用螺旋桨模式来处理这个 Voxel 资源文件,用于控制游戏处理多组件 Voxel 资源文件的方式,如果启用那么可以正常地根据 3D 空间交叠方式显示位于一个大组件空置区域的小组件,而不是简单地让其中一个位于更高图层的组件整个绘制在另一组件之上导致将另一组件完全遮挡 DisableVoxelCache = 游戏是否缓存这个 Voxel 对象的数据,禁用也不会引发什么绘图问题,事实上对于幻影伪装和原版下用超时空超武移动一个还未从工厂开出来的载具如果使用这个标签反而会导致一些颜色错误,倒是也可以一定程度上缓解多组件多帧 Voxel 素材抖动问题。功能设计的本意大概是减少缓存可动 Voxel 素材引起的内存消耗,然而如果屏幕上 Voxel 素材过多那么禁用反而会因为游戏不断重新绘制导致性能暴跌 DisableShadowCache = 游戏是否缓存这个Voxel 对象投射的影子,禁用缓存会让游戏为使用该素材对象的 hva 每帧单独渲染一个影子而不是仅绘制第一帧。可以修复 Voxel 组件导致的影子绘制的空洞并防止 Jumpjet 运动模式的载具降落在地面上时其影子绘制绘制在自身主体组件之上 ShadowIndex = 仅用于使用 Voxel 资源文件并且包含多个 Voxel 组件的对象。它决定了哪个 Voxel 组件用于渲染单位的影子 例如:直升机,直升机的机体大概包含两个vxl,即机身和螺旋桨。你可以通过ShadowIndex=设定游戏到底是绘制机身的影子还是螺旋桨的影子 然而原版下这个标签只能填一个值,Phobos已经提供了对应的新逻辑以支持多个 Voxel 组件多帧动画的动态影子 Remapable = 该单位素材中16-31号颜色是否重映射为所属色,然而这个语句实际上并没有效果 Normalized = 动画播放速度是否随游戏速度改变,以更加符合视觉感知 如果在动画上设置了Normalized=yes 如果设置则此动画播放速度最大FPS锁定30,在1-4速下和游戏速度一致 并且由于部分动画仅有这一句,而动画至少有一个语句才能播放(配套文件《全局代码解释2024.ini》置顶第20行),因此不能直接删除,可批量替换为Rate=900 NewTheater = 如果被赋值为yes,那么该单位(一般是建筑)将会在不同的场景中使用不同的图形(例如温和气候场景和雪地场景) 游戏通过判断图像文件名的第二个字母来决定使用哪个图像 如果某个建筑名叫“[GARADR]”,那么当建筑在雪地场景中建造的时候,游戏会寻找名叫“garadr.shp”的文件作为图像;当建筑在温和气候场景中建造的时候,则寻找“gtradr.shp” 注意A代表雪地气候,U代表城市场景,T代表温和气候场景。尤里的复仇中,D代表沙漠场景,N代表新城市场景,L代表月球场景。如果游戏找不到与场景相关的图像,那么将默认使用文件名第二个字母为G的图像(也就是普通的场景)。 DemandLoad = 可以被赋值为yes或者no。如果设置成yes,游戏将会在装载“Loading…”那个画面的时候预载入图像而不是在建造的载入图像。一般用于平民建筑。(这是当然的!你要是打算在那个“Loading…”画面的时候悠哉悠哉地洗个澡的话,就随便你设置……) UseLineTrail = 使游戏为这个对象绘制一条轨迹线 LineTrailColor = 指定轨迹线的RGB颜色,默认[AudioVisual] -> LineTrailColorOverride=设定的颜色 LineTrailColorDecrement = 默认16 指定轨迹线的消失速度。数值越大(消散的越快)物体移动速度越小代表轨迹线越短。 如果为0值并不能创建永不消散的轨迹线,只是变成了由单位移动速度决定一个固定长度内不随时间消失 如果用超时空运动的次数来定义这个“长度”的话只能存储31次轨迹,在第32次超时空移动时会开始抹除第1条 如果为负值则会由于算法问题导致LineTrailColor一项无效,而且还有与被AlphaImage影响时相同的变色,大多时候很难看,长度同上 注:以上LineTrail的三句泛用于所有类型的对象,例如粒子的图像由于其作为Particle因此无法使用Animation的AltPalette等语句,但是仍可正常在art中为粒子的图像定义LineTrail 在低画质下会*2使用 一种最常用的开火坐标系统: PrimaryFireFLH= SecondaryFireFLH = ElitePrimaryFireFLH = EliteSecondaryFireFLH = 格式为=F,L,H 单位不同武器的开火坐标,使用FLH坐标系,即前,左,上,单位为Lepton 如果武器拥有偶数的Burst,那么偶数次发射还会从F,-L,H处发射,不过Laser等特效依然在F,L,H处 并且对于磁电副武器、TS中EMPulse超武调起建筑开火、IFV的辐射工兵与超时空军团兵等的坐标是没有支持好的,Ares、Phobos等引擎已接力修复,详见说明书(或者直接开用) 对于建筑类使用PrimaryFireFLH的情况见PrimaryFireDualOffset一条的注解 WeaponXFLH = EliteWeaponXFLH = 使用WeaponX系统的单位X号武器的开火坐标,计算规则同上 Phobos以允许上面6个语句使用Burst的情况为每一发Burst单独指定FLH而不是只能奇数FLH偶数F-LH AlternateFLH0 = AlternateFLH1 = AlternateFLH2 = AlternateFLH3 = AlternateFLH4 = OpenTopped载具中步兵载员向外过火的位置,计算规则同上,但有效的仅有上面5个标签,不要原版造个AlternateFLH6问为什么不行 实际上是类似“压入舱室”的方式来执行,也就是每新进入一个将前面的载员往后推一号,如果超过5个人则只有最后进的5个人一人一个 例如有步兵ABCDEF,则刚进A时A使用0,再进入B则B使用0而A使用1,再进入C则CBA分别使用012,EDCBA使用01234,FEDCBA只有后5个也就是FEDCB使用01234而A的无了 对于载具类载员则使用其自身的TurretOffset及FireFLH,Phobos已硬编码要求载具同样遵循AlternateFLH,并且如果01234都排不上则跟运输载具的开火坐标 对于OpenTopped载具自身开火武器拥有Burst=2导致FLH使用F-LH的情况,AlternateFLH也会L翻转为-L,在Phobos下不再会切换,并且允许了5个以上的坐标 游戏内以60x30(Pixel)的菱形对应256x256(Lepton)的正方形地面单元格 正方形边长等于256Leptons,所以每个Pixel等于256*√2/60≈6.035Leptons≈6 故F与L可在单位朝向东北→与西南←时截图取Pixel*6求得(当然你要找准中心) 而H与视线夹角60°则是每Pixel等于256√2cot60°/30≈6.967Leptons≈7 TurretOffset往往需要*6再-1 如果=打成==则会因为数据读入程序后因为程序内部的算法导致一些并不标准的视觉效果结果,这倒也算不上什么稀奇事了,WW日常 YRStandard-INI项目中已添加一个名为[FLHAEANIM]的Animation以便直接使用AttachEffect.Animation等方式挂在单位上标记中心点 找好后截图算像素点即可获得足够精确的坐标值,该标尺横纵方向均为距中心每5个像素点标记一次白色像素点其余用黑色填充以便于读数 你也可以去使用DynamicPatcher引擎的实时INI功能不断调整FLH值直到满意,得益于动态更新INI数据的便捷,你不再需要反复启动游戏 TurretOffset = 指定载具类单位炮塔转轴的偏移量,原版下只支持修改F轴,单位Lepton 原版下仅支持Voxel炮塔与Voxel炮管,例如一个SHP载具使用那么Shape炮塔绘制在中心而Voxel炮管根据TurretOffset偏移,Phobos已硬编码支持Shape炮管生效 旧时代没有多炮塔/替身/虚单位逻辑有种实现更多炮塔的方法就是靠一个以本体为转轴的Shape炮塔配合一个Voxel的炮管来实现的“双炮塔”,现在已经属于陈年老物了 况且Laser等特效都被拓展引擎硬编码修Bug改得遵守Offset以后也不好做两个“炮塔”都有各自的开火效果了。此外Phobos支持了TurretOffset使用F,L和F,L,H的格式,详见说明书 WeaponXTurretLocked = 使用X号武器的炮塔是否锁定方向,但这个逻辑只是锁住炮塔,并不是让载具换用Body转向,也就是你得手动让它对正目标,当然[WeaponType] -> OmniFire=yes仍可正常工作 盖特即便实际上射不了也会累计计数器,并且盖特武器音效也是正常的,也就是你可以做一个某阶段自闭只能对自己朝向方向的对象开火的盖特 如果攻击自己不朝向的方向会自闭,但是下个阶段突然扭头送出一梭子,甚至正常让动态Voxel炮塔根据Hva里的规则播放了炮管转动效果 深切认为因为该逻辑与盖特逻辑本来就不是同一个版本引入的而WW自己也不知道还能组合出这种能跑的怪东西 基于锁定炮塔方向的这种效果你也同样可以搭配一些其他语句来处理原版下Jumpjet载具炮塔朝向不对的问题https://www.bilibili.com/opus/955527925895004169 不过在现代拓展引擎中都对这个问题给予了修复,哪怕实在思索不出如何搭配不同的语句达到目标效果或懒得探索也大可直接使用现代拓展引擎写好的代码 没有PrimaryTurretLocked之类的标签,不要自己乱造.jpg SecondSpawnOffset = 第二个导弹子机的生成位置,YR新增用于雷鸣潜艇前后两个位置发射导弹,原版无畏则是根据子机发射器虚拟武器上的Burst=2自动分配该武器所处武器位的FLH与F-LH作为坐标 然而以上两种方法都仅限导弹子机,即 MissileSpawn=yes 的 AircraftType 类子机 ``` ## 步兵 ```ini [InfantryType] FireUp = 表述1:指定使用第一武器开火的动画的帧的序号。 它用来确定例如使用步枪的时候,当你可以看到步枪开火时子弹离开的那一帧的帧序号,不是前一帧也不是后一帧(总之就是那一帧) 仅适用于步兵站着而不是卧倒时。 表述2:步兵攻击前摇,第几帧确实打出攻击 FireProne = (仅用于尤里的复仇)同上。唯一的不同就是步兵是卧倒开火。 SecondaryFire = (仅用于尤里的复仇)与“FireUp=”相同,只不过这里是第二武器。 SecondaryProne = (仅用于尤里的复仇)卧倒用第二武器开火的…… 上述攻击前摇效果开火时会穿插Guard序列的帧 Crawls = 指定是否单位能够爬行(包括卧倒)。当然步兵的动作序列必须具有爬行的帧。 类似于在rules中为步兵添加Fearless=yes的效果,YR中鲍里斯的禁止匍匐就没有使用Fearless而是使用的此句 Sequence = 直接填入=XXXSequence 决定步兵使用哪个动作序列。序列是指定哪些帧用于开火,哪些帧用于行走等等 任何一个步兵素材正常发挥作用都需要sequence [XXXSequence] 步兵动作序列告诉游戏某个步兵的SHP文件的哪些帧用于什么用途。每个标签都有三或四个可能的值。 第一个数字是特定动作的开始帧。注意这是从0开始的。 第二个数字是每个特定动作用到的帧数量,包括起始帧。 第三个数字是八个方向上的乘数,用于计算各个朝向上动作的起始帧,即不同朝向动作之间的帧数跨度,也就是你可以八个方向各10帧(这种情况可能是由其他序列所使用的完整动作)但通过上一个参数只调用前5帧。若为0则无多向设定。 第四个数字是八向基础标识,用于指定播放该序列动作时步兵的默认朝向。当使用此参数时第三个数字必须设为0。 总之这是不需要知道的知识,SHPBuilder可以帮你写序列。在工具里 动员兵 Crawl=86,6,6 游戏从第86帧开始,使用6帧包括第87帧作为面向北,然后后6帧作为下一个方向,以此类推。(可以推断,面向北的爬行的动作起始帧为第86帧,每个方向上的爬行动作占用6帧,从面向北转向面向西北需要跨过6帧,也就是说面向西北的爬行动作起始帧为第(86+6=92)帧。以此类推。) Prone=86,1,6 这里,游戏仅使用第一帧(第87帧)作为面向帧,然后通过计算得到下一个方向所占用的帧序号。(可以推断,面向北的卧倒动作起始帧为第86帧,每个方向上的卧倒动作占用1帧,从面向北转到面向西北需要跨过6帧……后面的我就不用再废话了。) 第四个值是罗盘系统上的“北,南,东,西”。游戏的方向性和你认为的不一样,游戏认为北就是你的屏幕的左上方。基本上游戏的罗盘相当于顺时针旋转了45°。第四个标签仅用于Idle1=、Idle2=、WetIdle1=、WetIdle2=和Cheer=标签中。 下面是有效的动作标签: Ready = 用于当步兵单位站在那里等待的时候。 Guard = 用于当步兵单位被处于Guard模式中。在红警2中似乎使用的不多。 Tread = 指定当步兵单位在水中游泳,并不断打水保持自己浮在水面上的帧序列。 Prone = 指定步兵单位卧倒(企图减少伤害)的所有帧序列。 Walk = 指定当步兵行走的时候的帧序列。 Swim = 指定当步兵在水中游泳的帧序列。 FireUp = 指定当步兵单位站着向敌方单位开火的帧序列。 WetAttack = 指定当步兵单位在水中向敌方单位开火的帧序列。 Down = 指定当步兵单位遭到攻击卧倒的帧序列。 Crawl = 指定当步兵单位爬行的帧序列。当步兵在移动的时候遭到攻击会出现这种动作。 Up = 和down=相反。指定当危险过后步兵单位站起来的帧序列。 FireProne = 指定当步兵卧倒开火的帧序列。 Idle1 = Idle2 = 指定当步兵单位站着闲得没事的帧序列。这会使步兵单位不至于看起来像一尊雕像一样。 WetIdle1 = WetIdle2 = 同上。不同点是这里的标签指的是水中。 Die1 = 指定当步兵单位被某种拥有InfDeath=0弹头的武器杀死的帧序列。 Die2 = 指定当步兵单位被某种拥有InfDeath=1弹头的武器杀死的帧序列。可能会从Die2=和Die3=中随机选择一种。 Die3 = 指定当步兵单位被某种拥有InfDeath=1弹头的武器杀死的帧序列。可能会从Die3=和Die2=中随机选择一种。 Die4 = 指定当步兵单位被某种拥有InfDeath=2弹头的武器杀死的帧序列。 Die5 = 指定当步兵单位被某种拥有InfDeath=3弹头的武器杀死的帧序列。 WetDie1 = 指定当步兵单位在水中被杀死的帧序列。可能会从WetDie1=和WetDie2=中随机选择一种。 WetDie2 = 指定当步兵单位在水中被杀死的帧序列。可能会从WetDie2=和WetDie1=中随机选择一种。 Deploy = 指定当步兵单位被命令“部署”从而激活某种功能(就像美国大兵会在身边摆放沙袋并架起机关枪)的帧序列 建议不少于7帧,否则可能不成功 Deployed = 指定步兵单位部署状态下的帧序列。 Undeploy = 指定当步兵被命令“取消部署”的帧序列。 DeployedFire = 指定部署状态下开火的帧序列 DeployedIdle = 指定步兵单位部署状态下闲置的帧序列 Cheer = 指定步兵单位欢呼的帧序列。 Paradrop = 指定当步兵单位被空投到战场上的帧。该帧不要有影子。 SecondaryFire = (仅用于尤里的复仇)和FireUp=相同,不同的是这里使用第二武器开火。 SecondaryProne = (仅用于尤里的复仇)和FireProne=相同,不同的是这里使用第二武器卧倒开火。 以下用于飞行兵 顾名思义 Fly = Hover = FireFly = Tumble = AirDeathStart=;gs a split of Tumble, which is unused AirDeathFalling = AirDeathFinish = 其中一些序列可以定义序列执行时播放的声音,同样写在[XXXSequence]中 例如 Idle1Sounds = 播放Idle1序列时的声音 Idle2Sounds = 播放Idle2序列时的声音 Die1Sounds = 播放Die1序列时的声音 Die2Sounds = 播放Die2序列时的声音 DeploySounds = 播放Deploy序列时的声音,例如大兵蹲下 UndeploySounds = 播放Undeploy序列时的声音,例如大兵站起 CheerSounds = 播放Cheer序列时的声音,比如你可以让大兵欢呼的时候发出鳄鱼叫声 序列相关的音效会与Rules中的各种音效指定同时播放,各用各的 例如CheerSounds会与RULES中[AudioVisual] -> CheerSound=指定的欢呼音效同时播放,也就是可以一边发出人的欢呼一边发出鳄鱼的欢呼( Idle等要结合使用情景,部分不太适合滥用,不然会巨吵,或者你乐得靠这玩意让玩家不要让这个兵闲着那也随你 ``` ## Shape 载具 ```ini Facings = 面数,原版只支持1和8面,ares可使用32甚至2048面(比8大的2的整数次方倍) UseTurretShadow = 是否绘制载具炮塔的影子,然而很可惜的是这个标签无效,请用Phobos的TurretShadow或其他拓展引擎重新支持的这个逻辑 WalkFrames = 指定这个SHP载具(不是使用vxl的载具)每个方向的帧数。假定全方向的动画都存在 这些帧在该SHP载具移动的时候发挥作用。(这种SHP载具和步兵非常类似。) 可和rules中的WalkRate=配合使用 FiringFrames = 同上。只不过这些帧用于SHP载具开火。 StandingFrames = 同上。用于SHP载具闲置,必须和rules中的IdleRate=配合使用 实际上没用,Idle时播放的依然是WalkFrames StartWalkFrame = StartFiringFrame = StartStandFrame = 用于调整上述三条从哪一帧开始。(shp第一帧在art内为0号) 附MK的有炮塔shp载具备忘: 分体式SHP载具: 底盘运动帧若干,顺时针 炮塔32帧置于运动帧后,顺时针 SHP飞艇,原版使用需要一个无形的炮塔,影子和本体之间有一定高度差,在渲染的时候就应该制作出本体和影子间的高度差,原版中这个高度无法改变。Ares无需此操作 Voxel=no Facings=8 面数,原版只支持1和8面,ares可使用32甚至2048面(比8大的2的整数次方倍) StartStandFrame=0 StandingFrames=每个方向主体的闲置帧数 StartWalkFrame=0 WalkFrames=每个方向主体的运动帧数 Trailer = 这个标签指定哪一个动画被用作尾烟,丢失所属。Phobos与Kratos均已修复这部分所属链 单位会不停产生动画,动画独立播放,因为单位不停飞远,看起来就是连续的 只对Aircraft类单位和抛射体图像有效 SpawnDelay = 每隔多少帧产生一个新的尾烟动画,默认值为3 该语句使用全局计数器,达到 Delay 指定的帧数后所有使用该逻辑的同类对象同时生成一次 Trailer 指定的动画 ``` ## 建筑 ```ini Foundation = 决定对象占地面积有多大,它采用的格式为“宽x长”,其中宽为该建筑在东西方向上所占的格子数,长为该建筑在南北方向上所占的格子数 NxN有固定的几个可用项,并非随意填写,可用列表见下: 宽(↘) : 1 2 3 4 5 6 特殊 长(↙)1: 1x1 1x2 1x3 1x4 1x5 长(↙)2: 2x1 2x2 2x3 2x5 2x6 长(↙)3: 3x1 3x2 3x3 3x4 3x5 3x3refinery 长(↙)4: 4x2 4x3 4x4 长(↙)5: 6x4 长(↙)5: 5x3 上面的特殊项3x3refinery是在3x3的基础上挖掉了正东方向中间那个格子 还有一类特殊的0x0建筑不占格(因此也无法用AOE伤害到)但光标放上去会有1x1建筑一样大的选取范围 原版下Foundation=0x0的TerrainType会导致崩溃,Phobos已修复 Ares可使用自定义形状,用ares包中的Documentation/_downloads/custom_foundation.html生成代码 当长宽均>1时建筑被摧毁强制生成一个污染物 常见问题-面积不对: Rules中[A]Image=B实际上Foundation依然会先找Art中[A]下的Foundation 若全部使用Ares的自定义Foundation则没有这个问题 常见问题-子机回收: 程序判定子机返航是以母舰正中心位置为目标抵达后回收,但建筑类需要到0,0单元格才算作抵达,而对于大于1x1的建筑而言这两个判定点显然根本就不是同一个坐标,因此非1x1的建筑无法正常回收子机 当然你可以让建筑放出一个生成后不移动的子航母再放出二级子机来处理,不过那就需要相当充足的子机姿控和子航母相关的知识了 子机回收问题在b47及以上版本的Phobos中已经解决,详见说明书 Height = 指定该建筑有多高(单位为格)。它用于决定当选中该建筑时,出现的白色虚线框的高度,还有基洛夫空艇、火箭飞行兵或其他任何飞行单位打算飞过该建筑时需要升高的高度。 默认2 Buildup = 决定建造该建筑的时候使用哪个SHP图像作为建造动画。卖建筑的时候,动画倒退播放 这个动画原版应该少于54帧, 如果帧数过长,由于计算所得每帧播放时长小于红警世界的普朗克时间而瞬间结束(笑) 如果帧数过短,由于帧数太低会被直接当做不存在,也无法出售,至少要有4帧,哪怕是空的 例如如果使用2025教程包附带的光速部署包,那么你可以直接指定Buildup=dummyup使用一个预置的无形素材 太长可以考虑用BuildupTime更改Buildup所需的时长来调节,太短可以考虑加帧 此外有无建造动画直接决定建筑能否被出售,不写Buildup的建筑强制无法出售 而拥有Buildup的建筑才会允许玩家使用Unsellable来设定 由于Unsellable的限制,AI与地图触发、强制更改Mission等实际上依然只能依靠Buildup来禁止出售 详见单位属性词典中对Unsellable的注解 Buildup仅调用shp文件,并非动画类型实体,因此无需也无法注册,更无法进行定义 DemandLoadBuildup = 提前载入建造动画 FreeBuildup = 可被设定为“yes”或者“no”。TS残留 建造完成后清除建造动画的缓存。在ra2已无用 Recoilless = 如果被设定为yes,那么即使建筑有炮塔也不会表现出后坐力动画 ToOverlay = 指定该建筑将会转化为哪个覆盖物。一般用于允许玩家建造城墙,需要在Rules中Wall=yes 如果你填写一个地形对象(例如树)那么实际上是创建了一个使用它图像的覆盖物而非真的创建了一个地形对象 DamageLevels = 指定一个城墙的SHP文件有多少损坏的程度。每一种损坏的程度都是一整套城墙的图像,而破损增加。(就是说每坏得更厉害一次,都需要一整套城墙的图像。) ZShapePointMove = 格式=X,Y 建筑ZShape的偏移值,用于对齐建筑体图像与buildngz.sha 有时候建筑边角被切掉就是因为ZShape在程序缓冲区中的问题 原版下ZShapePointMove并不用于Buildup的图像,Phobos已允许设定 NormalZAdjust = 用于建筑体自身的ZAdjust设置,对于ZAdjust的概念详见ZAdjust标签自身的注解 QueueingCell = 指定当一个矿车在朝矿厂里面倒矿,另一个矿车在旁边等待倒矿的时候,那个等着的矿车所在的格子的X,Y坐标 使用与Foundation相同的规则,不过实际上以原版的倒矿速度甚至不大用得到,就算用到也会立即更改移动目标点到另一个位置 这个参数按照这个规则确定:从建筑的西角开始数,向东北方向x坐标增加,向东南方向y坐标增加。 WaitingOffsetX = 遗留自RA2开发版本的废弃语句,用于设定第X个矿车等待的偏移位置,与RULES中NumberOfWaitingPoints一句同步废弃,正式版中强制1辆倒矿1辆等待也只有1个等待位置,已改用上一句 BibShape = 指定用作“Bib”的图像。Bib是指建筑最东边的那列,单位可以越过这个部分 直接调用文件名,不是Animation对象,无法被定义,就像Buildup那样 此时游戏将单位绘制到Bib的上面而不是下面,例如战车工厂门口地板 DockingOffset0 = DockingOffset1 = DockingOffset2 = DockingOffset3 = DockingOffset4 = DockingOffset5 = DockingOffset6 = DockingOffset7 = DockingOffset8 = DockingOffset9 = 格式=X,Y,Z 单位对接(Dock)到这个建筑上时的三维坐标,此处Z代表高度,XYZ单位均为Lepton 然而原版下战机返航必然会降落到地面,因此Z只影响战机生产出来时所在的坐标高度 此外Ares下严格了Aircraft降落的Dock,如果DockingOffset在建筑占地范围外那么会悬停在空中,也不会因为空出了占地范围内的Dock位轮替 并不用于矿场倒矿,矿场倒矿虽然也是Dock但使用单元格X,Y式坐标且硬编码,Ares已解除限制使用DockUnloadCell=X,Y指定,详见Ares说明书 DamageFireOffset0 = DamageFireOffset1 = DamageFireOffset2 = DamageFireOffset3 = DamageFireOffset4 = DamageFireOffset5 = DamageFireOffset6 = DamageFireOffset7 = 格式=X,Y 指定当建筑被破坏到HP少于50%的时候播放的着火动画的播放位置,使用X,Y的形式代表像素偏移的数量,X向右为正,Y向下为正 MuzzleFlash0 = MuzzleFlash1 = MuzzleFlash2 = MuzzleFlash3 = MuzzleFlash4 = MuzzleFlash5 = MuzzleFlash6 = MuzzleFlash7 = MuzzleFlash8 = MuzzleFlash9 = 格式=X,Y 建筑内驻军开火的枪口闪光动画位置,使用X,Y的形式代表像素偏移的数量,X向右为正,Y向下为正 对于同一建筑而言,只有[BuildingType] -> MaxNumberOccupants=范围内的条目会被使用 Phobos扩展了这一逻辑,允许[BuildingImage] -> MuzzleFlashX=的范围达到10及以上 PrimaryFirePixelOffset = SecondaryFirePixelOffset = 建筑的开火坐标,固定位置,使用X,Y坐标系,X向右为正,Y向下为正 例如原版核弹井就是直接使用PrimaryFirePixelOffset=0,44来设定 以上X,Y类型的参数均可使用附件包中的ImageShaper测得,在ImageShaper自带工具中 如果你获得本文档的同时没有配套这一工具,说明你的文档并非从原正式发布渠道获取,而是已经被第三方未经许可拆分修改过的 PrimaryFireDualOffset = 该建筑开火坐标是否额外使用PrimaryFireFLH参数的值 也就是启用时使用PrimaryFirePixelOffset指定的固定位置作为炮塔的旋转轴 而使用PrimaryFireFLH根据朝向在旋转轴的基点之上根据目标方向额外偏移值 对使用炮塔但炮塔转轴并不在建筑中心的建筑来说非常好用 IsAnimDelayedFire = 建筑开火之前是否会有一个前摇动画,例如原版光棱塔与磁暴线圈,前摇动画使用SpecialAnim指定 并且播放SpecialAnim时会删除ActiveAnim而结束后会切回ActiveAnim重新开始播放 也就是这种情况下ActiveAnim成为了相对于Fire而言Idle状态的动画 DelayedFireDelay = 建筑开火硬直时间,也就是开火前有多少帧前摇,用于协调前摇动画播放时间与实际开火时刻 需要[BuildingImage] -> IsAnimDelayedFire=yes才能使用该句,但无所谓有没有SpecialAnim指定 AddOccupy1 = AddOccupy2 = AddOccupy3 = AddOccupy4 = AddOccupy5 = AddOccupy6 = AddOccupy7 = 指定这个建筑判定可遮挡的额外区域,将这些单元格添加进建筑所占据的单元格一起进行判定 RemoveOccupy1 = RemoveOccupy2 = RemoveOccupy3 = RemoveOccupy4 = RemoveOccupy5 = RemoveOccupy6 = RemoveOccupy7 = 与AddOccupy相反的逻辑,将这些单元格从建筑所占据的单元格中去除,不参与判定 以上两条可以见RA2DIY论坛https://bbs.ra2diy.com/forum.php?mod=redirect&goto=findpost&ptid=16760&pid=90653 论坛坛友双杀步枪在6楼的图示 OccupyHeight = 指定OccupyCell(由AddOccupy和CanHideThings=指定)有多高 漂浮在OccupyCell上且低于OccupyHeight的火箭飞行兵会被认为是被挡住,而飞行高度高于此值则不被认为挡住。 默认[BuildingImage] -> Height=的值 CanHideThings = 该建筑能否遮挡其所占单元格上的其他对象,不影响图像绘制,只用于判定是否会在被遮挡的对象上显示[General] -> Behind=指定的动画 如果设定上其实是一个本就没有实体遮挡或不能遮挡其他对象的物体,那么可以将这个标签设为no来禁用Behind效果 CanBeHidden = 指定该对象能否被其他对象遮挡,不影响图像绘制,只用于判定是否会在被遮挡的对象上显示[General] -> Behind=指定的动画 如果设定上其实是一个本就没有实体遮挡或被遮挡也不应该绘制标识的物体,那么可以将这个标签设为no来禁用Behind效果 也就是建筑A在载具B之前,那么A上有CanHideThings=no或B上有CanBeHidden=no二者满足其一则B上不会标注[General] -> Behind=指定的动画 注意:WW很多ART中的标签实际是读取与物体同注册名的ART段落,而不是物体Image=调用的ART段落,所以最好保持物体在RULES与ART中注册名一致的好习惯 DoubleThick = (仅用于尤里的复仇)如果被设置为yes,则该建筑或者动画被超时空兵种攻击的时候会出现额外的半透明效果。用于当建筑有两个或者更多的层且其中一个半透明的层不够用的情况。 SiloDamage = 决定建筑能否根据其存储矿物的数量对应不同的SpecialAnim阶段,RA2中储矿逻辑已被移除,故无法使用 ``` ## 建筑动画 由于排列组合过多,以下内容以组合形式表述 ### 动画类别 ```ini ActiveAnim = 后面不带序号为建筑常态工作动画 在后面加[Two|Three|Four]代表第2、第3、第4ActiveAnim 指定当该建筑建造起来之后正常运作状态下所播放的工作动画 SpecialAnim = 在后面加[Two|Three|Four]代表第2、第3、第4SpecialAnim,其中第4是YR新增 这些标签就像ActiveAnim一样,只不过这些是用于当该建筑执行特殊功能时。因此并不是一直有效,只有需要的时候才有效 例如矿车倒矿,这种情况下播放速度不变但播放时间会随矿车所卸载的矿石量变化,即太少的矿会被阶段,而空仓直接不进行播放 当[BuildingType] -> Grinder=yes时作为回收动画 当[BuildingImage] -> IsAnimDelayedFire=yes时所使用的前摇动画也使用该标签指定 在[BuildingImage] -> SiloDamage=yes时也根据[|2|3]显示储矿等的不同程度,但是RA2下储矿逻辑已废弃,仅地编直接摆放在地图上时才会使用满仓时的动画 当[BuildingType] -> UnitRepair=yes时则根据[|2|3]对应维修[开始|进行|结束]阶段的动画效果 当[BuildingType] -> Bunker=yes时,[|2|3|4]分别对应[空员常态|进入动画|有员常态|退出动画] SuperAnim = 用于超武动画 后面不带序号为超武建筑常态动画 Two为SuperWeapon或Ares的SuperWeapons(不包括SuperWeapon2)的[SuperWeaponType] -> RechargeTime=剩余时间少于建筑[BuildingType] -> ChargedAnimTime=时播放的预备动画 Three为达到[BuildingType] -> ChargedAnimTime=后的常态动画,原版下地图预置建筑初始总是使用它,Phobos已修复 Four为超武发射时回到常态重新加载的动画,你也可以专门拿它当发射动画 例如原版核弹井,常态闭仓,Two为开仓效果,Three为开仓后一个核导弹竖在里面待命,Four为核导弹发射后闭仓效果 ProductionAnim = Factory=BuildingType需要[BuildingType] -> ConstructionYard=yes Factory=InfantryType/UnitType需要[BuildingType] -> WeaponsFactory=yes 用于工厂生产动画,例如原版造建筑时建造厂的吊臂,也可以战车工厂生产载具时播放一个动画 该类动画没有+Powered(XXX)四句的组合 神奇的是矿场倒矿动画除了SpecialAnim外也可以用ProductionAnim标签额外指定一个,并且在播放结束前矿车不会自动离开,哪怕它已经倒空了(仍可手动拉走) PreProductionAnim = 预生产动画,在工厂生产动画之前播放,由于RA2中预生产逻辑残缺不全,因此只有少数功能还能使用 该类动画没有+Powered(XXX)四句的组合 同样可以用于矿场倒矿额外指定一个动画,但是Dock了就播,不影响矿车自动离开 IdleAnim = 用于建筑闲置动画 LowPower = 对应ActiveAnim和SuperAnim,建筑处于LowPower状态的动画 SuperLowPower = 针对SuperAnimThree专用的LowPower版本动画 ``` ### 可选组合词条 ```ini +Damaged = 指定该建筑的此类动画处于伤残状态(黄血)时替换播放的动画 注: 由于CanBeOccupied=yes且TechLevel=-1决定的平民建筑红血才变为破损帧,所以与该功能兼容未必良好 然而这样的建筑通过Deliver.Types等方式来生成本就有建筑非中立所属方则不显示部分图像等各种问题,完全可以使用ActiveAnim系统替代掉其自身Image建筑本体的图像系统 当然,非平民建筑的建筑也可以使用这种方法来更好的处理遮挡问题与各种其他效果 注意:即便改为使用工作动画作为实际图像,您也依然需要为本体使用一个有非0号色像素点的Shape素材以让游戏为工作动画分配画布 对于NeedsEngineer=yes的对象原本应当是被工程师进入后才允许播放工作动画,但建筑黄血切换+Damaged的动画后也会开始播放,Ares已修复 +Garrisoned = 指定该建筑的此类动画处于驻军状态时替换播放的动画。例如RA2S1的胜利纪念碑进入一个动员兵后原本作为ActiveAnim的老美国旗变成了ActiveGarrisoned的苏俄国旗 以下2句用于调整动画的绘制坐标 +X = X坐标。正值向右,负值向左 +Y = Y坐标。正值向下,负值向上 以下2句用于调整动画的遮挡关系 +YSort = 动画的YSort,对于YSort的概念详见YSortAdjust标签自身的注解 +ZAdjust = 动画的ZAdjust,对于ZAdjust的概念详见ZAdjust标签自身的注解 以下4句用于控制电力相关的行为 +Powered = 这个动画是否在没电时进入停滞状态,no的话则是根据下一句判定 +PoweredLight = 这个动画是否在没电时消失,默认no即没电时也正常播放,若下句yes则这句几乎没用 仅用于Rules中Powered=yes的建筑,毕竟Powered=no的建筑显然不停滞就会始终活动 但是如果这是个Powered=yes且Power>0的建筑也会直接抹掉动画,除非它攻击一次 不合理的是,你可以使用手动断电逻辑先把没电状态动画被关了的建筑断电再打开来让动画正常播放 在TS中这会导致关联的动画在建筑Buildup还未结束时就生成,RA2已修复 对于地图预置建筑需要切换一次才正常执行,否则yes也会正常播放 下面2句均为YR新增LowPower动画逻辑相关 +PoweredEffect = 这个动画是否在没电时消失,并且转而播放对应的LowPower动画,直到有电时才反向切换回来 例如原版基因突变器在充满后处于SuperAnimThree,如果电力不足则切换为SuperLowPower 该逻辑不必须Rules中PoweredSpecial=yes的建筑,电厂被毁或单纯靠耗电建筑压电力负载即可 如果不考虑LowPower动画逻辑,那么和Light基本一样,包括关闭动画效果也是只要两句中拥有至少任意一句就会执行,甚至Bug表现得都一样 +PoweredSpecial = 这个动画是否在基地断电状态下消失 不必须Powered=yes 该逻辑仅用于Rules中PoweredSpecial=yes的建筑,这里的LowPower特指间谍和飞碟导致的LowPower ``` 将上述两类标签进行组合,你甚至可以得到SpecialAnimThreePoweredSpecial这种30个字符长度的标签(如果PreProductionAnim能用PoweredSpecial就有31字符长了)(大嘘) 上述情况共计[(2*4 + 5*1)*11 - 2*4]=179种组合 列于此处,以便进行文本搜索时查找原语句 不存在的组合也一并列出,但将语句进行了注释 ```ini [原基本标签] ActiveAnim = ActiveAnimTwo = ActiveAnimThree = ActiveAnimFour = SpecialAnim = SpecialAnimTwo = SpecialAnimThree = SpecialAnimFour = ProductionAnim = PreProductionAnim = IdleAnim = SuperAnim = SuperAnimTwo = SuperAnimThree = SuperAnimFour = LowPower = SuperLowPower = [+Damaged类] ActiveAnimDamaged = ActiveAnimTwoDamaged = ActiveAnimThreeDamaged = ActiveAnimFourDamaged = SpecialAnimDamaged = SpecialAnimTwoDamaged = SpecialAnimThreeDamaged = SpecialAnimFourDamaged = ProductionAnimDamaged = PreProductionAnimDamaged = IdleAnimDamaged = SuperAnimDamaged = SuperAnimTwoDamaged = SuperAnimThreeDamaged = SuperAnimFourDamaged = LowPowerDamaged = SuperLowPowerDamaged = [+Garrisoned类] ActiveAnimGarrisoned = ActiveAnimTwoGarrisoned = ActiveAnimThreeGarrisoned = ActiveAnimFourGarrisoned = SpecialAnimGarrisoned = SpecialAnimTwoGarrisoned = SpecialAnimThreeGarrisoned = SpecialAnimFourGarrisoned = ProductionAnimGarrisoned = PreProductionAnimGarrisoned = IdleAnimGarrisoned = SuperAnimGarrisoned = SuperAnimTwoGarrisoned = SuperAnimThreeGarrisoned = SuperAnimFourGarrisoned = LowPowerGarrisoned = SuperLowPowerGarrisoned = [+X类] ActiveAnimX = ActiveAnimTwoX = ActiveAnimThreeX = ActiveAnimFourX = SpecialAnimX = SpecialAnimTwoX = SpecialAnimThreeX = SpecialAnimFourX = ProductionAnimX = PreProductionAnimX = IdleAnimX = SuperAnimX = SuperAnimTwoX = SuperAnimThreeX = SuperAnimFourX = LowPowerX = SuperLowPowerX = [+Y类] ActiveAnimY = ActiveAnimTwoY = ActiveAnimThreeY = ActiveAnimFourY = SpecialAnimY = SpecialAnimTwoY = SpecialAnimThreeY = SpecialAnimFourY = ProductionAnimY = PreProductionAnimY = IdleAnimY = SuperAnimY = SuperAnimTwoY = SuperAnimThreeY = SuperAnimFourY = LowPowerY = SuperLowPowerY = [+YSort类] ActiveAnimYSort = ActiveAnimTwoYSort = ActiveAnimThreeYSort = ActiveAnimFourYSort = SpecialAnimYSort = SpecialAnimTwoYSort = SpecialAnimThreeYSort = SpecialAnimFourYSort = ProductionAnimYSort = PreProductionAnimYSort = IdleAnimYSort = SuperAnimYSort = SuperAnimTwoYSort = SuperAnimThreeYSort = SuperAnimFourYSort = LowPowerYSort = SuperLowPowerYSort = [+ZAdjust类] ActiveAnimZAdjust = ActiveAnimTwoZAdjust = ActiveAnimThreeZAdjust = ActiveAnimFourZAdjust = SpecialAnimZAdjust = SpecialAnimTwoZAdjust = SpecialAnimThreeZAdjust = SpecialAnimFourZAdjust = ProductionAnimZAdjust = PreProductionAnimZAdjust = IdleAnimZAdjust = SuperAnimZAdjust = SuperAnimTwoZAdjust = SuperAnimThreeZAdjust = SuperAnimFourZAdjust = LowPowerZAdjust = SuperLowPowerZAdjust = [+Powered类] ActiveAnimPowered = ActiveAnimTwoPowered = ActiveAnimThreePowered = ActiveAnimFourPowered = SpecialAnimPowered = SpecialAnimTwoPowered = SpecialAnimThreePowered = SpecialAnimFourPowered = ;ProductionAnimPowered = ;不存在的语句 ;PreProductionAnimPowered = ;不存在的语句 IdleAnimPowered = SuperAnimPowered = SuperAnimTwoPowered = SuperAnimThreePowered = SuperAnimFourPowered = LowPowerPowered = SuperLowPowerPowered = [+PoweredLight类] ActiveAnimPoweredLight = ActiveAnimTwoPoweredLight = ActiveAnimThreePoweredLight = ActiveAnimFourPoweredLight = SpecialAnimPoweredLight = SpecialAnimTwoPoweredLight = SpecialAnimThreePoweredLight = SpecialAnimFourPoweredLight = ;ProductionAnimPoweredLight = ;不存在的语句 ;PreProductionAnimPoweredLight = ;不存在的语句 IdleAnimPoweredLight = SuperAnimPoweredLight = SuperAnimTwoPoweredLight = SuperAnimThreePoweredLight = SuperAnimFourPoweredLight = LowPowerPoweredLight = SuperLowPowerPoweredLight = [+PoweredEffect类] ActiveAnimPoweredEffect = ActiveAnimTwoPoweredEffect = ActiveAnimThreePoweredEffect = ActiveAnimFourPoweredEffect = SpecialAnimPoweredEffect = SpecialAnimTwoPoweredEffect = SpecialAnimThreePoweredEffect = SpecialAnimFourPoweredEffect = ;ProductionAnimPoweredEffect = ;不存在的语句 ;PreProductionAnimPoweredEffect = ;不存在的语句 IdleAnimPoweredEffect = SuperAnimPoweredEffect = SuperAnimTwoPoweredEffect = SuperAnimThreePoweredEffect = SuperAnimFourPoweredEffect = LowPowerPoweredEffect = SuperLowPowerPoweredEffect = [+PoweredSpecial类] ActiveAnimPoweredSpecial = ActiveAnimTwoPoweredSpecial = ActiveAnimThreePoweredSpecial = ActiveAnimFourPoweredSpecial = SpecialAnimPoweredSpecial = SpecialAnimTwoPoweredSpecial = SpecialAnimThreePoweredSpecial = SpecialAnimFourPoweredSpecial = ;ProductionAnimPoweredSpecial = ;不存在的语句 ;PreProductionAnimPoweredSpecial = ;不存在的语句 IdleAnimPoweredSpecial = SuperAnimPoweredSpecial = SuperAnimTwoPoweredSpecial = SuperAnimThreePoweredSpecial = SuperAnimFourPoweredSpecial = LowPowerPoweredSpecial = SuperLowPowerPoweredSpecial = ``` ### 加载物动画 ```ini PowerUp[X] 建筑被加载时使用,[X]对应加载物的PowersUpToLevel值,因此也与其拥有相同的可用范围即[1|2|3] +Anim = 动画 +DamagedAnim = 伤残时的动画,注意不是AnimDamaged,与常规动画的伤残标签的拼写规则不同 +LocXX = 指定绘制建筑的加载物距离绘制建筑的位置的X轴像素偏移量。正值向右,负值向左 +LocYY = 指定绘制建筑的加载物距离绘制建筑的位置的Y轴像素偏移量。正值向下,负值向上 +LocZZ = 用于指定加载物的ZAdjust,对于ZAdjust的概念详见ZAdjust标签自身的注解 +YSort = 用于指定加载物动画的YSort,对于YSort的概念详见YSortAdjust标签自身的注解 ``` 共有下列组合: ```ini PowerUp1Anim = PowerUp2Anim = PowerUp3Anim = PowerUp1DamagedAnim = PowerUp2DamagedAnim = PowerUp3DamagedAnim = PowerUp1LocXX = PowerUp2LocXX = PowerUp3LocXX = PowerUp1LocYY = PowerUp2LocYY = PowerUp3LocYY = PowerUp1LocZZ = PowerUp2LocZZ = PowerUp3LocZZ = PowerUp1YSort = PowerUp2YSort = PowerUp3YSort = ``` End,请根据所属类别向上查看对应逻辑 ### 工厂图像 ```ini DeployingAnim = 战车工厂单位从大门离开时在单位遮挡层之前的图像 用于有[BuildingType] -> WeaponsFactory=yes的工厂类建筑,单位开出来时使用 或使用[BuildingType] -> CanBeOccupied=yes的驻军建筑,释放驻军步兵时使用 亦或者裂缝产生器使用ExtraPower部署的逻辑也可,但有一些有趣的效果: 这个语句所调用的*.shp文件会残留在镜头上,就像原版下碾压Terrain那样 刷新视角或另一个裂缝产生器在其他地方部署同样执行这个逻辑都可以刷掉它 UnderDoorAnim = 战车工厂单位从大门离开时在单位遮挡层之后的图像 RoofDeployingAnim = 战车工厂单位从天窗离开时在单位遮挡层之前的图像 UnderRoofDoorAnim = 战车工厂单位从天窗离开时在单位遮挡层之后的图像 ``` ### 建筑SHP炮塔 在rules的[Animations]下注册 图像从正上方开始,32帧 逆时针 参考代码: ```ini [XXXTUR] Normalized=no LoopStart=0 LoopEnd=32 LoopCount=-1 Rate=0 Layer=ground NewTheater=yes Shadow=yes ;SHP炮塔想要拥有影子需要像建筑动画那样自己写上Shadow来开启 Surface=yes ``` ## 用作抛射体的动画 ```ini AnimLow = AnimHigh = AnimRate = 这三条用于动画抛射体,抛射体飞行中会播放动画而非停留在第一帧。low和high等于是loopstart和loopend,Rate则是像WalkRate那样每一帧实际播放多少帧 Rotates = 这个抛射体图像是否拥有方向,不能与上面三跳启用的动画抛射体合用 素材为从背对玩家开始逆时针旋转360°的32帧或64帧(带影子)Shp文件 Ares已允许带有动画效果的有方向抛射体,使用新语句,详见Ares说明书 Voxel = 如果被设置为yes,则指定该图像是VXL而不是SHP。 ``` ## 动画 这些动画会在其它之上播放。包括火焰、爆炸、开火动画、各种特效等。 如新增动画无法显示,请在rules的Animations注册列表注册,Ares下rules中调用的动画必须注册 ```ini Scorch = 如果被设置为yes,动画会在战场上留下烧焦的痕迹(燃烧“污染”),纯粹就是图像效果 灼痕生成于动画播放到一半的时候,也就是总帧数/2后向上取整,共6帧则第4帧 TS残留喷火武器逻辑,Ares已复原,未复原前可无视下面三行 同时在原地生成一个SmallFire 当与Flamer=yes合用时火焰生成由Flamer逻辑接管 如果处于LandType=[Water|Beach|Ice|Rock]的地面,那么不使用相关逻辑 Flamer = TS残留喷火武器逻辑,Ares已复原 如果启用那么将随机生成一到三个动画 始终在中心位置生成一个SmallFire动画 有一半几率在较远处生成SmallFire动画 有一半几率在中距处生成LargeFire动画 换句话说,如果只生成出了一个动画,那么只能是SmallFire 如果有三个动画,那么只可能是2个SmallFire和1个LargeFire 如果生成了两个动画,那么其中一个是LargeFire的几率为50% 当与Scorch=yes搭配使用时 火焰生成由Flamer接管 但Scorch仍可使动画留下地面烧焦痕迹 关于SmallFire和LargeFire见全局[AudioVisual] Crater = 如果被设置为yes,动画会在战场上留下弹坑的痕迹,当然也是图像效果 值得注意的是原版下有这句的动画强制会破坏一层矿石,因此也曾被用于在RA2下实现类似MARV移动吃矿的效果 PsiWarning = 是否仅在敌方心灵探测范围内对敌方播放,如果被设置为yes,动画会在核弹发射的时候为拥有心灵感应器的玩家在心灵感应范围内的核弹落点处播放。 Sticky = 如果被设置为yes,动画会附着在目标上。听起来就很好用,但是这条语句是无效的 Flat = 告诉游戏处理ZAdjust时使用视角向上实际上是在地面上向西北扩展的方式来处理 详见ZAdjust下方注解,覆盖物拥有同类标签DrawFlat但默认yes,也可进行了解 Translucent = 渐变透明效果,如果被设置为yes,该动画在播放过程中会逐渐变为透明 Translucency = 指定动画的恒定半透明效果为多少 可取值25、50或75意味着25%、50%或75%透明度(值越大越透明) 两句同时存在则只表现Translucent=yes的效果,Translucent=no的情况下才会使用Translucency=指定一个固定值 旧传的什么Translucent=yes则由Translucency指定渐变停在多少/多少开始渐变的说法是完全错误的,原版并不存在那样的用法 TranslucencyDetailLevel = 为此动画的半透明效果设置视觉效果所需级别。 如果此标志的值高于当前游戏视觉细节级别,则尽管存在透明度或半透明值,动画仍将不透明。 默认为0。 Damage = 一帧造成一次伤害,范围和动画弹头一样。原版注册名为[INVISO]的动画弹头为[General] -> C4Warhead=指定的弹头,其它为[General] -> FlameDamage2=指定的弹头,不能修改 Ares引擎可为动画伤害单独指定弹头并且可指定伤害间隔,也允许让动画爆出一个武器而非单纯弹头以支持辐射等特殊效果,Phobos下允许有所属动画爆出的武器与原所属关联 这里的一帧是Shape文件自身向前一帧,也就是一个4帧的Shape动画会杀伤4次,如果有LoopCount=2额外播一轮造成4*2=8次,但是如果只是设定里Rate=300每帧实际在游戏内持续900/300=3帧,那么依旧只杀伤4次,但是每两次之间间隔3帧 动画所挂的伤害允许使用小数形式,但并不能表现为一帧减少半点血量,而是根据设定值累计周期决定多少帧杀伤一次 Report = 指定当播放动画的时候播放的声音。声音应当和soundmd.ini文件中的片断头相匹配。 StartSound = 当动画开始播放的时候播放的声音,与上句功能上毫无区别,非要说区别就是TS里没有,所以对于RA2Modder来说就是完全一样,如果有这句就不会再去尝试读取上句 个人理解是RA2开始WW给动画的Start和Stop各加了一个Sound设置,于是成了成对的StartSound和StopSound。检查原版的应用实例在RA2中使用StartSound的动画除了流水悬崖以外仅有ChargedAnimTime开启的超武SuperAnim系列动画和DamageFireTypes的3个FIRE0[1|2|3]动画,而这两套逻辑又恰好都是RA2新增的,推测是Westwood开发时没有协调好导致大量动画音效沿用了TS的旧写法仍然使用的Report于是后期在程序内又添加了StartSound获取不到时去找Report的运作方式作为一种写法上的兼容 当本动画与Next的动画使用的是同一个音效时音效会继续播放 如果不是同一个音效会中断原本动画的音效开始播放新动画的音效 如果一串Next动画上均为同一个音效,那么要等前面好几个动画连续播放的音效播放结束后Next到下一个动画才会再次开始播放这个音效,而不是音效播放完立即重新开始 StopSound = 指定当动画播放结束时的声音 如果动画Next了另一个动画则不会播放,所以只有最后一个动画的StopSound有效 MakeInfantry = 基因突变的原理,动画生成步兵的序号,由rules全局的AnimToInfantry规定,0代表第一个 1代表第二个 原版下强制动画使用unit色盘 原版下会丢失来自IvanBomb的所属方 Next = 指定当前动画已经停止播放之后播放的动画。这也包括当它已经循环播放数次之后的情形 仅替换图像,不更改运动状态,也不会改变图层顺序,也就是Next动画的Layer会与原动画一致 也就是说SHP碎片Next一个SHP动画依然会按碎片的参数运动,并且按碎片碰撞等逻辑结束播放 而一个SHP动画Next成一个SHP碎片那么这个碎片的参数不影响该动画继续按常规SHP动画播放 DetailLevel = 为此动画的视觉效果所需级别。如果此标志的值高于当前游戏视觉细节级别则图像不显示。 UseNormalLight = 如果被设置为yes,那么动画将一直以100%的亮度播放(即使此时屏幕由于闪电风暴超级武器变暗)。 YSortAdjust = 指定动画的YSort调整值,该值用于调整动画与动画、动画与单位等的遮挡层次关系,YSort越高的对象越靠近屏幕,显示得越靠上层 ZAdjust = 指定动画的 ZAdjust 调整值,该值用于调整动画与特定类型图像的遮挡层次 这些对象包括建筑、地形对象、覆盖物、地形,只有它们会留下 Z 缓冲 也就是动画自身的 Z 实际上用于处理动画与这些对象的遮挡关系,动画之间的遮挡和动画与其他类型对象的遮挡则是使用 YSort 与 Layer 控制 负值代表层次更高,例如降低 ZAdjust 的值会先后被地面挡住 -> 在地面之上但被树挡住 -> 在树之上但被桥梁和悬崖挡住 -> 把电力和“主要”这类文字框都挡掉 不过这不会不影响 sidebar,因为 Z 缓冲并不覆盖屏幕右侧 168 像素和屏幕下方 32 像素(即侧边栏与底边栏所在)的区域 Z 深的取值范围是 0-65535,而 ZAdjust 是对对象原本一般为 32768 的 Z 深进行调整,最后仍落在这个值域内 不同的对象拥有不同的默认 Z 深调整值,例如建筑额外 -2,其他对象也基本是此值,动画比较特殊直接额外 -50 对于 Z 的空间概念可以见 RA2DIY 论坛这个帖子 https://bbs.ra2diy.com/forum.php?mod=viewthread&tid=24951 中的坐标系 简单说当空间中一个物体向西北方向(屏幕正上,实际上是在远离屏幕)移动了 1 个像素,那么其 Z + 1 如果空间中一个物体向正上方向(也是屏幕正上,但实际上更靠近屏幕)移动了 3 个像素,那么其 Z - 1 建筑可以使用 Flat=yes 强制使用第一种,覆盖物则可在 rulesmd.ini 中使用 DrawFlat=no 来取消使用第一种 对应帖子中的 SVG 图形 红色平行线是两个不同 ZAdjust 层级的视平面 蓝色实线是一个地面单元格沿视角上方向(西北)的对角线 绿色线条是视觉上某点在空间中的延伸方向,垂直于视平面 从视平面 ZAdjust 1 实线部分右下角位置向西北移动 256*√2 Lepton 相当屏幕视角向上移动了 30 个像素,抵达视平面 ZAdjust 2,Z + 30 从视平面 ZAdjust 2 红绿蓝三条虚线交接处向上移动 768*√2/√3Lepton 即屏幕视角向上移动了 90 个像素,抵达视平面 ZAdjust 1,Z - 30 对于使用压缩 Shape 格式的建筑本体则将上述 ↑1/↓3 + 1Z 的默认算法换为用 buildngz.sha 进行调整 这种情况下的工作方式是对于每个像素减去 buildngz.sha 中对应位置像素的颜色色号值来获取其 Z 深 也就是如果不使用 buildngz.sha 而是使用原 ↑3 - 1Z 的处理方式那么相当于使用了一个相同色号全部横向排布并且从上往下色号递减(减的更少,结果更大)的 buildngz.sha 需要注意的是由于一个 Shape 的色号只有 0-255,因此 buildngz.sha 的调控效果也受限于原 Z-0 到原 Z-255 之间,估计是 WW 觉得对于当时 1024 * 768 分辨率而言足够了 对于 buildngz.sha 与建筑 *.shp 的对齐问题可以使用建筑上的 ZShapePointMove 来控制,建筑上的 NormalZAdjust 也可以在此之外继续调整偏移值 对于每一个 tmp 类文件(不包括改后缀的 *.shp),其除颜色部分外自带一个 ZAdjust 部分,相当于 buildngz.sha 的功用 原版下覆盖物不遵守 ZAdjust,Phobos已修复 YDrawOffset = 填数值。可以改变动画显示时在竖向偏移多少个像素,不影响动画实际坐标只影响绘制,正值向下,负值向上,对YSort似乎有影响,但仍可调整YSortAdjust轻松解决 Phobos添加了与之对应的XDrawOffset用于控制横向偏移,详见说明书 AltPalette = 如果被设置为yes,那么动画将会使用unittem.pal,unitsno.pal和uniturb.pal作为调色盘进行描绘,而不是使用anim.pal作为调色盘 会导致图层位于最顶层(甚至黑幕之上)并且始终恒亮不跟随闪电风暴和心灵支配导致的地图光照变化 用于原本使用unit色盘的有所属色动画原版下会变成强制使用[Color]列表第一个来Remap,Phobos已修复 AnimPalette = 如果被设置为yes,那么动画将会使用anim.pal作为调色盘进行描绘,而不是使用unittem.pal、unitsno.pal和uniturb.pal作为调色盘,优先级低于上一句 与上一句一样都用于默认色盘不正确的动画对象强制指定色盘 Ares已经允许Animation对象使用[Animation] -> CustomPalette=来自定义色盘,详见Ares说明书 TerrainPalette = 如果被设置为yes,则建筑会使用地形调色盘isotem.pal、isourb.pal和isosno.pal。尤里的复仇中还包括isodes.pal、isolun.pal和unitubn.pal ShouldUseCellDrawer = 用于建筑动画,决定动画是否使用其所附着单元格上对象的色盘,也就是使用建筑的色盘,默认yes 因此 Ares 引擎想要为建筑动画独立使用 CustomPalette=xxx~~~.pal 定义色盘需要先把该句禁用 Palette = 该【单位】使用哪个色盘,填名称,自动匹配气候对应色盘,而不需要像Ares的CustomPalette一样使用~~~替代 例如Palette=unit程序会去找unittem、unitsno、uniturb、unitdes、unitlun、unitubn这6个.pal文件 虽然原版就有这个语句并且存在使用(自由女神)但是WW在程序中硬编码了全局只能能有1个单位使用,超出则抛出7771F46F Ares已解除该限制,可任意使用,并添加CustomPalette用于指定Animation的色盘 需要注意的是间谍伪装效果并不能切换成被伪装目标所用的色盘,Phobos已修复 自定义色盘功能无法为围墙类覆盖物(OverlayType)正常使用,Phobos已修复 Phobos将该语句扩展至Voxel=yes的单位和地形对象(TerrainType),详见拓展引擎说明书,如果你获得本文档的同时没有配套这一文件,说明你的文档并非从原正式发布渠道获取,而是已经被第三方未经许可拆分修改过的 一些关于单位色盘的基础知识: 对于单位素材制作而言: 1 号和 208-239号色 由于Westwood在TS中原定作为气候色而RA2中仅有unitsno.pal还保留着208-239号作为建筑雪层的颜色 因此如果你使用了那么在非雪地气候下它们会使用对应气候的颜色,而unittem等色盘这些色号被删除了,使用252,0,252号色的品红色占位,于是你Ingame会看到一坨品红色 16- 31号色是所属色 虽然色盘中是红色但实际上会根据所属方所选择的配色方案改变颜色 例如原版战役中苏军为红色盟军为蓝色尤里为紫色苏军友军为棕色或橙色盟军友军为绿色或青色 240-254则是常亮色 不跟随地图光照的亮度不同而变化,始终恒亮 因此一些白色建筑闪电风暴中出现杂色点往往就是错用了240号的白色 但是因为其恒亮特性因此作为灯光部分使用是非常合适的 你也可以自己补全unit[tem|urb|des|lun|bun].pal中的208-239号色,作为你自己MOD中的气候色 当然,在现代拓展引擎例如Phobos中已经将原版的建筑自定义色盘解锁并拓展到了载具 因此你也可以自己做一整套的色盘为不同载具使用 不过由于Voxel素材在Ingame环境下每个不同方向使用的具体色号表现也受到原版voxels.vpl这一文件的影响 而现代公版拓展引擎中暂时还无法自定义vpl,因此最好保持类似原版unit~~~.pal中的色号排布形式,或者自己制作自用的vpl确保自己的vpl与pal能够正常共同使用即可 简单说就是把同类相似的颜色排在相近的半列中 事实上色盘保存时颜色值会/4来保存进入游戏后程序再*4来使用,因此会有一个255,0,0->63,0,0->252,0,0的过程 也同样的单色色盘无法罗列0,0,0-255,0,0的完整区间,哪怕按梯度生成后再打开也会发现存成了4位使用同一颜色的结果 当然,对于AlphaImage与buildngz.sha这种实际上色号仅用于相关计算并不实际使用色号对应颜色的逻辑而言并不会受到影响 IsVeins = TS残留泰伯利亚藤蔓相关逻辑,已废弃 残留效果是令动画使用unit色盘并映射观察者的所属色,就像原版围墙(覆盖物)和NukeMaker召唤来的NKMSLDN那样,屏幕前的玩家所使用的是哪个颜色它就映射成哪个颜色 对于拥有Tiled=yes的动画会无视这个逻辑 此外对于UseNormalLight=no的常规动画如果使用这个逻辑那么无法正常跟随地图光照的亮度 Rate = 决定动画的播放速度。数值越大代表播放速度越快 这个数值以900为被除数 例如300代表游戏将判定动画每帧持续900/300=3帧时间。 当Rate=X 如果900/X不是整数 帧时间则自动去尾 举例:301和450都为2帧 451和900都为1帧 如果Rate > 900那么会导致动画一直卡在第1帧 RandomRate = 决定动画的播放速度在这两个区间中获取,算法同Rate Layer =[surface|ground|air|top|none] 决定动画在哪个层上播放。“Top”意味着在所有之上“Ground”意味着战场。 动画默认 air 此处 none 属于特殊值,效果为不进行绘制 还有一个 underground 层,但无法使用该语句指定 此外 AltPalette=yes 也会影响绘制层级 对于非动画对象的 Layer 有一套固定规则, 例如Locomotor=DropPod/Rocket时始终为 air, 对于Locomotor=Fly的只要高度高于0即为 top, 对于Locomotor=Tunnel钻地时为 underground,地面行驶为 ground 对于Locomotor=Jumpjet升空前为 ground,高于空地判定阈值(208)即视为空中单位后若当前实际高度高于其JumpjetHeight则为 top 否则为 air Surface = TS残留无效,该动画是否位于 ground 层而非 air 层,RA2中已经换用 Layer 来控制 虽然标签名是 Surface 但实际上这个语句在 TS 中指定的就是 Ground 层而非 Surface 层 Start = 指定动画的起始帧。默认 0 如果图像是由另一个动画Next调用的,那么Next出的图像一开始的Start会*2计算 从 0 开始,负数可用但因为没有对应帧因此没有播放到首帧时始终没有图像,需要经过 1-Start 帧后才会出现图像 End = 指定动画结束帧相对起始帧的偏移量 例如Start=5而End=7那么会从Start指定的帧播放到Start+7帧,而非从Start播放到End 也就是说仅在Start=0的情况下End才能代表播放到从 1 开始的第几帧,此时才能充当结束帧的序号指定语句用,因为这种情况下结束帧的帧序号与所播放的帧数才是对应的 如果 End 为负数,那么仅在 LoopCount>1 且 LoopStart+1 DeployingAnim=而非art(md).ini中的[BuildingImage] -> DeployingAnim= PingPong = 此代码指定在完成循环后动画是否会反转,对应的由于需要先正播一遍再反向播放所以总帧数会翻倍 如果设置yes,则动画将向前播放至LoopEnd定义的帧,然后它将从LoopEnd反向播放到LoopStart。 如果LoopCount=-1,动画将重复向后和向前播放的循环 该语句有 Bug,不建议使用,远不如开 SHP Builder 用轮椅工具一键生成反向帧序列的 shp 文件替代来的安全 IsFlamingGuy = 该动画为火人动画 需要配合RunningFrames=使用 否则ie 会让动画在播放期间移动,当距离水域只有3格时会直奔向水中然后直接进入死亡帧 动画播放时长实际上不受Rate和LoopCount影响 火人移动会自动避开障碍物,如果在空中生成也会立即刷到地面继续移动(类似地面步兵寻路) RunningFrames = 火人动画的奔跑帧数,可将火人动画类比shp载具来理解,从第1帧开始8个方向各RunningFrames数量的帧作为奔跑帧,然后是8向通用的1面死亡帧,以及一半“影子帧” Tiled = 使该动画向上至屏幕顶端绘制一长串 看起来向从天而降的光束炮 此时从上往下把素材连到播放位置,高度间隔由第一帧像素排布决定,见https://www.bilibili.com/opus/577397012226752341 也就是一个Shape画布高度全填满的素材会从屏幕顶端连到动画播放位置,而Tiled=no的动画因为Shape的中心在1/2高度处于是会在播放位置之下露出1/2 强制使用anim色盘,Phobos已解除该限制 ShouldFogRemove = 在战争迷雾下是否不绘制该动画,默认yes 是战争迷雾,不是地图黑幕 HideIfNoOre = 如果触发此动画的单元格里没有矿石类型的覆盖物,则动画将被遮挡 不过它甚至不检查单元格内那个矿石类型覆盖物的生长程度,Phobos已允许设定 与此相同的遮挡效果同样出现在“显示隐藏对象”所用的[General] -> Behind=动画上 SpawnsParticle = 动画结束后生成的粒子,YR中加入,用于病毒狙击手击杀步兵 是粒子,不是粒子系统,要生成粒子系统请用动画挂弹头生成 NumParticles = 动画结束后生成多少个上面指定的粒子 实际上这个逻辑很多时候不如用动画挂伤害调用动画弹头上的Particle=设定的粒子系统来刷粒子好用,不过倒是更简单写起来方便 ``` ## 碎片 shp碎片的本质是动画,如ts的流星和建筑爆炸时候飞出来的东西都是碎片。和rules里的vxl碎片相似 ```ini Bouncer = 为yes时判定此动画为碎片 IsMeteor = 为yes时判定此动画为流星碎片,将会从天而降,可独立于Bouncer使用,同时强制水花动画使用[General] -> SplashList=最后一项 Z<0时在上方生成,Z速度沿Z轴负方向,XY将在NE-SW线为底边以西北(↑)的直角三角形范围内随机选取 Z>0时在下方生成,Z速度沿Z轴正方向,XY将在NE-SW线为底边以东南(↓)的直角三角形范围内随机选取 也就是说一个经典(Z<0)的流星碎片如果生成位置与命中位置不同(例如由一个在空中播放的动画TrailerAnim刷出Meteor) 那么这个Meteor会从屏幕上方飞来,穿过原动画的位置,然后落到原动画播放位置正下方的东南一侧(↓),无论如何无法落到原动画西北(↑)一侧 MaxXYVel = 碎片在平面上的速度,不得为0否则崩溃,同样大小的值写正数负数没有区别,默认 15.0 常规碎片本就方向随机,正负就算有意义也不影响 流星碎片无论正负都只会生成自原位置SW-NE一线NW一侧的上方(MinZVel为负)或SE一侧的下方(MinZVel为正) MinZVel = 碎片竖直速度的最小值,正数为向上飞再落下,负数直接落下,默认 3.5 对于流星碎片决定了其初始生成高度,正数从下方生成,负数从上方生成 ExpireAnim = 碎片爆炸动画。可以是另一个碎片的名字,毕竟Shape碎片本质就是Animation 掉入水中会强制播放[General] -> SplashList=第一项作为落水动画,空中播放结束不会触发 Damage = 被砸到的伤害数值 DamageRadius = 伤害范围,单位Lepton,用于对单个格子内的范围控制,然而基本用不到,多格范围用弹头的CellSpread计数 Warhead = 碎片撞击杀伤的弹头,很多时候不如往ExpireAnim或BounceAnim的非碎片动画上挂个伤害好使 Spawns = 撞击产生子碎片类型 SpawnCount = 子碎片数目 LoopStart = LoopEnd = LoopCount = RandomRate = 和前文常规动画的一样,搭配Image控制碎片的图像 *注意:如果碎片有Image=的设定,那么UseLineTrail相关的参数从Image=的节中读取,而不从这个碎片下面读取 TrailerAnim = 和Trailer一样,只不过用于碎片(动画)的尾烟,原版下会丢失所属,Phobos已补全这部分所属链,Kratos已补全所属链 TrailerSeperation = 和 SpawnDelay 一样,只不过用于碎片(动画)的尾烟 应用:可用此代码连接两个动画,可在一个固定动画上挂一个碎片作为尾烟,达成“碎片喷泉”的效果 注意:该语句按动画生成时间计算间隔,但不必然生成动画时长/间隔向下取整后的数量,会多生成一个或少生成一个 默认值为0,所以如果用了 TrailerAnim 则必须手动指定 TrailerSeperation 否则崩溃 IsTiberium = yes时开启下面两句 TiberiumSpawnType = 碎片落地产生的覆盖物,例如写产生矿的种类GEM01就是晶矿,仅Shape碎片有效,Voxel碎片只能生成[Tiberiums]的第一个矿石类型其Image所对应的覆盖物对象 非矿石类型会在覆盖物注册表拥有一个随机偏移,也就是并不能固定刷出某类非矿石覆盖物 TiberiumSpreadRadius = 产矿范围,单位lepton,有效值[0,4] Shape碎片只能1层,最大周围3x3范围挖掉中心的碎片落点所在格,Voxel碎片强制1x1随机层数(生长阶段) 然而写一个大于4的值程序依然会去进行计算,所以写一个巨大的值值只会让游戏卡一下,然后依旧只生成3x3范围的矿 矿石生成位置与矿石生成范围强相关,下面「/」处为碎片落点,正上方为正北(屏幕右上)方向,数值代表语句达到此值后增加的产矿单元格 NW← | →NE 1 | 0 | 1 2 | / | 2 3 | 4 | 3 一些老词典中错拼的TiberiumSpawnRadius和Westwood注释掉的TiberiumRadius实际上对应的实际语句均为本句 Elasticity = 碎片弹性,越大越强。SHP碎片实际无效,仅可用于开启BounceAnim,默认 0.8 BounceAnim= 弹跳动画,虽然SHP碎片实际弹不起来,但仍需要Elasticity>0开启本句 上两条详解见shp碎片弹跳http://bbs.ra2diy.com/forum.php?mod=viewthread&tid=14036 ``` By: Xgamer Red Alert 2 art.ini 教程 翻译:小遥指挥官 审核,纠正 MK 最后修订日期20241106by九千天华