Merge pull request #4371 from pchote/more-world-coords

Convert remaining yaml definitions to world coordinates
This commit is contained in:
Matthias Mailänder
2013-12-26 03:22:07 -08:00
207 changed files with 1637 additions and 1509 deletions

View File

@@ -1,3 +1,15 @@
NEW:
Engine:
Converted Aircraft CruiseAltitude to world coordinates.
Converted Health Radius to world coordinates.
Converted production exits to world coordinates.
Converted weapon projectiles to world coordinates.
Converted actor speed to world coordinates.
Mod / Custom map compatibility:
Altitude is no longer parsed from actor templates in maps. Specify CenterPosition instead.
Run `OpenRA.Utility.exe --upgrade-mod <mod> 20131223` to automatically upgrade mod rules.
Run `OpenRA.Utility.exe --upgrade-map <map path> 20131223` to automatically upgrade custom map rules.
20131223:
All mods:
Fixed dead units sometimes exploding or leaving husks when they weren't in the world.

View File

@@ -247,6 +247,18 @@ namespace OpenRA.FileFormats
return InvalidValueAction(value, fieldType, fieldName);
}
else if (fieldType == typeof(CPos))
{
var parts = value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
return new CPos(int.Parse(parts[0]), int.Parse(parts[1]));
}
else if (fieldType == typeof(CVec))
{
var parts = value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
return new CVec(int.Parse(parts[0]), int.Parse(parts[1]));
}
else if (fieldType.IsEnum)
{
if (!Enum.GetNames(fieldType).Select(a => a.ToLower()).Contains(value.ToLower()))

View File

@@ -154,6 +154,8 @@
<Compile Include="Graphics\TmpTDReader.cs" />
<Compile Include="Graphics\ShpD2Reader.cs" />
<Compile Include="FileSystem\Pak.cs" />
<Compile Include="CPos.cs" />
<Compile Include="CVec.cs" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">

View File

@@ -8,6 +8,7 @@
*/
#endregion
using System;
using System.Linq;
namespace OpenRA
@@ -15,7 +16,7 @@ namespace OpenRA
/// <summary>
/// 1d world distance - 1024 units = 1 cell.
/// </summary>
public struct WRange
public struct WRange : IComparable
{
public readonly int Range;
@@ -82,6 +83,15 @@ namespace OpenRA
return o != null && o == this;
}
public int CompareTo(object obj)
{
var o = obj as WRange?;
if (o == null)
return 1;
return Range.CompareTo(o.Value.Range);
}
public override string ToString() { return "{0}".F(Range); }
}
}

View File

@@ -55,14 +55,6 @@ namespace OpenRA
public int Value( World world ) { return value; }
}
public class AltitudeInit : IActorInit<int>
{
[FieldFromYamlKey] public readonly int value = 0;
public AltitudeInit() { }
public AltitudeInit( int init ) { value = init; }
public int Value( World world ) { return value; }
}
public class LocationInit : IActorInit<CPos>
{
[FieldFromYamlKey] public readonly int2 value = int2.Zero;

View File

@@ -18,8 +18,8 @@ namespace OpenRA.GameRules
{
public class WarheadInfo
{
[Desc("Distance (in pixels) from the explosion center at which damage is 1/2.")]
public readonly int Spread = 1;
[Desc("Distance from the explosion center at which damage is 1/2.")]
public readonly WRange Spread = new WRange(43);
[FieldLoader.LoadUsing("LoadVersus")]
[Desc("Damage vs each armortype. 0% = can't target.")]
public readonly Dictionary<string, float> Versus;
@@ -99,7 +99,7 @@ namespace OpenRA.GameRules
public class WeaponInfo
{
public readonly float Range = 0;
public readonly WRange Range = WRange.Zero;
public readonly string[] Report = null;
[Desc("Rate of Fire")]
public readonly int ROF = 1;
@@ -109,7 +109,7 @@ namespace OpenRA.GameRules
public readonly string[] ValidTargets = { "Ground", "Water" };
public readonly string[] InvalidTargets = { };
public readonly int BurstDelay = 5;
public readonly float MinRange = 0;
public readonly WRange MinRange = WRange.Zero;
[FieldLoader.LoadUsing("LoadProjectile")] public IProjectileInfo Projectile;
[FieldLoader.LoadUsing("LoadWarheads")] public List<WarheadInfo> Warheads;

View File

@@ -30,12 +30,15 @@ namespace OpenRA.Graphics
int nv = 0;
for (var j = map.Bounds.Top; j < map.Bounds.Bottom; j++)
{
for (var i = map.Bounds.Left; i < map.Bounds.Right; i++)
{
var tile = wr.Theater.TileSprite(map.MapTiles.Value[i, j]);
Util.FastCreateQuad(vertices, Game.CellSize * new float2(i, j), tile, terrainPalette, nv, tile.size);
var pos = wr.ScreenPosition(new CPos(i, j).CenterPosition) - 0.5f * tile.size;
Util.FastCreateQuad(vertices, pos, tile, terrainPalette, nv, tile.size);
nv += 4;
}
}
vertexBuffer = Game.Renderer.Device.CreateVertexBuffer(vertices.Length);
vertexBuffer.SetData(vertices, nv);

View File

@@ -190,25 +190,25 @@ namespace OpenRA.Graphics
selectable.DrawRollover(this);
}
public void DrawRangeCircle(Color c, float2 location, float range)
public void DrawRangeCircle(WPos pos, WRange range, Color c)
{
var offset = new WVec(range.Range, 0, 0);
for (var i = 0; i < 32; i++)
{
var start = location + Game.CellSize * range * float2.FromAngle((float)(Math.PI * i) / 16);
var end = location + Game.CellSize * range * float2.FromAngle((float)(Math.PI * (i + 0.7)) / 16);
Game.Renderer.WorldLineRenderer.DrawLine(start, end, c, c);
var pa = pos + offset.Rotate(WRot.FromFacing(8 * i));
var pb = pos + offset.Rotate(WRot.FromFacing(8 * i + 6));
Game.Renderer.WorldLineRenderer.DrawLine(ScreenPosition(pa), ScreenPosition(pb), c, c);
}
}
public void DrawRangeCircleWithContrast(Color fg, float2 location, float range, Color bg)
public void DrawRangeCircleWithContrast(WPos pos, WRange range, Color fg, Color bg)
{
var wlr = Game.Renderer.WorldLineRenderer;
var oldWidth = wlr.LineWidth;
wlr.LineWidth = 3;
DrawRangeCircle(bg, location, range);
DrawRangeCircle(pos, range, bg);
wlr.LineWidth = 1;
DrawRangeCircle(fg, location, range);
DrawRangeCircle(pos, range, fg);
wlr.LineWidth = oldWidth;
}

View File

@@ -146,7 +146,7 @@ namespace OpenRA
return map;
}
Dictionary<string, Map> FindMaps()
public Dictionary<string, Map> FindMaps()
{
var paths = Manifest.MapFolders.SelectMany(f => FindMapsIn(f));
var ret = new Dictionary<string, Map>();

View File

@@ -120,8 +120,6 @@
<Compile Include="Graphics\WorldRenderer.cs" />
<Compile Include="Group.cs" />
<Compile Include="InputHandler.cs" />
<Compile Include="CVec.cs" />
<Compile Include="CPos.cs" />
<Compile Include="Map.cs" />
<Compile Include="ModData.cs" />
<Compile Include="Network\Connection.cs" />

View File

@@ -17,7 +17,8 @@ namespace OpenRA.Traits
public class HealthInfo : ITraitInfo, UsesInit<HealthInit>
{
public readonly int HP = 0;
public readonly float Radius = 10;
[Desc("Physical size of the unit used for damage calculations. Impacts within this radius apply full damage")]
public readonly WRange Radius = new WRange(426);
public virtual object Create(ActorInitializer init) { return new Health(init, this); }
}

View File

@@ -52,12 +52,12 @@ namespace OpenRA.Mods.Cnc
owner.World.AddFrameEndTask(w =>
{
var altitude = Rules.Info[actorType].Traits.Get<PlaneInfo>().CruiseAltitude;
var a = w.CreateActor(actorType, new TypeDictionary
{
new LocationInit(startPos),
new CenterPositionInit(startPos.CenterPosition + new WVec(WRange.Zero, WRange.Zero, altitude)),
new OwnerInit(owner),
new FacingInit(64),
new AltitudeInit(Rules.Info[actorType].Traits.Get<PlaneInfo>().CruiseAltitude),
new FacingInit(64)
});
a.QueueActivity(Fly.ToCell(self.Location + new CVec(9, 0)));

View File

@@ -19,9 +19,9 @@ using OpenRA.Traits;
namespace OpenRA.Mods.RA.Air
{
public class AircraftInfo : ITraitInfo, IFacingInfo, IOccupySpaceInfo, UsesInit<AltitudeInit>, UsesInit<LocationInit>, UsesInit<FacingInit>
public class AircraftInfo : ITraitInfo, IFacingInfo, IOccupySpaceInfo, UsesInit<LocationInit>, UsesInit<FacingInit>
{
public readonly int CruiseAltitude = 30;
public readonly WRange CruiseAltitude = new WRange(1280);
[ActorReference]
public readonly string[] RepairBuildings = { "fix" };
@@ -57,13 +57,6 @@ namespace OpenRA.Mods.RA.Air
if (init.Contains<LocationInit>())
SetPosition(self, init.Get<LocationInit, CPos>());
if (init.Contains<AltitudeInit>())
{
var z = init.Get<AltitudeInit, int>() * 1024 / Game.CellSize;
SetPosition(self, CenterPosition + new WVec(0, 0, z - CenterPosition.Z));
}
if (init.Contains<CenterPositionInit>())
SetPosition(self, init.Get<CenterPositionInit, WPos>());
@@ -161,7 +154,7 @@ namespace OpenRA.Mods.RA.Air
public WVec FlyStep(int facing)
{
var speed = MovementSpeed * 7 * 1024 / (Game.CellSize * 32);
var speed = MovementSpeed;
var dir = new WVec(0, -1024, 0).Rotate(WRot.FromFacing(facing));
return speed * dir / 1024;
}

View File

@@ -51,13 +51,12 @@ namespace OpenRA.Mods.RA.Air
var plane = self.Trait<Plane>();
var desiredFacing = Util.GetFacing(d, plane.Facing);
var cruiseAltitude = new WRange(plane.Info.CruiseAltitude * 1024 / Game.CellSize);
// Don't turn until we've reached the cruise altitude
if (plane.CenterPosition.Z < cruiseAltitude.Range)
if (plane.CenterPosition.Z < plane.Info.CruiseAltitude.Range)
desiredFacing = plane.Facing;
FlyToward(self, plane, desiredFacing, cruiseAltitude);
FlyToward(self, plane, desiredFacing, plane.Info.CruiseAltitude);
return this;
}

View File

@@ -23,8 +23,7 @@ namespace OpenRA.Mods.RA.Air
// We can't possibly turn this fast
var desiredFacing = plane.Facing + 64;
var cruiseAltitude = new WRange(plane.Info.CruiseAltitude * 1024 / Game.CellSize);
Fly.FlyToward(self, plane, desiredFacing, cruiseAltitude);
Fly.FlyToward(self, plane, desiredFacing, plane.Info.CruiseAltitude);
return this;
}

View File

@@ -24,8 +24,7 @@ namespace OpenRA.Mods.RA.Air
return NextActivity;
var plane = self.Trait<Plane>();
var cruiseAltitude = new WRange(plane.Info.CruiseAltitude * 1024 / Game.CellSize);
Fly.FlyToward(self, plane, plane.Facing, cruiseAltitude);
Fly.FlyToward(self, plane, plane.Facing, plane.Info.CruiseAltitude);
return this;
}
@@ -39,8 +38,7 @@ namespace OpenRA.Mods.RA.Air
return NextActivity;
var plane = self.Trait<Plane>();
var cruiseAltitude = new WRange(plane.Info.CruiseAltitude * 1024 / Game.CellSize);
Fly.FlyToward(self, plane, plane.Facing, cruiseAltitude);
Fly.FlyToward(self, plane, plane.Facing, plane.Info.CruiseAltitude);
return this;
}

View File

@@ -35,8 +35,7 @@ namespace OpenRA.Mods.RA.Air
var desiredFacing = Util.GetFacing(dist, helicopter.Facing);
helicopter.Facing = Util.TickFacing(helicopter.Facing, desiredFacing, helicopter.ROT);
var cruiseAltitude = new WRange(helicopter.Info.CruiseAltitude * 1024 / Game.CellSize);
if (HeliFly.AdjustAltitude(self, helicopter, cruiseAltitude))
if (HeliFly.AdjustAltitude(self, helicopter, helicopter.Info.CruiseAltitude))
return this;
// Fly towards the target

View File

@@ -40,8 +40,7 @@ namespace OpenRA.Mods.RA.Air
var helicopter = self.Trait<Helicopter>();
var cruiseAltitude = new WRange(helicopter.Info.CruiseAltitude * 1024 / Game.CellSize);
if (AdjustAltitude(self, helicopter, cruiseAltitude))
if (AdjustAltitude(self, helicopter, helicopter.Info.CruiseAltitude))
return this;
// Rotate towards the target
@@ -53,7 +52,7 @@ namespace OpenRA.Mods.RA.Air
var move = helicopter.FlyStep(desiredFacing);
if (dist.HorizontalLengthSquared < move.HorizontalLengthSquared)
{
helicopter.SetPosition(self, pos + new WVec(0, 0, cruiseAltitude.Range - pos.Z));
helicopter.SetPosition(self, pos + new WVec(0, 0, helicopter.Info.CruiseAltitude.Range - pos.Z));
return NextActivity;
}

View File

@@ -51,7 +51,7 @@ namespace OpenRA.Mods.RA.Air
heli.Reservation = res.Reserve(dest, self, heli);
var exit = dest.Info.Traits.WithInterface<ExitInfo>().FirstOrDefault();
var offset = (exit != null) ? exit.SpawnOffsetVector : WVec.Zero;
var offset = (exit != null) ? exit.SpawnOffset : WVec.Zero;
return Util.SequenceActivities(
new HeliFly(dest.CenterPosition + offset),

View File

@@ -73,7 +73,7 @@ namespace OpenRA.Mods.RA.Air
Reservation = res.Reserve(order.TargetActor, self, this);
var exit = order.TargetActor.Info.Traits.WithInterface<ExitInfo>().FirstOrDefault();
var offset = (exit != null) ? exit.SpawnOffsetVector : WVec.Zero;
var offset = (exit != null) ? exit.SpawnOffset : WVec.Zero;
self.SetTargetLine(Target.FromActor(order.TargetActor), Color.Green);
@@ -114,8 +114,7 @@ namespace OpenRA.Mods.RA.Air
// Repulsion only applies when we're flying!
var altitude = CenterPosition.Z;
var cruiseAltitude = Info.CruiseAltitude * 1024 / Game.CellSize;
if (altitude != cruiseAltitude)
if (altitude != Info.CruiseAltitude.Range)
return;
var otherHelis = self.World.FindActorsInCircle(self.CenterPosition, Info.IdealSeparation)

View File

@@ -49,16 +49,16 @@ namespace OpenRA.Mods.RA.Air
}
var landPos = dest.CenterPosition;
var altitude = planeInfo.CruiseAltitude.Range;
// Distance required for descent.
var landDistance = planeInfo.CruiseAltitude * 1024 * 1024 / (Game.CellSize * plane.Info.MaximumPitch.Tan());
var altitude = planeInfo.CruiseAltitude * 1024 / Game.CellSize;
var landDistance = altitude * 1024 / plane.Info.MaximumPitch.Tan();
// Land towards the east
var approachStart = landPos + new WVec(-landDistance, 0, altitude);
// Add 10% to the turning radius to ensure we have enough room
var speed = plane.MovementSpeed * 1024 / (Game.CellSize * 5);
var speed = plane.MovementSpeed * 32 / 35;
var turnRadius = (int)(141 * speed / planeInfo.ROT / (float)Math.PI);
// Find the center of the turning circles for clockwise and counterclockwise turns

View File

@@ -107,13 +107,10 @@ namespace OpenRA.Mods.RA
if (limitedAmmo != null && !limitedAmmo.HasAmmo())
return;
// TODO: Define weapon ranges as WRange
var range = new WRange((int)(1024*Weapon.Range));
var minRange = new WRange((int)(1024*Weapon.MinRange));
if (!target.IsInRange(self.CenterPosition, range))
if (!target.IsInRange(self.CenterPosition, Weapon.Range))
return;
if (minRange != WRange.Zero && target.IsInRange(self.CenterPosition, minRange))
if (Weapon.MinRange != WRange.Zero && target.IsInRange(self.CenterPosition, Weapon.MinRange))
return;
if (!Weapon.IsValidAgainst(target, self.World))

View File

@@ -144,7 +144,7 @@ namespace OpenRA.Mods.RA
public abstract Activity GetAttackActivity(Actor self, Target newTarget, bool allowMove);
public bool HasAnyValidWeapons(Target t) { return Armaments.Any(a => a.Weapon.IsValidAgainst(t, self.World)); }
public WRange GetMaximumRange() { return new WRange((int)(1024 * Armaments.Max(a => a.Weapon.Range))); }
public WRange GetMaximumRange() { return Armaments.Max(a => a.Weapon.Range); }
public Armament ChooseArmamentForTarget(Target t) { return Armaments.FirstOrDefault(a => a.Weapon.IsValidAgainst(t, self.World)); }

View File

@@ -52,9 +52,7 @@ namespace OpenRA.Mods.RA
if (a == null)
return null;
// TODO: Define weapon ranges as WRange
var range = new WRange(Math.Max(0,(int)(1024*a.Weapon.Range)));
return new Activities.Attack(newTarget, range, allowMove);
return new Activities.Attack(newTarget, a.Weapon.Range, allowMove);
}
}
}

