09. ART修改

本部分由颜落随风编写

相关资源:
【10L】art词典2019.txt
{坟贴警告}心灵终结3ini吧>寻惘>关于如何修改单位开火位置的小教学

以下内容较长,收录为如下链接txt文件:
https://gitee.com/junjacobyoung/mo336ini-guide/blob/develop/ststl/【10L】art修改-by颜落随风.txt

也可继续在本文档阅读,内容与txt文件一致:

artmo.ini 因为原版为artmd.ini,所以在说明书和一些教程里的文件名不一样,但依然是同一个文件。

前置提示:每一个例子中所用到的代码并非所有都可以用到该部分的代码,有一些稀奇古怪的代码具体参照字典自己尝试

此处列举的例子只是通用部分

修改art的第一步是知道你需要改的东西是什么

从目标分类为,单位,建筑,动画 其中只有动画目标需要在rules中的[Animations]底下进行注册

从素材分类为shp素材和vxl素材

首先说单位素材,单位素材包括步兵,载具,飞机 (飞行载具依然是载具,即jumpjet分类)

步兵素材:步兵素材全部为shp素材,假设这里有一个步兵素材的shp为temp.shp

那么在art中就需要以这个shp的大写名字为名称写一个新的内容,即

[TEMP]

Sequence=TEMPSequence ;这是步兵序列,非常重要的一环,下面会说

Crawls=no ;MO里面步兵不会卧倒就是因为这个

Remapable=yes ;这里如果为yes,则在色盘中的16到31号色判断为所属色,按照所属方颜色处理。(色盘是另外一部分内容)

FireUp=0 ;这里指定该单位在攻击动画播放到第几帧的时候武器实际射出(武器ROF改的特别低时依然有延迟就是因为这个,写0即一抬手就发射)

PrimaryFireFLH=10,10,60 ;武器发射的位置,F L H。

CameoPCX=yuyukoicon.pcx ;使用该Image的单位图标,如果有phobos平台可以不使用索引颜色

Palette=temp ;该单位的色盘,但其实指的是六个文件,即tempdes.pal templun.pal tempsno.pal temptem.pal tempubn.pal tempurb.pal 就是tempxxx.pal这样的格式,对应六种地形中的色盘,即使一模一样也最好复制处理六份

下面来说步兵序列,仅步兵单位有这个写法,它决定了步兵在什么情况下播放什么帧,依旧写在art里

特别需要注意的是,引擎是将第一帧认为0帧,第二帧认为1帧,所以在用shpbuild或者别的什么对照帧时,需要-1处理

在第三个数不为0时,每一个动作读取八个方向,第四个值是给游戏判断方向的,一般不用去深究,真要研究就去找字典。

[TEMPSequence]
Ready=0,1,1 ;站立等候,从第一帧开始,持续1帧,距离1帧到下一个方向。一共八帧
Guard=0,1,1;防御状态,从第一帧开始,持续1帧,距离1帧到下一个方向。一共八帧
Walk=8,6,6;行走状态,从第九帧开始,持续6帧,距离6帧到下一个方向。一共四十八帧
Idle1=104,16,0,S;闲来没事发个呆,从105帧开始,持续16帧,没有下一个方向,面朝左下方。一共16帧。
Idle2=120,19,0,E;闲来没事发个呆第二种,从121帧开始,持续19帧,没有下一个方向,面朝右下方。一共19帧
Crawl=86,6,6;具体词条意思往下看
Prone=86,1,6
Die1=139,20,0
Die2=159,12,0
FireUp=56,6,6
FireProne=212,6,6
Down=260,2,2
Up=276,2,2
Paradrop=171,1,0
Cheer=391,20,0,E
Tread=172,6,6
Swim=220,6,6
WetAttack=268,6,6
WetIdle1=316,18,0,S
WetIdle2=334,19,0,E
WetDie1=354,18,0
WetDie2=372,19,0
Panic=8,6,6
Die3=0,1,1
Die4=0,1,1
Die5=0,1,1

以下部分来自art词典翻译2019版

Ready=
用于当步兵单位站在那里等待的时候。

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=

如果你需要一个本来不可以两栖的步兵在水面行走,那么需要额外给他写水面序列,仅改rules只会导致单位在水面鬼畜。


载具素材:载具素材可以为shp也可以为vxl

先说常见的vxl载具,假设这里有一个vxl的模型文件和配套的hva动画文件temp.vxl和temp.hva

那么就以temp的大写为名称写一个新的内容,其中需注意,vxl单位默认用游戏内置色盘,不能自己调整色盘

如果有可旋转炮塔的话,文件名应为temptur.vxl,不需要额外写任何东西,只要单位的rules属性里有炮塔就直接调用

[TEMP]
Voxel=yes ;是否为vxl的最重要判断

