Convert timer actions to be properties

This commit is contained in:
Scott_NZ
2012-08-11 11:36:26 +12:00
parent 81e2c1d2d7
commit a30d82b333

View File

@@ -1,235 +1,244 @@
#region Copyright & License Information #region Copyright & License Information
/* /*
* Copyright 2007-2012 The OpenRA Developers (see AUTHORS) * Copyright 2007-2012 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made * 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 * available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information, * as published by the Free Software Foundation. For more information,
* see COPYING. * see COPYING.
*/ */
#endregion #endregion
using System; using System;
using System.Drawing; using System.Drawing;
using System.Linq; using System.Linq;
using OpenRA.FileFormats; using OpenRA.FileFormats;
using OpenRA.Traits; using OpenRA.Traits;
using OpenRA.Widgets; using OpenRA.Widgets;
namespace OpenRA.Mods.RA.Missions namespace OpenRA.Mods.RA.Missions
{ {
class Allies02ScriptInfo : TraitInfo<Allies02Script>, Requires<SpawnMapActorsInfo> { } class Allies02ScriptInfo : TraitInfo<Allies02Script>, Requires<SpawnMapActorsInfo> { }
class Allies02Script : IWorldLoaded, ITick class Allies02Script : IWorldLoaded, ITick
{ {
static readonly string[] objectives = static readonly string[] objectives =
{ {
"Destroy the SAM sites. Tanya and Einstein must survive.", "Destroy the SAM sites. Tanya and Einstein must survive.",
"Wait for the helicopter and extract Einstein. Tanya and Einstein must survive." "Wait for the helicopter and extract Einstein. Tanya and Einstein must survive."
}; };
int currentObjective; int currentObjective;
Actor sam1; Actor sam1;
Actor sam2; Actor sam2;
Actor sam3; Actor sam3;
Actor sam4; Actor sam4;
Actor tanya; Actor tanya;
Actor einstein; Actor einstein;
Actor chinookHusk; Actor chinookHusk;
Actor allies2BasePoint; Actor allies2BasePoint;
Actor reinforcementsEntryPoint; Actor reinforcementsEntryPoint;
World world; World world;
Player allies1; Player allies1;
Player allies2; Player allies2;
Player soviets; Player soviets;
CountdownTimerWidget reinfTimer; CountdownTimerWidget reinfTimer;
const int CountdownTicks = 18000; const int CountdownTicks = /*18000;*/300;
static readonly string[] reinforcements = { "1tnk", "1tnk", "jeep", "mcv" }; static readonly string[] reinforcements = { "1tnk", "1tnk", "jeep", "mcv" };
void DisplayObjective() void DisplayObjective()
{ {
Game.AddChatLine(Color.LimeGreen, "Objective", objectives[currentObjective]); Game.AddChatLine(Color.LimeGreen, "Objective", objectives[currentObjective]);
Sound.Play("bleep6.aud"); Sound.Play("bleep6.aud");
} }
void MissionFailed(Actor self, string text) void MissionFailed(Actor self, string text)
{ {
if (allies1.WinState != WinState.Undefined) if (allies1.WinState != WinState.Undefined)
{ {
return; return;
} }
allies1.WinState = allies2.WinState = WinState.Lost; allies1.WinState = allies2.WinState = WinState.Lost;
Game.AddChatLine(Color.Red, "Mission failed", text); Game.AddChatLine(Color.Red, "Mission failed", text);
Sound.Play("misnlst1.aud"); Sound.Play("misnlst1.aud");
} }
void MissionAccomplished(Actor self, string text) void MissionAccomplished(Actor self, string text)
{ {
if (allies1.WinState != WinState.Undefined) if (allies1.WinState != WinState.Undefined)
{ {
return; return;
} }
allies1.WinState = allies2.WinState = WinState.Won; allies1.WinState = allies2.WinState = WinState.Won;
Game.AddChatLine(Color.Blue, "Mission accomplished", text); Game.AddChatLine(Color.Blue, "Mission accomplished", text);
Sound.Play("misnwon1.aud"); Sound.Play("misnwon1.aud");
} }
public void Tick(Actor self) public void Tick(Actor self)
{ {
// display current objective every so often // display current objective every so often
if (self.World.FrameNumber % 1500 == 1) if (self.World.FrameNumber % 1500 == 1)
{ {
DisplayObjective(); DisplayObjective();
} }
if (currentObjective == 0) if (currentObjective == 0)
{ {
if (sam1.Destroyed && sam2.Destroyed && sam3.Destroyed && sam4.Destroyed) if (sam1.Destroyed && sam2.Destroyed && sam3.Destroyed && sam4.Destroyed)
{ {
currentObjective++; currentObjective++;
DisplayObjective(); DisplayObjective();
} }
} }
else if (currentObjective == 1) else if (currentObjective == 1)
{ {
} }
if (tanya.Destroyed) if (tanya.Destroyed)
{ {
MissionFailed(self, "Tanya was killed."); MissionFailed(self, "Tanya was killed.");
} }
if (einstein.Destroyed) if (einstein.Destroyed)
{ {
MissionFailed(self, "Einstein was killed."); MissionFailed(self, "Einstein was killed.");
} }
} }
void StartReinforcementsTimer() void StartReinforcementsTimer()
{ {
reinfTimer.IsVisible = () => true; reinfTimer.IsVisible = () => true;
Sound.Play("timergo1.aud"); Sound.Play("timergo1.aud");
} }
void TimerExpired() void TimerExpired()
{ {
reinfTimer.IsVisible = () => false; reinfTimer.IsVisible = () => false;
SendReinforcements(); SendReinforcements();
} }
void SendReinforcements() void SendReinforcements()
{ {
Sound.Play("reinfor1.aud"); Sound.Play("reinfor1.aud");
foreach (var unit in reinforcements) foreach (var unit in reinforcements)
{ {
var actor = world.CreateActor(unit, new TypeDictionary { new LocationInit(reinforcementsEntryPoint.Location), new FacingInit(0), new OwnerInit(allies2) }); var actor = world.CreateActor(unit, new TypeDictionary { new LocationInit(reinforcementsEntryPoint.Location), new FacingInit(0), new OwnerInit(allies2) });
actor.QueueActivity(new Move.Move(allies2BasePoint.Location)); actor.QueueActivity(new Move.Move(allies2BasePoint.Location));
} }
} }
public void WorldLoaded(World w) public void WorldLoaded(World w)
{ {
world = w; world = w;
allies1 = w.Players.Single(p => p.InternalName == "Allies1"); allies1 = w.Players.Single(p => p.InternalName == "Allies1");
allies2 = w.Players.Single(p => p.InternalName == "Allies2"); allies2 = w.Players.Single(p => p.InternalName == "Allies2");
soviets = w.Players.Single(p => p.InternalName == "Soviets"); soviets = w.Players.Single(p => p.InternalName == "Soviets");
var actors = w.WorldActor.Trait<SpawnMapActors>().Actors; var actors = w.WorldActor.Trait<SpawnMapActors>().Actors;
chinookHusk = actors["ChinookHusk"]; chinookHusk = actors["ChinookHusk"];
sam1 = actors["SAM1"]; sam1 = actors["SAM1"];
sam2 = actors["SAM2"]; sam2 = actors["SAM2"];
sam3 = actors["SAM3"]; sam3 = actors["SAM3"];
sam4 = actors["SAM4"]; sam4 = actors["SAM4"];
tanya = actors["Tanya"]; tanya = actors["Tanya"];
einstein = actors["Einstein"]; einstein = actors["Einstein"];
allies2BasePoint = actors["Allies2BasePoint"]; allies2BasePoint = actors["Allies2BasePoint"];
reinforcementsEntryPoint = actors["ReinforcementsEntryPoint"]; reinforcementsEntryPoint = actors["ReinforcementsEntryPoint"];
w.WorldActor.Trait<Shroud>().Explore(w, sam1.Location, 2); w.WorldActor.Trait<Shroud>().Explore(w, sam1.Location, 2);
w.WorldActor.Trait<Shroud>().Explore(w, sam2.Location, 2); w.WorldActor.Trait<Shroud>().Explore(w, sam2.Location, 2);
w.WorldActor.Trait<Shroud>().Explore(w, sam3.Location, 2); w.WorldActor.Trait<Shroud>().Explore(w, sam3.Location, 2);
w.WorldActor.Trait<Shroud>().Explore(w, sam4.Location, 2); w.WorldActor.Trait<Shroud>().Explore(w, sam4.Location, 2);
reinfTimer = new CountdownTimerWidget("Reinforcements arrive in", CountdownTicks) reinfTimer = new CountdownTimerWidget("Reinforcements arrive in", CountdownTicks)
{ {
IsVisible = () => false, IsVisible = () => false,
OnExpired = TimerExpired OnExpired = TimerExpired
}; };
Ui.Root.AddChild(reinfTimer); Ui.Root.AddChild(reinfTimer);
Game.MoveViewport(((w.LocalPlayer ?? allies1) == allies1 ? chinookHusk.Location : allies2BasePoint.Location).ToFloat2()); Game.MoveViewport(((w.LocalPlayer ?? allies1) == allies1 ? chinookHusk.Location : allies2BasePoint.Location).ToFloat2());
StartReinforcementsTimer(); StartReinforcementsTimer();
} }
} }
class CountdownTimerWidget : Widget class CountdownTimerWidget : Widget
{ {
public string Header { get; set; } public string Header { get; set; }
public int TicksLeft { get; set; } public int TicksLeft { get; set; }
int ticks; int ticks;
public CountdownTimerWidget(string header, int ticksLeft) public CountdownTimerWidget(string header, int ticksLeft)
{ {
Header = header; Header = header;
TicksLeft = ticksLeft; TicksLeft = ticksLeft;
} OnOneMinuteRemaining = () => Sound.Play("1minr.aud");
OnTwoMinutesRemaining = () => Sound.Play("2minr.aud");
public Action OnExpired; OnThreeMinutesRemaining = () => Sound.Play("3minr.aud");
public Action OnOneMinuteRemaining = () => Sound.Play("1minr.aud"); OnFourMinutesRemaining = () => Sound.Play("4minr.aud");
public Action OnTwoMinutesRemaining = () => Sound.Play("2minr.aud"); OnFiveMinutesRemaining = () => Sound.Play("5minr.aud");
public Action OnThreeMinutesRemaining = () => Sound.Play("3minr.aud"); OnTenMinutesRemaining = () => Sound.Play("10minr.aud");
public Action OnFourMinutesRemaining = () => Sound.Play("4minr.aud"); OnTwentyMinutesRemaining = () => Sound.Play("20minr.aud");
public Action OnFiveMinutesRemaining = () => Sound.Play("5minr.aud"); OnThirtyMinutesRemaining = () => Sound.Play("30minr.aud");
public Action OnTenMinutesRemaining = () => Sound.Play("10minr.aud"); OnFortyMinutesRemaining = () => Sound.Play("40minr.aud");
public Action OnTwentyMinutesRemaining = () => Sound.Play("20minr.aud"); }
public Action OnThirtyMinutesRemaining = () => Sound.Play("30minr.aud");
public Action OnFortyMinutesRemaining = () => Sound.Play("40minr.aud"); public Action OnExpired;
public Action OnOneMinuteRemaining { get; set; }
const int Expired = 0; public Action OnTwoMinutesRemaining { get; set; }
const int OneMinute = 1500; public Action OnThreeMinutesRemaining { get; set; }
const int TwoMinutes = OneMinute * 2; public Action OnFourMinutesRemaining { get; set; }
const int ThreeMinutes = OneMinute * 3; public Action OnFiveMinutesRemaining { get; set; }
const int FourMinutes = OneMinute * 4; public Action OnTenMinutesRemaining { get; set; }
const int FiveMinutes = OneMinute * 5; public Action OnTwentyMinutesRemaining { get; set; }
const int TenMinutes = OneMinute * 10; public Action OnThirtyMinutesRemaining { get; set; }
const int TwentyMinutes = OneMinute * 20; public Action OnFortyMinutesRemaining { get; set; }
const int ThirtyMinutes = OneMinute * 30;
const int FortyMinutes = OneMinute * 40; const int Expired = 0;
const int OneMinute = 1500;
public override void Tick() const int TwoMinutes = OneMinute * 2;
{ const int ThreeMinutes = OneMinute * 3;
if (!IsVisible()) const int FourMinutes = OneMinute * 4;
{ const int FiveMinutes = OneMinute * 5;
return; const int TenMinutes = OneMinute * 10;
} const int TwentyMinutes = OneMinute * 20;
ticks++; const int ThirtyMinutes = OneMinute * 30;
if (TicksLeft > 0) const int FortyMinutes = OneMinute * 40;
{
TicksLeft--; public override void Tick()
switch (TicksLeft) {
{ if (!IsVisible())
case Expired: OnExpired(); break; {
case OneMinute: OnOneMinuteRemaining(); break; return;
case TwoMinutes: OnTwoMinutesRemaining(); break; }
case ThreeMinutes: OnThreeMinutesRemaining(); break; ticks++;
case FourMinutes: OnFourMinutesRemaining(); break; if (TicksLeft > 0)
case FiveMinutes: OnFiveMinutesRemaining(); break; {
case TenMinutes: OnTenMinutesRemaining(); break; TicksLeft--;
case TwentyMinutes: OnTwentyMinutesRemaining(); break; switch (TicksLeft)
case ThirtyMinutes: OnThirtyMinutesRemaining(); break; {
case FortyMinutes: OnFortyMinutesRemaining(); break; case Expired: OnExpired(); break;
} case OneMinute: OnOneMinuteRemaining(); break;
} case TwoMinutes: OnTwoMinutesRemaining(); break;
} case ThreeMinutes: OnThreeMinutesRemaining(); break;
case FourMinutes: OnFourMinutesRemaining(); break;
public override void Draw() case FiveMinutes: OnFiveMinutesRemaining(); break;
{ case TenMinutes: OnTenMinutesRemaining(); break;
if (!IsVisible()) case TwentyMinutes: OnTwentyMinutesRemaining(); break;
{ case ThirtyMinutes: OnThirtyMinutesRemaining(); break;
return; case FortyMinutes: OnFortyMinutesRemaining(); break;
} }
var font = Game.Renderer.Fonts["Bold"]; }
var text = "{0}: {1}".F(Header, WidgetUtils.FormatTime(TicksLeft)); }
font.DrawTextWithContrast(text, new float2(32, 64), TicksLeft == 0 && ticks % 60 >= 30 ? Color.Red : Color.White, Color.Black, 1);
} public override void Draw()
} {
} if (!IsVisible())
{
return;
}
var font = Game.Renderer.Fonts["Bold"];
var text = "{0}: {1}".F(Header, WidgetUtils.FormatTime(TicksLeft));
font.DrawTextWithContrast(text, new float2(32, 64), TicksLeft == 0 && ticks % 60 >= 30 ? Color.Red : Color.White, Color.Black, 1);
}
}
}