diff --git a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj
index e92664825f..ba122626d5 100644
--- a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj
+++ b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj
@@ -60,6 +60,7 @@
+
diff --git a/OpenRA.Mods.Cnc/RenderGunboat.cs b/OpenRA.Mods.Cnc/RenderGunboat.cs
new file mode 100644
index 0000000000..743e1bcb1e
--- /dev/null
+++ b/OpenRA.Mods.Cnc/RenderGunboat.cs
@@ -0,0 +1,71 @@
+#region Copyright & License Information
+/*
+ * Copyright 2007-2010 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 LICENSE.
+ */
+#endregion
+
+using OpenRA.Graphics;
+using OpenRA.Traits;
+
+namespace OpenRA.Mods.RA.Render
+{
+ class RenderGunboatInfo : RenderUnitInfo
+ {
+ public override object Create(ActorInitializer init) { return new RenderGunboat(init.self); }
+ }
+
+ class RenderGunboat : RenderSimple, INotifyDamage
+ {
+ IFacing facing;
+ public RenderGunboat(Actor self)
+ : base(self, () => self.HasTrait() ? self.Trait().turretFacing : 0)
+ {
+ facing = self.Trait();
+
+ anim.Play("left");
+ anims.Add( "smoke", new AnimationWithOffset( new Animation( "smoke_m" ), null, () => !isSmoking ) );
+ }
+
+ string lastDir = "left";
+ string lastDamage = "";
+ public override void Tick(Actor self)
+ {
+ var dir = (facing.Facing > 128) ? "right" : "left";
+ if (dir != lastDir)
+ anim.ReplaceAnim((lastDir = dir)+lastDamage);
+
+ base.Tick(self);
+ }
+
+ bool isSmoking;
+ public void Damaged(Actor self, AttackInfo e)
+ {
+ // Damagestate
+ if (e.DamageStateChanged)
+ {
+ if (e.DamageState >= DamageState.Critical)
+ lastDamage = "-critical";
+ else if (e.DamageState >= DamageState.Heavy)
+ lastDamage = "-damaged";
+ else if (e.DamageState < DamageState.Heavy)
+ lastDamage = "";
+ anim.ReplaceAnim(lastDir+lastDamage);
+ }
+
+ // Smoking
+ if (e.DamageState < DamageState.Heavy) return;
+ if (isSmoking) return;
+
+ isSmoking = true;
+ var smoke = anims[ "smoke" ].Animation;
+ smoke.PlayThen( "idle",
+ () => smoke.PlayThen( "loop",
+ () => smoke.PlayBackwardsThen( "end",
+ () => isSmoking = false ) ) );
+ }
+ }
+}
diff --git a/mods/cnc/defaults.yaml b/mods/cnc/defaults.yaml
index c8c7787cb6..41d0c94290 100644
--- a/mods/cnc/defaults.yaml
+++ b/mods/cnc/defaults.yaml
@@ -136,6 +136,8 @@
Crushes: crate
TerrainTypes: Clear, Rough, Road, Tree, Water, Rock, Wall, Ore, Beach, River
TerrainSpeeds: 0%, 0%, 0%, 0%, 100%, 0%, 0%, 0%, 0%, 0%
+ Selectable:
+ Voice: GenericVoice
Targetable:
TargetTypes: Ground, Water
HiddenUnderFog:
diff --git a/mods/cnc/sequences-vehicles.xml b/mods/cnc/sequences-vehicles.xml
index 9008b570e9..a84e3c2569 100644
--- a/mods/cnc/sequences-vehicles.xml
+++ b/mods/cnc/sequences-vehicles.xml
@@ -109,14 +109,12 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/mods/cnc/vehicles.yaml b/mods/cnc/vehicles.yaml
index 34fb8e7eb4..d312de8dbb 100644
--- a/mods/cnc/vehicles.yaml
+++ b/mods/cnc/vehicles.yaml
@@ -533,7 +533,9 @@ BOAT:
ROT: 7
AttackTurreted:
PrimaryWeapon: BoatMissile
- RenderUnitTurreted:
+ PrimaryOffset: 0,-15,0,-4
+ PrimaryLocalOffset: -3,-5,0,3,-5,0,0,-5,0
+ RenderGunboat:
AutoTarget:
LST:
diff --git a/mods/cnc/weapons.yaml b/mods/cnc/weapons.yaml
index 550ad26a71..e4f85b6f16 100644
--- a/mods/cnc/weapons.yaml
+++ b/mods/cnc/weapons.yaml
@@ -382,6 +382,8 @@ MachineGun:
BoatMissile:
ROF: 35
Range: 8
+ Burst: 6
+ BurstDelay: 7
Report: ROCKET2
Missile:
Arm: 5
@@ -401,7 +403,7 @@ BoatMissile:
Explosion: 5
ImpactSound: xplos
SmudgeType: Crater
- Damage: 60
+ Damage: 10
Tomahawk:
ROF: 40