Remapable=yes ;所属色判断,参考步兵部分

CameoPCX=tempicon.pcx;图标

AltCameoPCX=apocuico.pcx;老兵图标,带个√

PrimaryFireFLH=390,30,120 ;主武器开火位置,写到模型想要的地方

SecondaryFireFLH=-75,0,205 ;副武器开火位置

TurretOffset=-75 ;单位炮塔的前后位置,沿着中轴线(如果有炮塔)

Weapon1FLH=390,30,120 ;这部分是稍微特殊的属性,对应盖特六阶的六个开火口
Weapon2FLH=-75,20,165
Weapon3FLH=-75,20,165
Weapon4FLH=-75,20,165
Weapon5FLH=-60,65,165
Weapon6FLH=-60,65,165

说一个很多人问的东西,如果某一个武器中加入了Burst>1,那么第二发射出位置会在以轴线对称的地方,即F L H中 L取反。
如果有phobos平台支持,可以自定义这个位置。

另外,所有发射子机(包括导弹)的模型,其空载时模型取tempwo.vxl 这并不需要额外在art中声明,这是在rules里声明的。( shp也有可能支持,并未实际尝试过)

接下来说不常见的shp载具,代表原版单位为蜘蛛,不过依然假设这里有一个temp.shp 以及一套六个色盘(参考步兵色盘)

[TEMP]

Remapable=yes;所属色,不再赘述

Shadow=yes ;是否将后半部分shp作为影子处理

Voxel=no;非vxl,这是shp的本质

CameoPCX=tempicon.pcx;图标

Facings=32;该shp战车有几个面,可以为任何八的倍数,不过这只跟素材有关系

StartStandFrame=0;站立从第一帧开始
StandingFrames=6;持续六帧为一个面,下面同理
StartWalkFrame=0;行走
WalkFrames=6
StartFiringFrame=0;开火
FiringFrames=6

Palette=temp;六种色盘后缀,参考步兵部分

PrimaryFireFLH=390,30,120 ;主武器开火位置,写到模型想要的地方

SecondaryFireFLH=-75,0,205 ;副武器开火位置

可见shp载具的序列不需要额外写,但是这也导致没有那么方便处理每一帧关系


飞机素材:飞机素材指的是在rules里注册到[AircraftTypes]中的单位,jumpjet浮空器视作上述载具部分

飞机素材有一个最大的限制,即只能使用vxl素材,即便是有其他的平台可以做障眼法,但是依旧不能改变这个本质

不过具体代码跟一般vxl载具基本没有区别,依旧假设有一个temp.vxl temp.hva

[TEMP]

CameoPCX=tempicon.pcx;图标

Voxel=yes;是vxl

Remapable=yes ;所属色

PrimaryFireFLH=150,0,-30

SecondaryFireFLH=150,0,-30

Trailer=TRAILHARB ;飞机尾烟动画,就是后面的烟雾拖尾

SpawnDelay=1;每一帧扔一个尾烟动画

飞机不能带炮台,剩下的就没了


建筑素材:建筑素材不是不能用vxl,但是极其不建议用vxl,原版参考为巨炮,下面不介绍vxl建筑内容

这里以mo3中焚风建造厂举例,注意一个区别,内容名为FACNST,但是素材名为fgcnst.shp,这里的第二个字母取g,表示一般场景素材

原版建筑有雪地帧,是以第二个字母为a的素材,引擎会自动读这部分

当建筑在温和气候场景中建造的时候,则寻找“ftcnst.shp”。

注意A代表雪地气候,U代表城市场景,T代表温和气候场景,D代表沙漠场景,L代表月球场景。如果游戏找不到与场景相关的图像,那么将默认使用文件名第二个字母为G的图像(也就是普通的场景)。

一般也就在建筑中用这个,所以放在了这里。

[FACNST]

Image=FGCNST;使用fgcnst.shp文件作为素材。 在没有phobos平台时,此条仅支持动画以及建筑,现在单位也可以这样处理。

Remapable=yes;所属色

Foundation=4x4;占地面积4x4

Height=5; 高度,表现为血条和那个描边的白线框。

Buildup=FACNSTMK;建造动画,在动画部分细说

CameoPCX=fmcvicon.pcx;图标

DemandLoadBuildup=true;提前载入建造动画,即为了基地车在消失之前就开始播放,一般的建筑不需要

FreeBuildup=true;无效代码,作用为建造后清除建造动画缓存

NewTheater=yes;是否在不同地形读取不同素材.(上述第二个字母的处理方式)

ActiveAnim=FACNST_A ;运行动画1

ActiveAnimDamaged=FACNST_AD;受损时运行动画1