View File

@@ -42,9 +42,7 @@ namespace OpenRA.Mods.RA
if (a == null)
return;
// TODO: Define weapon ranges as WRange
var range = new WRange((int)(1024*a.Weapon.Range));
if (!target.IsInRange(self.CenterPosition, range))
if (!target.IsInRange(self.CenterPosition, a.Weapon.Range))
return;
self.CancelActivity();

View File

@@ -31,9 +31,7 @@ namespace OpenRA.Mods.RA
if (arm == null)
return;
// TODO: Define weapon ranges as WRange
var range = new WRange((int)(1024*arm.Weapon.Range));
if (!target.IsInRange(self.CenterPosition, range))
if (!target.IsInRange(self.CenterPosition, arm.Weapon.Range))
return;
var facing = self.TraitOrDefault<IFacing>();

View File

@@ -33,9 +33,7 @@ namespace OpenRA.Mods.RA
if (a == null)
return null;
// TODO: Define weapon ranges as WRange
var range = new WRange(Math.Max(0, (int)(1024 * a.Weapon.Range)));
return new Activities.Heal(newTarget, range, allowMove);
return new Activities.Heal(newTarget, a.Weapon.Range, allowMove);
}
}
}

View File

@@ -96,7 +96,7 @@ namespace OpenRA.Mods.RA
if (weapon != null)
{
var range = WRange.FromCells(Math.Max(0, (int)weapon.Weapon.Range - RangeTolerance));
var range = WRange.FromCells(Math.Max(0, weapon.Weapon.Range.Range / 1024 - RangeTolerance));
attack.Target = target;
if (allowMove && self.HasTrait<Mobile>() && !self.Info.Traits.Get<MobileInfo>().OnRails)

View File

@@ -49,8 +49,7 @@ namespace OpenRA.Mods.RA
// Bombs drop anywhere in range
foreach (var a in Armaments.Where(a => a.Info.Name == info.Bombs))
{
var range = new WRange((int)(1024 * a.Weapon.Range));
if (!target.IsInRange(self.CenterPosition, range))
if (!target.IsInRange(self.CenterPosition, a.Weapon.Range))
continue;
a.CheckFire(self, this, facing, bombTarget);
@@ -63,11 +62,10 @@ namespace OpenRA.Mods.RA
foreach (var a in Armaments.Where(a => a.Info.Name == info.Guns))
{
var range = new WRange((int)(1024 * a.Weapon.Range));
if (!target.IsInRange(self.CenterPosition, range))
if (!target.IsInRange(self.CenterPosition, a.Weapon.Range))
continue;
var t = Target.FromPos(cp - new WVec(0, range.Range / 2, cp.Z).Rotate(WRot.FromFacing(facing.Facing)));
var t = Target.FromPos(cp - new WVec(0, a.Weapon.Range.Range / 2, cp.Z).Rotate(WRot.FromFacing(facing.Facing)));
a.CheckFire(self, this, facing, t);
}
}

View File

@@ -69,9 +69,11 @@ namespace OpenRA.Mods.RA.Buildings
return;
wr.DrawRangeCircleWithContrast(
self.CenterPosition,
WRange.FromCells(Info.Range),
Color.FromArgb(128, Ready() ? Color.White : Color.Red),
wr.ScreenPxPosition(self.CenterPosition), Info.Range,
Color.FromArgb(96, Color.Black));
Color.FromArgb(96, Color.Black)
);
}
// Selection bar

View File

@@ -152,9 +152,12 @@ namespace OpenRA.Mods.RA
if (self.Owner != self.World.LocalPlayer)
return;
wr.DrawRangeCircle(
wr.DrawRangeCircleWithContrast(
self.CenterPosition,
WRange.FromCells(self.Trait<ChronoshiftDeploy>().Info.JumpDistance),
Color.FromArgb(128, Color.DeepSkyBlue),
wr.ScreenPxPosition(self.CenterPosition), (int)self.Trait<ChronoshiftDeploy>().Info.JumpDistance);
Color.FromArgb(96, Color.Black)
);
}
}
}

View File

@@ -101,9 +101,8 @@ namespace OpenRA.Mods.RA
{
case DamageModel.Normal:
{
var maxSpread = warhead.Spread * (float)Math.Log(Math.Abs(warhead.Damage), 2);
var range = new WRange((int)maxSpread * 1024 / Game.CellSize);
var hitActors = world.FindActorsInCircle(pos, range);
var maxSpread = new WRange((int)(warhead.Spread.Range * (float)Math.Log(Math.Abs(warhead.Damage), 2)));
var hitActors = world.FindActorsInCircle(pos, maxSpread);
foreach (var victim in hitActors)
{
@@ -192,8 +191,8 @@ namespace OpenRA.Mods.RA
var rawDamage = (float)warhead.Damage;
if (withFalloff)
{
var distance = (int)Math.Max(0, (target.CenterPosition - pos).Length * Game.CellSize / 1024 - healthInfo.Radius);
var falloff = (float)GetDamageFalloff(distance / warhead.Spread);
var distance = Math.Max(0, (target.CenterPosition - pos).Length - healthInfo.Radius.Range);
var falloff = (float)GetDamageFalloff(distance * 1f / warhead.Spread.Range);
rawDamage = (float)(falloff * rawDamage);
}
return (float)(rawDamage * modifier * (float)warhead.EffectivenessAgainst(target.Info));

View File

@@ -42,7 +42,7 @@ namespace OpenRA.Mods.RA
return;
if (health.Value != null)
wr.DrawRangeCircle(Color.Red, wr.ScreenPxPosition(self.CenterPosition), health.Value.Info.Radius / Game.CellSize);
wr.DrawRangeCircle(self.CenterPosition, health.Value.Info.Radius, Color.Red);
var wlr = Game.Renderer.WorldLineRenderer;
var c = Color.White;

View File

@@ -92,26 +92,26 @@ namespace OpenRA.Mods.RA
var pp = ChooseDropCell(self, inWater, 100);
if (pp == null) return;
var p = pp.Value; //
var p = pp.Value;
self.World.AddFrameEndTask(w =>
{
var crate = w.CreateActor(false, Info.CrateActor, new TypeDictionary { new OwnerInit(w.WorldActor.Owner) });
crates.Add(crate);
var startPos = w.ChooseRandomEdgeCell();
var altitude = Rules.Info[Info.DeliveryAircraft].Traits.Get<PlaneInfo>().CruiseAltitude;
var plane = w.CreateActor(Info.DeliveryAircraft, new TypeDictionary
{
var crate = w.CreateActor(false, Info.CrateActor, new TypeDictionary { new OwnerInit(w.WorldActor.Owner) });
crates.Add(crate);
var startPos = w.ChooseRandomEdgeCell();
var plane = w.CreateActor(Info.DeliveryAircraft, new TypeDictionary
{
new LocationInit( startPos ),
new OwnerInit( w.WorldActor.Owner),
new FacingInit( Util.GetFacing(p - startPos, 0) ),
new AltitudeInit( Rules.Info[Info.DeliveryAircraft].Traits.Get<AircraftInfo>().CruiseAltitude ),
});
plane.CancelActivity();
plane.QueueActivity(new FlyAttack(Target.FromCell(p)));
plane.Trait<ParaDrop>().SetLZ(p);
plane.Trait<Cargo>().Load(plane, crate);
new CenterPositionInit(startPos.CenterPosition + new WVec(WRange.Zero, WRange.Zero, altitude)),
new OwnerInit(w.WorldActor.Owner),
new FacingInit(Util.GetFacing(p - startPos, 0))
});
plane.CancelActivity();
plane.QueueActivity(new FlyAttack(Target.FromCell(p)));
plane.Trait<ParaDrop>().SetLZ(p);
plane.Trait<Cargo>().Load(plane, crate);
});
}
}
}

