#region Copyright & License Information /* * Copyright 2007-2011 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.Collections.Generic; using System.Linq; using OpenRA.Mods.RA.Move; using OpenRA.Traits; namespace OpenRA.Mods.RA.Missions { class DesertShellmapScriptInfo : TraitInfo, Requires { } class DesertShellmapScript : ITick, IWorldLoaded { World world; Player allies; Player soviets; List viewportTargets = new List(); int2 viewportTarget; int viewportTargetNumber; int2 viewportOrigin; float mul; float div = 400; int waitTicks = 0; Actor attackLocation; Actor coastRP1; Actor coastRP2; int coastUnitsLeft; static readonly string[] CoastUnits = { "e1", "e1", "e2", "e3", "e4" }; Actor paradropLZ; Actor paradropEntry; static readonly string[] ParadropUnits = { "e1", "e1", "e1", "e2", "e2" }; Dictionary mapActors; public void Tick(Actor self) { MissionUtils.CapOre(soviets); if (world.FrameNumber % 20 == 0 && coastUnitsLeft-- > 0) { var u = world.CreateActor(CoastUnits.Random(world.SharedRandom), soviets, coastRP1.Location, null); u.QueueActivity(new Move.Move(coastRP2.Location, 0)); u.QueueActivity(new AttackMove.AttackMoveActivity(u, new Move.Move(attackLocation.Location, 0))); } if (world.FrameNumber % 25 == 0) foreach (var actor in world.Actors.Where(a => a.IsInWorld && a.Owner == soviets && a.IsIdle && !a.IsDead() && a.HasTrait() && a.HasTrait()) .Except(mapActors.Values)) actor.QueueActivity(new AttackMove.AttackMoveActivity(actor, new Move.Move(attackLocation.Location, 0))); if (--waitTicks <= 0) { if (++mul <= div) Game.MoveViewport(float2.Lerp(viewportOrigin, viewportTarget, mul / div)); else { mul = 0; viewportOrigin = viewportTarget; viewportTarget = viewportTargets[(viewportTargetNumber = (viewportTargetNumber + 1) % viewportTargets.Count)]; waitTicks = 100; if (viewportTargetNumber == 0) coastUnitsLeft = 15; if (viewportTargetNumber == 1) MissionUtils.Paradrop(world, soviets, ParadropUnits, paradropEntry.Location, paradropLZ.Location); } } } public void WorldLoaded(World w) { world = w; allies = w.Players.Single(p => p.InternalName == "Allies"); soviets = w.Players.Single(p => p.InternalName == "Soviets"); mapActors = w.WorldActor.Trait().Actors; attackLocation = mapActors["AttackLocation"]; coastRP1 = mapActors["CoastRP1"]; coastRP2 = mapActors["CoastRP2"]; paradropLZ = mapActors["ParadropLZ"]; paradropEntry = mapActors["ParadropEntry"]; var t1 = mapActors["ViewportTarget1"]; var t2 = mapActors["ViewportTarget2"]; var t3 = mapActors["ViewportTarget3"]; var t4 = mapActors["ViewportTarget4"]; var t5 = mapActors["ViewportTarget5"]; viewportTargets = new[] { t1, t2, t3, t4, t5 }.Select(t => t.Location.ToInt2()).ToList(); foreach (var actor in mapActors.Values.Where(a => a.Owner == allies || a.HasTrait())) { if (actor.Owner == allies && actor.HasTrait()) actor.Trait().stance = UnitStance.Defend; actor.AddTrait(new Invulnerable()); } viewportOrigin = viewportTargets[0]; viewportTargetNumber = 1; viewportTarget = viewportTargets[1]; Game.viewport.Center(viewportOrigin); Sound.SoundVolumeModifier = 0.25f; } } }