ActiveAnimZAdjust=-128 ;运行动画1层次,当成图层理解,越高越表现在前,越低越在后,可以写负数

ActiveAnimPowered=true;运行动画1需要电力支持

ActiveAnimTwo=FACNST_B;运行动画2,下面不再赘述
ActiveAnimTwoDamaged=FACNST_BD
ActiveAnimTwoZAdjust=-60
ActiveAnimTwoPowered=true
ActiveAnimThree=FACNST_C
ActiveAnimThreeDamaged=DUMMYANIM
ActiveAnimThreeZAdjust=-90
ActiveAnimThreePowered=false
ActiveAnimThreePoweredLight=true
ActiveAnimFour=FACNST_D
ActiveAnimFourDamaged=FACNST_D
ActiveAnimFourZAdjust=-96
ActiveAnimFourPowered=false
ActiveAnimFourPoweredLight=true

OccupyHeight=4 ;实体高度,影响实体建筑遮挡抛射体和jumpjet单位从上方飞过需要多高。

CanHideThings=true;是否以特殊标记显示被遮挡单位

CanBeHidden=false;是否会被前方更高的建筑挡住

RemoveOccupy1=-2,-1;下面八个是为了在特殊位置不显示挡住特殊标记的内容,一般不需要
RemoveOccupy2=2,-1
RemoveOccupy3=1,-2
RemoveOccupy4=0,-2
RemoveOccupy5=-1,-2
RemoveOccupy6=-2,-2
RemoveOccupy7=-2,0
RemoveOccupy8=-2,1

DamageFireOffset0=-54,41;三个当建筑残血时播放受损动画的位置
DamageFireOffset1=-19,-1
DamageFireOffset2=70,36

ZShapePointMove=30,10;用于建筑与建筑的图层前后微调,一般不用管

因为建造厂没有武器,所以下面单列几个武器代码

PrimaryFireDualOffset=true ;使用PrimaryFirePixelOffset的位置来确定武器旋转中心

PrimaryFirePixelOffset=0,-4;武器固定开火中心,第一个数为横坐标,第二个数为纵坐标

PrimaryFireFLH=0,0,420;武器开火FLH,需要注意的是建筑的武器FLH中 F L不为零的话,在不同方向开火时位置会旋转。


动画素材:动画素材实际上是比较复杂的一部分,因为游戏中的几乎任何表现都是动画,特殊情况vxl动画会在最下面介绍

shp动画素材:由于动画的词条实在是太多太复杂,这里仅以一个最简单的例子开始,假设有一个temp.shp

那么你首先应该先在rules的[Animations]底下进行注册+=TEMP,建筑,单位都不需要

[TEMP]

结束,恭喜你,一个最简单的动画已经引入完成了!下面介绍一部分常用的代码

Image= ;引用其他文件名的动画素材,换皮动画最重要的语句

UseNormalLight=no;是否按照环境光处理,no即任何时候都是标准亮度

CustomPalette=temp.pal;自定义色盘,动画涉及的颜色非常多,如果不设置,则以标准anim.pal处理,当然也可以像上面分六个,但是这里就不是必须

YDrawOffset=-30;调整动画播放高度,负为上,正为下

XDrawOffset=30;调整动画播放左右,负为左,正为右(此条需要phobos平台支持)

Translucency=50;调整动画透明度,但是选择只有25 50 75,越大越透明

Translucent=yes;动画在播放时逐渐变成透明,但也只是25 50 75这样下去,渣效果

Rate=200;动画播放速度

Damage= ;动画播放伤害,范围和属性靠弹头处理

Warhead= ;动画播放时原地爆炸的弹头,但其实只读其中对于护甲的比例和范围和所属方,其他内容不读,在动画挂载到某个单位身上时有所属方判断,不能挂ae

Weapon=;动画播放时原地落下的武器,读取武器辐射参数,弹头非实体部分参数(包括ae效果),不读取抛射体参数和弹头实体参数(例如碎片),无所属方

Damage.Delay=10;动画的弹头或者武器间隔多少帧释放一次,比较残念的是在动画开始播放时会先开始计算一次间隔

Report= ;动画播放时的声音

Start=;动画指定起始帧

LoopStart=;动画循环的起始帧,跟下面几个词条配合

LoopEnd=;动画循环结束的帧

LoopCount=;动画循环次数,到指定次数以后不读取LoopEnd播放到动画结束

PingPong=yes;动画播放到LoopEnd时是否倒转播放到LoopStart作为一个循环,举例就是 23456765432 否就是234567234567

Tiled=no;动画是否自动竖直描绘到顶,表现为从天而降的激光,比如墨丘利激光,如果为yes,则动画强制使用anim.pal色盘,这是西木的坑。

Reverse=no;动画反向播放,包括半透明渐变效果