View File

@@ -22,15 +22,16 @@ namespace OpenRA.Mods.RA.Effects
{
public class BulletInfo : IProjectileInfo
{
public readonly int Speed = 1;
[Desc("Projectile speed in WRange / tick")]
public readonly WRange Speed = new WRange(17);
public readonly string Trail = null;
[Desc("Pixels at maximum range")]
public readonly float Inaccuracy = 0;
[Desc("Maximum offset at the maximum range")]
public readonly WRange Inaccuracy = WRange.Zero;
public readonly string Image = null;
[Desc("Check for whether an actor with Wall: trait blocks fire")]
public readonly bool High = false;
public readonly bool Shadow = false;
public readonly float Angle = 0;
public readonly WAngle Angle = WAngle.Zero;
public readonly int TrailInterval = 2;
public readonly int TrailDelay = 1;
public readonly int ContrailLength = 0;
@@ -49,7 +50,6 @@ namespace OpenRA.Mods.RA.Effects
ContrailRenderable trail;
Animation anim;
[Sync] WAngle angle;
[Sync] WPos pos, target;
[Sync] int length;
[Sync] int facing;
@@ -63,22 +63,15 @@ namespace OpenRA.Mods.RA.Effects
this.args = args;
this.pos = args.Source;
// Convert ProjectileArg definitions to world coordinates
// TODO: Change the yaml definitions so we don't need this
var range = new WRange((int)(1024 * args.Weapon.Range)); // Range in world units
var inaccuracy = new WRange((int)(info.Inaccuracy * 1024 / Game.CellSize)); // Offset in world units at max range
var speed = (int)(info.Speed * 4 * 1024 / (10 * Game.CellSize)); // Speed in world units per tick
angle = WAngle.ArcTan((int)(info.Angle * 4 * 1024), 1024); // Angle in world angle
target = args.PassiveTarget;
if (info.Inaccuracy > 0)
if (info.Inaccuracy.Range > 0)
{
var maxOffset = inaccuracy.Range * (target - pos).Length / range.Range;
var maxOffset = info.Inaccuracy.Range * (target - pos).Length / args.Weapon.Range.Range;
target += WVec.FromPDF(args.SourceActor.World.SharedRandom, 2) * maxOffset / 1024;
}
facing = Traits.Util.GetFacing(target - pos, 0);
length = Math.Max((target - pos).Length / speed, 1);
length = Math.Max((target - pos).Length / info.Speed.Range, 1);
if (info.Image != null)
{
@@ -98,7 +91,7 @@ namespace OpenRA.Mods.RA.Effects
int GetEffectiveFacing()
{
var at = (float)ticks / (length - 1);
var attitude = angle.Tan() * (1 - 2 * at) / (4 * 1024);
var attitude = info.Angle.Tan() * (1 - 2 * at) / (4 * 1024);
var u = (facing % 128) / 128f;
var scale = 512 * u * (1 - u);
@@ -113,11 +106,11 @@ namespace OpenRA.Mods.RA.Effects
if (anim != null)
anim.Tick();
pos = WPos.LerpQuadratic(args.Source, target, angle, ticks, length);
pos = WPos.LerpQuadratic(args.Source, target, info.Angle, ticks, length);
if (info.Trail != null && --smokeTicks < 0)
{
var delayedPos = WPos.LerpQuadratic(args.Source, target, angle, ticks - info.TrailDelay, length);
var delayedPos = WPos.LerpQuadratic(args.Source, target, info.Angle, ticks - info.TrailDelay, length);
world.AddFrameEndTask(w => w.Add(new Smoke(w, delayedPos, info.Trail)));
smokeTicks = info.TrailInterval;
}

View File

@@ -21,13 +21,15 @@ namespace OpenRA.Mods.RA.Effects
{
class MissileInfo : IProjectileInfo
{
public readonly int Speed = 1;
[Desc("Projectile speed in WRange / tick")]
public readonly WRange Speed = new WRange(8);
public readonly WAngle MaximumPitch = WAngle.FromDegrees(30);
public readonly int Arm = 0;
[Desc("Check for whether an actor with Wall: trait blocks fire")]
public readonly bool High = false;
public readonly string Trail = null;
public readonly float Inaccuracy = 0;
[Desc("Maximum offset at the maximum range")]
public readonly WRange Inaccuracy = WRange.Zero;
public readonly string Image = null;
[Desc("Rate of Turning")]
public readonly int ROT = 5;
@@ -46,12 +48,15 @@ namespace OpenRA.Mods.RA.Effects
class Missile : IEffect, ISync
{
static readonly WRange MissileCloseEnough = new WRange(7 * 1024 / Game.CellSize);
// HACK: the missile movement code isn't smart enough to explode
// when the projectile passes the actor. This defines an arbitrary
// proximity radius that they will explode within, which makes
// missiles difficult to consistently balance.
static readonly WRange MissileCloseEnough = new WRange(298);
readonly MissileInfo info;
readonly ProjectileArgs args;
readonly Animation anim;
readonly int speed;
int ticksToNextSmoke;
ContrailRenderable trail;
@@ -76,13 +81,8 @@ namespace OpenRA.Mods.RA.Effects
targetPosition = args.PassiveTarget;
// Convert ProjectileArg definitions to world coordinates
// TODO: Change the yaml definitions so we don't need this
var inaccuracy = (int)(info.Inaccuracy * 1024 / Game.CellSize);
speed = info.Speed * 1024 / (5 * Game.CellSize);
if (info.Inaccuracy > 0)
offset = WVec.FromPDF(args.SourceActor.World.SharedRandom, 2) * inaccuracy / 1024;
if (info.Inaccuracy.Range > 0)
offset = WVec.FromPDF(args.SourceActor.World.SharedRandom, 2) * info.Inaccuracy.Range / 1024;
if (info.Image != null)
{
@@ -131,7 +131,7 @@ namespace OpenRA.Mods.RA.Effects
desiredFacing = facing;
facing = Traits.Util.TickFacing(facing, desiredFacing, info.ROT);
var move = new WVec(0, -1024, 0).Rotate(WRot.FromFacing(facing)) * speed / 1024;
var move = new WVec(0, -1024, 0).Rotate(WRot.FromFacing(facing)) * info.Speed.Range / 1024;
if (targetPosition.Z > 0 && info.TurboBoost)
move = (move * 3) / 2;

View File

@@ -54,10 +54,6 @@ namespace OpenRA.Mods.RA
td.Add(new HuskSpeedInit(mobile.MovementSpeedForCell(self, self.Location)));
}
var aircraft = self.TraitOrDefault<Aircraft>();
if (aircraft != null)
td.Add(new AltitudeInit(aircraft.CenterPosition.Z * Game.CellSize / 1024));
var facing = self.TraitOrDefault<IFacing>();
if (facing != null)
td.Add(new FacingInit(facing.Facing));

View File

@@ -267,12 +267,12 @@ namespace OpenRA.Mods.RA.Missions
{
if (yak == null)
{
var altitude = Rules.Info[YakName].Traits.Get<PlaneInfo>().CruiseAltitude;
yak = world.CreateActor(YakName, new TypeDictionary
{
new LocationInit(yakEntryPoint.Location),
new CenterPositionInit(yakEntryPoint.CenterPosition + new WVec(WRange.Zero, WRange.Zero, altitude)),
new OwnerInit(soviets),
new FacingInit(Traits.Util.GetFacing(yakAttackPoint.Location - yakEntryPoint.Location, 0)),
new AltitudeInit(Rules.Info[YakName].Traits.Get<PlaneInfo>().CruiseAltitude)
new FacingInit(Traits.Util.GetFacing(yakAttackPoint.Location - yakEntryPoint.Location, 0))
});
}

View File

@@ -219,7 +219,7 @@ namespace OpenRA.Mods.RA.Missions
cargo.Load(chinook, world.CreateActor(false, ChinookCargo.Random(world.SharedRandom), allies, null, null));
var exit = lz.Info.Traits.WithInterface<ExitInfo>().FirstOrDefault();
var offset = (exit != null) ? exit.SpawnOffsetVector : WVec.Zero;
var offset = (exit != null) ? exit.SpawnOffset : WVec.Zero;
chinook.QueueActivity(new HeliFly(lz.CenterPosition + offset)); // no reservation of hpad but it's not needed
chinook.QueueActivity(new Turn(0));

View File

@@ -73,13 +73,14 @@ namespace OpenRA.Mods.RA.Missions
public static void Paradrop(World world, Player owner, IEnumerable<string> units, CPos entry, CPos location)
{
var altitude = Rules.Info["badr"].Traits.Get<PlaneInfo>().CruiseAltitude;
var badger = world.CreateActor("badr", new TypeDictionary
{
new LocationInit(entry),
new CenterPositionInit(entry.CenterPosition + new WVec(WRange.Zero, WRange.Zero, altitude)),
new OwnerInit(owner),
new FacingInit(Util.GetFacing(location - entry, 0)),
new AltitudeInit(Rules.Info["badr"].Traits.Get<PlaneInfo>().CruiseAltitude),
new FacingInit(Util.GetFacing(location - entry, 0))
});
badger.QueueActivity(new FlyAttack(Target.FromCell(location)));
badger.Trait<ParaDrop>().SetLZ(location);
var cargo = badger.Trait<Cargo>();
@@ -91,13 +92,14 @@ namespace OpenRA.Mods.RA.Missions
public static void Parabomb(World world, Player owner, CPos entry, CPos location)
{
var altitude = Rules.Info["badr.bomber"].Traits.Get<PlaneInfo>().CruiseAltitude;
var badger = world.CreateActor("badr.bomber", new TypeDictionary
{
new LocationInit(entry),
new CenterPositionInit(entry.CenterPosition + new WVec(WRange.Zero, WRange.Zero, altitude)),
new OwnerInit(owner),
new FacingInit(Util.GetFacing(location - entry, 0)),
new AltitudeInit(Rules.Info["badr.bomber"].Traits.Get<PlaneInfo>().CruiseAltitude),
new FacingInit(Util.GetFacing(location - entry, 0))
});
badger.Trait<AttackBomber>().SetTarget(location.CenterPosition);
badger.QueueActivity(Fly.ToCell(location));
badger.QueueActivity(new FlyOffMap());

View File

@@ -104,12 +104,12 @@ namespace OpenRA.Mods.RA.Missions
foreach (var airfield in airfields)
{
var entry = airfield.Location - new CVec(10, 0);
var altitude = Rules.Info["yak"].Traits.Get<PlaneInfo>().CruiseAltitude;
var yak = world.CreateActor("yak", new TypeDictionary
{
new CenterPositionInit(entry.CenterPosition + new WVec(WRange.Zero, WRange.Zero, altitude)),
new OwnerInit(ussr),
new LocationInit(entry),
new FacingInit(Traits.Util.GetFacing(airfield.Location - entry, 0)),
new AltitudeInit(Rules.Info["yak"].Traits.Get<PlaneInfo>().CruiseAltitude)
new FacingInit(Traits.Util.GetFacing(airfield.Location - entry, 0))
});
while (yak.Trait<LimitedAmmo>().TakeAmmo()) { }

View File

@@ -206,11 +206,10 @@ namespace OpenRA.Mods.RA.Move
this.Facing = init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : info.InitialFacing;
if (init.Contains<AltitudeInit>())
{
var z = init.Get<AltitudeInit, int>() * 1024 / Game.CellSize;
SetVisualPosition(self, CenterPosition + new WVec(0, 0, z - CenterPosition.Z));
}
// Sets the visual position to WPos accuracy
// Use LocationInit if you want to insert the actor into the ActorMap!
if (init.Contains<CenterPositionInit>())
SetVisualPosition(self, init.Get<CenterPositionInit, WPos>());
}
public void SetPosition(Actor self, CPos cell)
@@ -445,7 +444,7 @@ namespace OpenRA.Mods.RA.Move
decimal speed = Info.Speed * Info.TerrainSpeeds[type].Speed;
foreach (var t in self.TraitsImplementing<ISpeedModifier>())
speed *= t.GetSpeedModifier();
return (int)(speed / 100) * 1024 / (3 * Game.CellSize);
return (int)(speed / 100);
}
public void AddInfluence()

View File

@@ -28,13 +28,12 @@ namespace OpenRA.Mods.RA
[Desc("Where the unit should leave the building. Multiples are allowed if IDs are added: Exit@2, ...")]
public class ExitInfo : TraitInfo<Exit>
{
public readonly int2 SpawnOffset = int2.Zero; // in px relative to CenterLocation
public readonly int2 ExitCell = int2.Zero; // in cells relative to TopLeft
public readonly int Facing = -1;
[Desc("Offset at which that the exiting actor is spawned")]
public readonly WVec SpawnOffset = WVec.Zero;
// TODO: Push this conversion into the yaml
public WVec SpawnOffsetVector { get { return new WVec(SpawnOffset.X, SpawnOffset.Y, 0) * 1024 / Game.CellSize; } }
public CVec ExitCellVector { get { return (CVec)ExitCell; } }
[Desc("Cell offset where the exiting actor enters the ActorMap")]
public readonly CVec ExitCell = CVec.Zero;
public readonly int Facing = -1;
}
public class Exit { }
@@ -49,8 +48,8 @@ namespace OpenRA.Mods.RA
public void DoProduction(Actor self, ActorInfo producee, ExitInfo exitinfo)
{
var exit = self.Location + exitinfo.ExitCellVector;
var spawn = self.CenterPosition + exitinfo.SpawnOffsetVector;
var exit = self.Location + exitinfo.ExitCell;
var spawn = self.CenterPosition + exitinfo.SpawnOffset;
var to = exit.CenterPosition;
var fi = producee.Traits.Get<IFacingInfo>();
@@ -126,7 +125,7 @@ namespace OpenRA.Mods.RA
var mobileInfo = producee.Traits.GetOrDefault<MobileInfo>();
return mobileInfo == null ||
mobileInfo.CanEnterCell(self.World, self, self.Location + s.ExitCellVector, self, true, true);
mobileInfo.CanEnterCell(self.World, self, self.Location + s.ExitCell, self, true, true);
}
}
}

View File

@@ -31,8 +31,9 @@ namespace OpenRA.Mods.RA
return;
wr.DrawRangeCircleWithContrast(
self.CenterPosition,
WRange.FromCells(self.Info.Traits.Get<DetectCloakedInfo>().Range),
Color.FromArgb(128, Color.LimeGreen),
wr.ScreenPxPosition(self.CenterPosition), self.Info.Traits.Get<DetectCloakedInfo>().Range,
Color.FromArgb(96, Color.Black));
}
}

View File

@@ -58,10 +58,11 @@ namespace OpenRA.Mods.RA
public static void DrawRangeCircle(WorldRenderer wr, WPos pos, int range, Color color)
{
wr.DrawRangeCircleWithContrast(
pos,
WRange.FromCells(range),
Color.FromArgb(128, color),
wr.ScreenPxPosition(pos),
range,
Color.FromArgb(96, Color.Black));
Color.FromArgb(96, Color.Black)
);
}
}
}

View File

@@ -26,11 +26,16 @@ namespace OpenRA.Mods.RA
public void Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition)
{
var range = ai.Traits.WithInterface<ArmamentInfo>()
.Select(a => Rules.Weapons[a.Weapon.ToLowerInvariant()].Range)
.Max();
wr.DrawRangeCircleWithContrast(
Color.FromArgb(128, Color.Yellow), wr.ScreenPxPosition(centerPosition),
ai.Traits.WithInterface<ArmamentInfo>()
.Select(a => Rules.Weapons[a.Weapon.ToLowerInvariant()].Range).Max(),
Color.FromArgb(96, Color.Black));
centerPosition,
range,
Color.FromArgb(128, Color.Yellow),
Color.FromArgb(96, Color.Black)
);
foreach (var a in w.ActorsWithTrait<RenderRangeCircle>())
if (a.Actor.Owner == a.Actor.World.LocalPlayer)
@@ -52,12 +57,12 @@ namespace OpenRA.Mods.RA
if (self.Owner != self.World.LocalPlayer)
return;
// Hack: Convert world coords to cells
var pxRange = self.Trait<AttackBase>().GetMaximumRange().Range / 1024f;
wr.DrawRangeCircleWithContrast(
self.CenterPosition,
self.Trait<AttackBase>().GetMaximumRange(),
Color.FromArgb(128, Color.Yellow),
wr.ScreenPxPosition(self.CenterPosition), pxRange,
Color.FromArgb(96, Color.Black));
Color.FromArgb(96, Color.Black)
);
}
}
}

