diff --git a/OpenRA.Game/Effects/NukeLaunch.cs b/OpenRA.Game/Effects/NukeLaunch.cs new file mode 100644 index 0000000000..1b5f1546b8 --- /dev/null +++ b/OpenRA.Game/Effects/NukeLaunch.cs @@ -0,0 +1,90 @@ +#region Copyright & License Information +/* + * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. + * This file is part of OpenRA. + * + * OpenRA is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * OpenRA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenRA. If not, see . + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using OpenRA.Traits; +using OpenRA.GameRules; +using OpenRA.Graphics; + +namespace OpenRA.Effects +{ + class NukeLaunch : IEffect + { + readonly ProjectileInfo projectileUp, projectileDown; + readonly Actor silo; + Animation anim; + float2 pos; + int2 targetLocation; + readonly int targetAltitude = 400; + int altitude; + bool goingUp = true; + WeaponInfo weapon; + + public NukeLaunch(Actor silo, string weapon, int2 targetLocation) + { + this.silo = silo; + this.targetLocation = targetLocation; + this.weapon = Rules.WeaponInfo[weapon]; + projectileUp = Rules.ProjectileInfo["NukeUp"]; + projectileDown = Rules.ProjectileInfo["NukeDown"]; + + anim = new Animation(projectileUp.Image); + anim.PlayRepeating("idle"); + pos = silo.CenterLocation; + } + + public void Tick(World world) + { + anim.Tick(); + + if (goingUp) + { + altitude += 10; + if (altitude >= targetAltitude) + { + pos = OpenRA.Traits.Util.CenterOfCell(targetLocation); + anim = new Animation(projectileDown.Image); + anim.PlayRepeating("idle"); + goingUp = false; + } + } + else + { + altitude -= 10; + if (altitude <= 0) + Explode(world); + } + } + + void Explode(World world) + { + world.AddFrameEndTask(w => w.Remove(this)); + Combat.DoImpact(pos.ToInt2(), pos.ToInt2(), weapon, Rules.ProjectileInfo[weapon.Projectile], Rules.WarheadInfo[weapon.Warhead], silo); + } + + public IEnumerable Render() + { + yield return new Renderable(anim.Image, pos - 0.5f * anim.Image.size - new float2(0, altitude), "effect"); + } + } +} diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index 3d073ffd22..48cf1edd44 100644 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -1,4 +1,4 @@ - + Debug @@ -77,6 +77,7 @@ + diff --git a/OpenRA.Game/Traits/SupportPowers/NukePower.cs b/OpenRA.Game/Traits/SupportPowers/NukePower.cs index 5aa75ec439..19ec54ad9b 100644 --- a/OpenRA.Game/Traits/SupportPowers/NukePower.cs +++ b/OpenRA.Game/Traits/SupportPowers/NukePower.cs @@ -20,6 +20,7 @@ using System.Collections.Generic; using System.Linq; +using OpenRA.Effects; namespace OpenRA.Traits { @@ -56,8 +57,8 @@ namespace OpenRA.Traits if (Owner != Owner.World.LocalPlayer) Sound.Play("alaunch1.aud"); - // TODO: FIRE ZE MISSILES - //w.Add(new NukeLaunch(silo)); + //FIRE ZE MISSILES + w.Add(new NukeLaunch(silo, Info.MissileWeapon, order.TargetLocation)); }); Game.controller.CancelInputMode(); diff --git a/OpenRA.Game/Traits/SupportPowers/SupportPower.cs b/OpenRA.Game/Traits/SupportPowers/SupportPower.cs index 8736744033..ab3a6e19c4 100644 --- a/OpenRA.Game/Traits/SupportPowers/SupportPower.cs +++ b/OpenRA.Game/Traits/SupportPowers/SupportPower.cs @@ -33,6 +33,7 @@ namespace OpenRA.Traits public readonly string[] Prerequisites = { }; public readonly int TechLevel = -1; public readonly bool GivenAuto = true; + public readonly string MissileWeapon = ""; public abstract object Create(Actor self); } diff --git a/mods/ra/rules.ini b/mods/ra/rules.ini index b699902464..5258c70d6b 100644 --- a/mods/ra/rules.ini +++ b/mods/ra/rules.ini @@ -445,6 +445,12 @@ Speed=25 Warhead=HE Report=MISSILE1 +;Nuke (special case for Nuclear missile) +[Atomic] +Damage=1000 +Projectile=NukeDown +Warhead=Nuke + ; ******* Projectile Statistics ******* ; Projectiles describe how and what image to use as the weapon flies @@ -817,6 +823,7 @@ DogJaw Heal SCUD UnitExplode +Atomic [TeslaZap] RenderAsTesla=true diff --git a/mods/ra/rules.yaml b/mods/ra/rules.yaml index f0b863a7eb..622d0c8cea 100644 --- a/mods/ra/rules.yaml +++ b/mods/ra/rules.yaml @@ -50,6 +50,7 @@ Player: LongDesc: Launches a nuclear missile at a target location. Prerequisites: MSLO TechLevel: 12 + MissileWeapon: atomic SonarPulsePower: Image: sonricon ChargeTime: 10 diff --git a/mods/ra/sequences.xml b/mods/ra/sequences.xml index bfb1ceb239..d77d964f61 100644 --- a/mods/ra/sequences.xml +++ b/mods/ra/sequences.xml @@ -1,4 +1,4 @@ - +