Merge pull request #7638 from pchote/infantry-body

Decompose RenderInfantry into WithInfantryBody and RenderSprites.
This commit is contained in:
Oliver Brakmann
2015-03-21 15:22:53 +01:00
26 changed files with 292 additions and 207 deletions

View File

@@ -373,7 +373,6 @@
<Compile Include="Traits\Render\RenderEditorOnly.cs" /> <Compile Include="Traits\Render\RenderEditorOnly.cs" />
<Compile Include="Traits\Render\RenderFlare.cs" /> <Compile Include="Traits\Render\RenderFlare.cs" />
<Compile Include="Traits\Render\RenderHarvester.cs" /> <Compile Include="Traits\Render\RenderHarvester.cs" />
<Compile Include="Traits\Render\RenderInfantry.cs" />
<Compile Include="Traits\Render\RenderNameTag.cs" /> <Compile Include="Traits\Render\RenderNameTag.cs" />
<Compile Include="Traits\Render\RenderSimple.cs" /> <Compile Include="Traits\Render\RenderSimple.cs" />
<Compile Include="Traits\Render\RenderSprites.cs" /> <Compile Include="Traits\Render\RenderSprites.cs" />
@@ -616,6 +615,7 @@
<Compile Include="Widgets\TooltipContainerWidget.cs" /> <Compile Include="Widgets\TooltipContainerWidget.cs" />
<Compile Include="Widgets\ViewportControllerWidget.cs" /> <Compile Include="Widgets\ViewportControllerWidget.cs" />
<Compile Include="Widgets\VqaPlayerWidget.cs" /> <Compile Include="Widgets\VqaPlayerWidget.cs" />
<Compile Include="Traits\Render\WithInfantryBody.cs" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup> <PropertyGroup>

View File