View File

@@ -19,10 +19,11 @@ namespace OpenRA.Mods.RA
public void Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition)
{
wr.DrawRangeCircleWithContrast(
centerPosition,
WRange.FromCells(ai.Traits.Get<CreatesShroudInfo>().Range),
Color.FromArgb(128, Color.Cyan),
wr.ScreenPxPosition(centerPosition),
ai.Traits.Get<CreatesShroudInfo>().Range,
Color.FromArgb(96, Color.Black));
Color.FromArgb(96, Color.Black)
);
foreach (var a in w.ActorsWithTrait<RenderShroudCircle>())
if (a.Actor.Owner == a.Actor.World.LocalPlayer)
@@ -44,9 +45,11 @@ namespace OpenRA.Mods.RA
return;
wr.DrawRangeCircleWithContrast(
self.CenterPosition,
WRange.FromCells(self.Info.Traits.Get<CreatesShroudInfo>().Range),
Color.FromArgb(128, Color.Cyan),
wr.ScreenPxPosition(self.CenterPosition), self.Info.Traits.Get<CreatesShroudInfo>().Range,
Color.FromArgb(96, Color.Black));
Color.FromArgb(96, Color.Black)
);
}
}
}

View File

@@ -46,7 +46,7 @@ namespace OpenRA.Mods.RA
var attackRotation = WRot.FromFacing(attackFacing);
var delta = new WVec(0, -1024, 0).Rotate(attackRotation);
var altitude = Rules.Info[info.UnitType].Traits.Get<PlaneInfo>().CruiseAltitude * 1024 / Game.CellSize;
var altitude = Rules.Info[info.UnitType].Traits.Get<PlaneInfo>().CruiseAltitude.Range;
var target = order.TargetLocation.CenterPosition + new WVec(0, 0, altitude);
var startEdge = target - (self.World.DistanceToMapEdge(target, -delta) + info.Cordon).Range * delta / 1024;
var finishEdge = target + (self.World.DistanceToMapEdge(target, delta) + info.Cordon).Range * delta / 1024;

View File

@@ -53,12 +53,12 @@ namespace OpenRA.Mods.RA
flare.QueueActivity(new RemoveSelf());
}
var altitude = Rules.Info[info.UnitType].Traits.Get<PlaneInfo>().CruiseAltitude;
var a = w.CreateActor(info.UnitType, new TypeDictionary
{
new LocationInit( startPos ),
new OwnerInit( self.Owner ),
new FacingInit( Util.GetFacing(order.TargetLocation - startPos, 0) ),
new AltitudeInit( Rules.Info[info.UnitType].Traits.Get<PlaneInfo>().CruiseAltitude ),
new CenterPositionInit(startPos.CenterPosition + new WVec(WRange.Zero, WRange.Zero, altitude)),
new OwnerInit(self.Owner),
new FacingInit(Util.GetFacing(order.TargetLocation - startPos, 0))
});
a.CancelActivity();

View File

@@ -28,13 +28,13 @@ namespace OpenRA.Mods.RA
public override void Activate(Actor self, Order order)
{
var enterCell = self.World.ChooseRandomEdgeCell();
var altitude = Rules.Info["u2"].Traits.Get<PlaneInfo>().CruiseAltitude;
var plane = self.World.CreateActor("u2", new TypeDictionary
{
new LocationInit( enterCell ),
new OwnerInit( self.Owner ),
new FacingInit( Util.GetFacing(order.TargetLocation - enterCell, 0) ),
new AltitudeInit( Rules.Info["u2"].Traits.Get<PlaneInfo>().CruiseAltitude ),
new CenterPositionInit(enterCell.CenterPosition + new WVec(WRange.Zero, WRange.Zero, altitude)),
new OwnerInit(self.Owner),
new FacingInit(Util.GetFacing(order.TargetLocation - enterCell, 0))
});
plane.CancelActivity();

View File

@@ -324,7 +324,7 @@ namespace OpenRA.Utility
}
[Desc("MAPFILE", "MOD", "Upgrade a version 5 map to version 6.")]
public static void UpgradeMap(string[] args)
public static void UpgradeV5Map(string[] args)
{
var map = args[1];
var mod = args[2];

View File

@@ -76,6 +76,7 @@
<ItemGroup>
<Compile Include="Command.cs" />
<Compile Include="Program.cs" />
<Compile Include="UpgradeRules.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\OpenRA.FileFormats\OpenRA.FileFormats.csproj">

View File

@@ -29,7 +29,9 @@ namespace OpenRA.Utility
{ "--docs", Command.ExtractTraitDocs },
{ "--map-hash", Command.GetMapHash },
{ "--map-preview", Command.GenerateMinimap },
{ "--map-upgrade", Command.UpgradeMap },
{ "--map-upgrade-v5", Command.UpgradeV5Map },
{ "--upgrade-map", UpgradeRules.UpgradeMap },
{ "--upgrade-mod", UpgradeRules.UpgradeMod },
};
static void Main(string[] args)

View File