RandomLoopDelay=;动画每个循环的延迟,写两个数,从中随机选择

Crater=no;动画是否在地上留下弹坑,一般用于弹头动画里

TrailerAnim=;动画在播放时留下的尾烟动画

TrailerSeperation=10;多少帧出现一次尾烟动画

Next=;该动画播放完接着播放哪一个动画,会继承极大多数属性

接下来就是以效果来说比较重点的部分,碎片

Bouncer=;该动画是否为碎片,启用下面这些词条

MaxXYVel=50;碎片横向移动速度,不能小于1

MinZVel=10;碎片纵向移动速度,负数向下,正数向上飞。

ExpireAnim=;碎片落地爆炸动画,落水强制播放落水动画(虽然有办法规避,但那属于高端操作,这里不介绍)

Damage=;爆炸伤害

Warhead=;爆炸弹头,依旧只读取范围和护甲参数,毕竟碎片也没所属

IsMeteor=;碎片表现为从天而降,参考流星效果

Spawns=;爆炸产生的子碎片

SpawnCount=;子碎片个数

Elasticity=;碎片弹性,shp碎片实际上不表现为弹性,落水爆炸是利用这个做的

BounceAnim=;弹跳动画,shp碎片作为落水爆炸

以上就是绝大多数经常用到的动画词条,部分还可以用到单位和建筑素材中,部分phobos平台新增内容没有加入(激光尾迹),需要的自己去看说明书


番外篇:动画刷兵

动画刷兵经典表现为步兵被InfDeath=9的弹头杀死时,会有一个狂兽人变身动画,然后原地生成一个狂兽人,这个InfDeath=9不用去管,是全局定义

在某个动画中写入MakeInfantry= ;这里写数字,对应为rules全局代码中的

AnimToInfantry=BRUTE,BANE_N,SYNC_N,DUPL,KINGS,ZORB_N,RAIL,DEVI

ID为0 1 2 3 4 5 6 7

比如新加一个TEMP

AnimToInfantry=BRUTE,BANE_N,SYNC_N,DUPL,KINGS,ZORB_N,RAIL,DEVI,TEMP

则在你想要刷兵的动画中写入

MakeInfantry=8

那么当这个动画作为一个独立动画播放完时,会在动画的位置生成一个TEMP,仅限步兵

独立动画为,弹头动画,死亡动画,尾烟动画这一类不依赖于某个实体的动画,像是开火动画,抛射体动画则不行

当动画有所属方时,生成所属由以下代码决定

MakeInfantryOwner= ;invoker看情况|killer击杀者|victim死人|neutral野生|random随机

没有phobos平台时,弹头动画是不带所属的

以下为有phobos平台时,动画刷载具的方式,在某个动画中

CreateUnit=;生成的载具代码,填写步兵和飞机将会被强制注册为载具表现

CreateUnit.Facing=;生成的载具方向0-255

CreateUnit.RandomFacing=;生成载具的方向是否随机,一般没啥用

CreateUnit.RemapAnim=;生成动画是否带所属色,没啥用

CreateUnit.Mission=;动画生成单位的动作,这里考虑的是ai脚本,默认Guard警戒,当然这只对AI有用

CreateUnit.Owner=;动画生成单位所属invoker|killer|victim|civilian|special|neutral|random

CreateUnit.ConsiderPathfinding=;当生成格被占时,是否在最近可生成格生成,避免单位被卡掉,但是也会导致穿帮

phobos生成载具的代码相比于原版动画刷兵简单了不少,但是一定要注意动画是否有所属,否则一律按照平民考虑。


vxl动画素材:严格来说这玩意不是写在art里的,本来不介绍,不过也是动画,就稍微提一下

假设有一个vxl素材为temp.vxl

此处需要在[VoxelAnims]下面进行注册+=TEMP 然后以下代码全部写在rules里,而不是art里

vxl动画一般用于碎片,而且代码,效果等都不太一样

[TEMP]
Elasticity=1;弹性,vxl碎片可以在地上多次弹跳而不爆炸

MinAngularVelocity=12.0;最小角速度
MaxAngularVelocity=30.0;最大角速度

MinZVel=-100.0;最小竖直速度
MaxZVel=-100.0;最大竖直速度
MaxXYVel=100.0;最大横向速度

Duration=70;持续时间

ExpireAnim=DBRIEXP1;落地爆炸动画

Damage=500;落地爆炸伤害

DamageRadius=300;伤害范围,这个是无用词条,实际由弹头的CellSpread决定

Warhead=Meteorite;伤害弹头,只读取范围和护甲比例

IsMeteor=false;是否从天而降,表现为流星

Spawns=PEBBLE;落地爆炸产生的子碎片

SpawnCount=5;产生子碎片个数

颜落随风
2022.2.5