@@ -148,7 +148,7 @@ namespace OpenRA.Mods.Common.Traits
return cachedImage = info.GetImage(self.Info, self.World.Map.SequenceProvider, race); return cachedImage = info.GetImage(self.Info, self.World.Map.SequenceProvider, race);
} }
protected void UpdatePalette() public void UpdatePalette()
{ {
foreach (var anim in anims.Values) foreach (var anim in anims.Values)
anim.OwnerChanged(); anim.OwnerChanged();

View File

@@ -14,7 +14,7 @@ using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits namespace OpenRA.Mods.Common.Traits
{ {
[Desc("This actor has a death animation.")] [Desc("This actor has a death animation.")]
public class WithDeathAnimationInfo : ITraitInfo, Requires<RenderSimpleInfo> public class WithDeathAnimationInfo : ITraitInfo, Requires<RenderSpritesInfo>
{ {
[Desc("Sequence to play when this actor is killed by a warhead.")] [Desc("Sequence to play when this actor is killed by a warhead.")]
public readonly string DeathSequence = "die"; public readonly string DeathSequence = "die";
@@ -35,12 +35,12 @@ namespace OpenRA.Mods.Common.Traits
public class WithDeathAnimation : INotifyKilled public class WithDeathAnimation : INotifyKilled
{ {
public readonly WithDeathAnimationInfo Info; public readonly WithDeathAnimationInfo Info;
readonly RenderSimple renderSimple; readonly RenderSprites rs;
public WithDeathAnimation(Actor self, WithDeathAnimationInfo info) public WithDeathAnimation(Actor self, WithDeathAnimationInfo info)
{ {
Info = info; Info = info;
renderSimple = self.Trait<RenderSimple>(); rs = self.Trait<RenderSprites>();
} }
public void Killed(Actor self, AttackInfo e) public void Killed(Actor self, AttackInfo e)
@@ -66,7 +66,7 @@ namespace OpenRA.Mods.Common.Traits
self.World.AddFrameEndTask(w => self.World.AddFrameEndTask(w =>
{ {
if (!self.Destroyed) if (!self.Destroyed)
w.Add(new Corpse(w, self.CenterPosition, renderSimple.GetImage(self), sequence, palette)); w.Add(new Corpse(w, self.CenterPosition, rs.GetImage(self), sequence, palette));
}); });
} }
} }

View File

@@ -16,18 +16,18 @@ using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits namespace OpenRA.Mods.Common.Traits
{ {
public class RenderInfantryInfo : RenderSimpleInfo, Requires<IMoveInfo> public class WithInfantryBodyInfo : ITraitInfo, IQuantizeBodyOrientationInfo, IRenderActorPreviewSpritesInfo, Requires<IMoveInfo>, Requires<RenderSpritesInfo>
{ {
public readonly int MinIdleWaitTicks = 30; public readonly int MinIdleWaitTicks = 30;
public readonly int MaxIdleWaitTicks = 110; public readonly int MaxIdleWaitTicks = 110;
public readonly string MoveAnimation = "run"; public readonly string MoveSequence = "run";
public readonly string AttackAnimation = "shoot"; public readonly string AttackSequence = "shoot";
public readonly string[] IdleAnimations = { }; public readonly string[] IdleSequences = { };
public readonly string[] StandAnimations = { "stand" }; public readonly string[] StandSequences = { "stand" };
public override object Create(ActorInitializer init) { return new RenderInfantry(init, this); } public virtual object Create(ActorInitializer init) { return new WithInfantryBody(init, this); }
public override IEnumerable<IActorPreview> RenderPreviewSprites(ActorPreviewInitializer init, RenderSpritesInfo rs, string image, int facings, PaletteReference p) public IEnumerable<IActorPreview> RenderPreviewSprites(ActorPreviewInitializer init, RenderSpritesInfo rs, string image, int facings, PaletteReference p)
{ {
var facing = 0; var facing = 0;
var ifacing = init.Actor.Traits.GetOrDefault<IFacingInfo>(); var ifacing = init.Actor.Traits.GetOrDefault<IFacingInfo>();
@@ -35,20 +35,23 @@ namespace OpenRA.Mods.Common.Traits
facing = init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : ifacing.GetInitialFacing(); facing = init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : ifacing.GetInitialFacing();
var anim = new Animation(init.World, image, () => facing); var anim = new Animation(init.World, image, () => facing);
anim.PlayRepeating(StandAnimations.First()); anim.PlayRepeating(StandSequences.First());
yield return new SpriteActorPreview(anim, WVec.Zero, 0, p, rs.Scale); yield return new SpriteActorPreview(anim, WVec.Zero, 0, p, rs.Scale);
} }
public override int QuantizedBodyFacings(ActorInfo ai, SequenceProvider sequenceProvider, string race) public int QuantizedBodyFacings(ActorInfo ai, SequenceProvider sequenceProvider, string race)
{ {
return sequenceProvider.GetSequence(GetImage(ai, sequenceProvider, race), StandAnimations.First()).Facings; var rsi = ai.Traits.Get<RenderSpritesInfo>();
return sequenceProvider.GetSequence(rsi.GetImage(ai, sequenceProvider, race), StandSequences.First()).Facings;
} }
} }
public class RenderInfantry : RenderSimple, INotifyAttack, INotifyIdle public class WithInfantryBody : ITick, INotifyAttack, INotifyIdle
{ {
readonly RenderInfantryInfo info; readonly WithInfantryBodyInfo info;
readonly IMove move; readonly IMove move;
protected readonly Animation DefaultAnimation;
bool dirty = false; bool dirty = false;
string idleSequence; string idleSequence;
int idleDelay; int idleDelay;
@@ -58,11 +61,16 @@ namespace OpenRA.Mods.Common.Traits
bool IsModifyingSequence { get { return rsm != null && rsm.IsModifyingSequence; } } bool IsModifyingSequence { get { return rsm != null && rsm.IsModifyingSequence; } }
bool wasModifying; bool wasModifying;
public RenderInfantry(ActorInitializer init, RenderInfantryInfo info) public WithInfantryBody(ActorInitializer init, WithInfantryBodyInfo info)
: base(init, info, MakeFacingFunc(init.Self))
{ {
this.info = info; this.info = info;
DefaultAnimation.PlayFetchIndex(NormalizeInfantrySequence(init.Self, info.StandAnimations.Random(Game.CosmeticRandom)), () => 0); var self = init.Self;
var rs = self.Trait<RenderSprites>();
DefaultAnimation = new Animation(init.World, rs.GetImage(self), RenderSprites.MakeFacingFunc(self));
rs.Add("", DefaultAnimation);
DefaultAnimation.PlayFetchIndex(NormalizeInfantrySequence(init.Self, info.StandSequences.Random(Game.CosmeticRandom)), () => 0);
state = AnimationState.Waiting; state = AnimationState.Waiting;
move = init.Self.Trait<IMove>(); move = init.Self.Trait<IMove>();
rsm = init.Self.TraitOrDefault<IRenderInfantrySequenceModifier>(); rsm = init.Self.TraitOrDefault<IRenderInfantrySequenceModifier>();
@@ -86,8 +94,8 @@ namespace OpenRA.Mods.Common.Traits
public void Attacking(Actor self, Target target) public void Attacking(Actor self, Target target)
{ {
state = AnimationState.Attacking; state = AnimationState.Attacking;
if (DefaultAnimation.HasSequence(NormalizeInfantrySequence(self, info.AttackAnimation))) if (DefaultAnimation.HasSequence(NormalizeInfantrySequence(self, info.AttackSequence)))
DefaultAnimation.PlayThen(NormalizeInfantrySequence(self, info.AttackAnimation), () => state = AnimationState.Idle); DefaultAnimation.PlayThen(NormalizeInfantrySequence(self, info.AttackSequence), () => state = AnimationState.Idle);
} }
public void Attacking(Actor self, Target target, Armament a, Barrel barrel) public void Attacking(Actor self, Target target, Armament a, Barrel barrel)
@@ -95,10 +103,8 @@ namespace OpenRA.Mods.Common.Traits
Attacking(self, target); Attacking(self, target);
} }
public override void Tick(Actor self) public virtual void Tick(Actor self)
{ {
base.Tick(self);
if (rsm != null) if (rsm != null)
{ {
if (wasModifying != rsm.IsModifyingSequence) if (wasModifying != rsm.IsModifyingSequence)
@@ -110,12 +116,12 @@ namespace OpenRA.Mods.Common.Traits
if ((state == AnimationState.Moving || dirty) && !move.IsMoving) if ((state == AnimationState.Moving || dirty) && !move.IsMoving)
{ {
state = AnimationState.Waiting; state = AnimationState.Waiting;
DefaultAnimation.PlayFetchIndex(NormalizeInfantrySequence(self, info.StandAnimations.Random(Game.CosmeticRandom)), () => 0); DefaultAnimation.PlayFetchIndex(NormalizeInfantrySequence(self, info.StandSequences.Random(Game.CosmeticRandom)), () => 0);
} }
else if ((state != AnimationState.Moving || dirty) && move.IsMoving) else if ((state != AnimationState.Moving || dirty) && move.IsMoving)
{ {
state = AnimationState.Moving; state = AnimationState.Moving;
DefaultAnimation.PlayRepeating(NormalizeInfantrySequence(self, info.MoveAnimation)); DefaultAnimation.PlayRepeating(NormalizeInfantrySequence(self, info.MoveSequence));
} }
dirty = false; dirty = false;
@@ -125,12 +131,12 @@ namespace OpenRA.Mods.Common.Traits
{ {
if (state != AnimationState.Idle && state != AnimationState.IdleAnimating) if (state != AnimationState.Idle && state != AnimationState.IdleAnimating)
{ {
DefaultAnimation.PlayFetchIndex(NormalizeInfantrySequence(self, info.StandAnimations.Random(Game.CosmeticRandom)), () => 0); DefaultAnimation.PlayFetchIndex(NormalizeInfantrySequence(self, info.StandSequences.Random(Game.CosmeticRandom)), () => 0);
state = AnimationState.Idle; state = AnimationState.Idle;
if (info.IdleAnimations.Length > 0) if (info.IdleSequences.Length > 0)
{ {
idleSequence = info.IdleAnimations.Random(self.World.SharedRandom); idleSequence = info.IdleSequences.Random(self.World.SharedRandom);
idleDelay = self.World.SharedRandom.Next(info.MinIdleWaitTicks, info.MaxIdleWaitTicks); idleDelay = self.World.SharedRandom.Next(info.MinIdleWaitTicks, info.MaxIdleWaitTicks);
} }
} }
@@ -143,14 +149,14 @@ namespace OpenRA.Mods.Common.Traits
state = AnimationState.IdleAnimating; state = AnimationState.IdleAnimating;
DefaultAnimation.PlayThen(idleSequence, () => DefaultAnimation.PlayThen(idleSequence, () =>
{ {
DefaultAnimation.PlayRepeating(NormalizeInfantrySequence(self, info.StandAnimations.Random(Game.CosmeticRandom))); DefaultAnimation.PlayRepeating(NormalizeInfantrySequence(self, info.StandSequences.Random(Game.CosmeticRandom)));
state = AnimationState.Waiting; state = AnimationState.Waiting;
}); });
} }
} }
else else
{ {
DefaultAnimation.PlayRepeating(NormalizeInfantrySequence(self, info.StandAnimations.Random(Game.CosmeticRandom))); DefaultAnimation.PlayRepeating(NormalizeInfantrySequence(self, info.StandSequences.Random(Game.CosmeticRandom)));
state = AnimationState.Waiting; state = AnimationState.Waiting;
} }
} }

View File

@@ -719,6 +719,61 @@ namespace OpenRA.Mods.Common.UtilityCommands
} }
} }
if (engineVersion < 20150321)
{
// Note: These rules are set up to do approximately the right thing for maps, but
// mods need additional manual tweaks. This is the best we can do without having
// much smarter rules parsing, because we currently can't reason about inherited traits.
if (depth == 0)
{
var childKeys = new[] { "MinIdleWaitTicks", "MaxIdleWaitTicks", "MoveAnimation", "AttackAnimation", "IdleAnimations", "StandAnimations" };
var ri = node.Value.Nodes.FirstOrDefault(n => n.Key.StartsWith("RenderInfantry"));
if (ri != null)
{
ri.Key = "WithInfantryBody";
var rsNodes = ri.Value.Nodes.Where(n => !childKeys.Contains(n.Key)).ToList();
if (rsNodes.Any())
node.Value.Nodes.Add(new MiniYamlNode("RenderSprites", new MiniYaml("", rsNodes)));
ri.Value.Nodes.RemoveAll(n => rsNodes.Contains(n));
}
var rri = node.Value.Nodes.FirstOrDefault(n => n.Key.StartsWith("-RenderInfantry"));
if (rri != null)
rri.Key = "-WithInfantryBody";
var rdi = node.Value.Nodes.FirstOrDefault(n => n.Key.StartsWith("RenderDisguise"));
if (rdi != null)
{
rdi.Key = "WithDisguisingInfantryBody";
var rsNodes = rdi.Value.Nodes.Where(n => !childKeys.Contains(n.Key)).ToList();
if (rsNodes.Any())
node.Value.Nodes.Add(new MiniYamlNode("RenderSprites", new MiniYaml("", rsNodes)));
rdi.Value.Nodes.RemoveAll(n => rsNodes.Contains(n));
}
var rrdi = node.Value.Nodes.FirstOrDefault(n => n.Key.StartsWith("-RenderDisguise"));
if (rrdi != null)
rrdi.Key = "-WithDisguisingInfantryBody";
}
if (depth == 2 && node.Key == "MoveAnimation")
node.Key = "MoveSequence";
if (depth == 2 && node.Key == "AttackAnimation")
node.Key = "AttackSequence";
if (depth == 2 && node.Key == "IdleAnimations")
node.Key = "IdleSequences";
if (depth == 2 && node.Key == "StandAnimations")
node.Key = "StandSequences";
}
UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1); UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1);
} }
} }