@@ -0,0 +1,212 @@
#region Copyright & License Information
/*
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using OpenRA.FileFormats;
using OpenRA.FileFormats.Graphics;
using OpenRA.GameRules;
using OpenRA.Graphics;
using OpenRA.Traits;
namespace OpenRA.Utility
{
public static class UpgradeRules
{
static void ConvertFloatToRange(ref string input)
{
var value = float.Parse(input);
var cells = (int)value;
var subcells = (int)(1024 * value) - 1024 * cells;
input = "{0}c{1}".F(cells, subcells);
}
static void ConvertPxToRange(ref string input)
{
ConvertPxToRange(ref input, 1, 1);
}
static void ConvertPxToRange(ref string input, int scaleMult, int scaleDiv)
{
var value = int.Parse(input);
var world = value * 1024 * scaleMult / (scaleDiv * Game.CellSize);
var cells = world / 1024;
var subcells = world - 1024 * cells;
input = cells != 0 ? "{0}c{1}".F(cells, subcells) : subcells.ToString();
}
static void ConvertAngle(ref string input)
{
var value = float.Parse(input);
input = WAngle.ArcTan((int)(value * 4 * 1024), 1024).ToString();
}
static void ConvertInt2ToWVec(ref string input)
{
var offset = FieldLoader.GetValue<int2>("(value)", input);
var world = new WVec(offset.X * 1024 / Game.CellSize, offset.Y * 1024 / Game.CellSize, 0);
input = world.ToString();
}
static void UpgradeActorRules(int engineVersion, ref List<MiniYamlNode> nodes, MiniYamlNode parent, int depth)
{
var parentKey = parent != null ? parent.Key.Split('@').First() : null;
foreach (var node in nodes)
{
// Weapon definitions were converted to world coordinates
if (engineVersion < 20131226)
{
if (depth == 2 && parentKey == "Exit" && node.Key == "SpawnOffset")
ConvertInt2ToWVec(ref node.Value.Value);
if (depth == 2 && (parentKey == "Aircraft" || parentKey == "Helicopter" || parentKey == "Plane"))
{
if (node.Key == "CruiseAltitude")
ConvertPxToRange(ref node.Value.Value);
if (node.Key == "Speed")
ConvertPxToRange(ref node.Value.Value, 7, 32);
}
if (depth == 2 && parentKey == "Mobile" && node.Key == "Speed")
ConvertPxToRange(ref node.Value.Value, 1, 3);
if (depth == 2 && parentKey == "Health" && node.Key == "Radius")
ConvertPxToRange(ref node.Value.Value);
}
UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1);
}
}
static void UpgradeWeaponRules(int engineVersion, ref List<MiniYamlNode> nodes, MiniYamlNode parent, int depth)
{
var parentKey = parent != null ? parent.Key.Split('@').First() : null;
foreach (var node in nodes)
{
// Weapon definitions were converted to world coordinates
if (engineVersion < 20131226)
{
if (depth == 1)
{
switch (node.Key)
{
case "Range":
case "MinRange":
ConvertFloatToRange(ref node.Value.Value);
break;
default:
break;
}
}
if (depth == 2 && parentKey == "Projectile")
{
switch (node.Key)
{
case "Inaccuracy":
ConvertPxToRange(ref node.Value.Value);
break;
case "Angle":
ConvertAngle(ref node.Value.Value);
break;
case "Speed":
{
if (parent.Value.Value == "Missile")
ConvertPxToRange(ref node.Value.Value, 1, 5);
if (parent.Value.Value == "Bullet")
ConvertPxToRange(ref node.Value.Value, 2, 5);
break;
}
default:
break;
}
}
if (depth == 2 && parentKey == "Warhead")
{
switch (node.Key)
{
case "Spread":
ConvertPxToRange(ref node.Value.Value);
break;
default:
break;
}
}
}
UpgradeWeaponRules(engineVersion, ref node.Value.Nodes, node, depth + 1);
}
}
[Desc("MAP", "CURRENTENGINE", "Upgrade map rules to the latest engine version.")]
public static void UpgradeMap(string[] args)
{
var map = new Map(args[1]);
var engineDate = int.Parse(args[2]);
Game.modData = new ModData(map.RequiresMod);
UpgradeWeaponRules(engineDate, ref map.Weapons, null, 0);
UpgradeActorRules(engineDate, ref map.Rules, null, 0);
map.Save(args[1]);
}
[Desc("MOD", "CURRENTENGINE", "Upgrade mod rules to the latest engine version.")]
public static void UpgradeMod(string[] args)
{
var mod = args[1];
var engineDate = int.Parse(args[2]);
Game.modData = new ModData(mod);
Console.WriteLine("Processing Rules:");
foreach (var filename in Game.modData.Manifest.Rules)
{
Console.WriteLine("\t" + filename);
var yaml = MiniYaml.FromFile(filename);
UpgradeActorRules(engineDate, ref yaml, null, 0);
using (var file = new StreamWriter(filename))
file.WriteLine(yaml.WriteToString());
}
Console.WriteLine("Processing Weapons:");
foreach (var filename in Game.modData.Manifest.Weapons)
{
Console.WriteLine("\t" + filename);
var yaml = MiniYaml.FromFile(filename);
UpgradeWeaponRules(engineDate, ref yaml, null, 0);
using (var file = new StreamWriter(filename))
file.WriteLine(yaml.WriteToString());
}
Console.WriteLine("Processing Maps:");
foreach (var map in Game.modData.FindMaps().Values)
{
Console.WriteLine("\t" + map.Path);
UpgradeActorRules(engineDate, ref map.Rules, null, 0);
UpgradeWeaponRules(engineDate, ref map.Weapons, null, 0);
map.Save(map.Path);
}
}
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -999,10 +999,10 @@ Rules:
Widget: MENU_BACKGROUND
LST:
Mobile:
Speed: 3
Speed: 42
BOAT:
Mobile:
Speed: 3
Speed: 42
Sequences:

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -14,7 +14,7 @@ TRAN:
Helicopter:
LandWhenIdle: true
ROT: 5
Speed: 15
Speed: 140
InitialFacing: 0
LandableTerrainTypes: Clear,Rough,Road,Ore,Beach
Health:
@@ -56,7 +56,7 @@ HELI:
Helicopter:
RearmBuildings: hpad
ROT: 4
Speed: 20
Speed: 186
Health:
HP: 125
Armor:
@@ -108,7 +108,7 @@ ORCA:
Helicopter:
RearmBuildings: hpad
ROT: 4
Speed: 20
Speed: 186
Health:
HP: 90
Armor:
@@ -149,7 +149,7 @@ C17:
Cost: 2000
Plane:
ROT: 5
Speed: 35
Speed: 326
Health:
HP: 25
Armor:
@@ -157,7 +157,6 @@ C17:
RenderUnit:
WithShadow:
Cargo:
# Types: Infantry, Vehicle
MaxWeight: 10
PipCount: 10
Invulnerable:
@@ -188,7 +187,7 @@ A10:
Cost: 2000
Plane:
ROT: 4
Speed: 40
Speed: 373
Health:
HP: 150
Armor:
@@ -227,7 +226,7 @@ TRAN.Husk:
Name: Chinook Transport
Helicopter:
ROT: 5
Speed: 15
Speed: 140
RevealsShroud:
Range: 8
WithRotor@PRIMARY:
@@ -245,7 +244,7 @@ HELI.Husk:
Name: Apache Longbow
Helicopter:
ROT: 4
Speed: 20
Speed: 186
RevealsShroud:
Range: 10
WithRotor:
@@ -260,9 +259,10 @@ ORCA.Husk:
Name: Orca
Helicopter:
ROT: 4
Speed: 20
Speed: 186
RevealsShroud:
Range: 10
RenderUnit:
Image: orca
WithShadow:
WithShadow:

View File

@@ -3,7 +3,7 @@ V20:
Building:
Footprint: xx xx
Dimensions: 2,2
LeavesHusk:
LeavesHusk:
HuskActor: V20.Husk
EditorTilesetFilter:
RequireTilesets: DESERT
@@ -21,7 +21,7 @@ V21:
Building:
Footprint: xx xx
Dimensions: 2,2
LeavesHusk:
LeavesHusk:
HuskActor: V21.Husk
EditorTilesetFilter:
RequireTilesets: DESERT
@@ -39,7 +39,7 @@ V22:
Building:
Footprint: xx
Dimensions: 2,1
LeavesHusk:
LeavesHusk:
HuskActor: V22.Husk
EditorTilesetFilter:
RequireTilesets: DESERT
@@ -54,7 +54,7 @@ V22.Husk:
V23:
Inherits: ^CivBuilding
LeavesHusk:
LeavesHusk:
HuskActor: V23.Husk
EditorTilesetFilter:
RequireTilesets: DESERT
@@ -69,7 +69,7 @@ V24:
Building:
Footprint: xx xx
Dimensions: 2,2
LeavesHusk:
LeavesHusk:
HuskActor: V24.Husk
EditorTilesetFilter:
RequireTilesets: DESERT
@@ -89,7 +89,7 @@ V25:
Dimensions: 2,2
Tooltip:
Name: Church
LeavesHusk:
LeavesHusk:
HuskActor: V25.Husk
EditorTilesetFilter:
RequireTilesets: DESERT
@@ -109,7 +109,7 @@ V26:
Building:
Footprint: xx
Dimensions: 2,1
LeavesHusk:
LeavesHusk:
HuskActor: V26.Husk
EditorTilesetFilter:
RequireTilesets: DESERT
@@ -124,7 +124,7 @@ V26.Husk:
V27:
Inherits: ^CivBuilding
LeavesHusk:
LeavesHusk:
HuskActor: V27.Husk
EditorTilesetFilter:
RequireTilesets: DESERT
@@ -136,7 +136,7 @@ V27.Husk:
V28:
Inherits: ^CivBuilding
LeavesHusk:
LeavesHusk:
HuskActor: V28.Husk
EditorTilesetFilter:
RequireTilesets: DESERT
@@ -148,7 +148,7 @@ V28.Husk:
V29:
Inherits: ^CivBuilding
LeavesHusk:
LeavesHusk:
HuskActor: V29.Husk
EditorTilesetFilter:
RequireTilesets: DESERT
@@ -163,7 +163,7 @@ V30:
Building:
Footprint: xx
Dimensions: 2,1
LeavesHusk:
LeavesHusk:
HuskActor: V30.Husk
EditorTilesetFilter:
RequireTilesets: DESERT
@@ -181,7 +181,7 @@ V31:
Building:
Footprint: xx
Dimensions: 2,1
LeavesHusk:
LeavesHusk:
HuskActor: V31.Husk
EditorTilesetFilter:
RequireTilesets: DESERT
@@ -199,7 +199,7 @@ V32:
Building:
Footprint: xx
Dimensions: 2,1
LeavesHusk:
LeavesHusk:
HuskActor: V32.Husk
EditorTilesetFilter:
RequireTilesets: DESERT
@@ -217,7 +217,7 @@ V33:
Building:
Footprint: xx
Dimensions: 2,1
LeavesHusk:
LeavesHusk:
HuskActor: V33.Husk
EditorTilesetFilter:
RequireTilesets: DESERT
@@ -232,7 +232,7 @@ V33.Husk:
V34:
Inherits: ^CivBuilding
LeavesHusk:
LeavesHusk:
HuskActor: V34.Husk
EditorTilesetFilter:
RequireTilesets: DESERT
@@ -244,7 +244,7 @@ V34.Husk:
V35:
Inherits: ^CivBuilding
LeavesHusk:
LeavesHusk:
HuskActor: V35.Husk
EditorTilesetFilter:
RequireTilesets: DESERT
@@ -256,7 +256,7 @@ V35.Husk:
V36:
Inherits: ^CivBuilding
LeavesHusk:
LeavesHusk:
HuskActor: V36.Husk
EditorTilesetFilter:
RequireTilesets: DESERT
@@ -268,7 +268,7 @@ V36.Husk:
V37:
Inherits: ^CivBuilding
LeavesHusk:
LeavesHusk:
HuskActor: V37.Husk
Building:
Footprint: __xx_ ___xx
@@ -282,4 +282,5 @@ V37.Husk:
Footprint: __xx_ ___xx
Dimensions: 5,2
EditorTilesetFilter:
RequireTilesets: DESERT
RequireTilesets: DESERT

View File

@@ -5,7 +5,7 @@ V01:
Dimensions: 2,2
Tooltip:
Name: Church
LeavesHusk:
LeavesHusk:
HuskActor: V01.Husk
EditorTilesetFilter:
ExcludeTilesets: DESERT
@@ -25,7 +25,7 @@ V02:
Building:
Footprint: xx xx
Dimensions: 2,2
LeavesHusk:
LeavesHusk:
HuskActor: V02.Husk
EditorTilesetFilter:
ExcludeTilesets: DESERT
@@ -43,7 +43,7 @@ V03:
Building:
Footprint: xx xx
Dimensions: 2,2
LeavesHusk:
LeavesHusk:
HuskActor: V03.Husk
EditorTilesetFilter:
ExcludeTilesets: DESERT
@@ -61,7 +61,7 @@ V04:
Building:
Footprint: xx xx
Dimensions: 2,2
LeavesHusk:
LeavesHusk:
HuskActor: V04.Husk
EditorTilesetFilter:
ExcludeTilesets: DESERT
@@ -79,7 +79,7 @@ V05:
Building:
Footprint: xx
Dimensions: 2,1
LeavesHusk:
LeavesHusk:
HuskActor: V05.Husk
EditorTilesetFilter:
ExcludeTilesets: DESERT
@@ -97,7 +97,7 @@ V06:
Building:
Footprint: xx
Dimensions: 2,1
LeavesHusk:
LeavesHusk:
HuskActor: V06.Husk
EditorTilesetFilter:
ExcludeTilesets: DESERT
@@ -115,7 +115,7 @@ V07:
Building:
Footprint: xx
Dimensions: 2,1
LeavesHusk:
LeavesHusk:
HuskActor: V07.Husk
EditorTilesetFilter:
ExcludeTilesets: DESERT
@@ -130,7 +130,7 @@ V07.Husk:
V08:
Inherits: ^CivBuilding
LeavesHusk:
LeavesHusk:
HuskActor: V08.Husk
EditorTilesetFilter:
ExcludeTilesets: DESERT
@@ -142,7 +142,7 @@ V08.Husk:
V09:
Inherits: ^CivBuilding
LeavesHusk:
LeavesHusk:
HuskActor: V09.Husk
EditorTilesetFilter:
ExcludeTilesets: DESERT
@@ -154,7 +154,7 @@ V09.Husk:
V10:
Inherits: ^CivBuilding
LeavesHusk:
LeavesHusk:
HuskActor: V10.Husk
EditorTilesetFilter:
ExcludeTilesets: DESERT
@@ -166,7 +166,7 @@ V10.Husk:
V11:
Inherits: ^CivBuilding
LeavesHusk:
LeavesHusk:
HuskActor: V11.Husk
EditorTilesetFilter:
ExcludeTilesets: DESERT
@@ -178,7 +178,7 @@ V11.Husk:
V12:
Inherits: ^CivBuilding
LeavesHusk:
LeavesHusk:
HuskActor: V12.Husk
EditorTilesetFilter:
ExcludeTilesets: DESERT
@@ -190,7 +190,7 @@ V12.Husk:
V13:
Inherits: ^CivBuilding
LeavesHusk:
LeavesHusk:
HuskActor: V13.Husk
EditorTilesetFilter:
ExcludeTilesets: DESERT
@@ -202,7 +202,7 @@ V13.Husk:
V14:
Inherits: ^CivField
LeavesHusk:
LeavesHusk:
HuskActor: V14.Husk
EditorTilesetFilter:
ExcludeTilesets: DESERT
@@ -214,7 +214,7 @@ V14.Husk:
V15:
Inherits: ^CivField
LeavesHusk:
LeavesHusk:
HuskActor: V15.Husk
EditorTilesetFilter:
ExcludeTilesets: DESERT
@@ -226,7 +226,7 @@ V15.Husk:
V16:
Inherits: ^CivField
LeavesHusk:
LeavesHusk:
HuskActor: V16.Husk
EditorTilesetFilter:
ExcludeTilesets: DESERT
@@ -238,7 +238,7 @@ V16.Husk:
V17:
Inherits: ^CivField
LeavesHusk:
LeavesHusk:
HuskActor: V17.Husk
EditorTilesetFilter:
ExcludeTilesets: DESERT
@@ -250,7 +250,7 @@ V17.Husk:
V18:
Inherits: ^CivField
LeavesHusk:
LeavesHusk:
HuskActor: V18.Husk
EditorTilesetFilter:
ExcludeTilesets: DESERT
@@ -265,7 +265,7 @@ ARCO:
Building:
Footprint: xx
Dimensions: 2,1
LeavesHusk:
LeavesHusk:
HuskActor: ARCO.Husk
ARCO.Husk:
@@ -410,14 +410,14 @@ C10:
VICE:
AppearsOnRadar:
Health:
Radius: 3
Radius: 128
HP: 400
Armor:
Type: Wood
RevealsShroud:
Range: 6
Mobile:
Speed: 5
Speed: 71
TerrainSpeeds:
Clear: 70
Rough: 60
@@ -454,4 +454,5 @@ VICE:
BodyOrientation:
QuantizedFacings: 8
PoisonedByTiberium:
Weapon: Heal
Weapon: Heal

View File

@@ -11,17 +11,17 @@
Beach: 50
ROT: 5
SelectionDecorations:
Selectable:
Selectable:
Voice: VehicleVoice
TargetableUnit:
TargetTypes: Ground
Buildable:
Queue: Vehicle
Repairable:
Chronoshiftable:
Passenger:
Repairable:
Chronoshiftable:
Passenger:
CargoType: Vehicle
IronCurtainable:
IronCurtainable:
HiddenUnderFog:
GainsExperience:
GivesExperience:
@@ -56,17 +56,17 @@
Beach: 70
ROT: 5
SelectionDecorations:
Selectable:
Selectable:
Voice: VehicleVoice
TargetableUnit:
TargetTypes: Ground
Buildable:
Queue: Vehicle
Repairable:
Chronoshiftable:
Passenger:
Repairable:
Chronoshiftable:
Passenger:
CargoType: Vehicle
IronCurtainable:
IronCurtainable:
HiddenUnderFog:
GainsExperience:
GivesExperience:
@@ -123,7 +123,7 @@
^Infantry:
AppearsOnRadar:
Health:
Radius: 3
Radius: 128
Armor:
Type: None
RevealsShroud:
@@ -195,7 +195,7 @@
Tooltip:
Name: Civilian
Mobile:
Speed: 4
Speed: 56
Health:
HP: 25
RevealsShroud:
@@ -215,7 +215,7 @@
^DINO:
AppearsOnRadar:
Health:
Radius: 3
Radius: 128
HP: 1000
Armor:
Type: Wood
@@ -230,7 +230,7 @@
RevealsShroud:
Range: 6
Mobile:
Speed: 8
Speed: 113
TerrainSpeeds:
Clear: 90
Rough: 80
@@ -362,7 +362,7 @@
-EngineerRepairable:
Health:
HP: 400
Armor:
Armor:
Type: Wood
Building:
RenderBuilding:
@@ -502,7 +502,7 @@
^Husk:
Health:
HP: 140
Armor:
Armor:
Type: Light
Husk:
AllowedTerrain: Clear, Rough, Road, Tiberium, BlueTiberium, Beach
@@ -515,11 +515,6 @@
ForceHealthPercentage: 25
BelowUnits:
BodyOrientation:
# Capturable:
# Type: husk
# AllowAllies: true
# AllowNeutral: true
# AllowEnemies: true
LuaScriptEvents:
^HelicopterHusk:
@@ -547,3 +542,4 @@
DestroyedSound: xplobig4.aud
BodyOrientation:
LuaScriptEvents:

View File

@@ -22,7 +22,6 @@ APC.Husk:
RenderUnit:
Image: apc
FTNK.Husk:
Inherits: ^Husk
Tooltip:
@@ -31,7 +30,6 @@ FTNK.Husk:
RenderUnit:
Image: ftnk
ARTY.Husk:
Inherits: ^Husk
Tooltip:
@@ -113,11 +111,12 @@ MLRS.Husk:
Image: mlrs
ThrowsParticle@turret:
Anim: turret
STNK.Husk:
Inherits: ^Husk
Tooltip:
Name: Stealth Tank (Destroyed)
Icon: stnkicnh
RenderUnit:
Image: stnk
Image: stnk

View File

@@ -11,7 +11,7 @@ E1:
Selectable:
Bounds: 12,17,0,-6
Mobile:
Speed: 4
Speed: 56
Health:
HP: 50
Armament:
@@ -37,7 +37,7 @@ E2:
Selectable:
Bounds: 12,17,0,-6
Mobile:
Speed: 5
Speed: 71
Health:
HP: 50
Armament:
@@ -54,7 +54,7 @@ E2:
Chance: 50
DetectCloaked:
Range: 2
E3:
Inherits: ^Infantry
Valued:
@@ -68,7 +68,7 @@ E3:
Selectable:
Bounds: 12,17,0,-6
Mobile:
Speed: 3
Speed: 42
Health:
HP: 45
Armament:
@@ -96,7 +96,7 @@ E4:
Selectable:
Bounds: 12,17,0,-6
Mobile:
Speed: 5
Speed: 71
Health:
HP: 90
Armament:
@@ -126,7 +126,7 @@ E5:
Selectable:
Bounds: 12,17,0,-6
Mobile:
Speed: 4
Speed: 56
TerrainSpeeds:
Tiberium: 80
PathingCost: 80
@@ -161,7 +161,7 @@ E6:
Selectable:
Bounds: 12,17,0,-6
Mobile:
Speed: 4
Speed: 56
Health:
HP: 25
Passenger:
@@ -193,7 +193,7 @@ RMBO:
Bounds: 12,17,0,-6
Voice: CommandoVoice
Mobile:
Speed: 5
Speed: 71
Health:
HP: 200
Passenger:
@@ -261,3 +261,4 @@ RAPT:
Description: Bipedal with enlarged sickle-shaped claw on each hindfoot
Armament:
Weapon: claw

View File

@@ -9,9 +9,9 @@ BOAT:
Armor:
Type: Heavy
Mobile:
InitialFacing:64
InitialFacing: 64
ROT: 4
Speed: 2
Speed: 28
OnRails: true
RevealsShroud:
Range: 7
@@ -47,9 +47,9 @@ LST:
BlueTiberium: 100
Beach: 100
River: 100
InitialFacing:0
InitialFacing: 0
ROT: 4
Speed: 10
Speed: 142
Health:
HP: 400
Armor:
@@ -69,3 +69,4 @@ LST:
AttackMove:
JustMove: true
RejectsOrders:

View File

@@ -1,5 +1,3 @@
# Arranged structures in order, from basic to advanced: Buildings, Defenses, Walls, Misc.
FACT:
Inherits: ^Building
Buildable:
@@ -17,7 +15,7 @@ FACT:
Dimensions: 3,2
Health:
HP: 1400
Armor:
Armor:
Type: Wood
RevealsShroud:
Range: 10
@@ -26,7 +24,7 @@ FACT:
Produces: Building,Defense
Transforms:
IntoActor: mcv
Offset:1,1
Offset: 1,1
Facing: 108
ProductionQueue@Building:
Type: Building
@@ -187,12 +185,12 @@ PYLE:
Bib:
RallyPoint:
Exit@1:
SpawnOffset: -10,2
SpawnOffset: -426,85,0
ExitCell: 0,1
Exit@2:
SpawnOffset: 7,7
ExitCell: 1,1
Production:
SpawnOffset: 298,298,0
ExitCell: 1,1
Production:
Produces: Infantry
ProductionQueue:
Type: Infantry
@@ -200,7 +198,7 @@ PYLE:
BuildSpeed: .4
LowPowerSlowdown: 3
ProductionBar:
HAND:
Inherits: ^Building
Valued:
@@ -225,7 +223,7 @@ HAND:
Bib:
RallyPoint:
Exit@1:
SpawnOffset: 12,24
SpawnOffset: 512,1024,0
ExitCell: 1,2
Production:
Produces: Infantry
@@ -261,7 +259,7 @@ AFLD:
RallyPoint:
RallyPoint: 4,2
Exit@1:
SpawnOffset: -24,0
SpawnOffset: -1024,0,0
ExitCell: 3,1
ProductionAirdrop:
Produces: Vehicle
@@ -300,7 +298,7 @@ WEAP:
RallyPoint:
RallyPoint: 0,3
Exit@1:
SpawnOffset: -8,-8
SpawnOffset: -341,-341,0
ExitCell: 0,2
Production:
Produces: Vehicle
@@ -331,7 +329,7 @@ HPAD:
RevealsShroud:
Range: 5
Exit@1:
SpawnOffset: 0,-6
SpawnOffset: 0,-256,0
Production:
Produces: Aircraft
Reservable:
@@ -407,7 +405,7 @@ FIX:
Reservable:
RepairsUnits:
RallyPoint:
EYE:
RequiresPower:
CanPowerDown:
@@ -540,7 +538,7 @@ SAM:
-GivesBuildableArea:
Health:
HP: 400
Armor:
Armor:
Type: Heavy
RevealsShroud:
Range: 5
@@ -576,7 +574,7 @@ OBLI:
-GivesBuildableArea:
Health:
HP: 400
Armor:
Armor:
Type: Heavy
RevealsShroud:
Range: 8
@@ -588,7 +586,7 @@ OBLI:
FireDelay: 8
AttackTurreted:
Turreted:
ROT:255
ROT: 255
AutoTarget:
-RenderBuilding:
RenderRangeCircle:
@@ -629,7 +627,7 @@ GTWR:
RenderRangeCircle:
WithMuzzleFlash:
Turreted:
ROT:255
ROT: 255
ATWR:
Inherits: ^Building
@@ -651,12 +649,12 @@ ATWR:
-GivesBuildableArea:
Health:
HP: 600
Armor:
Armor:
Type: Heavy
RevealsShroud:
Range: 9
Turreted:
ROT:255
ROT: 255
Offset: 128,128,-85
Armament:
Weapon: TowerMissle
@@ -687,7 +685,7 @@ SBAG:
Owner: gdi
Health:
HP: 100
Armor:
Armor:
Type: Light
CYCL:
@@ -706,7 +704,7 @@ CYCL:
Owner: nod
Health:
HP: 100
Armor:
Armor:
Type: Light
BRIK:
@@ -725,7 +723,7 @@ BRIK:
Owner: gdi,nod
Health:
HP: 250
Armor:
Armor:
Type: Heavy
Wall:
CrushClasses: heavywall
@@ -733,7 +731,6 @@ BRIK:
SoundOnDamageTransition:
DestroyedSound: crumble.aud
# custom prerequisites:
BARRACKS:
Tooltip:
Name: Infantry Production
@@ -753,3 +750,4 @@ ANYHQ:
Tooltip:
Name: a communications center
Description: a communications center

View File

@@ -9,7 +9,7 @@ Player:
ActorGroupProxy:
DeveloperMode:
HackyAI@Default:
Name:Easy AI
Name: Easy AI
BuildingCommonNames:
ConstructionYard: fact
Refinery: proc
@@ -71,7 +71,7 @@ Player:
orca: 5%
SquadSize: 15
HackyAI@Normal:
Name:Normal AI
Name: Normal AI
BuildingCommonNames:
ConstructionYard: fact
Refinery: proc
@@ -133,7 +133,7 @@ Player:
mtnk: 50%
SquadSize: 15
HackyAI@hard:
Name:Hard AI
Name: Hard AI
BuildingCommonNames:
ConstructionYard: fact
Refinery: proc
@@ -312,11 +312,11 @@ World:
AllowedTerrainTypes: Clear,Road
AllowUnderActors: false
SmudgeLayer@SCORCH:
Type:Scorch
Type: Scorch
Sequence: scorches
SmokePercentage:50
SmokePercentage: 50
SmudgeLayer@CRATER:
Type:Crater
Type: Crater
Sequence: craters
PathfinderDebugOverlay:
SpawnMapActors:
@@ -421,3 +421,4 @@ waypoint:
Waypoint:
RenderEditorOnly:
BodyOrientation:

View File

@@ -1,4 +1,3 @@
# Oil Derrick
V19:
Inherits: ^TechBuilding
CashTrickler:
@@ -7,7 +6,7 @@ V19:
Dimensions: 1,1
Tooltip:
Name: Oil Derrick
LeavesHusk:
LeavesHusk:
HuskActor: V19.Husk
V19.Husk:
@@ -19,7 +18,6 @@ V19.Husk:
Tooltip:
Name: Oil Derrick (Destroyed)
# Hospital
HOSP:
Inherits: ^TechBuilding
Selectable:
@@ -33,7 +31,7 @@ HOSP:
Type: InfantryHealing
Tooltip:
Name: Hospital
LeavesHusk:
LeavesHusk:
HuskActor: HOSP.Husk
HOSP.Husk:
@@ -44,7 +42,6 @@ HOSP.Husk:
Tooltip:
Name: Hospital (Destroyed)
# Bio Lab
BIO:
Inherits: ^TechBuilding
Building:
@@ -53,7 +50,7 @@ BIO:
Tooltip:
Name: Biological Lab
Exit@1:
SpawnOffset: 0,-10
SpawnOffset: 0,-426,0
ExitCell: 0,-1
Production:
Produces: Biolab
@@ -65,7 +62,7 @@ BIO:
ProductionBar:
RallyPoint:
RallyPoint: -1,-1
LeavesHusk:
LeavesHusk:
HuskActor: BIO.Husk
BIO.Husk:
@@ -76,7 +73,6 @@ BIO.Husk:
Tooltip:
Name: Biological Lab (Destroyed)
# Prison / Tech Center
MISS:
Inherits: ^CivBuilding
RenderBuilding:
@@ -90,4 +86,5 @@ MISS:
BuildPaletteOrder: 1000
Owner: None
Valued:
Cost: 2000
Cost: 2000

View File

@@ -3,7 +3,7 @@ SPLIT2:
RenderBuilding:
Palette: staticterrain
SeedsResource:
ResourceType:Tiberium
ResourceType: Tiberium
Interval: 55
Tooltip:
Name: Blossom Tree
@@ -18,7 +18,7 @@ SPLIT3:
RenderBuilding:
Palette: staticterrain
SeedsResource:
ResourceType:Tiberium
ResourceType: Tiberium
Interval: 55
Tooltip:
Name: Blossom Tree
@@ -33,7 +33,7 @@ SPLITBLUE:
RenderBuilding:
Palette: staticterrain
SeedsResource:
ResourceType:BlueTiberium
ResourceType: BlueTiberium
Interval: 110
Tooltip:
Name: Blossom Tree (blue)
@@ -45,16 +45,22 @@ SPLITBLUE:
ROCK1:
Inherits: ^Rock
ROCK2:
Inherits: ^Rock
ROCK3:
Inherits: ^Rock
ROCK4:
Inherits: ^Rock
ROCK5:
Inherits: ^Rock
ROCK6:
Inherits: ^Rock
ROCK7:
Inherits: ^Rock
@@ -90,16 +96,17 @@ T09:
Building:
Footprint: x_
Dimensions: 2,1
T10:
Inherits: ^Tree
Building:
Footprint: __ xx
T11:
Inherits: ^Tree
Building:
Footprint: __ xx
T12:
Inherits: ^Tree
@@ -126,9 +133,10 @@ T17:
Building:
Footprint: ___ xx_
Dimensions: 3,2
T18:
Inherits: ^Tree
TC01:
Inherits: ^Tree
Building:
@@ -158,3 +166,4 @@ TC05:
Building:
Footprint: __x_ xxx_ _xx_
Dimensions: 4,3

View File

@@ -12,23 +12,23 @@ MCV:
Selectable:
Priority: 3
Mobile:
Speed: 5
Speed: 71
Health:
HP: 750
Armor:
Armor:
Type: Light
RevealsShroud:
Range: 8
Transforms:
IntoActor: fact
Offset:-1,-1
Offset: -1,-1
Facing: 108
TransformSounds: constru2.aud, hvydoor1.aud
NoTransformSounds: deploy1.aud
RenderUnit:
MustBeDestroyed:
AttackMove:
JustMove:true
JustMove: true
BaseBuilding:
LeavesHusk:
HuskActor: MCV.Husk
@@ -61,15 +61,15 @@ HARV:
SearchFromProcRadius: 24
SearchFromOrderRadius: 12
Mobile:
Speed: 6
Speed: 85
Health:
HP: 600
Armor:
Armor:
Type: Heavy
RevealsShroud:
Range: 4
AttackMove:
JustMove:true
JustMove: true
LeavesHusk:
HuskActor: HARV.Husk
-GainsExperience:
@@ -88,7 +88,7 @@ APC:
Owner: gdi
Mobile:
ROT: 8
Speed: 9
Speed: 128
Health:
HP: 200
Armor:
@@ -136,7 +136,7 @@ ARTY:
Owner: nod
Mobile:
ROT: 2
Speed: 6
Speed: 85
Health:
HP: 75
Armor:
@@ -170,7 +170,7 @@ FTNK:
Owner: nod
Mobile:
ROT: 7
Speed: 8
Speed: 113
Health:
HP: 350
Armor:
@@ -204,7 +204,7 @@ BGGY:
Owner: nod
Mobile:
ROT: 12
Speed: 12
Speed: 170
Health:
HP: 120
Armor:
@@ -238,7 +238,7 @@ BIKE:
Owner: nod
Mobile:
ROT: 12
Speed: 15
Speed: 213
TerrainSpeeds:
Clear: 70
Rough: 35
@@ -261,7 +261,7 @@ BIKE:
AutoTarget:
LeavesHusk:
HuskActor: BIKE.Husk
JEEP:
Inherits: ^Vehicle
Valued:
@@ -275,7 +275,7 @@ JEEP:
Owner: gdi
Mobile:
ROT: 11
Speed: 11
Speed: 156
Health:
HP: 160
Armor:
@@ -308,8 +308,8 @@ LTNK:
Prerequisites: anyhq
Owner: nod
Mobile:
ROT: 7
Speed: 8
ROT: 7
Speed: 113
Health:
HP: 300
Armor:
@@ -346,7 +346,7 @@ MTNK:
Prerequisites: anyhq
Owner: gdi
Mobile:
Speed: 6
Speed: 85
Health:
HP: 400
Armor:
@@ -386,7 +386,7 @@ HTNK:
Owner: gdi
Mobile:
Crushes: wall, heavywall, crate, infantry
Speed: 4
Speed: 56
ROT: 3
Health:
HP: 900
@@ -436,7 +436,7 @@ MSAM:
Prerequisites: anyhq
Owner: gdi
Mobile:
Speed: 6
Speed: 85
ROT: 4
Health:
HP: 120
@@ -473,7 +473,7 @@ MLRS:
Prerequisites: anyhq
Owner: nod
Mobile:
Speed: 7
Speed: 99
ROT: 7
Health:
HP: 120
@@ -514,7 +514,7 @@ STNK:
Owner: nod
Mobile:
ROT: 8
Speed: 10
Speed: 142
Crushes: crate, infantry
Health:
HP: 150
@@ -551,7 +551,7 @@ MHQ:
Armor:
Type: Light
Mobile:
Speed: 6
Speed: 85
RevealsShroud:
Range: 6
RenderUnit:
@@ -563,3 +563,4 @@ MHQ:
Explodes:
Weapon: UnitExplodeSmall
EmptyWeapon: UnitExplodeSmall

View File

@@ -1,7 +1,7 @@
FlametankExplode:
Warhead:
Damage: 100
Spread: 24
Spread: 1c0
Explosion: big_napalm
InfDeath: 5
ImpactSound: xplobig6.aud
@@ -9,7 +9,7 @@ FlametankExplode:
HeliCrash:
Warhead:
Damage: 40
Spread: 10
Spread: 426
Explosion: poof
InfDeath: 4
ImpactSound: xplos.aud
@@ -23,7 +23,7 @@ HeliExplode:
UnitExplode:
Warhead:
Damage: 500
Spread: 10
Spread: 426
Versus:
None: 90%
Wood: 75%
@@ -36,7 +36,7 @@ UnitExplode:
UnitExplodeSmall:
Warhead:
Damage: 40
Spread: 10
Spread: 426
Versus:
None: 90%
Wood: 75%
@@ -49,7 +49,7 @@ UnitExplodeSmall:
GrenadierExplode:
Warhead:
Damage: 10
Spread: 9
Spread: 384
Versus:
None: 90%
Wood: 75%
@@ -64,7 +64,7 @@ Atomic:
Report: nukemisl.aud
Warhead@impact:
Damage: 1000
Spread:15
Spread: 640
Versus:
None: 90%
Wood: 60%
@@ -76,7 +76,7 @@ Atomic:
Warhead@areanukea:
Damage: 200
SmudgeType: Scorch
Spread: 60
Spread: 2c512
Size: 3
Ore: true
Versus:
@@ -90,7 +90,7 @@ Atomic:
Warhead@areanukeb:
Damage: 200
SmudgeType: Scorch
Spread:90
Spread: 3c768
Size: 4
Ore: true
Versus:
@@ -103,7 +103,7 @@ Atomic:
Warhead@areanukec:
Damage: 200
SmudgeType: Scorch
Spread: 120
Spread: 5c0
Size: 5
Ore: true
Versus:
@@ -116,7 +116,7 @@ Atomic:
Warhead@areanuke:
Damage: 200
SmudgeType: Scorch
Spread: 150
Spread: 6c256
Size: 6
Ore: true
Versus:
@@ -131,7 +131,7 @@ IonCannon:
ValidTargets: Ground, Air
Warhead@impact:
Damage: 900
Spread: 16
Spread: 682
Ore: true
Versus:
None: 100%
@@ -151,12 +151,12 @@ IonCannon:
Sniper:
Report: RAMGUN2.AUD
ROF: 40
Range: 6
Range: 6c0
Projectile: Bullet
Speed: 100
Speed: 1c682
Warhead:
Damage: 100
Spread: 1
Spread: 42
Versus:
None: 100%
Wood: 5%
@@ -166,13 +166,13 @@ Sniper:
HighV:
ROF: 30
Range: 6
Range: 6c0
Report: GUN8.AUD
Projectile: Bullet
Speed: 100
Speed: 1c682
Warhead:
Damage: 50
Spread: 3
Spread: 128
Versus:
None: 100%
Wood: 50%
@@ -185,14 +185,14 @@ HeliAGGun:
ROF: 20
Burst: 2
BurstDelay: 0
Range: 4
Range: 4c0
ValidTargets: Ground
Report: gun5.aud
Projectile: Bullet
Speed: 100
Speed: 1c682
Warhead:
Damage: 20
Spread: 6
Spread: 256
Versus:
None: 100%
Wood: 50%
@@ -205,14 +205,14 @@ HeliAAGun:
ROF: 20
Burst: 2
BurstDelay: 0
Range: 4
Range: 4c0
ValidTargets: Air
Report: gun5.aud
Projectile: Bullet
Speed: 100
Speed: 1c682
Warhead:
Damage: 20
Spread: 3
Spread: 128
Versus:
None: 100%
Wood: 50%
@@ -223,13 +223,13 @@ HeliAAGun:
Pistol:
ROF: 7
Range: 3
Range: 3c0
Report: GUN18.AUD
Projectile: Bullet
Speed: 100
Speed: 1c682
Warhead:
Spread: 3
Versus:
Spread: 128
Versus:
None: 100%
Wood: 50%
Light: 50%
@@ -240,13 +240,13 @@ Pistol:
M16:
ROF: 20
Range: 4
Range: 4c0
Report: MGUN2.AUD
Projectile: Bullet
Speed: 100
Speed: 1c682
Warhead:
Spread: 3
Versus:
Spread: 128
Versus:
None: 100%
Wood: 25%
Light: 30%
@@ -257,22 +257,22 @@ M16:
Rockets:
ROF: 50
Range: 6
Range: 6c0
Report: BAZOOK1.AUD
ValidTargets: Ground, Air
Projectile: Missile
Arm: 0
High: yes
Shadow: no
Inaccuracy: 3
Inaccuracy: 128
Image: DRAGON
ROT: 15
Trail: smokey
ContrailLength: 8
Speed: 35
Speed: 298
RangeLimit: 30
Warhead:
Spread: 3
Spread: 128
Versus:
None: 50%
Wood: 85%
@@ -287,7 +287,7 @@ Rockets:
BikeRockets:
ROF: 50
Range: 6
Range: 6c0
Report: BAZOOK1.AUD
ValidTargets: Ground, Air
Burst: 2
@@ -296,16 +296,16 @@ BikeRockets:
Arm: 0
High: yes
Shadow: no
Inaccuracy: 3
Inaccuracy: 128
Image: DRAGON
ROT: 10
Trail: smokey
ContrailLength: 8
Speed: 35
Speed: 298
RangeLimit: 40
Warhead:
Spread: 3
Versus:
Spread: 128
Versus:
None: 65%
Wood: 50%
Light: 100%
@@ -321,22 +321,22 @@ OrcaAGMissiles:
ROF: 15
Burst: 2
BurstDelay: 15
Range: 5
Range: 5c0
Report: BAZOOK1.AUD
ValidTargets: Ground
Projectile: Missile
Arm: 0
High: yes
Shadow: no
Inaccuracy: 3
Inaccuracy: 128
Image: DRAGON
ROT: 10
Trail: smokey
ContrailLength: 8
Speed: 25
Speed: 213
RangeLimit: 30
Warhead:
Spread: 3
Spread: 128
Versus:
None: 50%
Wood: 100%
@@ -352,22 +352,22 @@ OrcaAAMissiles:
ROF: 15
Burst: 2
BurstDelay: 15
Range: 5
Range: 5c0
Report: BAZOOK1.AUD
ValidTargets: Air
Projectile: Missile
Arm: 0
High: yes
Shadow: no
Inaccuracy: 3
Inaccuracy: 128
Image: DRAGON
ROT: 10
Trail: smokey
ContrailLength: 8
Speed: 25
Speed: 213
RangeLimit: 30
Warhead:
Spread: 3
Spread: 128
Versus:
None: 50%
Wood: 100%
@@ -381,12 +381,12 @@ OrcaAAMissiles:
Flamethrower:
ROF: 50
Range: 2.5
Range: 2c512
Report: FLAMER2.AUD
Projectile: Bullet
Speed: 100
Speed: 1c682
Warhead:
Spread: 8
Spread: 341
Versus:
None: 90%
Wood: 100%
@@ -400,14 +400,14 @@ Flamethrower:
BigFlamer:
ROF: 50
Range: 3.5
Range: 3c512
Report: FLAMER2.AUD
Projectile: Bullet
Speed: 20
Burst:2
BurstDelay:25
Speed: 341
Burst: 2
BurstDelay: 25
Warhead:
Spread: 8
Spread: 341
Versus:
None: 100%
Wood: 100%
@@ -421,13 +421,13 @@ BigFlamer:
Chemspray:
ROF: 70
Range: 3
Range: 3c0
Report: FLAMER2.AUD
Projectile: Bullet
Speed: 100
Speed: 1c682
Warhead:
Damage: 80
Spread: 6
Spread: 256
Versus:
None: 100%
Wood: 75%
@@ -440,16 +440,16 @@ Chemspray:
Grenade:
ROF: 50
Range: 5
Range: 5c0
Report: toss1.aud
Projectile: Bullet
Speed: 12
Speed: 204
High: yes
Angle: .1
Inaccuracy: 5
Angle: 62
Inaccuracy: 213
Image: BOMB
Warhead:
Spread: 6
Spread: 256
Versus:
None: 90%
Wood: 75%
@@ -463,13 +463,13 @@ Grenade:
70mm:
ROF: 38
Range: 4
Range: 4c0
Report: TNKFIRE3.AUD
Projectile: Bullet
Image: 120MM
Speed: 60
Speed: 1c0
Warhead:
Spread: 3
Spread: 128
Versus:
None: 30%
Wood: 75%
@@ -484,13 +484,13 @@ Grenade:
105mm:
ROF: 50
Range: 4.75
Range: 4c768
Report: TNKFIRE4.AUD
Projectile: Bullet
Image: 120MM
Speed: 40
Speed: 682
Warhead:
Spread: 3
Spread: 128
Versus:
None: 30%
Wood: 75%
@@ -504,13 +504,13 @@ Grenade:
120mm:
ROF: 50
Range: 4.75
Range: 4c768
Report: TNKFIRE6.AUD
Projectile: Bullet
Image: 120MM
Speed: 40
Speed: 682
Warhead:
Spread: 3
Spread: 128
Versus:
None: 30%
Wood: 75%
@@ -525,15 +525,15 @@ Grenade:
120mmDual:
ROF: 60
Range: 4.75
Range: 4c768
Report: TNKFIRE6.AUD
Burst: 2
BurstDelay: 5
Projectile: Bullet
Image: 120MM
Speed: 40
Speed: 682
Warhead:
Spread: 3
Spread: 128
Versus:
None: 30%
Wood: 75%
@@ -548,13 +548,13 @@ Grenade:
TurretGun:
ROF: 25
Range: 6
Range: 6c0
Report: TNKFIRE6.AUD
Projectile: Bullet
Image: 120MM
Speed: 50
Speed: 853
Warhead:
Spread: 3
Spread: 128
Versus:
None: 25%
Wood: 25%
@@ -568,7 +568,7 @@ TurretGun:
MammothMissiles:
ROF: 100
Range: 5
Range: 5c0
Report: ROCKET1.AUD
ValidTargets: Ground, Air
Burst: 2
@@ -576,15 +576,15 @@ MammothMissiles:
Arm: 0
High: yes
Shadow: no
Inaccuracy: 3
Inaccuracy: 128
Image: DRAGON
ROT: 10
Trail: smokey
ContrailLength: 8
Speed: 25
Speed: 213
RangeLimit: 35
Warhead:
Spread: 6
Spread: 256
Versus:
None: 40%
Wood: 75%
@@ -596,10 +596,10 @@ MammothMissiles:
SmudgeType: Crater
Damage: 75
227mm:
227mm:
ROF: 140
Range: 12
MinRange: 3
Range: 12c0
MinRange: 3c0
Burst: 4
BurstDelay: 4
Report: ROCKET1.AUD
@@ -608,15 +608,15 @@ MammothMissiles:
Arm: 5
High: yes
Shadow: yes
Inaccuracy: 20
Angle: 0.1
Inaccuracy: 853
Angle: 62
Image: DRAGON
ROT: 2
ContrailLength: 10
Trail: smokey
Speed: 20
Speed: 341
Warhead:
Spread: 15
Spread: 640
Versus:
None: 25%
Wood: 30%
@@ -630,7 +630,7 @@ MammothMissiles:
227mm.stnk:
ROF: 70
Range: 7
Range: 7c0
Report: ROCKET1.AUD
Burst: 2
BurstDelay: 10
@@ -639,15 +639,15 @@ MammothMissiles:
Arm: 0
High: yes
Shadow: yes
Inaccuracy: 5
Inaccuracy: 213
Image: DRAGON
ROT: 10
Trail: smokey
ContrailLength: 8
Speed: 25
Speed: 213
RangeLimit: 55
Warhead:
Spread: 3
Spread: 128
Versus:
None: 35%
Wood: 50%
@@ -661,19 +661,19 @@ MammothMissiles:
ArtilleryShell:
ROF: 65
Range: 11
MinRange: 2
Range: 11c0
MinRange: 2c0
Report: TNKFIRE2.AUD
Projectile: Bullet
Speed: 12
Speed: 204
High: yes
Angle: .09
Inaccuracy: 30
Angle: 56
Inaccuracy: 1c256
ContrailLength: 30
Image: 120MM
Warhead:
Damage: 150
Spread: 6
Spread: 256
Versus:
None: 90%
Wood: 50%
@@ -687,12 +687,12 @@ ArtilleryShell:
MachineGun:
ROF: 20
Burst: 4
Range: 4
Range: 4c0
Report: MGUN11.AUD
Projectile: Bullet
Speed: 100
Speed: 1c682
Warhead:
Spread: 3
Spread: 128
Versus:
None: 100%
Wood: 25%
@@ -705,7 +705,7 @@ MachineGun:
BoatMissile:
ROF: 35
Range: 8
Range: 8c0
Burst: 2
BurstDelay: 7
Report: ROCKET2.AUD
@@ -713,16 +713,16 @@ BoatMissile:
Arm: 0
High: yes
Shadow: no
Inaccuracy: 5
Inaccuracy: 213
Image: DRAGON
ROT: 10
Trail: smokey
ContrailLength: 8
Speed: 20
Speed: 170
RangeLimit: 60
Warhead:
Spread: 6
Versus:
Spread: 256
Versus:
None: 90%
Wood: 75%
Light: 60%
@@ -735,7 +735,7 @@ BoatMissile:
TowerMissle:
ROF: 24
Range: 8
Range: 8c0
Report: ROCKET2.AUD
ValidTargets: Ground, Air
Burst: 2
@@ -744,16 +744,16 @@ TowerMissle:
Arm: 0
High: yes
Shadow: no
Inaccuracy: 3
Inaccuracy: 128
Image: DRAGON
ROT: 20
Trail: smokey
ContrailLength: 8
Speed: 35
Speed: 298
RangeLimit: 40
Warhead:
Spread: 12
Versus:
Spread: 512
Versus:
None: 25%
Wood: 25%
Light: 100%
@@ -767,13 +767,13 @@ TowerMissle:
Vulcan:
ValidTargets: Ground, Water
ROF: 2
Range: 6
Range: 6c0
Report: gun5.aud
Projectile: Bullet
Speed: 100
Speed: 1c682
Warhead:
Damage: 75
Spread: 10
Spread: 426
Versus:
None: 100%
Wood: 50%
@@ -785,13 +785,13 @@ Vulcan:
Napalm:
ValidTargets: Ground, Water
ROF: 4
Range: 2
Range: 2c0
Burst: 2
BurstDelay: 2
Projectile: GravityBomb
Image: BOMBLET
Warhead:
Spread: 20
Spread: 853
Versus:
None: 90%
Wood: 100%
@@ -806,7 +806,7 @@ Napalm:
Napalm.Crate:
Warhead:
Spread: 4
Spread: 170
Versus:
None: 90%
Wood: 100%
@@ -820,14 +820,14 @@ Napalm.Crate:
Laser:
ROF: 90
Range: 8.5
Range: 8c512
Charges: true
Report: OBELRAY1.AUD
Projectile: LaserZap
BeamWidth: 2
HitAnim: laserfire
Warhead:
Spread: 1
Spread: 42
Versus:
Wood: 50%
InfDeath: 5
@@ -836,7 +836,7 @@ Laser:
SAMMissile:
ROF: 15
Range: 10
Range: 10c0
Report: ROCKET2.AUD
ValidTargets: Air
Projectile: Missile
@@ -845,12 +845,12 @@ SAMMissile:
Shadow: no
Image: MISSILE
ROT: 20
Speed: 50
Speed: 426
RangeLimit: 35
Trail: smokey
ContrailLength: 8
Warhead: AP
Spread: 16
Spread: 682
Versus:
None: 100%
Wood: 100%
@@ -864,20 +864,20 @@ SAMMissile:
HonestJohn:
ROF: 200
Range: 10
Range: 10c0
Report: ROCKET1.AUD
Projectile: Bullet
Arm: 10
High: yes
Shadow: yes
Inaccuracy: 5
Inaccuracy: 213
Image: patriot
Trail: smokey
Speed: 11
Speed: 187
RangeLimit: 35
Angle: .15
Angle: 88
Warhead:
Spread: 6
Spread: 256
Versus:
None: 90%
Wood: 75%
@@ -892,7 +892,7 @@ HonestJohn:
Tiberium:
ROF: 4
Warhead:
Spread: 1
Spread: 42
InfDeath: 6
Damage: 1
PreventProne: yes
@@ -900,19 +900,19 @@ Tiberium:
Heal:
ROF: 4
Warhead:
Spread: 1
Spread: 42
Damage: -1
PreventProne: yes
APCGun:
ROF: 12
Range: 5
Range: 5c0
Report: gun20.aud
ValidTargets: Ground
Projectile: Bullet
Speed: 100
Speed: 1c682
Warhead:
Spread: 3
Spread: 128
Versus:
None: 35%
Wood: 50%
@@ -920,17 +920,17 @@ APCGun:
Heavy: 20%
Explosion: small_poof
Damage: 15
APCGun.AA:
ROF: 12
Range: 7
Range: 7c0
Report: gun20.aud
ValidTargets: Air
Projectile: Bullet
Speed: 100
Speed: 1c682
High: true
Warhead:
Spread: 3
Spread: 128
Versus:
Heavy: 50%
Explosion: small_poof
@@ -938,8 +938,8 @@ APCGun.AA:
Patriot:
ROF: 30
Range: 10
MinRange: 1
Range: 10c0
MinRange: 1c0
Burst: 2
BurstDelay: 15
Report: ROCKET2.AUD
@@ -951,11 +951,11 @@ Patriot:
Trail: smokey
ContrailLength: 8
ROT: 20
Speed: 50
Speed: 426
RangeLimit: 30
Angle: .15
Angle: 88
Warhead: AP
Spread: 16
Spread: 682
Versus:
None: 100%
Wood: 100%
@@ -969,10 +969,10 @@ Patriot:
Tail:
ROF: 30
Range: 1
Range: 1c0
Projectile: Bullet
Warhead:
Spread: 5
Spread: 213
Versus:
None: 90%
Wood: 10%
@@ -984,10 +984,10 @@ Tail:
Horn:
ROF: 20
Range: 1
Range: 1c0
Projectile: Bullet
Warhead:
Spread: 5
Spread: 213
Versus:
None: 90%
Wood: 10%
@@ -999,10 +999,10 @@ Horn:
Teeth:
ROF: 30
Range: 1
Range: 1c0
Projectile: Bullet
Warhead:
Spread: 5
Spread: 213
Versus:
None: 90%
Wood: 10%
@@ -1014,10 +1014,10 @@ Teeth:
Claw:
ROF: 10
Range: 1
Range: 1c0
Projectile: Bullet
Warhead:
Spread: 5
Spread: 213
Versus:
None: 90%
Wood: 10%
@@ -1025,4 +1025,5 @@ Claw:
Heavy: 10%
Concrete: 10%
InfDeath: 1
Damage: 60
Damage: 60

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More