ShiftOS-C-/source/WindowsFormsApplication1/FinalMission/EndGameHandler.cs
2016-07-21 16:00:53 -07:00

283 lines
No EOL
11 KiB
C#

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
namespace ShiftOS.FinalMission
{
public enum Choice
{
SideWithDevX,
StopDevX,
EndAll
}
public class EndGameHandler
{
#region Properties
public static Choice CurrentChoice
{
get { return currentChoice; }
}
public static Dictionary<string, bool> ThingsToDo
{
get
{
return thingsToDo;
}
}
public static bool C2_ShellShockBreachCommand { get; set; }
public static string CurrentObjective
{
get
{
try
{
return thingsToDo.Keys.ElementAt<string>(currentObjective);
}
catch
{
return "";
}
}
}
public static string CurrentObjectivePrompt
{
get { return objPrompt; }
}
public static MissionGuide MissionGuide
{
get { return mguide; }
}
public static bool GodModeInstallEnabled { get; set; }
#endregion
public static FakeChatClient FakeHoloChatRoom
{
get
{
if (currentObjective == 0)
{
var room = new FakeChatClient();
room.Name = "The Hacker Alliance";
room.OtherCharacters = new List<string>();
switch (currentChoice)
{
case Choice.EndAll:
room.Topic = "Oh no. | The ShiftOS Hacker Alliance: We don't mess around.";
room.OtherCharacters.Add("???");
room.OtherCharacters.Add("Hacker101");
room.Messages = JsonConvert.DeserializeObject<Dictionary<string, string>>(Properties.Resources.Choice3);
break;
case Choice.StopDevX:
room.Topic = "The ShiftOS Hacker Alliance: We don't mess around.";
room.OtherCharacters.Add("???");
room.Messages = JsonConvert.DeserializeObject<Dictionary<string, string>>(Properties.Resources.Choice2);
break;
case Choice.SideWithDevX:
room.Topic = "Chat seized by DevX";
room.OtherCharacters.Add("DevX");
room.Messages = JsonConvert.DeserializeObject<Dictionary<string, string>>(Properties.Resources.Choice1);
break;
}
return room;
}
else
{
return null;
}
}
}
#region Events
public static event EventHandler ObjectiveCompleted;
public static event EventHandler MissionComplete;
#endregion
#region Variables
private static Choice currentChoice = Choice.EndAll;
private static Dictionary<string, bool> thingsToDo = new Dictionary<string, bool>();
private static int currentObjective = 0;
private static string objPrompt;
private static MissionGuide mguide;
#endregion
#region Methods
public static void Initiate(int choice)
{
mguide = new MissionGuide();
mguide.Show();
switch (choice)
{
case 1:
currentChoice = Choice.SideWithDevX;
currentObjective = 0;
thingsToDo.Add("Chat with DevX on HoloChat", false);
thingsToDo.Add("Install DevX's packages", false);
mguide.ShowButton = false;
objPrompt = "Go chat with DevX on HoloChat.";
break;
case 2:
currentChoice = Choice.StopDevX;
thingsToDo.Add("Chat with the Other Player on HoloChat", false);
thingsToDo.Add("Hack through DevX's firewall", false);
thingsToDo.Add("Take down DevX's primary server", false);
thingsToDo.Add("Take down DevX's secondary server", false);
thingsToDo.Add("Forkbomb DevX's storage and telemetry server", false);
thingsToDo.Add("One last battle...", false);
thingsToDo.Add("Uninstall ShiftOS", false);
mguide.ShowButton = false;
objPrompt = "It's time to destroy DevX. Head to the Hacker Alliance HoloChat room to begin.";
break;
case 3:
currentChoice = Choice.EndAll;
thingsToDo.Add("Trouble in the Hacker Alliance...", false);
mguide.ShowButton = false;
objPrompt = "Something's wrong in the Hacker Alliance chatroom... They need you.";
break;
}
API.CurrentSession.EndGame_AttachEvents();
}
public static void GoToNextObjective()
{
var h = ObjectiveCompleted;
if (h != null)
{
h(CurrentObjective, new EventArgs());
}
currentObjective += 1;
SetupGUIforCurrent();
}
public static void SetupGUIforCurrent()
{
GodModeInstallEnabled = false;
C2_ShellShockBreachCommand = false;
switch(currentChoice)
{
case Choice.SideWithDevX:
switch(currentObjective)
{
case 1:
mguide.ShowButton = false;
objPrompt = "Go open your Terminal and install the 'god_utils' package.";
GodModeInstallEnabled = true;
break;
case 2:
var h = MissionComplete;
h?.Invoke(CurrentObjective, new EventArgs());
break;
}
break;
case Choice.EndAll:
switch(currentObjective)
{
case 1:
var h = MissionComplete;
h?.Invoke(CurrentObjective, new EventArgs());
break;
}
break;
case Choice.StopDevX:
switch(currentObjective)
{
case 1:
mguide.ShowButton = true;
mguide.OnButtonClick = new Action(() =>
{
var enemy = JsonConvert.DeserializeObject<EnemyHacker>(Properties.Resources.DevX_Firewall);
var hui = new HackUI(enemy);
hui.Show();
hui.OnWin += (object s, EventArgs a) =>
{
GoToNextObjective();
};
});
objPrompt = "Before we can do anything major, we need to bust through DevX's firewall. It should be easy, but beware. It's just a firewall. The real stuff's coming soon.";
break;
case 2:
mguide.OnButtonClick = new Action(() =>
{
var enemy = JsonConvert.DeserializeObject<EnemyHacker>(Properties.Resources.DevX_PrimaryNet);
var hui = new HackUI(enemy);
hui.Show();
hui.OnWin += (object s, EventArgs a) =>
{
GoToNextObjective();
};
});
objPrompt = "Alright, we're through. Next on the list is DevX's primary server. Take this down and we can get further into the network without him finding out.";
break;
case 3:
mguide.OnButtonClick = new Action(() =>
{
var enemy = JsonConvert.DeserializeObject<EnemyHacker>(Properties.Resources.DevX_Secondary);
var hui = new HackUI(enemy);
hui.Show();
hui.OnWin += (object s, EventArgs a) =>
{
GoToNextObjective();
};
});
objPrompt = "Primary server's D to the O to the W to the N. DOWN. Next we gotta take down his secondary server. Once it goes down, he's finished.";
break;
case 4:
mguide.ButtonText = "Begin attack in Terminal";
mguide.OnButtonClick = new Action(() =>
{
var t = new Terminal();
API.CreateForm(t, API.LoadedNames.TerminalName, API.GetIcon("Terminal"));
t.StartShellShock();
});
objPrompt = "Bye, have a great time, DevX! Arighty, DevX has one last server running that needs to go before we do anything more. This one sits on shiftnet://devx/tracker and is the server DevX uses to track other ShiftOS users. Take it down and he can't see any of this.";
break;
case 5:
mguide.ShowButton = false;
objPrompt = "THAT did it. I'd keep that terminal open until connection to the server drops. Once it's done, I'll close it and tell you what to do next.";
mguide.ButtonText = "Connect to server";
break;
case 6:
mguide.ShowButton = true;
mguide.ButtonText = "End DevX";
mguide.OnButtonClick = new Action(() =>
{
StartGoodEnding();
});
objPrompt = "Firewall, check. Primary server, check. Secondary server, CHECK. Telemetry server, CHECK. Now it's time to disable DevX himself. After all, he IS just code.";
break;
case 7:
var h = MissionComplete;
h?.Invoke(CurrentObjective, new EventArgs());
break;
}
break;
}
}
#endregion
public static void StartGoodEnding()
{
var room = new FakeChatClient();
room.OtherCharacters = new List<string>();
room.OtherCharacters.Add("TheHiddenHacker");
room.Messages.Add("TheHiddenHacker", "After All This Time...");
}
}
}