View File

@@ -45,7 +45,8 @@ namespace OpenRA.Mods.RA.Activities
to = self.World.Map.CenterOfSubCell(targetMobile.FromCell, targetMobile.FromSubCell); to = self.World.Map.CenterOfSubCell(targetMobile.FromCell, targetMobile.FromSubCell);
length = Math.Max((to - from).Length / speed.Range, 1); length = Math.Max((to - from).Length / speed.Range, 1);
self.Trait<RenderInfantry>().Attacking(self, Target.FromActor(target)); // HACK: why isn't this using the interface?
self.Trait<WithInfantryBody>().Attacking(self, Target.FromActor(target));
if (weapon.Report != null && weapon.Report.Any()) if (weapon.Report != null && weapon.Report.Any())
Sound.Play(weapon.Report.Random(self.World.SharedRandom), self.CenterPosition); Sound.Play(weapon.Report.Random(self.World.SharedRandom), self.CenterPosition);

View File

@@ -94,7 +94,6 @@
<Compile Include="Traits\PaletteEffects\ChronoshiftPaletteEffect.cs" /> <Compile Include="Traits\PaletteEffects\ChronoshiftPaletteEffect.cs" />
<Compile Include="Traits\PortableChrono.cs" /> <Compile Include="Traits\PortableChrono.cs" />
<Compile Include="Traits\Render\RenderJammerCircle.cs" /> <Compile Include="Traits\Render\RenderJammerCircle.cs" />
<Compile Include="Traits\Render\RenderDisguise.cs" />
<Compile Include="Traits\Render\RenderLandingCraft.cs" /> <Compile Include="Traits\Render\RenderLandingCraft.cs" />
<Compile Include="Traits\Render\RenderShroudCircle.cs" /> <Compile Include="Traits\Render\RenderShroudCircle.cs" />
<Compile Include="Traits\Render\RenderUnitReload.cs" /> <Compile Include="Traits\Render\RenderUnitReload.cs" />
@@ -106,6 +105,7 @@
<Compile Include="Scripting\Properties\ChronosphereProperties.cs" /> <Compile Include="Scripting\Properties\ChronosphereProperties.cs" />
<Compile Include="Scripting\Properties\ParadropProperties.cs" /> <Compile Include="Scripting\Properties\ParadropProperties.cs" />
<Compile Include="Scripting\Properties\ParatroopersProperties.cs" /> <Compile Include="Scripting\Properties\ParatroopersProperties.cs" />
<Compile Include="Traits\Render\WithDisguisingInfantryBody.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\OpenRA.Game\OpenRA.Game.csproj"> <ProjectReference Include="..\OpenRA.Game\OpenRA.Game.csproj">

