aboutsummaryrefslogtreecommitdiff
path: root/ShiftOS_TheReturn/Hacking.cs
diff options
context:
space:
mode:
authorMichael <[email protected]>2017-07-17 14:34:59 -0400
committerMichael <[email protected]>2017-07-17 14:34:59 -0400
commita0ee79dbcd26a8f07d493a7e993cbaf0d02e44db (patch)
treed974220621e6cfcfe745c2825149ca370e3a7aab /ShiftOS_TheReturn/Hacking.cs
parente929a9f5105c00b0a3a2b4e75a876bbb95bbfa7b (diff)
downloadshiftos_thereturn-a0ee79dbcd26a8f07d493a7e993cbaf0d02e44db.tar.gz
shiftos_thereturn-a0ee79dbcd26a8f07d493a7e993cbaf0d02e44db.tar.bz2
shiftos_thereturn-a0ee79dbcd26a8f07d493a7e993cbaf0d02e44db.zip
Hacking, barebones fskimmer, double clicking
Diffstat (limited to 'ShiftOS_TheReturn/Hacking.cs')
-rw-r--r--ShiftOS_TheReturn/Hacking.cs98
1 files changed, 94 insertions, 4 deletions
diff --git a/ShiftOS_TheReturn/Hacking.cs b/ShiftOS_TheReturn/Hacking.cs
index db47f66..ea2d89b 100644
--- a/ShiftOS_TheReturn/Hacking.cs
+++ b/ShiftOS_TheReturn/Hacking.cs
@@ -10,6 +10,9 @@ namespace ShiftOS.Engine
{
private static List<HackableSystem> _activeConnections = new List<HackableSystem>();
private static List<Objects.Hackable> Hackables = new List<Objects.Hackable>();
+ private static List<Objects.Loot> Loot = new List<Objects.Loot>();
+
+ public static HackableSystem CurrentHackable { get; private set; }
public static Objects.Hackable[] AvailableToHack
{
@@ -44,13 +47,84 @@ namespace ShiftOS.Engine
}
}
+ public static void InitHack(Objects.Hackable data)
+ {
+ var hsys = new HackableSystem();
+ hsys.Data = data;
+ hsys.IsPwn3d = false;
+ var fs = new Objects.ShiftFS.Directory();
+ fs.Name = data.FriendlyName;
+ Objects.ShiftFS.Utils.Mounts.Add(fs);
+ var mountid = Objects.ShiftFS.Utils.Mounts.IndexOf(fs);
+ Objects.ShiftFS.Utils.Mounts.Remove(fs);
+ hsys.Filesystem = fs;
+ hsys.FirewallCracked = (data.FirewallStrength == 0);
+ hsys.DoConnectionTimeout = (data.ConnectionTimeoutLevel > 0);
+ if (hsys.DoConnectionTimeout)
+ {
+ hsys.MillisecondsCountdown = 1000 * (240 / data.ConnectionTimeoutLevel);
+ }
+ else
+ {
+ hsys.MillisecondsCountdown = 0;
+ }
+ hsys.PortsToUnlock = new List<Port>();
+ if (data.SystemType.HasFlag(Objects.SystemType.EmailServer))
+ hsys.PortsToUnlock.Add(new Port
+ {
+ Value = 25,
+ Name = "SMTP mailserver (unencrypted)",
+ });
+ if (data.SystemType.HasFlag(Objects.SystemType.FileServer))
+ hsys.PortsToUnlock.Add(new Port
+ {
+ Value = 22,
+ Name = "File Transfer Protocol",
+ });
+ if (data.SystemType.HasFlag(Objects.SystemType.SSHServer))
+ hsys.PortsToUnlock.Add(new Port
+ {
+ Value = 21,
+ Name = "ShiftSSH server",
+ });
+ if (data.SystemType.HasFlag(Objects.SystemType.Database))
+ hsys.PortsToUnlock.Add(new Port
+ {
+ Value = 3306,
+ Name = "MySQL database",
+ });
+
+ CurrentHackable = hsys;
+ }
+
+ public static void FailHack()
+ {
+ if (CurrentHackable == null)
+ throw new NaughtyDeveloperException("Someone tried to fail a non-existent hack.");
+ if (CurrentHackable.IsPwn3d)
+ throw new NaughtyDeveloperException("A developer tried to un-pwn a pwn3d hackable.");
+ if (!string.IsNullOrWhiteSpace(CurrentHackable.Data.OnHackFailedStoryEvent))
+ Story.Start(CurrentHackable.Data.OnHackFailedStoryEvent);
+ if (Objects.ShiftFS.Utils.Mounts.Contains(CurrentHackable.Filesystem))
+ Objects.ShiftFS.Utils.Mounts.Remove(CurrentHackable.Filesystem);
+ CurrentHackable = null;
+ }
+
public static void Initiate()
{
foreach(var type in ReflectMan.Types.Where(x => x.GetInterfaces().Contains(typeof(IHackableProvider))))
{
var @interface = (IHackableProvider)Activator.CreateInstance(type, null);
Hackables.AddRange(@interface.GetHackables());
-
+ var lootinfo = @interface.GetLootInfo();
+ foreach(var loot in lootinfo)
+ {
+ var existing = Loot.FirstOrDefault(x => x.Info.Filename == loot.Filename);
+ if (existing != null)
+ throw new DataConflictException("Data conflict encountered while reading loot data. Two or more loot resources with the filename \"" + loot.Filename + "\" were found. This can cause major bugs and confusion in the game.");
+ var @new = new Objects.Loot(loot, @interface.GetLootFromResource(loot.ResourceId));
+ Loot.Add(@new);
+ }
}
var hackable = Hackables.FirstOrDefault(x => Hackables.Where(y => x.SystemName == y.SystemName).Count() > 1);
@@ -61,6 +135,21 @@ namespace ShiftOS.Engine
}
}
+ /// <summary>
+ /// An exception which is thrown when a developer deliberately tries to cause a bug.
+ /// </summary>
+ public class NaughtyDeveloperException : Exception
+ {
+ /// <summary>
+ /// Create a new instance of the <see cref="NaughtyDeveloperException"/>, with the specified message, which will cause Visual Studio to call the person who caused the exception a scrotem.
+ /// </summary>
+ /// <param name="message">The message you want to yell at the user.</param>
+ public NaughtyDeveloperException(string message) : base(message + " - FIX IT, YOU SCROTEM")
+ {
+
+ }
+ }
+
public class DataConflictException : Exception
{
public DataConflictException(string message) : base(message)
@@ -72,6 +161,8 @@ namespace ShiftOS.Engine
public interface IHackableProvider
{
Objects.Hackable[] GetHackables();
+ Objects.LootInfo[] GetLootInfo();
+ byte[] GetLootFromResource(string resId);
}
public class HackableSystem
@@ -80,7 +171,8 @@ namespace ShiftOS.Engine
public List<Port> PortsToUnlock { get; set; }
public bool FirewallCracked { get; set; }
public Objects.ShiftFS.Directory Filesystem { get; set; }
- public int MillisecondsCountdown { get; set; }
+ public double MillisecondsCountdown { get; set; }
+ public bool DoConnectionTimeout { get; set; }
public bool IsPwn3d { get; set; }
}
@@ -88,7 +180,5 @@ namespace ShiftOS.Engine
{
public string Name { get; set; }
public int Value { get; set; }
- public int Difficulty { get; set; }
- public bool Cracked { get; set; }
}
}