View File

@@ -13,21 +13,23 @@ using OpenRA.Traits;
namespace OpenRA.Mods.RA.Traits namespace OpenRA.Mods.RA.Traits
{ {
class RenderDisguiseInfo : RenderInfantryInfo, Requires<DisguiseInfo> class WithDisguisingInfantryBodyInfo : WithInfantryBodyInfo, Requires<DisguiseInfo>
{ {
public override object Create(ActorInitializer init) { return new RenderDisguise(init, this); } public override object Create(ActorInitializer init) { return new WithDisguisingInfantryBody(init, this); }
} }
class RenderDisguise : RenderInfantry class WithDisguisingInfantryBody : WithInfantryBody
{ {
RenderDisguiseInfo info; readonly WithDisguisingInfantryBodyInfo info;
readonly Disguise disguise;
readonly RenderSprites rs;
string intendedSprite; string intendedSprite;
Disguise disguise;
public RenderDisguise(ActorInitializer init, RenderDisguiseInfo info) public WithDisguisingInfantryBody(ActorInitializer init, WithDisguisingInfantryBodyInfo info)
: base(init, info) : base(init, info)
{ {
this.info = info; this.info = info;
rs = init.Self.Trait<RenderSprites>();
disguise = init.Self.Trait<Disguise>(); disguise = init.Self.Trait<Disguise>();
intendedSprite = disguise.AsSprite; intendedSprite = disguise.AsSprite;
} }
@@ -37,8 +39,8 @@ namespace OpenRA.Mods.RA.Traits
if (disguise.AsSprite != intendedSprite) if (disguise.AsSprite != intendedSprite)
{ {
intendedSprite = disguise.AsSprite; intendedSprite = disguise.AsSprite;
DefaultAnimation.ChangeImage(intendedSprite ?? GetImage(self), info.StandAnimations.Random(Game.CosmeticRandom)); DefaultAnimation.ChangeImage(intendedSprite ?? rs.GetImage(self), info.StandSequences.Random(Game.CosmeticRandom));
UpdatePalette(); rs.UpdatePalette();
} }
base.Tick(self); base.Tick(self);

View File

@@ -182,7 +182,8 @@
TargetTypes: Ground, Infantry TargetTypes: Ground, Infantry
TakeCover: TakeCover:
SpeedModifier: 60 SpeedModifier: 60
RenderInfantry: RenderSprites:
WithInfantryBody:
WithDeathAnimation: WithDeathAnimation:
AttackMove: AttackMove:
Passenger: Passenger:
@@ -300,8 +301,7 @@
TargetTypes: Ground, Infantry TargetTypes: Ground, Infantry
HiddenUnderFog: HiddenUnderFog:
GivesExperience: GivesExperience:
RenderInfantry: WithInfantryBody:
Palette: terrain
WithDeathAnimation: WithDeathAnimation:
UseDeathTypeSuffix: false UseDeathTypeSuffix: false
EditorAppearance: EditorAppearance:
@@ -316,6 +316,8 @@
Huntable: Huntable:
ScriptTriggers: ScriptTriggers:
DeathSounds: DeathSounds:
RenderSprites:
Palette: terrain
^Plane: ^Plane:
AppearsOnRadar: AppearsOnRadar:

View File

@@ -17,9 +17,9 @@ E1:
Armament: Armament:
Weapon: M16 Weapon: M16
AttackFrontal: AttackFrontal:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2,idle3,idle4 IdleSequences: idle1,idle2,idle3,idle4
StandAnimations: stand, stand2 StandSequences: stand, stand2
E2: E2:
Inherits: ^Infantry Inherits: ^Infantry
@@ -43,9 +43,9 @@ E2:
LocalOffset: 0,0,427 LocalOffset: 0,0,427
FireDelay: 15 FireDelay: 15
AttackFrontal: AttackFrontal:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
StandAnimations: stand, stand2 StandSequences: stand, stand2
Explodes: Explodes:
Weapon: GrenadierExplode Weapon: GrenadierExplode
EmptyWeapon: GrenadierExplode EmptyWeapon: GrenadierExplode
@@ -74,9 +74,9 @@ E3:
LocalOffset: 256,43,341 LocalOffset: 256,43,341
FireDelay: 5 FireDelay: 5
AttackFrontal: AttackFrontal:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
StandAnimations: stand, stand2 StandSequences: stand, stand2
E4: E4:
Inherits: ^Infantry Inherits: ^Infantry
@@ -104,9 +104,9 @@ E4:
AttackFrontal: AttackFrontal:
WithMuzzleFlash: WithMuzzleFlash:
SplitFacings: true SplitFacings: true
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
StandAnimations: stand, stand2 StandSequences: stand, stand2
E5: E5:
Inherits: ^Infantry Inherits: ^Infantry
@@ -140,9 +140,9 @@ E5:
WithMuzzleFlash: WithMuzzleFlash:
SplitFacings: true SplitFacings: true
-PoisonedByTiberium: -PoisonedByTiberium:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
StandAnimations: stand, stand2 StandSequences: stand, stand2
E6: E6:
Inherits: ^Infantry Inherits: ^Infantry
@@ -167,9 +167,9 @@ E6:
Captures: Captures:
CaptureTypes: building, husk CaptureTypes: building, husk
-AutoTarget: -AutoTarget:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
StandAnimations: stand, stand2 StandSequences: stand, stand2
-GainsExperience: -GainsExperience:
RMBO: RMBO:
@@ -201,9 +201,9 @@ RMBO:
Armament: Armament:
Weapon: Sniper Weapon: Sniper
AttackFrontal: AttackFrontal:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2,idle3 IdleSequences: idle1,idle2,idle3
StandAnimations: stand, stand2 StandSequences: stand, stand2
AnnounceOnBuild: AnnounceOnBuild:
AnnounceOnKill: AnnounceOnKill:

View File

@@ -193,7 +193,8 @@
Voice: InfantryVoice Voice: InfantryVoice
TargetableUnit: TargetableUnit:
TargetTypes: Ground TargetTypes: Ground
RenderInfantry: RenderSprites:
WithInfantryBody:
TakeCover: TakeCover:
WithDeathAnimation: WithDeathAnimation:
AutoTarget: AutoTarget:

View File

@@ -99,8 +99,8 @@ medic:
AttackMedic: AttackMedic:
Cursor: ability Cursor: ability
OutsideRangeCursor: ability OutsideRangeCursor: ability
RenderInfantry: WithInfantryBody:
AttackAnimation: heal AttackSequence: heal
Passenger: Passenger:
PipType: Blue PipType: Blue
-AutoTarget: -AutoTarget:
@@ -166,8 +166,8 @@ grenadier:
FireDelay: 15 FireDelay: 15
AttackFrontal: AttackFrontal:
TakeCover: TakeCover:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle IdleSequences: idle
Explodes: Explodes:
Weapon: UnitExplodeSmall Weapon: UnitExplodeSmall
Chance: 100 Chance: 100
@@ -228,3 +228,4 @@ saboteur:
-AutoTarget: -AutoTarget:
AttractsWorms: AttractsWorms:
Intensity: 120 Intensity: 120

View File

@@ -1381,14 +1381,14 @@ Rules:
-ExternalCaptures: -ExternalCaptures:
Captures: Captures:
CaptureTypes: building CaptureTypes: building
RenderInfantry:
Image: E6
Cloak@JAIL: Cloak@JAIL:
UpgradeTypes: jail UpgradeTypes: jail
UpgradeMinEnabledLevel: 1 UpgradeMinEnabledLevel: 1
InitialDelay: 0 InitialDelay: 0
CloakDelay: 0 CloakDelay: 0
Palette: Palette:
RenderSprites:
Image: E6
MEDI: MEDI:
Cloak@JAIL: Cloak@JAIL:
UpgradeTypes: jail UpgradeTypes: jail
@@ -1398,11 +1398,11 @@ Rules:
Palette: Palette:
E7.noautotarget: E7.noautotarget:
Inherits: E7 Inherits: E7
RenderInfantry:
Image: E7
AutoTarget: AutoTarget:
EnableStances: false EnableStances: false
-AttackMove: -AttackMove:
RenderSprites:
Image: E7
PRISON: PRISON:
Immobile: Immobile:
OccupiesSpace: false OccupiesSpace: false
@@ -1430,7 +1430,7 @@ Rules:
Range: 8c0 Range: 8c0
AutoTarget: AutoTarget:
ScanRadius: 7 ScanRadius: 7
RenderInfantry: RenderSprites:
Image: E1 Image: E1
E2.Autotarget: E2.Autotarget:
Inherits: E2 Inherits: E2
@@ -1440,7 +1440,7 @@ Rules:
Range: 8c0 Range: 8c0
AutoTarget: AutoTarget:
ScanRadius: 7 ScanRadius: 7
RenderInfantry: RenderSprites:
Image: E2 Image: E2
DOG: DOG:
RevealsShroud: RevealsShroud:

View File

@@ -1276,14 +1276,15 @@ Rules:
-ExternalCaptures: -ExternalCaptures:
Captures: Captures:
CaptureTypes: building CaptureTypes: building
RenderInfantry: WithInfantryBody:
Image: E6
Cloak@JAIL: Cloak@JAIL:
UpgradeTypes: jail UpgradeTypes: jail
UpgradeMinEnabledLevel: 1 UpgradeMinEnabledLevel: 1
InitialDelay: 0 InitialDelay: 0
CloakDelay: 0 CloakDelay: 0
Palette: Palette:
RenderSprites:
Image: E6
MEDI: MEDI:
Cloak@JAIL: Cloak@JAIL:
UpgradeTypes: jail UpgradeTypes: jail
@@ -1293,11 +1294,11 @@ Rules:
Palette: Palette:
E7.noautotarget: E7.noautotarget:
Inherits: E7 Inherits: E7
RenderInfantry:
Image: E7
AutoTarget: AutoTarget:
EnableStances: false EnableStances: false
-AttackMove: -AttackMove:
RenderSprites:
Image: E7
PRISON: PRISON:
Immobile: Immobile:
OccupiesSpace: false OccupiesSpace: false
@@ -1338,7 +1339,7 @@ Rules:
Range: 8c0 Range: 8c0
AutoTarget: AutoTarget:
ScanRadius: 7 ScanRadius: 7
RenderInfantry: RenderSprites:
Image: E1 Image: E1
E2.Autotarget: E2.Autotarget:
Inherits: E2 Inherits: E2
@@ -1348,7 +1349,7 @@ Rules:
Range: 8c0 Range: 8c0
AutoTarget: AutoTarget:
ScanRadius: 7 ScanRadius: 7
RenderInfantry: RenderSprites:
Image: E2 Image: E2
DOG: DOG:
Buildable: Buildable:

View File

@@ -1687,11 +1687,11 @@ Rules:
TargetTypes: Ground, C4, DetonateAttack, Structure, Mission Objectives TargetTypes: Ground, C4, DetonateAttack, Structure, Mission Objectives
E7.noautotarget: E7.noautotarget:
Inherits: E7 Inherits: E7
RenderInfantry:
Image: E7
AutoTarget: AutoTarget:
EnableStances: false EnableStances: false
-AttackMove: -AttackMove:
RenderSprites:
Image: E7
Colt: Colt:
-Huntable: -Huntable:
AutoTargetIgnore: AutoTargetIgnore:
@@ -1727,7 +1727,7 @@ Rules:
Range: 8c0 Range: 8c0
AutoTarget: AutoTarget:
ScanRadius: 7 ScanRadius: 7
RenderInfantry: RenderSprites:
Image: E1 Image: E1
E2.Autotarget: E2.Autotarget:
Inherits: E2 Inherits: E2
@@ -1737,7 +1737,7 @@ Rules:
Range: 8c0 Range: 8c0
AutoTarget: AutoTarget:
ScanRadius: 7 ScanRadius: 7
RenderInfantry: RenderSprites:
Image: E2 Image: E2
AFLD: AFLD:
AirstrikePower@spyplane: AirstrikePower@spyplane:

View File

@@ -617,12 +617,12 @@ Rules:
Inherits: SNIPER Inherits: SNIPER
Buildable: Buildable:
Prerequisites: ~disabled Prerequisites: ~disabled
RenderInfantry:
Image: SNIPER
MustBeDestroyed: MustBeDestroyed:
InvulnerabilityUpgrade@UNKILLABLE: InvulnerabilityUpgrade@UNKILLABLE:
UpgradeTypes: unkillable UpgradeTypes: unkillable
UpgradeMinEnabledLevel: 1 UpgradeMinEnabledLevel: 1
RenderSprites:
Image: SNIPER
SPY: SPY:
Inherits: ^Infantry Inherits: ^Infantry
Buildable: Buildable:

View File

@@ -2240,7 +2240,7 @@ Rules:
Captures: Captures:
CaptureTypes: building CaptureTypes: building
Sabotage: False Sabotage: False
RenderInfantry: RenderSprites:
Image: e6 Image: e6
E6: E6:
Buildable: Buildable:

View File

@@ -2145,10 +2145,10 @@ Rules:
Inherits: DELPHI Inherits: DELPHI
Tooltip: Tooltip:
Name: Dr. Demitri Name: Dr. Demitri
RenderInfantry:
Image: DELPHI
Passenger: Passenger:
CargoType: Demitri CargoType: Demitri
RenderSprites:
Image: DELPHI
TRAN: TRAN:
RevealsShroud: RevealsShroud:
Range: 0c0 Range: 0c0

View File

@@ -13,43 +13,50 @@ C4:
Inherits: ^CivInfantry Inherits: ^CivInfantry
Selectable: Selectable:
Voice: CivilianFemaleVoice Voice: CivilianFemaleVoice
RenderInfantry: WithInfantryBody:
RenderSprites:
Image: C2 Image: C2
C5: C5:
Inherits: ^CivInfantry Inherits: ^CivInfantry
RenderInfantry: WithInfantryBody:
RenderSprites:
Image: C1 Image: C1
C6: C6:
Inherits: ^CivInfantry Inherits: ^CivInfantry
Selectable: Selectable:
Voice: CivilianFemaleVoice Voice: CivilianFemaleVoice
RenderInfantry: WithInfantryBody:
RenderSprites:
Image: C2 Image: C2
C7: C7:
Inherits: ^CivInfantry Inherits: ^CivInfantry
RenderInfantry: WithInfantryBody:
RenderSprites:
Image: C1 Image: C1
C8: C8:
Inherits: ^CivInfantry Inherits: ^CivInfantry
Selectable: Selectable:
Voice: CivilianFemaleVoice Voice: CivilianFemaleVoice
RenderInfantry: WithInfantryBody:
RenderSprites:
Image: C2 Image: C2
C9: C9:
Inherits: ^CivInfantry Inherits: ^CivInfantry
RenderInfantry: WithInfantryBody:
RenderSprites:
Image: C1 Image: C1
C10: C10:
Inherits: ^CivInfantry Inherits: ^CivInfantry
Selectable: Selectable:
Voice: CivilianFemaleVoice Voice: CivilianFemaleVoice
RenderInfantry: WithInfantryBody:
RenderSprites:
Image: C2 Image: C2
FCOM: FCOM:

View File

@@ -186,7 +186,8 @@
Voice: GenericVoice Voice: GenericVoice
TargetableUnit: TargetableUnit:
TargetTypes: Ground, Infantry, Disguise TargetTypes: Ground, Infantry, Disguise
RenderInfantry: RenderSprites:
WithInfantryBody:
WithDeathAnimation: WithDeathAnimation:
AutoTarget: AutoTarget:
AttackMove: AttackMove:
@@ -557,7 +558,7 @@
AttackFrontal: AttackFrontal:
ProximityCaptor: ProximityCaptor:
Types: CivilianInfantry Types: CivilianInfantry
RenderInfantry: WithInfantryBody:
ScaredyCat: ScaredyCat:
^CivBuilding: ^CivBuilding:

View File

@@ -22,8 +22,8 @@ DOG:
Armament: Armament:
Weapon: DogJaw Weapon: DogJaw
AttackLeap: AttackLeap:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
IgnoresDisguise: IgnoresDisguise:
DetectCloaked: DetectCloaked:
Range: 5 Range: 5
@@ -54,9 +54,9 @@ E1:
MuzzleSequence: garrison-muzzle MuzzleSequence: garrison-muzzle
AttackFrontal: AttackFrontal:
TakeCover: TakeCover:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
StandAnimations: stand,stand2 StandSequences: stand,stand2
E2: E2:
Inherits: ^Infantry Inherits: ^Infantry
@@ -86,9 +86,9 @@ E2:
FireDelay: 15 FireDelay: 15
AttackFrontal: AttackFrontal:
TakeCover: TakeCover:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
StandAnimations: stand,stand2 StandSequences: stand,stand2
Explodes: Explodes:
Weapon: UnitExplodeSmall Weapon: UnitExplodeSmall
Chance: 50 Chance: 50
@@ -122,9 +122,9 @@ E3:
Weapon: Dragon Weapon: Dragon
AttackFrontal: AttackFrontal:
TakeCover: TakeCover:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
StandAnimations: stand,stand2 StandSequences: stand,stand2
E4: E4:
Inherits: ^Infantry Inherits: ^Infantry
@@ -153,9 +153,9 @@ E4:
Weapon: Flamer Weapon: Flamer
AttackFrontal: AttackFrontal:
TakeCover: TakeCover:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
StandAnimations: stand,stand2 StandSequences: stand,stand2
E6: E6:
Inherits: ^Infantry Inherits: ^Infantry
@@ -184,9 +184,9 @@ E6:
Type: building Type: building
TakeCover: TakeCover:
-AutoTarget: -AutoTarget:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
StandAnimations: stand,stand2 StandSequences: stand,stand2
SPY: SPY:
Inherits: ^Infantry Inherits: ^Infantry
@@ -218,24 +218,25 @@ SPY:
Infiltrates: Infiltrates:
Types: SpyInfiltrate Types: SpyInfiltrate
-AutoTarget: -AutoTarget:
-RenderInfantry: -WithInfantryBody:
RenderDisguise: WithDisguisingInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
StandAnimations: stand,stand2 StandSequences: stand,stand2
Armament: Armament:
Weapon: SilencedPPK Weapon: SilencedPPK
AttackFrontal: AttackFrontal:
SPY.England: SPY.England:
Inherits: SPY Inherits: SPY
RenderDisguise: WithDisguisingInfantryBody:
Image: spy
Buildable: Buildable:
Prerequisites: ~infantry.england, dome, ~tent, ~techlevel.medium Prerequisites: ~infantry.england, dome, ~tent, ~techlevel.medium
Valued: Valued:
Cost: 250 Cost: 250
DisguiseToolTip: DisguiseToolTip:
Name: British Spy Name: British Spy
RenderSprites:
Image: spy
E7: E7:
Inherits: ^Infantry Inherits: ^Infantry
@@ -274,8 +275,8 @@ E7:
MuzzleSequence: garrison-muzzle MuzzleSequence: garrison-muzzle
AttackFrontal: AttackFrontal:
TakeCover: TakeCover:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
AnnounceOnBuild: AnnounceOnBuild:
AnnounceOnKill: AnnounceOnKill:
@@ -310,9 +311,9 @@ MEDI:
OutsideRangeCursor: heal OutsideRangeCursor: heal
TakeCover: TakeCover:
-AutoTarget: -AutoTarget:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
AttackAnimation: heal AttackSequence: heal
MECH: MECH:
Inherits: ^Infantry Inherits: ^Infantry
@@ -347,9 +348,9 @@ MECH:
CaptureTypes: husk CaptureTypes: husk
TakeCover: TakeCover:
-AutoTarget: -AutoTarget:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
AttackAnimation: heal AttackSequence: heal
EINSTEIN: EINSTEIN:
Inherits: ^Infantry Inherits: ^Infantry
@@ -369,7 +370,7 @@ EINSTEIN:
-AutoTarget: -AutoTarget:
ProximityCaptor: ProximityCaptor:
Types: CivilianInfantry Types: CivilianInfantry
RenderInfantry: WithInfantryBody:
ScaredyCat: ScaredyCat:
DELPHI: DELPHI:
@@ -390,7 +391,7 @@ DELPHI:
-AutoTarget: -AutoTarget:
ProximityCaptor: ProximityCaptor:
Types: CivilianInfantry Types: CivilianInfantry
RenderInfantry: WithInfantryBody:
ScaredyCat: ScaredyCat:
CHAN: CHAN:
@@ -484,9 +485,9 @@ SHOK:
Weapon: PortaTesla Weapon: PortaTesla
AttackFrontal: AttackFrontal:
TakeCover: TakeCover:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
StandAnimations: stand,stand2 StandSequences: stand,stand2
SNIPER: SNIPER:
Inherits: ^Infantry Inherits: ^Infantry
@@ -520,9 +521,9 @@ SNIPER:
MuzzleSequence: garrison-muzzle MuzzleSequence: garrison-muzzle
AttackFrontal: AttackFrontal:
TakeCover: TakeCover:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
StandAnimations: stand,stand2 StandSequences: stand,stand2
Cloak: Cloak:
InitialDelay: 250 InitialDelay: 250
CloakDelay: 120 CloakDelay: 120

View File

@@ -166,7 +166,8 @@
Voice: Infantry Voice: Infantry
TargetableUnit: TargetableUnit:
TargetTypes: Ground, Infantry TargetTypes: Ground, Infantry
RenderInfantry: RenderSprites:
WithInfantryBody:
WithDeathAnimation: WithDeathAnimation:
AutoTarget: AutoTarget:
AttackMove: AttackMove:
@@ -248,7 +249,7 @@
AttackFrontal: AttackFrontal:
ProximityCaptor: ProximityCaptor:
Types: CivilianInfantry Types: CivilianInfantry
RenderInfantry: WithInfantryBody:
ScaredyCat: ScaredyCat:
-MustBeDestroyed: -MustBeDestroyed:

View File

@@ -26,8 +26,8 @@ E1:
UpgradeMinEnabledLevel: 1 UpgradeMinEnabledLevel: 1
AttackFrontal: AttackFrontal:
TakeCover: TakeCover:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
E2: E2:
Inherits: ^Infantry Inherits: ^Infantry
@@ -52,8 +52,8 @@ E2:
FireDelay: 5 FireDelay: 5
AttackFrontal: AttackFrontal:
TakeCover: TakeCover:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
E3: E3:
Inherits: ^Infantry Inherits: ^Infantry
@@ -78,8 +78,8 @@ E3:
LocalOffset: 128,0,640 LocalOffset: 128,0,640
AttackFrontal: AttackFrontal:
TakeCover: TakeCover:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
WEEDGUY: WEEDGUY:
Inherits: ^Infantry Inherits: ^Infantry
@@ -106,7 +106,7 @@ WEEDGUY:
Weapon: FireballLauncher Weapon: FireballLauncher
LocalOffset: 85,0,384 LocalOffset: 85,0,384
AttackFrontal: AttackFrontal:
RenderInfantry: WithInfantryBody:
TakeCover: TakeCover:
MEDIC: MEDIC:
@@ -133,9 +133,9 @@ MEDIC:
Weapon: Heal Weapon: Heal
AttackFrontal: AttackFrontal:
TakeCover: TakeCover:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
AttackAnimation: heal AttackSequence: heal
SelfHealing: SelfHealing:
Passenger: Passenger:
PipType: Red PipType: Red
@@ -165,8 +165,8 @@ ENGINEER:
Captures: Captures:
CaptureTypes: building CaptureTypes: building
-AutoTarget: -AutoTarget:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
TakeCover: TakeCover:
-GainsExperience: -GainsExperience:
@@ -197,8 +197,8 @@ UMAGON:
Weapon: Sniper Weapon: Sniper
AttackFrontal: AttackFrontal:
TakeCover: TakeCover:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
GHOST: GHOST:
Inherits: ^Infantry Inherits: ^Infantry
@@ -233,8 +233,8 @@ GHOST:
C4Demolition: C4Demolition:
C4Delay: 45 C4Delay: 45
TakeCover: TakeCover:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
JUMPJET: JUMPJET:
Inherits: ^Infantry Inherits: ^Infantry
@@ -264,7 +264,7 @@ JUMPJET:
-Crushable: -Crushable:
AttackFrontal: AttackFrontal:
TakeCover: TakeCover:
RenderInfantry: WithInfantryBody:
CHAMSPY: CHAMSPY:
Inherits: ^Infantry Inherits: ^Infantry
@@ -292,9 +292,9 @@ CHAMSPY:
Infiltrates: Infiltrates:
Types: SpyInfiltrate Types: SpyInfiltrate
-AutoTarget: -AutoTarget:
-RenderInfantry: -WithInfantryBody:
RenderDisguise: WithDisguisingInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
CYBORG: CYBORG:
Inherits: ^Infantry Inherits: ^Infantry
@@ -326,8 +326,8 @@ CYBORG:
Weapon: Vulcan3 Weapon: Vulcan3
AttackFrontal: AttackFrontal:
TakeCover: TakeCover:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
CYC2: CYC2:
Inherits: ^Infantry Inherits: ^Infantry
@@ -360,8 +360,8 @@ CYC2:
LocalOffset: 170,85,683 LocalOffset: 170,85,683
AttackFrontal: AttackFrontal:
TakeCover: TakeCover:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
MUTANT: MUTANT:
Inherits: ^Infantry Inherits: ^Infantry
@@ -388,8 +388,8 @@ MUTANT:
Weapon: Vulcan Weapon: Vulcan
AttackFrontal: AttackFrontal:
TakeCover: TakeCover:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
MWMN: MWMN:
Inherits: ^Infantry Inherits: ^Infantry
@@ -416,8 +416,8 @@ MWMN:
Weapon: Vulcan Weapon: Vulcan
AttackFrontal: AttackFrontal:
TakeCover: TakeCover:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
MUTANT3: MUTANT3:
Inherits: ^Infantry Inherits: ^Infantry
@@ -444,8 +444,8 @@ MUTANT3:
Weapon: Vulcan Weapon: Vulcan
AttackFrontal: AttackFrontal:
TakeCover: TakeCover:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
MHIJACK: MHIJACK:
Inherits: ^Infantry Inherits: ^Infantry
@@ -471,8 +471,8 @@ MHIJACK:
Range: 6c0 Range: 6c0
-AutoTarget: -AutoTarget:
TakeCover: TakeCover:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
TRATOS: TRATOS:
Inherits: ^Infantry Inherits: ^Infantry
@@ -496,8 +496,8 @@ TRATOS:
Range: 4c0 Range: 4c0
TakeCover: TakeCover:
-AutoTarget: -AutoTarget:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
OXANNA: OXANNA:
Inherits: ^Infantry Inherits: ^Infantry
@@ -519,8 +519,8 @@ OXANNA:
Range: 4c0 Range: 4c0
TakeCover: TakeCover:
-AutoTarget: -AutoTarget:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
SLAV: SLAV:
Inherits: ^Infantry Inherits: ^Infantry
@@ -542,8 +542,8 @@ SLAV:
Range: 4c0 Range: 4c0
TakeCover: TakeCover:
-AutoTarget: -AutoTarget:
RenderInfantry: WithInfantryBody:
IdleAnimations: idle1,idle2 IdleSequences: idle1,idle2
DOGGIE: DOGGIE:
Inherits: ^Infantry Inherits: ^Infantry
@@ -603,9 +603,10 @@ VISSML:
TargetableUnit: TargetableUnit:
TargetTypes: Ground TargetTypes: Ground
-AutoTarget: -AutoTarget:
-RenderInfantry: -RenderSprites:
RenderUnit: -WithInfantryBody:
-WithDeathAnimation: -WithDeathAnimation:
RenderUnit:
VISLRG: VISLRG:
Inherits: ^Infantry Inherits: ^Infantry
@@ -639,9 +640,10 @@ VISLRG:
WanderMoveRadius: 2 WanderMoveRadius: 2
MinMoveDelayInTicks: 25 MinMoveDelayInTicks: 25
MaxMoveDelayInTicks: 45 MaxMoveDelayInTicks: 45
-RenderInfantry: -RenderSprites:
RenderUnit: -WithInfantryBody:
-WithDeathAnimation: -WithDeathAnimation:
RenderUnit:
CIV1: CIV1:
Inherits: ^CivilianInfantry Inherits: ^CivilianInfantry

View File

@@ -16,13 +16,14 @@ waypoint:
InitialFacing: 160 InitialFacing: 160
Turreted: Turreted:
InitialFacing: 160 InitialFacing: 160
RenderInfantry: WithInfantryBody:
Image: mmch StandSequences: run
StandAnimations: run
Palette: colorpicker
RenderVoxels: RenderVoxels:
Image: mmch Image: mmch
Palette: colorpicker Palette: colorpicker
RenderSprites:
Image: mmch
Palette: colorpicker
CAMERA: CAMERA:
Immobile: Immobile:
@@ -66,3 +67,4 @@ TROCK04:
TROCK05: TROCK05:
Inherits: ^Rock Inherits: ^Rock

View File

@@ -168,7 +168,7 @@ HVR:
Buildable: Buildable:
Queue: Vehicle Queue: Vehicle
BuildPaletteOrder: 60 BuildPaletteOrder: 60
Prerequisites: ~gaweap Prerequisites: ~gaweap
Mobile: Mobile:
Speed: 56 Speed: 56
ROT: 5 ROT: 5
@@ -518,7 +518,8 @@ MMCH:
Type: Heavy Type: Heavy
RevealsShroud: RevealsShroud:
Range: 8c0 Range: 8c0
RenderInfantry: RenderSprites:
WithInfantryBody:
Turreted: Turreted:
ROT: 5 ROT: 5
AttackTurreted: AttackTurreted:
@@ -590,7 +591,8 @@ SMECH:
AutoTarget: AutoTarget:
Armament: Armament:
Weapon: AssaultCannon Weapon: AssaultCannon
RenderInfantry: RenderSprites:
WithInfantryBody:
Selectable: Selectable:
Voices: Mech Voices: Mech
Bounds: 16, 32 Bounds: 16, 32