From b6bc4fd3de7324dd4b086c215768bc50b54c49bb Mon Sep 17 00:00:00 2001 From: MichaelTheShifter Date: Tue, 24 May 2016 20:27:25 -0400 Subject: [PATCH] 0.1.1 Release Candidate 1 Committing all code for 0.1.1 Release Candidate 1. --- source/WindowsFormsApplication1/API.cs | 72 +--- source/WindowsFormsApplication1/Computer.cs | 32 +- .../WindowsFormsApplication1/File Skimmer.cs | 35 +- source/WindowsFormsApplication1/HackUI.cs | 27 +- source/WindowsFormsApplication1/Hacking.cs | 124 +++++-- source/WindowsFormsApplication1/HoloChat.cs | 83 ++++- .../ListViewEx.Designer.cs | 66 ++++ source/WindowsFormsApplication1/ListViewEx.cs | 65 ++++ .../WindowsFormsApplication1/ListViewEx.resx | 120 +++++++ source/WindowsFormsApplication1/MountMgr.cs | 37 +++ .../NetGen.Designer.cs | 313 ++++++++++++++---- source/WindowsFormsApplication1/NetGen.cs | 99 +++++- .../NetModuleStatus.Designer.cs | 84 +++++ .../NetModuleStatus.cs | 46 +++ .../NetModuleStatus.resx | 120 +++++++ .../NetworkBrowser.Designer.cs | 290 ++++++++++++++++ .../NetworkBrowser.cs | 301 +++++++++++++++++ .../NetworkBrowser.resx | 123 +++++++ .../PanelManager.Designer.cs | 132 ++++++++ .../WindowsFormsApplication1/PanelManager.cs | 73 ++++ .../PanelManager.resx | 120 +++++++ source/WindowsFormsApplication1/Program.cs | 7 + .../Properties/Resources.Designer.cs | 68 ++++ .../Properties/Resources.resx | 24 +- .../Resources/AustinWalkerCompletionStory.txt | 7 + .../Resources/Hacker_AustinWalker.txt | 1 + .../Resources/Hacker_DanaRoss.txt | 1 + .../Resources/Hacker_JonathanRivard.txt | 1 + .../Resources/MidGame_Holochat.txt | 18 + .../Resources/NetBrowser_Enemies.txt | 5 + .../Resources/Thumbs.db | Bin 0 -> 104448 bytes source/WindowsFormsApplication1/SaveSystem.cs | 10 + .../WindowsFormsApplication1/ShiftOS.csproj | 45 ++- .../ShiftOSDesktop.Designer.cs | 44 +-- .../ShiftOSDesktop.cs | 171 ++++++---- .../Shifter.Designer.cs | 88 ++--- source/WindowsFormsApplication1/Shifter.cs | 11 +- source/WindowsFormsApplication1/Terminal.cs | 219 +++++++----- source/WindowsFormsApplication1/skins.cs | 49 ++- 39 files changed, 2726 insertions(+), 405 deletions(-) create mode 100644 source/WindowsFormsApplication1/ListViewEx.Designer.cs create mode 100644 source/WindowsFormsApplication1/ListViewEx.cs create mode 100644 source/WindowsFormsApplication1/ListViewEx.resx create mode 100644 source/WindowsFormsApplication1/MountMgr.cs create mode 100644 source/WindowsFormsApplication1/NetModuleStatus.Designer.cs create mode 100644 source/WindowsFormsApplication1/NetModuleStatus.cs create mode 100644 source/WindowsFormsApplication1/NetModuleStatus.resx create mode 100644 source/WindowsFormsApplication1/NetworkBrowser.Designer.cs create mode 100644 source/WindowsFormsApplication1/NetworkBrowser.cs create mode 100644 source/WindowsFormsApplication1/NetworkBrowser.resx create mode 100644 source/WindowsFormsApplication1/PanelManager.Designer.cs create mode 100644 source/WindowsFormsApplication1/PanelManager.cs create mode 100644 source/WindowsFormsApplication1/PanelManager.resx create mode 100644 source/WindowsFormsApplication1/Resources/AustinWalkerCompletionStory.txt create mode 100644 source/WindowsFormsApplication1/Resources/Hacker_AustinWalker.txt create mode 100644 source/WindowsFormsApplication1/Resources/Hacker_DanaRoss.txt create mode 100644 source/WindowsFormsApplication1/Resources/Hacker_JonathanRivard.txt create mode 100644 source/WindowsFormsApplication1/Resources/MidGame_Holochat.txt create mode 100644 source/WindowsFormsApplication1/Resources/NetBrowser_Enemies.txt create mode 100644 source/WindowsFormsApplication1/Resources/Thumbs.db diff --git a/source/WindowsFormsApplication1/API.cs b/source/WindowsFormsApplication1/API.cs index 8589708..f90532f 100644 --- a/source/WindowsFormsApplication1/API.cs +++ b/source/WindowsFormsApplication1/API.cs @@ -353,64 +353,15 @@ public static void LaunchMod(string modSAA) } } var story_rnd = new Random(); - int story_chance = story_rnd.Next(0, 100); - switch (story_chance) - { - case 4: - if (API.Upgrades["otherplayerstory"] == false) + int story_chance = story_rnd.Next(0, 3); + switch (story_chance) { + case 2: + if(API.Upgrades["holochat"] == false) { var t = new Terminal(); - API.CreateForm(t, LoadedNames.TerminalName, Properties.Resources.iconTerminal); - t.StartOtherPlayerStory(); - } - break; - case 25: - if (API.Upgrades["devxfurious"] == false) - { - var t = new Terminal(); - API.CreateForm(t, LoadedNames.TerminalName, Properties.Resources.iconTerminal); + API.CreateForm(t, API.LoadedNames.TerminalName, API.GetIcon("Terminal")); t.StartDevXFuriousStory(); - } - break; - case 30: - if (API.Upgrades["aidennirh"] == false) - { - var t = new Terminal(); - API.CreateForm(t, LoadedNames.TerminalName, Properties.Resources.iconTerminal); - t.StartAidenNirhStory(); - } - break; - case 75: - if (API.Upgrades["hacker101"] == false) - { - var t = new Terminal(); - API.CreateForm(t, LoadedNames.TerminalName, Properties.Resources.iconTerminal); - t.StartHacker101Story(); - } - break; - //case 1000: - // t.StartJonathanLadouceurStory(); - // break; - //Do you honestly think HE would appear in ShiftOS? Yugh. NO. - default: - if (API.Upgrades["devxfurious"] == true) - { - if (API.Upgrades["otherplayerrescue"] == false) - { - var t = new Terminal(); - t.StartOtherPlayerSysFix(); - CreateForm(t, LoadedNames.TerminalName, Properties.Resources.iconTerminal); - } - else - { - if (API.Upgrades["midgamebridge"] == false) - { - /*var t = new Terminal(); - t.StartBridgeToMidGame(); - CreateForm(t, LoadedNames.TerminalName, Properties.Resources.iconTerminal);*/ - - } - } + t.BringToFront(); } break; } @@ -687,6 +638,7 @@ public static void GetAppLauncherItems() AppLauncherItems.Add(new ApplauncherItem(LoadedNames.FileSkimmerName, GetIcon("FileSkimmer"), "open_program('file_skimmer')", Upgrades["alfileskimmer"])); if (!LimitedMode) { + AppLauncherItems.Add(new ApplauncherItem("Network Browser", GetIcon("NetworkBrowser"), "open_program('netbrowse')", Upgrades["networkbrowser"])); AppLauncherItems.Add(new ApplauncherItem(LoadedNames.SkinLoaderName, GetIcon("SkinLoader"), "open_program('skinloader')", Upgrades["skinning"])); AppLauncherItems.Add(new ApplauncherItem(LoadedNames.ShiftoriumName, GetIcon("Shiftorium"), "open_program('shiftorium')", Upgrades["alshiftorium"])); } @@ -1713,6 +1665,16 @@ public static bool OpenProgram(string cmd) bool succeeded = true; switch (cmd) { + case "netbrowse": + if(Upgrades["networkbrowser"]) + { + CreateForm(new NetworkBrowser(), "Network Browser", GetIcon("NetworkBrowser")); + } + else + { + succeeded = false; + } + break; case "quests": if(LimitedMode) { diff --git a/source/WindowsFormsApplication1/Computer.cs b/source/WindowsFormsApplication1/Computer.cs index db1f24e..3b546b7 100644 --- a/source/WindowsFormsApplication1/Computer.cs +++ b/source/WindowsFormsApplication1/Computer.cs @@ -12,6 +12,8 @@ namespace ShiftOS { public partial class Computer : UserControl { + public int TotalHP = 100; + public Computer() { InitializeComponent(); @@ -318,6 +320,16 @@ private void Computer_Load(object sender, EventArgs e) if (this.HP > 0) { lbstats.Text = $"HP: {_HP}"; + if(!Enemy) + { + foreach(var m in Hacking.MyNetwork) + { + if(m.Hostname == Hostname) + { + m.HP = _HP; + } + } + } switch (Type) { case SystemType.Core: @@ -369,8 +381,24 @@ private void Computer_Load(object sender, EventArgs e) { if (API.Upgrades["limitlesscustomshades"] == true) { - int mod = _HP % 255; - this.BackColor = Color.FromArgb(255, mod, mod); + if(_HP > TotalHP / 2) + { + this.BackColor = Color.Green; + lbstats.ForeColor = Color.Black; + } + else + { + if(_HP > TotalHP / 3) + { + this.BackColor = Color.Orange; + lbstats.ForeColor = Color.Black; + } + else + { + this.BackColor = Color.Red; + lbstats.ForeColor = Color.White; + } + } } if (Enemy == true) { diff --git a/source/WindowsFormsApplication1/File Skimmer.cs b/source/WindowsFormsApplication1/File Skimmer.cs index 3c63693..883ff95 100644 --- a/source/WindowsFormsApplication1/File Skimmer.cs +++ b/source/WindowsFormsApplication1/File Skimmer.cs @@ -128,6 +128,7 @@ public void OpenFile(string filepath) /// public File_Skimmer() { + MountMgr.Init(); InitializeComponent(); } @@ -176,13 +177,28 @@ private void File_Skimmer_Load(object sender, EventArgs e) { if (lbcurrentfolder.Text != "/") { - CurrentFolder = Directory.GetParent(CurrentFolder).FullName; - ListFiles(); + if (lbcurrentfolder.Text == MountPoint.Replace("\\", "/")) + { + CurrentFolder = Paths.SaveRoot; + ListFiles(); + } + else + { + CurrentFolder = Directory.GetParent(CurrentFolder).FullName; + ListFiles(); + } } else { API.CreateInfoboxSession("Can't read directory", "File Skimmer is not able to read the requested directory as it is not formatted with the ShiftFS file system.", infobox.InfoboxMode.Info); } } + else if(tag.StartsWith("drv:")) + { + string drivepath = tag.Remove(0, 4); + CurrentFolder = drivepath; + MountPoint = drivepath; + ListFiles(); + } } } } @@ -198,11 +214,14 @@ private void File_Skimmer_Load(object sender, EventArgs e) }; } + string MountPoint = null; + /// /// Lists all the files in the current folder. /// public void ListFiles() { + MountMgr.Init(); SetupImages(); txtfilename.Text = ""; //SetupUI(); @@ -223,6 +242,18 @@ public void ListFiles() upone.Tag = "_uponedir"; upone.ImageKey = "directory"; lvfiles.Items.Add(upone); + if(CurrentFolder == Paths.SaveRoot) + { + foreach(var drive in MountMgr.links) + { + var dinf = new DirectoryInfo(drive.Key); + var item = new ListViewItem(); + item.Text = drive.Value; + item.Tag = "drv:" + dinf.FullName; + lvfiles.Items.Add(item); + item.ImageKey = "directory"; + } + } foreach (string dir in Directory.GetDirectories(CurrentFolder)) { var dirinf = new DirectoryInfo(dir); diff --git a/source/WindowsFormsApplication1/HackUI.cs b/source/WindowsFormsApplication1/HackUI.cs index 342318a..d12119d 100644 --- a/source/WindowsFormsApplication1/HackUI.cs +++ b/source/WindowsFormsApplication1/HackUI.cs @@ -151,11 +151,13 @@ private void this_Closing(object sender, FormClosingEventArgs e) if (UserRequestedClose == false) { tmrplayerhealthdetect.Stop(); - foreach (var pc in AllPlayerComputers) - { - pc.HP = 0; - } } + else + { + e.Cancel = true; + API.CreateInfoboxSession("Can't retreat now.", "You started this battle, and made it this far. Finish what you started. Don't run away.", infobox.InfoboxMode.Info); + } + Hacking.RepairTimer.Start(); //Now the player can repair. } public Computer SelectedPlayerComputer = null; @@ -450,8 +452,11 @@ public void SetupModuleList() } if (m == null) { - cmbmodules.Items.Add(item.Hostname); - FutureModules.Add(item.Hostname, item.Type); + if (item.HP > 0) + { + cmbmodules.Items.Add(item.Hostname); + FutureModules.Add(item.Hostname, item.Type); + } } } @@ -703,7 +708,9 @@ private void btndonebuying_Click(object sender, EventArgs e) } if (cont2 == true) { - GetMyNet().Add(new Module(mod.Type, Convert.ToInt32(txtgrade.Text), hname)); + var newModule = new Module(mod.Type, Convert.ToInt32(txtgrade.Text), hname); + newModule.HP = newModule.GetTotalHP(); + GetMyNet().Add(newModule); API.RemoveCodepoints(mod.Cost); API.CreateInfoboxSession("Module added.", "To deploy the module to the network, select 'Add Module' and choose the hostname from the menu.", infobox.InfoboxMode.Info); pnlbuy.Hide(); @@ -945,6 +952,7 @@ private void btnnext_Click(object sender, EventArgs e) private void HackUI_Load(object sender, EventArgs e) { + Hacking.RepairTimer.Stop(); //Don't want the player to be able to repair dead modules during a battle! this.TopMost = true; arc = new AudioResourceClient("HackerBattle"); arc.SongFinished += (object s, EventArgs a) => @@ -975,8 +983,8 @@ private void VisualizeEnemyNetwork() var rnd = new Random(); foreach (Module m in ThisEnemyHacker.Network) { + m.HP = m.GetTotalHP(); var c = m.Deploy(); - c.Location = new Point(m.X, m.Y); if (c.Type == SystemType.Core) { ThisEnemyPC = c; @@ -984,6 +992,7 @@ private void VisualizeEnemyNetwork() ThisPlayerPC.EnemyComputer = ThisEnemyPC; } AddEnemyModule(c); + c.Location = new Point(m.X, m.Y); } } @@ -1102,7 +1111,7 @@ public void AddEnemyModule(Computer newModule) public void Enemy_Firewall_Deflect(Computer fwall) { - //Safegaurd... + //Safeguard... also apparently I can't spell... because this used to be 'Safegaurd'... if (fwall.Type == SystemType.Firewall) { var r = fwall.GetAreaOfEffect(); diff --git a/source/WindowsFormsApplication1/Hacking.cs b/source/WindowsFormsApplication1/Hacking.cs index cdc0d9b..2791f09 100644 --- a/source/WindowsFormsApplication1/Hacking.cs +++ b/source/WindowsFormsApplication1/Hacking.cs @@ -21,6 +21,24 @@ public class Hacking public static List MyNetwork = new List(); public static bool Failure = false; public static DateTime FailDate = DateTime.Now; + internal static string HackerBattleAward = null; + public static Timer RepairTimer = null; + + public static Module MyCore + { + get + { + var m = new Module(SystemType.Core, 1, "invalid"); + foreach(var mod in MyNetwork) + { + if(mod.Hostname == "localhost") + { + m = mod; + } + } + return m; + } + } /// /// Gives a shiftorium upgrade for free. @@ -474,6 +492,59 @@ public static void GetCharacters() File.WriteAllText(Paths.Drivers + "Network.dri", API.Encryption.Encrypt(JsonConvert.SerializeObject(MyNetwork))); } + List coresToRemove = new List(); + foreach(var m in MyNetwork) + { + if(m.Type == SystemType.Core && m != MyCore) + { + coresToRemove.Add(m); + } + } + foreach(var m in coresToRemove) + { + MyNetwork.Remove(m); + } + RepairTimer = new Timer(); + RepairTimer.Interval = 2000; + var r = new Random(); + RepairTimer.Tick += (object s, EventArgs a) => + { + var repairable = new List(); + foreach(var mod in MyNetwork) + { + if(mod.HP < mod.GetTotalHP()) + { + repairable.Add(mod); + } + } + int index = r.Next(0, repairable.Count); + try + { + int increase = 1; + foreach(var mod in MyNetwork) + { + if(mod.Type == SystemType.RepairModule) + { + increase += mod.HP / 4; + } + } + + var m = repairable[index]; + while(m.HP + increase > m.GetTotalHP()) + { + increase -= 1; + } + if(m.HP < m.GetTotalHP()) + { + m.HP += increase; + } + } + catch + { + + } + }; + RepairTimer.Start(); } /// @@ -588,34 +659,10 @@ public Module(SystemType t, int grade, string hname) public Computer Deploy() { var c = new Computer(); + c.TotalHP = GetTotalHP(); //for proper status display c.Hostname = Hostname; c.Type = Type; - switch (Type) - { - case SystemType.Core: - c.HP = 100; - break; - default: - switch (Grade) - { - case 1: - c.HP = 10; - break; - case 2: - c.HP = 20; - break; - case 3: - c.HP = 40; - break; - case 4: - c.HP = 80; - break; - default: - c.HP = 10; - break; - } - break; - } + c.HP = HP; c.Visible = true; c.Grade = Grade; if(X != 0 && Y != 0) @@ -624,6 +671,30 @@ public Computer Deploy() } return c; } + + public int GetTotalHP() + { + switch (Type) + { + case SystemType.Core: + return 100; + default: + switch (Grade) + { + case 1: + return 10; + case 2: + return 20; + case 3: + return 40; + case 4: + return 80; + default: + return 10; + + } + } + } } /// @@ -661,6 +732,7 @@ public EnemyHacker(string name, string description, string fdesc, int fskill, in Network.Add(m); //Hacker will always have a core system. } + public bool IsLeader = false; public string Name { get; set; } public string FriendDesc { get; set; } public string Description { get; set; } diff --git a/source/WindowsFormsApplication1/HoloChat.cs b/source/WindowsFormsApplication1/HoloChat.cs index 72c3b1e..aa1f597 100644 --- a/source/WindowsFormsApplication1/HoloChat.cs +++ b/source/WindowsFormsApplication1/HoloChat.cs @@ -1,4 +1,5 @@ using NetSockets; +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; @@ -40,6 +41,15 @@ public void SetupUI() { IPs = new Dictionary(); lbrooms.Items.Clear(); + this.Invoke(new Action(() => + { + if (API.Upgrades["networkbrowser"] == false) + { + API.CreateInfoboxSession(Hacker_Alliance.Name, Hacker_Alliance.Topic, infobox.InfoboxMode.Info); + lbrooms.Items.Add(Hacker_Alliance.Name); + } + })); + foreach (var client in Package_Grabber.clients) { if (client.Value.IsConnected) @@ -90,6 +100,7 @@ public void SetupUI() Package_Grabber.SendMessage(client.Key, "chat get_name"); } } + } else { @@ -101,6 +112,25 @@ public void SetupUI() } } + private FakeChatClient Hacker_Alliance + { + get + { + var r = new FakeChatClient(); + r.Name = "The Hacker Alliance"; + r.OtherCharacters = new List(); + if (!API.Upgrades["networkbrowser"]) + { + r.OtherCharacters.Add("Richard Ladouceur"); //Dear djdeedahx0 and other non-ShiftOS members: DEAL with the last name - I'm not creative. - Michael + r.OtherCharacters.Add("Hacker101"); + r.Messages = JsonConvert.DeserializeObject>(Properties.Resources.MidGame_Holochat); + r.Topic = "The Hacker Alliance - Please welcome our newest user!"; + } + return r; + + } + } + private void btnconnect_Click(object sender, EventArgs e) { if(lbrooms.SelectedItem != null) @@ -108,25 +138,32 @@ private void btnconnect_Click(object sender, EventArgs e) if (!API.LimitedMode) { string topic = (string)lbrooms.SelectedItem; - string ip = ""; - foreach (var obj in IPs) + if (topic == Hacker_Alliance.Name) { - if (obj.Value == topic) - { - ip = obj.Key; - } + SetupFakeClient(Hacker_Alliance); } - if (ip != "") + else { - API.CreateInfoboxSession("Choose a Nickname", "Please enter a nick name.", infobox.InfoboxMode.TextEntry); - API.InfoboxSession.FormClosing += (object s, FormClosingEventArgs a) => + string ip = ""; + foreach (var obj in IPs) { - var res = API.GetInfoboxResult(); - if (res != "fail") + if (obj.Value == topic) { - SetupClient(ip, res); + ip = obj.Key; } - }; + } + if (ip != "") + { + API.CreateInfoboxSession("Choose a Nickname", "Please enter a nick name.", infobox.InfoboxMode.TextEntry); + API.InfoboxSession.FormClosing += (object s, FormClosingEventArgs a) => + { + var res = API.GetInfoboxResult(); + if (res != "fail") + { + SetupClient(ip, res); + } + }; + } } } else @@ -225,8 +262,24 @@ public void SetupFakeClient(FakeChatClient fClient) string message = fClient.Messages.Keys.ElementAt(m); string user = fClient.Messages[message]; //show message on textbox - txtchat.AppendText(Environment.NewLine + $"<{user}> {message}"); - if(m < fClient.Messages.Count - 1) + if (message.StartsWith("install:")) + { + try + { + string upg = message.Remove(0, 8); + API.Upgrades[upg] = true; + API.CurrentSession.SetupDesktop(); + } + catch + { + + } + } + else + { + txtchat.AppendText(Environment.NewLine + $"<{user}> {message}"); + } + if (m < fClient.Messages.Count - 1) { m += 1; } diff --git a/source/WindowsFormsApplication1/ListViewEx.Designer.cs b/source/WindowsFormsApplication1/ListViewEx.Designer.cs new file mode 100644 index 0000000..1596c8f --- /dev/null +++ b/source/WindowsFormsApplication1/ListViewEx.Designer.cs @@ -0,0 +1,66 @@ +namespace ShiftOS +{ + partial class ListViewEx + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.tblist = new System.Windows.Forms.TableLayoutPanel(); + this.SuspendLayout(); + // + // tblist + // + this.tblist.AutoSize = true; + this.tblist.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.tblist.ColumnCount = 2; + this.tblist.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tblist.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tblist.Dock = System.Windows.Forms.DockStyle.Fill; + this.tblist.Location = new System.Drawing.Point(0, 0); + this.tblist.Name = "tblist"; + this.tblist.RowCount = 2; + this.tblist.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tblist.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tblist.Size = new System.Drawing.Size(521, 343); + this.tblist.TabIndex = 0; + // + // ListViewEx + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.tblist); + this.Name = "ListViewEx"; + this.Size = new System.Drawing.Size(521, 343); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tblist; + } +} diff --git a/source/WindowsFormsApplication1/ListViewEx.cs b/source/WindowsFormsApplication1/ListViewEx.cs new file mode 100644 index 0000000..075c3df --- /dev/null +++ b/source/WindowsFormsApplication1/ListViewEx.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ShiftOS +{ + public partial class ListViewEx : UserControl + { + private List items = null; + private List columns = null; + + public ListViewEx() + { + InitializeComponent(); + items = new List(); + columns = new List(); + } + + private Color _item_color = Color.Gray; + + public Color ItemSelectedColor + { + get { return _item_color; } + set + { + _item_color = value; + } + } + + private void setup_ui() + { + + } + } + + public class Item + { + public Item(string text) + { + Text = text; + SubItems = new List(); + } + + public string Text { get; set; } + public List SubItems { get; set; } + public object Tag { get; set; } + } + + public class Column + { + public Column(string text) + { + Text = text; + } + + public string Text { get; set; } + } + +} diff --git a/source/WindowsFormsApplication1/ListViewEx.resx b/source/WindowsFormsApplication1/ListViewEx.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/source/WindowsFormsApplication1/ListViewEx.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/source/WindowsFormsApplication1/MountMgr.cs b/source/WindowsFormsApplication1/MountMgr.cs new file mode 100644 index 0000000..3981b64 --- /dev/null +++ b/source/WindowsFormsApplication1/MountMgr.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.IO; + +namespace ShiftOS +{ + class MountMgr + { + public static Dictionary links = null; + + public static void Init() + { + links = new Dictionary(); + if (API.Upgrades["fsexternaldevices"] == true) + { + var drives = DriveInfo.GetDrives(); + foreach (var drive in drives) + { + try + { + if (!Paths.SaveRoot.Contains(drive.Name)) + { + links.Add(drive.Name, drive.VolumeLabel); + } + } + catch + { + + } + } + } + } + } +} diff --git a/source/WindowsFormsApplication1/NetGen.Designer.cs b/source/WindowsFormsApplication1/NetGen.Designer.cs index 456f65e..b596cdb 100644 --- a/source/WindowsFormsApplication1/NetGen.Designer.cs +++ b/source/WindowsFormsApplication1/NetGen.Designer.cs @@ -31,6 +31,11 @@ private void InitializeComponent() System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(NetGen)); this.panel1 = new System.Windows.Forms.Panel(); this.pnlnetdesign = new System.Windows.Forms.Panel(); + this.pnlpcinfo = new System.Windows.Forms.Panel(); + this.btndelete = new System.Windows.Forms.Button(); + this.lbpcinfo = new System.Windows.Forms.Label(); + this.lbmoduletitle = new System.Windows.Forms.Label(); + this.btncloseinfo = new System.Windows.Forms.Button(); this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); this.btnaddmodule = new System.Windows.Forms.Button(); this.pnlbuy = new System.Windows.Forms.Panel(); @@ -43,6 +48,12 @@ private void InitializeComponent() this.label4 = new System.Windows.Forms.Label(); this.btndonebuying = new System.Windows.Forms.Button(); this.pnlnetinf = new System.Windows.Forms.Panel(); + this.label6 = new System.Windows.Forms.Label(); + this.cbdifficulty = new System.Windows.Forms.ComboBox(); + this.txtfspeed = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.txtfskill = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); this.txtnetdesc = new System.Windows.Forms.TextBox(); this.label2 = new System.Windows.Forms.Label(); this.txtnetname = new System.Windows.Forms.TextBox(); @@ -53,23 +64,26 @@ private void InitializeComponent() this.pnlnetinfo = new System.Windows.Forms.Panel(); this.lbdescription = new System.Windows.Forms.Label(); this.lbtitle = new System.Windows.Forms.Label(); - this.pnlpcinfo = new System.Windows.Forms.Panel(); - this.btndelete = new System.Windows.Forms.Button(); - this.lbpcinfo = new System.Windows.Forms.Label(); - this.lbmoduletitle = new System.Windows.Forms.Label(); - this.btncloseinfo = new System.Windows.Forms.Button(); + this.btnloadfromtemplate = new System.Windows.Forms.Button(); + this.pnltemplates = new System.Windows.Forms.Panel(); + this.label9 = new System.Windows.Forms.Label(); + this.cbnets = new System.Windows.Forms.ComboBox(); + this.label10 = new System.Windows.Forms.Label(); + this.btnrecreate = new System.Windows.Forms.Button(); this.panel1.SuspendLayout(); this.pnlnetdesign.SuspendLayout(); + this.pnlpcinfo.SuspendLayout(); this.flowLayoutPanel1.SuspendLayout(); this.pnlbuy.SuspendLayout(); this.pnlnetinf.SuspendLayout(); this.flbuttons.SuspendLayout(); this.pnlnetinfo.SuspendLayout(); - this.pnlpcinfo.SuspendLayout(); + this.pnltemplates.SuspendLayout(); this.SuspendLayout(); // // panel1 // + this.panel1.Controls.Add(this.pnltemplates); this.panel1.Controls.Add(this.pnlnetdesign); this.panel1.Controls.Add(this.pnlnetinf); this.panel1.Controls.Add(this.flbuttons); @@ -77,7 +91,7 @@ private void InitializeComponent() this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; this.panel1.Location = new System.Drawing.Point(0, 0); this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(1242, 605); + this.panel1.Size = new System.Drawing.Size(894, 591); this.panel1.TabIndex = 0; this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint); // @@ -89,17 +103,75 @@ private void InitializeComponent() this.pnlnetdesign.Dock = System.Windows.Forms.DockStyle.Fill; this.pnlnetdesign.Location = new System.Drawing.Point(0, 76); this.pnlnetdesign.Name = "pnlnetdesign"; - this.pnlnetdesign.Size = new System.Drawing.Size(1242, 498); + this.pnlnetdesign.Size = new System.Drawing.Size(894, 484); this.pnlnetdesign.TabIndex = 6; this.pnlnetdesign.MouseDown += new System.Windows.Forms.MouseEventHandler(this.place_module); // + // pnlpcinfo + // + this.pnlpcinfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.pnlpcinfo.Controls.Add(this.btndelete); + this.pnlpcinfo.Controls.Add(this.lbpcinfo); + this.pnlpcinfo.Controls.Add(this.lbmoduletitle); + this.pnlpcinfo.Controls.Add(this.btncloseinfo); + this.pnlpcinfo.Location = new System.Drawing.Point(43, 167); + this.pnlpcinfo.Name = "pnlpcinfo"; + this.pnlpcinfo.Size = new System.Drawing.Size(382, 280); + this.pnlpcinfo.TabIndex = 9; + this.pnlpcinfo.Visible = false; + // + // btndelete + // + this.btndelete.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btndelete.AutoSize = true; + this.btndelete.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.btndelete.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btndelete.Location = new System.Drawing.Point(106, 254); + this.btndelete.Name = "btndelete"; + this.btndelete.Size = new System.Drawing.Size(59, 23); + this.btndelete.TabIndex = 8; + this.btndelete.Text = "Delete"; + this.btndelete.UseVisualStyleBackColor = true; + this.btndelete.Click += new System.EventHandler(this.btndelete_Click); + // + // lbpcinfo + // + this.lbpcinfo.Location = new System.Drawing.Point(12, 41); + this.lbpcinfo.Name = "lbpcinfo"; + this.lbpcinfo.Size = new System.Drawing.Size(367, 86); + this.lbpcinfo.TabIndex = 6; + this.lbpcinfo.Text = resources.GetString("lbpcinfo.Text"); + // + // lbmoduletitle + // + this.lbmoduletitle.AutoSize = true; + this.lbmoduletitle.Location = new System.Drawing.Point(10, 12); + this.lbmoduletitle.Name = "lbmoduletitle"; + this.lbmoduletitle.Size = new System.Drawing.Size(75, 11); + this.lbmoduletitle.TabIndex = 2; + this.lbmoduletitle.Text = "Add Module"; + // + // btncloseinfo + // + this.btncloseinfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btncloseinfo.AutoSize = true; + this.btncloseinfo.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.btncloseinfo.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btncloseinfo.Location = new System.Drawing.Point(327, 254); + this.btncloseinfo.Name = "btncloseinfo"; + this.btncloseinfo.Size = new System.Drawing.Size(52, 23); + this.btncloseinfo.TabIndex = 1; + this.btncloseinfo.Text = "Done."; + this.btncloseinfo.UseVisualStyleBackColor = true; + this.btncloseinfo.Click += new System.EventHandler(this.btncloseinfo_Click); + // // flowLayoutPanel1 // this.flowLayoutPanel1.Controls.Add(this.btnaddmodule); this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Bottom; - this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 467); + this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 453); this.flowLayoutPanel1.Name = "flowLayoutPanel1"; - this.flowLayoutPanel1.Size = new System.Drawing.Size(1242, 31); + this.flowLayoutPanel1.Size = new System.Drawing.Size(894, 31); this.flowLayoutPanel1.TabIndex = 8; // // btnaddmodule @@ -126,7 +198,7 @@ private void InitializeComponent() this.pnlbuy.Controls.Add(this.cmbbuyable); this.pnlbuy.Controls.Add(this.label4); this.pnlbuy.Controls.Add(this.btndonebuying); - this.pnlbuy.Location = new System.Drawing.Point(3, 162); + this.pnlbuy.Location = new System.Drawing.Point(3, 148); this.pnlbuy.Name = "pnlbuy"; this.pnlbuy.Size = new System.Drawing.Size(382, 299); this.pnlbuy.TabIndex = 7; @@ -217,6 +289,12 @@ private void InitializeComponent() // // pnlnetinf // + this.pnlnetinf.Controls.Add(this.label6); + this.pnlnetinf.Controls.Add(this.cbdifficulty); + this.pnlnetinf.Controls.Add(this.txtfspeed); + this.pnlnetinf.Controls.Add(this.label5); + this.pnlnetinf.Controls.Add(this.txtfskill); + this.pnlnetinf.Controls.Add(this.label3); this.pnlnetinf.Controls.Add(this.txtnetdesc); this.pnlnetinf.Controls.Add(this.label2); this.pnlnetinf.Controls.Add(this.txtnetname); @@ -224,9 +302,74 @@ private void InitializeComponent() this.pnlnetinf.Dock = System.Windows.Forms.DockStyle.Fill; this.pnlnetinf.Location = new System.Drawing.Point(0, 76); this.pnlnetinf.Name = "pnlnetinf"; - this.pnlnetinf.Size = new System.Drawing.Size(1242, 498); + this.pnlnetinf.Size = new System.Drawing.Size(894, 484); this.pnlnetinf.TabIndex = 0; // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(40, 225); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(124, 11); + this.label6.TabIndex = 11; + this.label6.Text = "Difficulty (Tier)"; + // + // cbdifficulty + // + this.cbdifficulty.BackColor = System.Drawing.Color.Black; + this.cbdifficulty.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cbdifficulty.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.cbdifficulty.ForeColor = System.Drawing.Color.Green; + this.cbdifficulty.FormattingEnabled = true; + this.cbdifficulty.Items.AddRange(new object[] { + "easy", + "medium", + "hard"}); + this.cbdifficulty.Location = new System.Drawing.Point(170, 222); + this.cbdifficulty.Name = "cbdifficulty"; + this.cbdifficulty.Size = new System.Drawing.Size(121, 19); + this.cbdifficulty.TabIndex = 10; + // + // txtfspeed + // + this.txtfspeed.BackColor = System.Drawing.Color.Black; + this.txtfspeed.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.txtfspeed.ForeColor = System.Drawing.Color.Green; + this.txtfspeed.Location = new System.Drawing.Point(142, 172); + this.txtfspeed.Name = "txtfspeed"; + this.txtfspeed.Size = new System.Drawing.Size(41, 18); + this.txtfspeed.TabIndex = 9; + this.txtfspeed.TextChanged += new System.EventHandler(this.txtfspeed_TextChanged); + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(40, 174); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(61, 11); + this.label5.TabIndex = 8; + this.label5.Text = "F. Speed"; + // + // txtfskill + // + this.txtfskill.BackColor = System.Drawing.Color.Black; + this.txtfskill.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.txtfskill.ForeColor = System.Drawing.Color.Green; + this.txtfskill.Location = new System.Drawing.Point(142, 146); + this.txtfskill.Name = "txtfskill"; + this.txtfskill.Size = new System.Drawing.Size(41, 18); + this.txtfskill.TabIndex = 7; + this.txtfskill.TextChanged += new System.EventHandler(this.txtfskill_TextChanged); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(40, 148); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(61, 11); + this.label3.TabIndex = 6; + this.label3.Text = "F. Skill"; + // // txtnetdesc // this.txtnetdesc.BackColor = System.Drawing.Color.Black; @@ -234,7 +377,7 @@ private void InitializeComponent() this.txtnetdesc.ForeColor = System.Drawing.Color.Green; this.txtnetdesc.Location = new System.Drawing.Point(142, 80); this.txtnetdesc.Name = "txtnetdesc"; - this.txtnetdesc.Size = new System.Drawing.Size(511, 18); + this.txtnetdesc.Size = new System.Drawing.Size(492, 18); this.txtnetdesc.TabIndex = 5; // // label2 @@ -271,9 +414,9 @@ private void InitializeComponent() this.flbuttons.Controls.Add(this.btnback); this.flbuttons.Dock = System.Windows.Forms.DockStyle.Bottom; this.flbuttons.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft; - this.flbuttons.Location = new System.Drawing.Point(0, 574); + this.flbuttons.Location = new System.Drawing.Point(0, 560); this.flbuttons.Name = "flbuttons"; - this.flbuttons.Size = new System.Drawing.Size(1242, 31); + this.flbuttons.Size = new System.Drawing.Size(894, 31); this.flbuttons.TabIndex = 0; // // btnnext @@ -281,7 +424,7 @@ private void InitializeComponent() this.btnnext.AutoSize = true; this.btnnext.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; this.btnnext.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btnnext.Location = new System.Drawing.Point(1194, 3); + this.btnnext.Location = new System.Drawing.Point(846, 3); this.btnnext.Name = "btnnext"; this.btnnext.Size = new System.Drawing.Size(45, 23); this.btnnext.TabIndex = 0; @@ -294,7 +437,7 @@ private void InitializeComponent() this.btnback.AutoSize = true; this.btnback.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; this.btnback.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btnback.Location = new System.Drawing.Point(1143, 3); + this.btnback.Location = new System.Drawing.Point(795, 3); this.btnback.Name = "btnback"; this.btnback.Size = new System.Drawing.Size(45, 23); this.btnback.TabIndex = 1; @@ -304,12 +447,13 @@ private void InitializeComponent() // // pnlnetinfo // + this.pnlnetinfo.Controls.Add(this.btnloadfromtemplate); this.pnlnetinfo.Controls.Add(this.lbdescription); this.pnlnetinfo.Controls.Add(this.lbtitle); this.pnlnetinfo.Dock = System.Windows.Forms.DockStyle.Top; this.pnlnetinfo.Location = new System.Drawing.Point(0, 0); this.pnlnetinfo.Name = "pnlnetinfo"; - this.pnlnetinfo.Size = new System.Drawing.Size(1242, 76); + this.pnlnetinfo.Size = new System.Drawing.Size(894, 76); this.pnlnetinfo.TabIndex = 1; // // lbdescription @@ -318,7 +462,7 @@ private void InitializeComponent() | System.Windows.Forms.AnchorStyles.Right))); this.lbdescription.Location = new System.Drawing.Point(15, 31); this.lbdescription.Name = "lbdescription"; - this.lbdescription.Size = new System.Drawing.Size(1215, 36); + this.lbdescription.Size = new System.Drawing.Size(867, 36); this.lbdescription.TabIndex = 1; this.lbdescription.Text = "Information about the network."; // @@ -332,78 +476,95 @@ private void InitializeComponent() this.lbtitle.TabIndex = 0; this.lbtitle.Text = "Network Information"; // - // pnlpcinfo + // btnloadfromtemplate // - this.pnlpcinfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.pnlpcinfo.Controls.Add(this.btndelete); - this.pnlpcinfo.Controls.Add(this.lbpcinfo); - this.pnlpcinfo.Controls.Add(this.lbmoduletitle); - this.pnlpcinfo.Controls.Add(this.btncloseinfo); - this.pnlpcinfo.Location = new System.Drawing.Point(391, 181); - this.pnlpcinfo.Name = "pnlpcinfo"; - this.pnlpcinfo.Size = new System.Drawing.Size(382, 280); - this.pnlpcinfo.TabIndex = 9; - this.pnlpcinfo.Visible = false; + this.btnloadfromtemplate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnloadfromtemplate.AutoSize = true; + this.btnloadfromtemplate.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.btnloadfromtemplate.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnloadfromtemplate.Location = new System.Drawing.Point(683, 47); + this.btnloadfromtemplate.Name = "btnloadfromtemplate"; + this.btnloadfromtemplate.Size = new System.Drawing.Size(199, 23); + this.btnloadfromtemplate.TabIndex = 2; + this.btnloadfromtemplate.Text = "This button breaks things."; + this.btnloadfromtemplate.UseVisualStyleBackColor = true; + this.btnloadfromtemplate.Visible = false; + this.btnloadfromtemplate.Click += new System.EventHandler(this.btnloadfromtemplate_Click); // - // btndelete + // pnltemplates // - this.btndelete.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btndelete.AutoSize = true; - this.btndelete.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.btndelete.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btndelete.Location = new System.Drawing.Point(106, 254); - this.btndelete.Name = "btndelete"; - this.btndelete.Size = new System.Drawing.Size(59, 23); - this.btndelete.TabIndex = 8; - this.btndelete.Text = "Delete"; - this.btndelete.UseVisualStyleBackColor = true; - this.btndelete.Click += new System.EventHandler(this.btndelete_Click); + this.pnltemplates.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.pnltemplates.Controls.Add(this.label9); + this.pnltemplates.Controls.Add(this.cbnets); + this.pnltemplates.Controls.Add(this.label10); + this.pnltemplates.Controls.Add(this.btnrecreate); + this.pnltemplates.Location = new System.Drawing.Point(256, 146); + this.pnltemplates.Name = "pnltemplates"; + this.pnltemplates.Size = new System.Drawing.Size(382, 299); + this.pnltemplates.TabIndex = 8; + this.pnltemplates.Visible = false; // - // lbpcinfo + // label9 // - this.lbpcinfo.Location = new System.Drawing.Point(12, 41); - this.lbpcinfo.Name = "lbpcinfo"; - this.lbpcinfo.Size = new System.Drawing.Size(367, 86); - this.lbpcinfo.TabIndex = 6; - this.lbpcinfo.Text = resources.GetString("lbpcinfo.Text"); + this.label9.Location = new System.Drawing.Point(10, 63); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(367, 156); + this.label9.TabIndex = 6; + this.label9.Text = "Please choose a network from the above list. Net Generator will attempt to grab d" + + "ata about the network and recreate it for you."; // - // lbmoduletitle + // cbnets // - this.lbmoduletitle.AutoSize = true; - this.lbmoduletitle.Location = new System.Drawing.Point(10, 12); - this.lbmoduletitle.Name = "lbmoduletitle"; - this.lbmoduletitle.Size = new System.Drawing.Size(75, 11); - this.lbmoduletitle.TabIndex = 2; - this.lbmoduletitle.Text = "Add Module"; + this.cbnets.BackColor = System.Drawing.Color.Black; + this.cbnets.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cbnets.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.cbnets.ForeColor = System.Drawing.Color.White; + this.cbnets.FormattingEnabled = true; + this.cbnets.Location = new System.Drawing.Point(12, 38); + this.cbnets.Name = "cbnets"; + this.cbnets.Size = new System.Drawing.Size(360, 19); + this.cbnets.TabIndex = 3; // - // btncloseinfo + // label10 // - this.btncloseinfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btncloseinfo.AutoSize = true; - this.btncloseinfo.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.btncloseinfo.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btncloseinfo.Location = new System.Drawing.Point(327, 254); - this.btncloseinfo.Name = "btncloseinfo"; - this.btncloseinfo.Size = new System.Drawing.Size(52, 23); - this.btncloseinfo.TabIndex = 1; - this.btncloseinfo.Text = "Done."; - this.btncloseinfo.UseVisualStyleBackColor = true; - this.btncloseinfo.Click += new System.EventHandler(this.btncloseinfo_Click); + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(10, 12); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(124, 11); + this.label10.TabIndex = 2; + this.label10.Text = "Load from Network"; + // + // btnrecreate + // + this.btnrecreate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnrecreate.AutoSize = true; + this.btnrecreate.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.btnrecreate.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnrecreate.Location = new System.Drawing.Point(334, 273); + this.btnrecreate.Name = "btnrecreate"; + this.btnrecreate.Size = new System.Drawing.Size(45, 23); + this.btnrecreate.TabIndex = 1; + this.btnrecreate.Text = "Done"; + this.btnrecreate.UseVisualStyleBackColor = true; + this.btnrecreate.Click += new System.EventHandler(this.btnrecreate_Click); // // NetGen // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 11F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.Color.Black; - this.ClientSize = new System.Drawing.Size(1242, 605); + this.ClientSize = new System.Drawing.Size(894, 591); this.Controls.Add(this.panel1); this.Font = new System.Drawing.Font("Lucida Console", 8.25F); this.ForeColor = System.Drawing.Color.LightGreen; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; this.Name = "NetGen"; this.Text = "NetGen"; this.Load += new System.EventHandler(this.NetGen_Load); this.panel1.ResumeLayout(false); this.pnlnetdesign.ResumeLayout(false); + this.pnlpcinfo.ResumeLayout(false); + this.pnlpcinfo.PerformLayout(); this.flowLayoutPanel1.ResumeLayout(false); this.flowLayoutPanel1.PerformLayout(); this.pnlbuy.ResumeLayout(false); @@ -414,8 +575,8 @@ private void InitializeComponent() this.flbuttons.PerformLayout(); this.pnlnetinfo.ResumeLayout(false); this.pnlnetinfo.PerformLayout(); - this.pnlpcinfo.ResumeLayout(false); - this.pnlpcinfo.PerformLayout(); + this.pnltemplates.ResumeLayout(false); + this.pnltemplates.PerformLayout(); this.ResumeLayout(false); } @@ -451,5 +612,17 @@ private void InitializeComponent() private System.Windows.Forms.Label lbpcinfo; private System.Windows.Forms.Label lbmoduletitle; private System.Windows.Forms.Button btncloseinfo; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.ComboBox cbdifficulty; + private System.Windows.Forms.TextBox txtfspeed; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox txtfskill; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Button btnloadfromtemplate; + private System.Windows.Forms.Panel pnltemplates; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.ComboBox cbnets; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Button btnrecreate; } } \ No newline at end of file diff --git a/source/WindowsFormsApplication1/NetGen.cs b/source/WindowsFormsApplication1/NetGen.cs index 7f09eb1..616505d 100644 --- a/source/WindowsFormsApplication1/NetGen.cs +++ b/source/WindowsFormsApplication1/NetGen.cs @@ -46,8 +46,28 @@ public void SetupUI() pnlnetinf.BringToFront(); break; case 1: + //clear potential + if(potentialModules != null) + { + foreach(var p in potentialModules) + { + pnlnetdesign.Controls.Remove(p); + p.Hide(); + + } + potentialModules = new List(); + } //create net - network = new EnemyHacker(txtnetname.Text, txtnetdesc.Text, txtnetdesc.Text, 0, 0, "unknown"); + if (overwrite_net == true) + { + network = new EnemyHacker(txtnetname.Text, txtnetdesc.Text, txtnetdesc.Text, this.skill, this.speed, cbdifficulty.Text); + } + else + { + network = new EnemyHacker(txtnetname.Text, txtnetdesc.Text, txtnetdesc.Text, this.skill, this.speed, cbdifficulty.Text); + network.Network = TemplateNet; + } + network.Network[0].HP = network.Network[0].GetTotalHP(); var c = network.Network[0].Deploy(); c.Left = (pnlnetdesign.Width - 64) / 2; c.Top = (pnlnetdesign.Height - 64) / 2; @@ -213,7 +233,7 @@ private void place_module(object sender, MouseEventArgs e) var coordinates = pnlnetdesign.PointToClient(Cursor.Position); int x = coordinates.X; int y = coordinates.Y; - + fmod.HP = fmod.GetTotalHP(); var computerToPlace = fmod.Deploy(); computerToPlace.Location = new Point(x, y); pnlnetdesign.Controls.Add(computerToPlace); @@ -262,5 +282,80 @@ private void btncloseinfo_Click(object sender, EventArgs e) SelectedSystem = null; pnlpcinfo.Hide(); } + + int skill = 0; + int speed = 0; + + private void txtfskill_TextChanged(object sender, EventArgs e) + { + try + { + skill = Convert.ToInt32(txtfskill.Text); + } + catch + { + txtfskill.Text = skill.ToString(); + } + } + + private void txtfspeed_TextChanged(object sender, EventArgs e) + { + try + { + speed = Convert.ToInt32(txtfspeed.Text); + } + catch + { + txtfspeed.Text = speed.ToString(); + } + } + + Dictionary Templates = null; + + public void SetupTemplates() + { + Templates = JsonConvert.DeserializeObject>(Properties.Resources.NetBrowser_Enemies); + cbnets.Items.Clear(); + foreach(var t in Templates) + { + cbnets.Items.Add(t.Key); + } + } + + private void btnloadfromtemplate_Click(object sender, EventArgs e) + { + SetupTemplates(); + pnltemplates.BringToFront(); + pnltemplates.Visible = !pnltemplates.Visible; + } + + bool overwrite_net = true; + List TemplateNet = null; + + public void SetupTemplate(EnemyHacker t) + { + txtnetname.Text = t.Name; + txtnetdesc.Text = t.Description; + txtfskill.Text = t.FriendSkill.ToString(); + txtfspeed.Text = t.FriendSpeed.ToString(); + cbdifficulty.SelectedItem = t.Difficulty; + stage = 0; + overwrite_net = false; + TemplateNet = t.Network; + SetupUI(); + } + + private void btnrecreate_Click(object sender, EventArgs e) + { + try + { + SetupTemplate(Templates[cbnets.Text]); + pnltemplates.Hide(); + } + catch + { + + } + } } } diff --git a/source/WindowsFormsApplication1/NetModuleStatus.Designer.cs b/source/WindowsFormsApplication1/NetModuleStatus.Designer.cs new file mode 100644 index 0000000..31608d4 --- /dev/null +++ b/source/WindowsFormsApplication1/NetModuleStatus.Designer.cs @@ -0,0 +1,84 @@ +namespace ShiftOS +{ + partial class NetModuleStatus + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lbinfo = new System.Windows.Forms.Label(); + this.pghealth = new ShiftOS.ProgressBarEX(); + this.SuspendLayout(); + // + // lbinfo + // + this.lbinfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.lbinfo.Location = new System.Drawing.Point(4, 4); + this.lbinfo.Name = "lbinfo"; + this.lbinfo.Size = new System.Drawing.Size(102, 22); + this.lbinfo.TabIndex = 1; + this.lbinfo.Text = "label1"; + // + // pghealth + // + this.pghealth.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pghealth.BackColor = System.Drawing.Color.Black; + this.pghealth.BlockSeparation = 3; + this.pghealth.BlockWidth = 5; + this.pghealth.Color = System.Drawing.Color.Gray; + this.pghealth.ForeColor = System.Drawing.Color.White; + this.pghealth.Location = new System.Drawing.Point(112, 4); + this.pghealth.MaxValue = 100; + this.pghealth.MinValue = 0; + this.pghealth.Name = "pghealth"; + this.pghealth.Orientation = ShiftOS.ProgressBarEX.ProgressBarOrientation.Horizontal; + this.pghealth.ShowValue = true; + this.pghealth.Size = new System.Drawing.Size(227, 22); + this.pghealth.Step = 10; + this.pghealth.Style = ShiftOS.ProgressBarEX.ProgressBarExStyle.Continuous; + this.pghealth.TabIndex = 0; + this.pghealth.Value = 0; + // + // NetModuleStatus + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.lbinfo); + this.Controls.Add(this.pghealth); + this.Name = "NetModuleStatus"; + this.Size = new System.Drawing.Size(352, 26); + this.ResumeLayout(false); + + } + + #endregion + + private ProgressBarEX pghealth; + private System.Windows.Forms.Label lbinfo; + } +} diff --git a/source/WindowsFormsApplication1/NetModuleStatus.cs b/source/WindowsFormsApplication1/NetModuleStatus.cs new file mode 100644 index 0000000..037f73a --- /dev/null +++ b/source/WindowsFormsApplication1/NetModuleStatus.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ShiftOS +{ + public partial class NetModuleStatus : UserControl + { + private Module _module = null; + + public NetModuleStatus(Module m) + { + _module = m; + InitializeComponent(); + var t = new Timer(); + t.Tick += (object s, EventArgs a) => + { + lbinfo.Text = _module.Hostname; + pghealth.MaxValue = _module.GetTotalHP(); + pghealth.Value = _module.HP; + if(_module.HP == _module.GetTotalHP()) + { + if(this.Visible == true) + { + this.Hide(); + } + } + else + { + if(this.Visible == false) + { + this.Show(); + } + } + }; + t.Interval = 100; + t.Start(); + } + } +} diff --git a/source/WindowsFormsApplication1/NetModuleStatus.resx b/source/WindowsFormsApplication1/NetModuleStatus.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/source/WindowsFormsApplication1/NetModuleStatus.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/source/WindowsFormsApplication1/NetworkBrowser.Designer.cs b/source/WindowsFormsApplication1/NetworkBrowser.Designer.cs new file mode 100644 index 0000000..cf9468d --- /dev/null +++ b/source/WindowsFormsApplication1/NetworkBrowser.Designer.cs @@ -0,0 +1,290 @@ +namespace ShiftOS +{ + partial class NetworkBrowser + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.panel1 = new System.Windows.Forms.Panel(); + this.label3 = new System.Windows.Forms.Label(); + this.btnscreen = new System.Windows.Forms.Button(); + this.pnlmynet = new System.Windows.Forms.Panel(); + this.flmodules = new System.Windows.Forms.FlowLayoutPanel(); + this.label5 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.btntier = new System.Windows.Forms.Button(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.btnstartbattle = new System.Windows.Forms.Button(); + this.lbnets = new System.Windows.Forms.ListBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.lbnetdesc = new System.Windows.Forms.Label(); + this.lbtitle = new System.Windows.Forms.Label(); + this.pgtotalhealth = new ShiftOS.ProgressBarEX(); + this.tmrcalctotal = new System.Windows.Forms.Timer(this.components); + this.panel1.SuspendLayout(); + this.pnlmynet.SuspendLayout(); + this.panel2.SuspendLayout(); + this.SuspendLayout(); + // + // panel1 + // + this.panel1.Controls.Add(this.label3); + this.panel1.Controls.Add(this.btnscreen); + this.panel1.Controls.Add(this.pnlmynet); + this.panel1.Controls.Add(this.btntier); + this.panel1.Controls.Add(this.label2); + this.panel1.Controls.Add(this.label1); + this.panel1.Controls.Add(this.btnstartbattle); + this.panel1.Controls.Add(this.lbnets); + this.panel1.Controls.Add(this.panel2); + this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(725, 495); + this.panel1.TabIndex = 0; + // + // label3 + // + this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(282, 470); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(44, 13); + this.label3.TabIndex = 8; + this.label3.Text = "Screen:"; + // + // btnscreen + // + this.btnscreen.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.btnscreen.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnscreen.Location = new System.Drawing.Point(332, 465); + this.btnscreen.Name = "btnscreen"; + this.btnscreen.Size = new System.Drawing.Size(84, 23); + this.btnscreen.TabIndex = 7; + this.btnscreen.Text = "Network List"; + this.btnscreen.UseVisualStyleBackColor = true; + this.btnscreen.Click += new System.EventHandler(this.btnscreen_Click); + // + // pnlmynet + // + this.pnlmynet.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pnlmynet.Controls.Add(this.pgtotalhealth); + this.pnlmynet.Controls.Add(this.flmodules); + this.pnlmynet.Controls.Add(this.label5); + this.pnlmynet.Controls.Add(this.label4); + this.pnlmynet.Location = new System.Drawing.Point(12, 12); + this.pnlmynet.Name = "pnlmynet"; + this.pnlmynet.Size = new System.Drawing.Size(404, 447); + this.pnlmynet.TabIndex = 6; + // + // flmodules + // + this.flmodules.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.flmodules.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; + this.flmodules.Location = new System.Drawing.Point(7, 140); + this.flmodules.Name = "flmodules"; + this.flmodules.Size = new System.Drawing.Size(394, 298); + this.flmodules.TabIndex = 3; + this.flmodules.WrapContents = false; + // + // label5 + // + this.label5.Location = new System.Drawing.Point(4, 37); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(397, 58); + this.label5.TabIndex = 2; + this.label5.Text = "Below you can see your network\'s total health, as well as a list of any damaged m" + + "odules\' health. If \'localhost\' is on the list and it\'s health is 0, you cannot p" + + "articipate in any battles."; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F); + this.label4.Location = new System.Drawing.Point(3, 5); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(91, 20); + this.label4.TabIndex = 1; + this.label4.Text = "My Network"; + // + // btntier + // + this.btntier.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.btntier.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btntier.Location = new System.Drawing.Point(47, 465); + this.btntier.Name = "btntier"; + this.btntier.Size = new System.Drawing.Size(75, 23); + this.btntier.TabIndex = 5; + this.btntier.Text = "1"; + this.btntier.UseVisualStyleBackColor = true; + this.btntier.Click += new System.EventHandler(this.btntier_Click); + // + // label2 + // + this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(13, 470); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(28, 13); + this.label2.TabIndex = 4; + this.label2.Text = "Tier:"; + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.label1.Location = new System.Drawing.Point(419, 354); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(294, 71); + this.label1.TabIndex = 3; + this.label1.Text = "When you\'re ready, click \'Start Battle\' to begin the hacker battle."; + // + // btnstartbattle + // + this.btnstartbattle.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnstartbattle.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnstartbattle.Location = new System.Drawing.Point(638, 465); + this.btnstartbattle.Name = "btnstartbattle"; + this.btnstartbattle.Size = new System.Drawing.Size(75, 23); + this.btnstartbattle.TabIndex = 2; + this.btnstartbattle.Text = "Start Battle"; + this.btnstartbattle.UseVisualStyleBackColor = true; + this.btnstartbattle.Click += new System.EventHandler(this.btnstartbattle_Click); + // + // lbnets + // + this.lbnets.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lbnets.BackColor = System.Drawing.Color.Black; + this.lbnets.ForeColor = System.Drawing.Color.White; + this.lbnets.FormattingEnabled = true; + this.lbnets.Location = new System.Drawing.Point(13, 17); + this.lbnets.Name = "lbnets"; + this.lbnets.Size = new System.Drawing.Size(403, 433); + this.lbnets.TabIndex = 1; + this.lbnets.SelectedIndexChanged += new System.EventHandler(this.lbnets_SelectedIndexChanged); + // + // panel2 + // + this.panel2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.panel2.Controls.Add(this.lbnetdesc); + this.panel2.Controls.Add(this.lbtitle); + this.panel2.Location = new System.Drawing.Point(422, 13); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(291, 326); + this.panel2.TabIndex = 0; + // + // lbnetdesc + // + this.lbnetdesc.Location = new System.Drawing.Point(5, 36); + this.lbnetdesc.Name = "lbnetdesc"; + this.lbnetdesc.Size = new System.Drawing.Size(283, 290); + this.lbnetdesc.TabIndex = 1; + this.lbnetdesc.Text = "No network selected."; + // + // lbtitle + // + this.lbtitle.AutoSize = true; + this.lbtitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F); + this.lbtitle.Location = new System.Drawing.Point(4, 4); + this.lbtitle.Name = "lbtitle"; + this.lbtitle.Size = new System.Drawing.Size(129, 20); + this.lbtitle.TabIndex = 0; + this.lbtitle.Text = "Network Browser"; + // + // pgtotalhealth + // + this.pgtotalhealth.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pgtotalhealth.BackColor = System.Drawing.Color.Black; + this.pgtotalhealth.BlockSeparation = 3; + this.pgtotalhealth.BlockWidth = 5; + this.pgtotalhealth.Color = System.Drawing.Color.Gray; + this.pgtotalhealth.Location = new System.Drawing.Point(7, 98); + this.pgtotalhealth.MaxValue = 100; + this.pgtotalhealth.MinValue = 0; + this.pgtotalhealth.Name = "pgtotalhealth"; + this.pgtotalhealth.Orientation = ShiftOS.ProgressBarEX.ProgressBarOrientation.Horizontal; + this.pgtotalhealth.ShowValue = true; + this.pgtotalhealth.Size = new System.Drawing.Size(394, 32); + this.pgtotalhealth.Step = 10; + this.pgtotalhealth.Style = ShiftOS.ProgressBarEX.ProgressBarExStyle.Continuous; + this.pgtotalhealth.TabIndex = 4; + this.pgtotalhealth.Value = 0; + // + // tmrcalctotal + // + this.tmrcalctotal.Enabled = true; + this.tmrcalctotal.Tick += new System.EventHandler(this.tmrcalctotal_Tick); + // + // NetworkBrowser + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.White; + this.ClientSize = new System.Drawing.Size(725, 495); + this.Controls.Add(this.panel1); + this.ForeColor = System.Drawing.Color.Black; + this.Name = "NetworkBrowser"; + this.Text = "NetworkBrowser"; + this.Load += new System.EventHandler(this.NetworkBrowser_Load); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + this.pnlmynet.ResumeLayout(false); + this.pnlmynet.PerformLayout(); + this.panel2.ResumeLayout(false); + this.panel2.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button btnstartbattle; + private System.Windows.Forms.ListBox lbnets; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Label lbnetdesc; + private System.Windows.Forms.Label lbtitle; + private System.Windows.Forms.Button btntier; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Button btnscreen; + private System.Windows.Forms.Panel pnlmynet; + private System.Windows.Forms.FlowLayoutPanel flmodules; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label4; + private ProgressBarEX pgtotalhealth; + private System.Windows.Forms.Timer tmrcalctotal; + } +} \ No newline at end of file diff --git a/source/WindowsFormsApplication1/NetworkBrowser.cs b/source/WindowsFormsApplication1/NetworkBrowser.cs new file mode 100644 index 0000000..127140f --- /dev/null +++ b/source/WindowsFormsApplication1/NetworkBrowser.cs @@ -0,0 +1,301 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ShiftOS +{ + public partial class NetworkBrowser : Form + { + public NetworkBrowser() + { + InitializeComponent(); + } + + public Dictionary Networks = null; + + private void NetworkBrowser_Load(object sender, EventArgs e) + { + LoadNetworks(); + SetupSidePane(); + pnlmynet.Hide(); + } + + public string CurrentTier = "easy"; + public EnemyHacker SelectedNet = null; + + public void LoadNetworks() + { + switch(CurrentTier) + { + case "easy": + btntier.Text = "1"; + break; + case "medium": + btntier.Text = "2"; + break; + case "hard": + btntier.Text = "3"; + break; + } + Networks = JsonConvert.DeserializeObject>(Properties.Resources.NetBrowser_Enemies); + lbnets.Items.Clear(); + var Tier1 = new List(); + var Tier2 = new List(); + var Tier3 = new List(); + + foreach (var net in Networks) + { + if (!API.CurrentSave.CompletedNets.Contains(net.Key)) + { + switch (net.Value.Difficulty) + { + case "easy": + Tier1.Add(net.Key); + break; + case "medium": + Tier2.Add(net.Key); + break; + case "hard": + Tier3.Add(net.Key); + break; + } + } + } + + switch (CurrentTier) + { + case "easy": + SetupUI(Tier1); + break; + case "medium": + SetupUI(Tier2); + break; + case "hard": + SetupUI(Tier3); + break; + } + } + + public void SetupSidePane() + { + if(SelectedNet != null) + { + lbtitle.Text = SelectedNet.Name; + lbnetdesc.Text = SelectedNet.Description + @" + +Leader hack speed: " + SelectedNet.FriendSpeed.ToString() + @" +Leader hack skill: " + SelectedNet.FriendSkill.ToString() + @" + +Those above values only matter if the leader decides to become a friend. If they do, you can hire them for free to hack into certain ShiftOS applications."; + btnstartbattle.Enabled = true; + } + else + { + lbtitle.Text = "Network Browser"; + lbnetdesc.Text = "No network selected."; + btnstartbattle.Enabled = false; + } + } + + public void SetupUI(List tier) + { + if (tier.Count > 0) + { + foreach (var t in tier) + { + lbnets.Items.Add(t); + } + } + else + { + AddLeader(CurrentTier); + } + } + + public void AddLeader(string tier) + { + if (API.Upgrades["nb_tier_" + tier] == false) + { + var enemy = JsonConvert.DeserializeObject(Get_Leader_JSON(tier)); + Networks.Add(enemy.Name, enemy); + lbnets.Items.Add(enemy.Name); + } + } + + public string Get_Leader_JSON(string tier) + { + switch(tier) + { + case "easy": + return Properties.Resources.Hacker_DanaRoss; + case "medium": + return Properties.Resources.Hacker_AustinWalker; + case "hard": + return Properties.Resources.Hacker_JonathanRivard; + default: + return null; + + } + } + + private void btntier_Click(object sender, EventArgs e) + { + switch(btntier.Text) + { + case "1": + if(API.Upgrades["nb_tier_easy"] == true) + { + CurrentTier = "medium"; + } + break; + case "2": + if (API.Upgrades["nb_tier_medium"] == true) + { + CurrentTier = "hard"; + } + else + { + CurrentTier = "easy"; + } + break; + case "3": + CurrentTier = "easy"; + break; + } + LoadNetworks(); + } + + private void lbnets_SelectedIndexChanged(object sender, EventArgs e) + { + var t = lbnets.SelectedItem as string; + foreach(var net in Networks) + { + if(net.Key == t) + { + SelectedNet = net.Value; + } + } + SetupSidePane(); + } + + private void btnstartbattle_Click(object sender, EventArgs e) + { + if (Hacking.MyCore.HP == 0) + { + SetupMyNet(); + pnlmynet.Show(); + btnscreen.Text = "My Network"; + API.CreateInfoboxSession("Your Core isn't ready.", "Your Core (hostname \"localhost\") has 0 HP, and cannot fight. Please wait until your Core regenerates.", infobox.InfoboxMode.Info); + } + else + { + string tier_upgrade = null; + if (SelectedNet.IsLeader == true) + { + tier_upgrade = "nb_tier_" + CurrentTier; + } + var hui = new HackUI(SelectedNet); + hui.OnWin += (object s, EventArgs a) => + { + if (tier_upgrade != null) + { + API.Upgrades[tier_upgrade] = true; + if(CurrentTier == "easy") + { + if(API.Upgrades["midgamebridge"] == false) + { + var term = new Terminal(); + API.CreateForm(term, API.LoadedNames.TerminalName, API.GetIcon("Terminal")); + term.StartDanaRossStory(); + } + } + else if(CurrentTier == "medium") + { + var h = new HoloChat(); + var fakeroom = new FakeChatClient(); + fakeroom.Name = "The Hacker Alliance"; + fakeroom.Topic = "The Hacker Alliance - We are the masters. DevX cannot control us."; + fakeroom.OtherCharacters = new List(new [] {"Richard Ladouceur"}); + fakeroom.Messages = JsonConvert.DeserializeObject>(Properties.Resources.AustinWalkerCompletionStory); + API.CreateForm(h, "QuickChat", API.GetIcon("QuickChat")); + var t = new Thread(new ThreadStart(new Action(() => + { + Thread.Sleep(200); + h.Invoke(new Action(() => + { + h.SetupFakeClient(fakeroom); + })); + }))); + + } + foreach(var mod in SelectedNet.Network) + { + if (mod.Type != SystemType.Core) + { + mod.HP = 0; + Hacking.MyNetwork.Add(mod); + } + } + SetupMyNet(); + } + API.CurrentSave.CompletedNets.Add(SelectedNet.Name); + SelectedNet = null; + LoadNetworks(); + SetupSidePane(); + }; + hui.Show(); + } + } + + public void SetupMyNet() + { + flmodules.Controls.Clear(); + foreach(var m in Hacking.MyNetwork) + { + var mStatus = new NetModuleStatus(m); + flmodules.Controls.Add(mStatus); + mStatus.Show(); + } + } + + private void btnscreen_Click(object sender, EventArgs e) + { + switch (btnscreen.Text) + { + case "My Network": + LoadNetworks(); + SetupSidePane(); + pnlmynet.Hide(); + btnscreen.Text = "Network List"; + break; + case "Network List": + SetupMyNet(); + pnlmynet.Show(); + btnscreen.Text = "My Network"; + break; + } + + } + + private void tmrcalctotal_Tick(object sender, EventArgs e) + { + int total = 0; + int hp = 0; + foreach(var mod in Hacking.MyNetwork) + { + total += mod.GetTotalHP(); + hp += mod.HP; + } + pgtotalhealth.MaxValue = total; + pgtotalhealth.Value = hp; + } + } +} diff --git a/source/WindowsFormsApplication1/NetworkBrowser.resx b/source/WindowsFormsApplication1/NetworkBrowser.resx new file mode 100644 index 0000000..fa83c0a --- /dev/null +++ b/source/WindowsFormsApplication1/NetworkBrowser.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/source/WindowsFormsApplication1/PanelManager.Designer.cs b/source/WindowsFormsApplication1/PanelManager.Designer.cs new file mode 100644 index 0000000..2ae44a8 --- /dev/null +++ b/source/WindowsFormsApplication1/PanelManager.Designer.cs @@ -0,0 +1,132 @@ +namespace ShiftOS +{ + partial class PanelManager + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.pnlmain = new System.Windows.Forms.Panel(); + this.btndone = new System.Windows.Forms.Button(); + this.pnlbgcolor = new System.Windows.Forms.Panel(); + this.Label40 = new System.Windows.Forms.Label(); + this.Label36 = new System.Windows.Forms.Label(); + this.txtheight = new System.Windows.Forms.TextBox(); + this.pnlmain.SuspendLayout(); + this.SuspendLayout(); + // + // pnlmain + // + this.pnlmain.BackColor = System.Drawing.Color.White; + this.pnlmain.Controls.Add(this.txtheight); + this.pnlmain.Controls.Add(this.Label36); + this.pnlmain.Controls.Add(this.pnlbgcolor); + this.pnlmain.Controls.Add(this.Label40); + this.pnlmain.Controls.Add(this.btndone); + this.pnlmain.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlmain.ForeColor = System.Drawing.Color.Black; + this.pnlmain.Location = new System.Drawing.Point(0, 0); + this.pnlmain.Name = "pnlmain"; + this.pnlmain.Size = new System.Drawing.Size(360, 378); + this.pnlmain.TabIndex = 0; + // + // btndone + // + this.btndone.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btndone.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btndone.Location = new System.Drawing.Point(273, 343); + this.btndone.Name = "btndone"; + this.btndone.Size = new System.Drawing.Size(75, 23); + this.btndone.TabIndex = 0; + this.btndone.Text = "Done"; + this.btndone.UseVisualStyleBackColor = true; + this.btndone.Click += new System.EventHandler(this.btndone_Click); + // + // pnlbgcolor + // + this.pnlbgcolor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.pnlbgcolor.Location = new System.Drawing.Point(307, 101); + this.pnlbgcolor.Name = "pnlbgcolor"; + this.pnlbgcolor.Size = new System.Drawing.Size(41, 20); + this.pnlbgcolor.TabIndex = 22; + this.pnlbgcolor.MouseDown += new System.Windows.Forms.MouseEventHandler(this.setbgcolor); + // + // Label40 + // + this.Label40.AutoSize = true; + this.Label40.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Label40.Location = new System.Drawing.Point(12, 101); + this.Label40.Name = "Label40"; + this.Label40.Size = new System.Drawing.Size(259, 16); + this.Label40.TabIndex = 23; + this.Label40.Text = "Background Color (right-click to set image)"; + // + // Label36 + // + this.Label36.AutoSize = true; + this.Label36.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Label36.Location = new System.Drawing.Point(12, 136); + this.Label36.Name = "Label36"; + this.Label36.Size = new System.Drawing.Size(50, 16); + this.Label36.TabIndex = 24; + this.Label36.Text = "Height:"; + // + // txtheight + // + this.txtheight.BackColor = System.Drawing.Color.White; + this.txtheight.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.txtheight.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txtheight.ForeColor = System.Drawing.Color.Black; + this.txtheight.Location = new System.Drawing.Point(325, 134); + this.txtheight.Name = "txtheight"; + this.txtheight.Size = new System.Drawing.Size(23, 22); + this.txtheight.TabIndex = 25; + this.txtheight.TextChanged += new System.EventHandler(this.txtheight_TextChanged); + // + // PanelManager + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(360, 378); + this.Controls.Add(this.pnlmain); + this.Name = "PanelManager"; + this.Text = "PanelManager"; + this.Load += new System.EventHandler(this.PanelManager_Load); + this.pnlmain.ResumeLayout(false); + this.pnlmain.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel pnlmain; + private System.Windows.Forms.Button btndone; + private System.Windows.Forms.Panel pnlbgcolor; + private System.Windows.Forms.Label Label40; + private System.Windows.Forms.Label Label36; + private System.Windows.Forms.TextBox txtheight; + } +} \ No newline at end of file diff --git a/source/WindowsFormsApplication1/PanelManager.cs b/source/WindowsFormsApplication1/PanelManager.cs new file mode 100644 index 0000000..9e5327a --- /dev/null +++ b/source/WindowsFormsApplication1/PanelManager.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ShiftOS +{ + public partial class PanelManager : Form + { + public PanelManager(Skinning.DesktopPanel newPanel) + { + pnl = newPanel; + InitializeComponent(); + } + + private Skinning.DesktopPanel pnl = null; + + private void setbgcolor(object sender, MouseEventArgs e) + { + if(e.Button == MouseButtons.Left) + { + API.CreateColorPickerSession("Panel Background", pnl.BackgroundColor); + API.ColorPickerSession.FormClosing += (s, a) => + { + var c = API.GetLastColorFromSession(); + pnl.BackgroundColor = c; + pnl.BackgroundImage = null; + }; + } + else if(e.Button == MouseButtons.Right) + { + API.CreateGraphicPickerSession("Panel Background", false); + API.GraphicPickerSession.FormClosing += (s, a) => + { + var img = API.GraphicPickerSession.IdleImage; + pnl.BackgroundImage = img; + }; + } + } + + private void txtheight_TextChanged(object sender, EventArgs e) + { + try + { + int height = Convert.ToInt32(txtheight.Text); + pnl.Height = height; + } + catch + { + txtheight.Text = pnl.Height.ToString(); + } + } + + private void btndone_Click(object sender, EventArgs e) + { + API.CurrentSession.SetupDesktopPanel(); + Skinning.Utilities.saveskin(); + this.Close(); + } + + private void PanelManager_Load(object sender, EventArgs e) + { + pnlbgcolor.BackColor = pnl.BackgroundColor; + pnlbgcolor.BackgroundImage = pnl.BackgroundImage; + txtheight.Text = pnl.Height.ToString(); + } + } +} diff --git a/source/WindowsFormsApplication1/PanelManager.resx b/source/WindowsFormsApplication1/PanelManager.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/source/WindowsFormsApplication1/PanelManager.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/source/WindowsFormsApplication1/Program.cs b/source/WindowsFormsApplication1/Program.cs index 668b08e..2b9bd47 100644 --- a/source/WindowsFormsApplication1/Program.cs +++ b/source/WindowsFormsApplication1/Program.cs @@ -66,6 +66,13 @@ static void Main(string[] args) //Load ShiftOS skin Skinning.Utilities.loadskin(); SaveSystem.ShiftoriumRegistry.UpdateShiftorium(); + //Lua bootscreen. + if(File.Exists(Paths.SaveRoot + "BOOT")) + { + string lua = File.ReadAllText(Paths.SaveRoot + "BOOT"); + var l = new LuaInterpreter(); + l.mod(lua); + } //Start recieving calls from the Modding API... Application.Run(new ShiftOSDesktop()); //By now, the API receiver has been loaded, diff --git a/source/WindowsFormsApplication1/Properties/Resources.Designer.cs b/source/WindowsFormsApplication1/Properties/Resources.Designer.cs index 995975b..801ccf8 100644 --- a/source/WindowsFormsApplication1/Properties/Resources.Designer.cs +++ b/source/WindowsFormsApplication1/Properties/Resources.Designer.cs @@ -659,6 +659,20 @@ internal static System.Drawing.Bitmap ArtPadundo { } } + /// + /// Looks up a localized string similar to { + ///"Hey! Seems your Network Browser's working pretty well, huh?":"Richard Ladouceur", + ///"I keep reading news about networks on the list going offline.":"Richard Ladouceur", + ///"It's great to see you're doing this, because pretty soon, it'll be DevX's turn to suffer your wrath.":"Richard Ladouceur", + ///"I've patched your Network Browser to allow you to fight in Tier 3 battles.":"Richard Ladouceur", + ///"Just be careful - if I'm able to see all of this news, there's no doubt DevX has his eyes on it.":"Richard Ladouce [rest of string was truncated]";. + /// + internal static string AustinWalkerCompletionStory { + get { + return ResourceManager.GetString("AustinWalkerCompletionStory", resourceCulture); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -1113,6 +1127,33 @@ internal static System.Drawing.Bitmap Gray_Shades { } } + /// + /// Looks up a localized string similar to {"IsLeader":true,"Name":"Austin Walker","FriendDesc":"Austin Walker is a retired programmer who worked at Orange Inc. In an attempt to gain even more money, he has trained himself with hacker battles.","Description":"Austin Walker is a retired programmer who worked at Orange Inc. In an attempt to gain even more money, he has trained himself with hacker battles.","FriendSpeed":45,"FriendSkill":150,"Difficulty":"medium","Network":[{"Hostname":"austin_walker","ModuleType":0,"Type":0,"HP":100,"Grade":1,"X":0,"Y [rest of string was truncated]";. + /// + internal static string Hacker_AustinWalker { + get { + return ResourceManager.GetString("Hacker_AustinWalker", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {"Name":"Dana Ross","FriendDesc":"Dana Ross is a new, yet experienced ShiftOS user. She is also experienced in hacking, and is a worthy adversary for any Tier 1 network who dares try her.","Description":"Dana Ross is a new, yet experienced ShiftOS user. She is also experienced in hacking, and is a worthy adversary for any Tier 1 network who dares try her.","FriendSpeed":100,"FriendSkill":100,"Difficulty":"easy","Network":[{"Hostname":"dana_ross","ModuleType":0,"Type":0,"HP":0,"Grade":1,"X":0,"Y":0},{"Hostna [rest of string was truncated]";. + /// + internal static string Hacker_DanaRoss { + get { + return ResourceManager.GetString("Hacker_DanaRoss", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {}. + /// + internal static string Hacker_JonathanRivard { + get { + return ResourceManager.GetString("Hacker_JonathanRivard", resourceCulture); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -1532,6 +1573,23 @@ internal static System.Drawing.Bitmap loadbutton { } } + /// + /// Looks up a localized string similar to { + /// "Ahhh, User! I see the installation was successful and you made it.":"Richard Ladouceur", + /// "Oh - sorry. I'm who you know as '???'.":"Richard Ladouceur", + /// "So listen. You've heard of Hacker Battles, right?":"Richard Ladouceur", + /// "Well - every skilled hacker needs to know who to hit.":"Richard Ladouceur", + /// "Remember that hacker friend I told you about earlier?":"Richard Ladouceur", + /// "Yeah - that's me...":"Hacker101", + /// "Me and Richard have plans - and we need your help.":"Hacker101", + /// "We're plannin [rest of string was truncated]";. + /// + internal static string MidGame_Holochat { + get { + return ResourceManager.GetString("MidGame_Holochat", resourceCulture); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -1562,6 +1620,16 @@ internal static System.Drawing.Bitmap minimatchlabyrinthpreview { } } + /// + /// Looks up a localized string similar to { + ///"BufferOverflow":{"IsLeader":false,"Name":"BufferOverflow","FriendDesc":"BufferOverflow is a question-and-answer site with millions of Shifters willing to share their knowledge.","Description":"BufferOverflow is a question-and-answer site with millions of Shifters willing to share their knowledge.","FriendSpeed":0,"FriendSkill":0,"Difficulty":"easy","Network":[{"Hostname":"bufferoverflow","ModuleType":0,"Type":0,"HP":100,"Grade":1,"X":0,"Y":0},{"Hostname":"main_av","ModuleType":0,"Type":1,"HP":0,"Grade": [rest of string was truncated]";. + /// + internal static string NetBrowser_Enemies { + get { + return ResourceManager.GetString("NetBrowser_Enemies", resourceCulture); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/source/WindowsFormsApplication1/Properties/Resources.resx b/source/WindowsFormsApplication1/Properties/Resources.resx index 092475f..b8d0f01 100644 --- a/source/WindowsFormsApplication1/Properties/Resources.resx +++ b/source/WindowsFormsApplication1/Properties/Resources.resx @@ -715,9 +715,6 @@ ..\Resources\upgradeartpadpaintbrushtool.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\iconColourPicker.fw.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\object_small2.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -1201,4 +1198,25 @@ ..\Resources\DevX_Secondary.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + ..\Resources\Hacker_AustinWalker.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + ..\Resources\Hacker_DanaRoss.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + ..\Resources\Hacker_JonathanRivard.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + ..\Resources\MidGame_Holochat.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + ..\Resources\NetBrowser_Enemies.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + ..\Resources\iconColourPicker.fw.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\AustinWalkerCompletionStory.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + \ No newline at end of file diff --git a/source/WindowsFormsApplication1/Resources/AustinWalkerCompletionStory.txt b/source/WindowsFormsApplication1/Resources/AustinWalkerCompletionStory.txt new file mode 100644 index 0000000..3981311 --- /dev/null +++ b/source/WindowsFormsApplication1/Resources/AustinWalkerCompletionStory.txt @@ -0,0 +1,7 @@ +{ +"Hey! Seems your Network Browser's working pretty well, huh?":"Richard Ladouceur", +"I keep reading news about networks on the list going offline.":"Richard Ladouceur", +"It's great to see you're doing this, because pretty soon, it'll be DevX's turn to suffer your wrath.":"Richard Ladouceur", +"I've patched your Network Browser to allow you to fight in Tier 3 battles.":"Richard Ladouceur", +"Just be careful - if I'm able to see all of this news, there's no doubt DevX has his eyes on it.":"Richard Ladouceur" +} \ No newline at end of file diff --git a/source/WindowsFormsApplication1/Resources/Hacker_AustinWalker.txt b/source/WindowsFormsApplication1/Resources/Hacker_AustinWalker.txt new file mode 100644 index 0000000..922dfe2 --- /dev/null +++ b/source/WindowsFormsApplication1/Resources/Hacker_AustinWalker.txt @@ -0,0 +1 @@ +{"IsLeader":true,"Name":"Austin Walker","FriendDesc":"Austin Walker is a retired programmer who worked at Orange Inc. In an attempt to gain even more money, he has trained himself with hacker battles.","Description":"Austin Walker is a retired programmer who worked at Orange Inc. In an attempt to gain even more money, he has trained himself with hacker battles.","FriendSpeed":45,"FriendSkill":150,"Difficulty":"medium","Network":[{"Hostname":"austin_walker","ModuleType":0,"Type":0,"HP":100,"Grade":1,"X":0,"Y":0},{"Hostname":"aus_ddos_1","ModuleType":0,"Type":6,"HP":0,"Grade":3,"X":489,"Y":242},{"Hostname":"aus_ddos_2","ModuleType":0,"Type":6,"HP":0,"Grade":3,"X":493,"Y":167},{"Hostname":"aus_fw_1","ModuleType":0,"Type":5,"HP":0,"Grade":4,"X":372,"Y":214},{"Hostname":"aus_repair1","ModuleType":0,"Type":9,"HP":0,"Grade":4,"X":553,"Y":212},{"Hostname":"aus_repair2","ModuleType":0,"Type":9,"HP":0,"Grade":4,"X":332,"Y":219},{"Hostname":"aus_repair3","ModuleType":0,"Type":9,"HP":0,"Grade":2,"X":509,"Y":136},{"Hostname":"aus_repair4","ModuleType":0,"Type":9,"HP":0,"Grade":2,"X":504,"Y":297},{"Hostname":"aus_turret1","ModuleType":0,"Type":3,"HP":0,"Grade":4,"X":425,"Y":263},{"Hostname":"aus_turret2","ModuleType":0,"Type":3,"HP":0,"Grade":4,"X":429,"Y":151}]} \ No newline at end of file diff --git a/source/WindowsFormsApplication1/Resources/Hacker_DanaRoss.txt b/source/WindowsFormsApplication1/Resources/Hacker_DanaRoss.txt new file mode 100644 index 0000000..af0ca1c --- /dev/null +++ b/source/WindowsFormsApplication1/Resources/Hacker_DanaRoss.txt @@ -0,0 +1 @@ +{"Name":"Dana Ross","FriendDesc":"Dana Ross is a new, yet experienced ShiftOS user. She is also experienced in hacking, and is a worthy adversary for any Tier 1 network who dares try her.","Description":"Dana Ross is a new, yet experienced ShiftOS user. She is also experienced in hacking, and is a worthy adversary for any Tier 1 network who dares try her.","FriendSpeed":100,"FriendSkill":100,"Difficulty":"easy","Network":[{"Hostname":"dana_ross","ModuleType":0,"Type":0,"HP":0,"Grade":1,"X":0,"Y":0},{"Hostname":"dr_ddos","ModuleType":0,"Type":6,"HP":0,"Grade":1,"X":659,"Y":208},{"Hostname":"dr_av1","ModuleType":0,"Type":1,"HP":0,"Grade":2,"X":714,"Y":215},{"Hostname":"main_firewall","ModuleType":0,"Type":5,"HP":0,"Grade":3,"X":526,"Y":220},{"Hostname":"trt_1","ModuleType":0,"Type":3,"HP":0,"Grade":4,"X":600,"Y":154},{"Hostname":"trt_2","ModuleType":0,"Type":3,"HP":0,"Grade":4,"X":599,"Y":281}],"IsLeader":true} \ No newline at end of file diff --git a/source/WindowsFormsApplication1/Resources/Hacker_JonathanRivard.txt b/source/WindowsFormsApplication1/Resources/Hacker_JonathanRivard.txt new file mode 100644 index 0000000..33f2f27 --- /dev/null +++ b/source/WindowsFormsApplication1/Resources/Hacker_JonathanRivard.txt @@ -0,0 +1 @@ +{"IsLeader":false,"Name":"Jonathan Rivard","FriendDesc":"Jonathan is a 13 year old from the city of New York, who was also hijacked by DevX and told to try ShiftOS out. He was a member of the Hacker Alliance, but decided to leave to accomplish his goal of becoming a hacker battle giant. Just goes to show that kids can also be extremely competent hackers.","Description":"Jonathan is a 13 year old from the city of New York, who was also hijacked by DevX and told to try ShiftOS out. He was a member of the Hacker Alliance, but decided to leave to accomplish his goal of becoming a hacker battle giant. Just goes to show that kids can also be extremely competent hackers.","FriendSpeed":400,"FriendSkill":400,"Difficulty":"hard","Network":[{"Hostname":"jonathan_rivard","ModuleType":0,"Type":0,"HP":100,"Grade":1,"X":0,"Y":0},{"Hostname":"jr_trt1","ModuleType":0,"Type":3,"HP":0,"Grade":4,"X":428,"Y":275},{"Hostname":"jr_trt2","ModuleType":0,"Type":3,"HP":0,"Grade":4,"X":433,"Y":142},{"Hostname":"jr_trt3","ModuleType":0,"Type":3,"HP":0,"Grade":4,"X":494,"Y":215},{"Hostname":"jr_trt4","ModuleType":0,"Type":3,"HP":0,"Grade":4,"X":367,"Y":218},{"Hostname":"jr_repair_alpha","ModuleType":0,"Type":9,"HP":0,"Grade":3,"X":364,"Y":276},{"Hostname":"jr_repair_beta","ModuleType":0,"Type":9,"HP":0,"Grade":4,"X":499,"Y":276},{"Hostname":"distributed_denial_of_freedom","ModuleType":0,"Type":2,"HP":0,"Grade":2,"X":492,"Y":149},{"Hostname":"distributed_grant_of_evil","ModuleType":0,"Type":2,"HP":0,"Grade":2,"X":364,"Y":144},{"Hostname":"sorry","ModuleType":0,"Type":6,"HP":0,"Grade":4,"X":543,"Y":196},{"Hostname":"not_really","ModuleType":0,"Type":6,"HP":0,"Grade":4,"X":289,"Y":207}]} \ No newline at end of file diff --git a/source/WindowsFormsApplication1/Resources/MidGame_Holochat.txt b/source/WindowsFormsApplication1/Resources/MidGame_Holochat.txt new file mode 100644 index 0000000..0ea1009 --- /dev/null +++ b/source/WindowsFormsApplication1/Resources/MidGame_Holochat.txt @@ -0,0 +1,18 @@ +{ + "Ahhh, User! I see the installation was successful and you made it.":"Richard Ladouceur", + "Oh - sorry. I'm who you know as '???'.":"Richard Ladouceur", + "So listen. You've heard of Hacker Battles, right?":"Richard Ladouceur", + "Well - every skilled hacker needs to know who to hit.":"Richard Ladouceur", + "Remember that hacker friend I told you about earlier?":"Richard Ladouceur", + "Yeah - that's me...":"Hacker101", + "Me and Richard have plans - and we need your help.":"Hacker101", + "We're planning on stopping DevX right in his tracks.":"Richard Ladouceur", + "And since you have the tools, we figured we'd get you on board.":"Richard Ladouceur", + "But first - I need to install ANOTHER thing on your system.":"Richard Ladouceur", + "It's called the 'Network Browser'. It's a handy tool that'll list various networks you can take down.":"Hacker101", + "It'll tell you their name, leader skill, leader speed, and their tier.":"Hacker101", + "install:networkbrowser":"Hacker101", + "Done. For now, we've locked it to only showing Tier 1 networks.":"Richard Ladouceur", + "Beat all the Tier 1 networks, and beat the leader, and you'll gain a special reward.":"Hacker101", + "Anyways, that's all we've gotta say. Talk to ya later!":"Hacker101" +} \ No newline at end of file diff --git a/source/WindowsFormsApplication1/Resources/NetBrowser_Enemies.txt b/source/WindowsFormsApplication1/Resources/NetBrowser_Enemies.txt new file mode 100644 index 0000000..9190dc6 --- /dev/null +++ b/source/WindowsFormsApplication1/Resources/NetBrowser_Enemies.txt @@ -0,0 +1,5 @@ +{ +"BufferOverflow":{"IsLeader":false,"Name":"BufferOverflow","FriendDesc":"BufferOverflow is a question-and-answer site with millions of Shifters willing to share their knowledge.","Description":"BufferOverflow is a question-and-answer site with millions of Shifters willing to share their knowledge.","FriendSpeed":0,"FriendSkill":0,"Difficulty":"easy","Network":[{"Hostname":"bufferoverflow","ModuleType":0,"Type":0,"HP":100,"Grade":1,"X":0,"Y":0},{"Hostname":"main_av","ModuleType":0,"Type":1,"HP":0,"Grade":4,"X":371,"Y":148},{"Hostname":"defense1","ModuleType":0,"Type":3,"HP":0,"Grade":4,"X":252,"Y":121},{"Hostname":"defense2","ModuleType":0,"Type":3,"HP":0,"Grade":4,"X":251,"Y":163}]}, +"Exodus Software":{"IsLeader":false,"Name":"Exodus Software","FriendDesc":"Known for their ShiftOS desktop environment \"Exodus Desktop Environment\", Exodus Software is well-known among the ShiftOS user-base. Now they're trying to dig their hands into hacker battles.","Description":"Known for their ShiftOS desktop environment \"Exodus Desktop Environment\", Exodus Software is well-known among the ShiftOS user-base. Now they're trying to dig their hands into hacker battles.","FriendSpeed":75,"FriendSkill":45,"Difficulty":"easy","Network":[{"Hostname":"exodus_software","ModuleType":0,"Type":0,"HP":100,"Grade":1,"X":0,"Y":0},{"Hostname":"exds_turret1","ModuleType":0,"Type":3,"HP":0,"Grade":4,"X":500,"Y":215},{"Hostname":"exds_antimalware","ModuleType":0,"Type":1,"HP":0,"Grade":1,"X":500,"Y":259},{"Hostname":"exds_antimalware2","ModuleType":0,"Type":1,"HP":0,"Grade":1,"X":498,"Y":162},{"Hostname":"exds_repairman","ModuleType":0,"Type":9,"HP":0,"Grade":2,"X":351,"Y":210}]}, +"Orange Inc.":{"IsLeader":false,"Name":"Orange Inc.","FriendDesc":"Orange is a computer industry giant. Let's see how they can compete in a Hacker Battle.","Description":"Orange is a computer industry giant. Let's see how they can compete in a Hacker Battle.","FriendSpeed":100,"FriendSkill":2001,"Difficulty":"hard","Network":[{"Hostname":"orange_inc.","ModuleType":0,"Type":0,"HP":100,"Grade":1,"X":0,"Y":0},{"Hostname":"blood_orange","ModuleType":0,"Type":6,"HP":0,"Grade":4,"X":484,"Y":203},{"Hostname":"yummy","ModuleType":0,"Type":2,"HP":0,"Grade":3,"X":497,"Y":150},{"Hostname":"juicy","ModuleType":0,"Type":5,"HP":0,"Grade":4,"X":356,"Y":212},{"Hostname":"sweet","ModuleType":0,"Type":9,"HP":0,"Grade":2,"X":316,"Y":212},{"Hostname":"orange","ModuleType":0,"Type":2,"HP":0,"Grade":3,"X":490,"Y":270}]} +} \ No newline at end of file diff --git a/source/WindowsFormsApplication1/Resources/Thumbs.db b/source/WindowsFormsApplication1/Resources/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..96f1d97f85c3c04715be7ea36a433fa00144c241 GIT binary patch literal 104448 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 literal 0 HcmV?d00001 diff --git a/source/WindowsFormsApplication1/SaveSystem.cs b/source/WindowsFormsApplication1/SaveSystem.cs index c321700..a86ee52 100644 --- a/source/WindowsFormsApplication1/SaveSystem.cs +++ b/source/WindowsFormsApplication1/SaveSystem.cs @@ -33,6 +33,7 @@ public class Save public int CodepointMultiplier = 1; public int PriceDivider = 1; public string CloudID = ""; + public List CompletedNets = new List(); } public class PrivateBitnoteAddress @@ -412,17 +413,26 @@ an upgrade named '' with description '<description>' would be added to th DefaultUpgrades.Add(new Shiftorium.Upgrade("Hack Command - 0 CP", null, null, "nodisplay", "fundamental")); DefaultUpgrades.Add(new Shiftorium.Upgrade("Hacker Battles - 0 CP", null, null, "nodisplay", "fundamental")); DefaultUpgrades.Add(new Shiftorium.Upgrade("Mid Game Bridge - 0 CP", null, null, "nodisplay", "fundamental")); + DefaultUpgrades.Add(new Shiftorium.Upgrade("Network Browser - 0 CP", null, null, "nodisplay", "fundamental")); //0.1.1/new DefaultUpgrades.Add(new Shiftorium.Upgrade("Fancy Effects - 5000 CP", null, "Have you ever wanted to make your operating system look fancy, adding fade effects and other animations to various parts of the UI? If so, this upgrade is for you!", "limitlesscustomshades;shiftnet", "fancy")); DefaultUpgrades.Add(new Shiftorium.Upgrade("Shift Fancy Effects - 45 CP", null, "ShiftOS is looking pretty darn fine now. But, let's make it look even better. With this upgrade you will be able to customize fancy effects in the Shifter!", "advancedshifter;fancyeffects", "fancy")); DefaultUpgrades.Add(new Shiftorium.Upgrade("Icon Manager - 45 CP", null, "Add even more customization options to ShiftOS using the new Icon Manager. This tool allows you to change almost any icon on the system!", "advancedshifter;appicons", "useful")); + DefaultUpgrades.Add(new Shiftorium.Upgrade("FS External Devices - 175 CP", null, "Ever wanted to see the contents of another device on the system? For example, a USB drive, CD, floppy, or another hard drive? Well this upgrade is for you. It will give File Skimmer the ability to see other drives on the system.", "fileskimmer", "useful")); + DefaultUpgrades.Add(new Shiftorium.Upgrade("Advanced Desktop - 50 CP", null, "Want to further customize the desktop panel? Want to add even more panels, and add custom widgets to the panels? This upgrade's for you!", "desktoppanel;midgamebridge", "useful")); //0.1.1/category DefaultUpgrades.Add(new Shiftorium.Upgrade("Useful - 0 CP", null, null, "nodisplay", "fundamental")); DefaultUpgrades.Add(new Shiftorium.Upgrade("Fancy - 0 CP", null, null, "nodisplay", "fundamental")); DefaultUpgrades.Add(new Shiftorium.Upgrade("Software - 0 CP", null, null, "nodisplay", "fundamental")); DefaultUpgrades.Add(new Shiftorium.Upgrade("HoloChat - 0 CP", null, null, "nodisplay", "fundamental")); DefaultUpgrades.Add(new Shiftorium.Upgrade("Story Complete - 0 CP", null, null, "nodisplay", "fundamental")); + + //0.1.1/netbrowser/tiers + DefaultUpgrades.Add(new Shiftorium.Upgrade("nb_tier_easy - 0 CP", null, null, "nodisplay", "fundamental")); + DefaultUpgrades.Add(new Shiftorium.Upgrade("nb_tier_medium - 0 CP", null, null, "nodisplay", "fundamental")); + DefaultUpgrades.Add(new Shiftorium.Upgrade("nb_tier_hard - 0 CP", null, null, "nodisplay", "fundamental")); + } /// <summary> diff --git a/source/WindowsFormsApplication1/ShiftOS.csproj b/source/WindowsFormsApplication1/ShiftOS.csproj index 98b6af0..bbb2529 100644 --- a/source/WindowsFormsApplication1/ShiftOS.csproj +++ b/source/WindowsFormsApplication1/ShiftOS.csproj @@ -268,7 +268,14 @@ <Compile Include="Labyrinth.Designer.cs"> <DependentUpon>Labyrinth.cs</DependentUpon> </Compile> + <Compile Include="ListViewEx.cs"> + <SubType>UserControl</SubType> + </Compile> + <Compile Include="ListViewEx.Designer.cs"> + <DependentUpon>ListViewEx.cs</DependentUpon> + </Compile> <Compile Include="Lua_Interp.cs" /> + <Compile Include="MountMgr.cs" /> <Compile Include="NameChanger.cs"> <SubType>Form</SubType> </Compile> @@ -281,6 +288,18 @@ <Compile Include="NetGen.Designer.cs"> <DependentUpon>NetGen.cs</DependentUpon> </Compile> + <Compile Include="NetModuleStatus.cs"> + <SubType>UserControl</SubType> + </Compile> + <Compile Include="NetModuleStatus.Designer.cs"> + <DependentUpon>NetModuleStatus.cs</DependentUpon> + </Compile> + <Compile Include="NetworkBrowser.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="NetworkBrowser.Designer.cs"> + <DependentUpon>NetworkBrowser.cs</DependentUpon> + </Compile> <Compile Include="Notification.cs"> <SubType>UserControl</SubType> </Compile> @@ -289,6 +308,12 @@ </Compile> <Compile Include="OSInfo.cs" /> <Compile Include="Package_Grabber.cs" /> + <Compile Include="PanelManager.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="PanelManager.Designer.cs"> + <DependentUpon>PanelManager.cs</DependentUpon> + </Compile> <Compile Include="Pong.cs"> <SubType>Form</SubType> </Compile> @@ -448,15 +473,27 @@ <EmbeddedResource Include="KnowledgeInput.resx"> <DependentUpon>KnowledgeInput.cs</DependentUpon> </EmbeddedResource> + <EmbeddedResource Include="ListViewEx.resx"> + <DependentUpon>ListViewEx.cs</DependentUpon> + </EmbeddedResource> <EmbeddedResource Include="NameChanger.resx"> <DependentUpon>NameChanger.cs</DependentUpon> </EmbeddedResource> <EmbeddedResource Include="NetGen.resx"> <DependentUpon>NetGen.cs</DependentUpon> </EmbeddedResource> + <EmbeddedResource Include="NetModuleStatus.resx"> + <DependentUpon>NetModuleStatus.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="NetworkBrowser.resx"> + <DependentUpon>NetworkBrowser.cs</DependentUpon> + </EmbeddedResource> <EmbeddedResource Include="Notification.resx"> <DependentUpon>Notification.cs</DependentUpon> </EmbeddedResource> + <EmbeddedResource Include="PanelManager.resx"> + <DependentUpon>PanelManager.cs</DependentUpon> + </EmbeddedResource> <EmbeddedResource Include="Pong.resx"> <DependentUpon>Pong.cs</DependentUpon> </EmbeddedResource> @@ -624,7 +661,6 @@ <None Include="Resources\iconBitnoteWallet.png" /> <None Include="Resources\iconCalculator.png" /> <None Include="Resources\iconClock.png" /> - <None Include="Resources\iconColourPicker.fw.png" /> <None Include="Resources\iconDodge.png" /> <None Include="Resources\iconDownloader.png" /> <None Include="Resources\iconFileOpener.fw.png" /> @@ -900,6 +936,13 @@ <None Include="Resources\DevX_Primary.txt" /> <None Include="Resources\DevX_PrimaryNet.txt" /> <None Include="Resources\DevX_Secondary.txt" /> + <None Include="Resources\MidGame_Holochat.txt" /> + <None Include="Resources\NetBrowser_Enemies.txt" /> + <None Include="Resources\Hacker_DanaRoss.txt" /> + <None Include="Resources\Hacker_AustinWalker.txt" /> + <None Include="Resources\Hacker_JonathanRivard.txt" /> + <None Include="Resources\iconColourPicker.fw.png" /> + <None Include="Resources\AustinWalkerCompletionStory.txt" /> <Content Include="Snakey.Designer.vb" /> <Content Include="Snakey.vb" /> <Compile Include="ShiftOSDesktop.cs"> diff --git a/source/WindowsFormsApplication1/ShiftOSDesktop.Designer.cs b/source/WindowsFormsApplication1/ShiftOSDesktop.Designer.cs index a257f23..532ac64 100644 --- a/source/WindowsFormsApplication1/ShiftOSDesktop.Designer.cs +++ b/source/WindowsFormsApplication1/ShiftOSDesktop.Designer.cs @@ -155,6 +155,7 @@ private void InitializeComponent() this.ShortcutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.scriptToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.addDesktopPanelToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.widgetManagerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.imgshiftnetapps = new System.Windows.Forms.ImageList(this.components); this.lbldebug = new System.Windows.Forms.Label(); this.lblog = new System.Windows.Forms.Label(); @@ -170,7 +171,6 @@ private void InitializeComponent() this.appLauncherToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.panelButtonsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.clockToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.widgetManagerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.desktoppanel.SuspendLayout(); this.applaunchermenuholder.SuspendLayout(); this.desktopappmenu.SuspendLayout(); @@ -237,19 +237,21 @@ private void InitializeComponent() // this.pnlnotifications.Dock = System.Windows.Forms.DockStyle.Fill; this.pnlnotifications.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft; - this.pnlnotifications.Location = new System.Drawing.Point(1083, 0); + this.pnlnotifications.Location = new System.Drawing.Point(132, 0); this.pnlnotifications.Name = "pnlnotifications"; - this.pnlnotifications.Size = new System.Drawing.Size(88, 24); + this.pnlnotifications.Size = new System.Drawing.Size(1039, 24); this.pnlnotifications.TabIndex = 2; // // pnlpanelbuttonholder // + this.pnlpanelbuttonholder.AutoSize = true; + this.pnlpanelbuttonholder.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; this.pnlpanelbuttonholder.BackColor = System.Drawing.Color.Transparent; this.pnlpanelbuttonholder.Dock = System.Windows.Forms.DockStyle.Left; this.pnlpanelbuttonholder.Location = new System.Drawing.Point(130, 0); this.pnlpanelbuttonholder.Name = "pnlpanelbuttonholder"; this.pnlpanelbuttonholder.Padding = new System.Windows.Forms.Padding(2, 0, 0, 0); - this.pnlpanelbuttonholder.Size = new System.Drawing.Size(953, 24); + this.pnlpanelbuttonholder.Size = new System.Drawing.Size(2, 24); this.pnlpanelbuttonholder.TabIndex = 1; // // applaunchermenuholder @@ -1157,7 +1159,7 @@ private void InitializeComponent() this.addDesktopPanelToolStripMenuItem, this.widgetManagerToolStripMenuItem}); this.cmbdesktopoptions.Name = "ContextMenuStrip1"; - this.cmbdesktopoptions.Size = new System.Drawing.Size(175, 92); + this.cmbdesktopoptions.Size = new System.Drawing.Size(175, 70); // // NewToolStripMenuItem // @@ -1177,49 +1179,49 @@ private void InitializeComponent() // FolderToolStripMenuItem // this.FolderToolStripMenuItem.Name = "FolderToolStripMenuItem"; - this.FolderToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.FolderToolStripMenuItem.Size = new System.Drawing.Size(155, 22); this.FolderToolStripMenuItem.Text = "Folder"; this.FolderToolStripMenuItem.Click += new System.EventHandler(this.FolderToolStripMenuItem_Click); // // ToolStripMenuItem2 // this.ToolStripMenuItem2.Name = "ToolStripMenuItem2"; - this.ToolStripMenuItem2.Size = new System.Drawing.Size(151, 6); + this.ToolStripMenuItem2.Size = new System.Drawing.Size(152, 6); // // ArtpadPictureToolStripMenuItem // this.ArtpadPictureToolStripMenuItem.Name = "ArtpadPictureToolStripMenuItem"; - this.ArtpadPictureToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.ArtpadPictureToolStripMenuItem.Size = new System.Drawing.Size(155, 22); this.ArtpadPictureToolStripMenuItem.Text = "Artpad Picture"; // // TextDocumentToolStripMenuItem // this.TextDocumentToolStripMenuItem.Name = "TextDocumentToolStripMenuItem"; - this.TextDocumentToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.TextDocumentToolStripMenuItem.Size = new System.Drawing.Size(155, 22); this.TextDocumentToolStripMenuItem.Text = "Text Document"; // // NewSkin // this.NewSkin.Name = "NewSkin"; - this.NewSkin.Size = new System.Drawing.Size(154, 22); + this.NewSkin.Size = new System.Drawing.Size(155, 22); this.NewSkin.Text = "Skin"; this.NewSkin.Click += new System.EventHandler(this.NewSkin_Click); // // WebpageToolStripMenuItem // this.WebpageToolStripMenuItem.Name = "WebpageToolStripMenuItem"; - this.WebpageToolStripMenuItem.Size = new System.Drawing.Size(151, 6); + this.WebpageToolStripMenuItem.Size = new System.Drawing.Size(152, 6); // // ShortcutToolStripMenuItem // this.ShortcutToolStripMenuItem.Name = "ShortcutToolStripMenuItem"; - this.ShortcutToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.ShortcutToolStripMenuItem.Size = new System.Drawing.Size(155, 22); this.ShortcutToolStripMenuItem.Text = "Shortcut"; // // scriptToolStripMenuItem // this.scriptToolStripMenuItem.Name = "scriptToolStripMenuItem"; - this.scriptToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.scriptToolStripMenuItem.Size = new System.Drawing.Size(155, 22); this.scriptToolStripMenuItem.Text = "Script"; this.scriptToolStripMenuItem.Click += new System.EventHandler(this.scriptToolStripMenuItem_Click); // @@ -1230,6 +1232,13 @@ private void InitializeComponent() this.addDesktopPanelToolStripMenuItem.Text = "Add Desktop Panel"; this.addDesktopPanelToolStripMenuItem.Click += new System.EventHandler(this.addDesktopPanelToolStripMenuItem_Click); // + // widgetManagerToolStripMenuItem + // + this.widgetManagerToolStripMenuItem.Name = "widgetManagerToolStripMenuItem"; + this.widgetManagerToolStripMenuItem.Size = new System.Drawing.Size(174, 22); + this.widgetManagerToolStripMenuItem.Text = "Widget Manager"; + this.widgetManagerToolStripMenuItem.Click += new System.EventHandler(this.widgetManagerToolStripMenuItem_Click); + // // imgshiftnetapps // this.imgshiftnetapps.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit; @@ -1317,6 +1326,7 @@ private void InitializeComponent() this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem"; this.optionsToolStripMenuItem.Size = new System.Drawing.Size(174, 22); this.optionsToolStripMenuItem.Text = "Options"; + this.optionsToolStripMenuItem.Click += new System.EventHandler(this.optionsToolStripMenuItem_Click); // // placeHereToolStripMenuItem // @@ -1349,13 +1359,6 @@ private void InitializeComponent() this.clockToolStripMenuItem1.Text = "Clock"; this.clockToolStripMenuItem1.Click += new System.EventHandler(this.clockToolStripMenuItem1_Click); // - // widgetManagerToolStripMenuItem - // - this.widgetManagerToolStripMenuItem.Name = "widgetManagerToolStripMenuItem"; - this.widgetManagerToolStripMenuItem.Size = new System.Drawing.Size(174, 22); - this.widgetManagerToolStripMenuItem.Text = "Widget Manager"; - this.widgetManagerToolStripMenuItem.Click += new System.EventHandler(this.widgetManagerToolStripMenuItem_Click); - // // ShiftOSDesktop // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -1372,6 +1375,7 @@ private void InitializeComponent() this.Text = "ShiftOSDesktop"; this.Load += new System.EventHandler(this.ShiftOSDesktop_Load); this.desktoppanel.ResumeLayout(false); + this.desktoppanel.PerformLayout(); this.applaunchermenuholder.ResumeLayout(false); this.desktopappmenu.ResumeLayout(false); this.desktopappmenu.PerformLayout(); diff --git a/source/WindowsFormsApplication1/ShiftOSDesktop.cs b/source/WindowsFormsApplication1/ShiftOSDesktop.cs index 948efa9..3dcb156 100644 --- a/source/WindowsFormsApplication1/ShiftOSDesktop.cs +++ b/source/WindowsFormsApplication1/ShiftOSDesktop.cs @@ -178,7 +178,7 @@ private void ShiftOSDesktop_Load(object sender, EventArgs e) this.BackColor = Color.FromArgb(r, g, b); this.BackgroundImage = null; } - if (Viruses.InfectedWith("holyfuckmyears")) + if (Viruses.InfectedWith("ow")) { Random rand = new Random(); switch (rand.Next(0, 3)) { @@ -241,7 +241,32 @@ public void SetupDesktop() CheckUnity(); SetupWidgets(); CheckForChristmas(); - + //Set up the context menus. + addDesktopPanelToolStripMenuItem.Visible = API.Upgrades["advanceddesktop"]; + widgetManagerToolStripMenuItem.Visible = API.Upgrades["advanceddesktop"]; + if (API.Upgrades["advanceddesktop"]) + { + AppLauncherPanel.ContextMenuStrip = cbwidget; + Clock.ContextMenuStrip = cbwidget; + PanelButtonHolder.ContextMenuStrip = cbwidget; + } + else + { + AppLauncherPanel.ContextMenuStrip = null; + Clock.ContextMenuStrip = null; + PanelButtonHolder.ContextMenuStrip = null; + } + foreach(var dp in DesktopPanels) + { + if(API.Upgrades["advanceddesktop"]) + { + dp.ContextMenuStrip = cbdpanel; + } + else + { + dp.ContextMenuStrip = cbdpanel; + } + } } public void SetupWidgets() @@ -455,57 +480,42 @@ public void SetupDesktopPanel() { if (this.Controls.Contains(pnl)) { + pnl.Hide(); this.Controls.Remove(pnl); } } } + var old_list = new List<Skinning.DesktopPanel>(); + var dp = new Skinning.DesktopPanel(); + dp.Position = API.CurrentSkin.desktoppanelposition; + dp.Height = API.CurrentSkin.desktoppanelheight; + dp.BackgroundColor = API.CurrentSkin.desktoppanelcolour; + dp.BackgroundImage = API.CurrentSkinImages.desktoppanel; + old_list.Add(dp); + if (API.CurrentSkin.DesktopPanels.Count == 0) { - var dp = new Skinning.DesktopPanel(); - dp.Position = API.CurrentSkin.desktoppanelposition; - dp.Height = API.CurrentSkin.desktoppanelheight; - dp.BackgroundColor = API.CurrentSkin.desktoppanelcolour; - API.CurrentSkin.DesktopPanels.Add(dp); + API.CurrentSkin.DesktopPanels = old_list; } - DesktopPanels = new List<Panel>(); - foreach (var dp in API.CurrentSkin.DesktopPanels) + if(API.Upgrades["advanceddesktop"]) { - Panel pnl = new Panel(); - pnl.BackColor = dp.BackgroundColor; - switch (dp.Position) - { - case "Top": - pnl.Dock = DockStyle.Top; - break; - case "Bottom": - pnl.Dock = DockStyle.Bottom; - break; - } - pnl.Tag = dp; - pnl.Height = dp.Height; - this.DesktopPanels.Add(pnl); - this.Controls.Add(pnl); + SetupPanels(API.CurrentSkin.DesktopPanels); } - if (DesktopPanels != null) + else { - foreach (var pnl in DesktopPanels) + if(API.Upgrades["desktoppanel"]) { - if (this.Controls.Contains(pnl)) - { - this.Controls.Remove(pnl); - } + SetupPanels(old_list); } } - if (API.CurrentSkin.DesktopPanels.Count == 0) - { - var dp = new Skinning.DesktopPanel(); - dp.Position = "Top"; - dp.Height = API.CurrentSkin.desktoppanelheight; - dp.BackgroundColor = API.CurrentSkin.desktoppanelcolour; - API.CurrentSkin.DesktopPanels.Add(dp); - } + desktopappmenu.BackgroundImageLayout = (ImageLayout)API.CurrentSkin.applauncherlayout; + } + + public void SetupPanels(List<Skinning.DesktopPanel> lst) + { DesktopPanels = new List<Panel>(); - foreach (var dp in API.CurrentSkin.DesktopPanels) + + foreach (var dp in lst) { Panel pnl = new Panel(); pnl.BackColor = dp.BackgroundColor; @@ -522,7 +532,7 @@ public void SetupDesktopPanel() pnl.Height = dp.Height; pnl.MouseMove += (object s, MouseEventArgs a) => { - if(MovingControl != null) + if (MovingControl != null) { var newloc = new Point(a.X + 15, 0); var proper = pnl.PointToClient(newloc); @@ -531,15 +541,15 @@ public void SetupDesktopPanel() }; pnl.MouseDown += (object s, MouseEventArgs a) => { - if(MovingControl != null) + if (MovingControl != null) { - if(a.Button == MouseButtons.Left) + if (a.Button == MouseButtons.Left) { var w = (Skinning.DesktopWidget)MovingControl.Tag; w.XLocation = MovingControl.Left; Skinning.Utilities.saveskin(); } - else if(a.Button == MouseButtons.Left) + else if (a.Button == MouseButtons.Left) { var w = (Skinning.DesktopWidget)MovingControl.Tag; MovingControl.Left = w.XLocation; @@ -549,50 +559,63 @@ public void SetupDesktopPanel() MovingControl = null; } }; - this.DesktopPanels.Add(pnl); - this.Controls.Add(pnl); - } - //AL bug fix with mouse-over/click behavior - desktopappmenu.BackgroundImageLayout = (ImageLayout)API.CurrentSkin.applauncherlayout; - foreach (var dp in DesktopPanels) - { + DesktopPanels.Add(pnl); if (API.Upgrades["desktoppanel"] == true) { - if (API.CurrentSkinImages.desktoppanel == null) + if (dp.BackgroundImage == null) { - dp.BackgroundImage = null; + pnl.BackgroundImage = null; } - else { - dp.BackgroundImage = API.CurrentSkinImages.desktoppanel; - dp.BackgroundImageLayout = (ImageLayout)API.CurrentSkin.desktoppanellayout; - dp.BackColor = Color.Transparent; - } - var t = (Skinning.DesktopPanel)dp.Tag; - if (API.CurrentSkin.ALPosition == t.Position) + else { - ChangePosition(AppLauncherPanel, dp); + pnl.BackgroundImage = dp.BackgroundImage; + pnl.BackgroundImageLayout = (ImageLayout)API.CurrentSkin.desktoppanellayout; + pnl.BackColor = Color.Transparent; } - if (API.CurrentSkin.PanelButtonPosition == t.Position) + if (lst.Count > 1) { - ChangePosition(PanelButtonHolder, dp); + if (API.CurrentSkin.ALPosition == dp.Position) + { + ChangePosition(AppLauncherPanel, pnl); + } + if (API.CurrentSkin.PanelButtonPosition == dp.Position) + { + ChangePosition(PanelButtonHolder, pnl); + } + if (API.CurrentSkin.ClockPosition == dp.Position) + { + ChangePosition(Clock, pnl); + } } - if (API.CurrentSkin.ClockPosition == t.Position) + else { - ChangePosition(Clock, dp); + ChangePosition(AppLauncherPanel, pnl); + ChangePosition(PanelButtonHolder, pnl); + ChangePosition(Clock, pnl); } - dp.MouseDown += (object s, MouseEventArgs a) => + pnl.MouseDown += (object s, MouseEventArgs a) => { if (a.Button == MouseButtons.Right) { - SelectedObject = dp; + SelectedObject = pnl; } }; - dp.Size = new Size(desktoppanel.Size.Width, API.CurrentSkin.desktoppanelheight); - dp.Show(); + if (API.Upgrades["advanceddesktop"]) + { + pnl.ContextMenuStrip = cbdpanel; + } + else + { + pnl.ContextMenuStrip = null; + } + pnl.Size = new Size(desktoppanel.Size.Width, dp.Height); + this.Controls.Add(pnl); + pnl.Show(); } - else { - dp.Hide(); - this.Controls.Remove(dp); + else + { + pnl.Hide(); + this.Controls.Remove(pnl); } } @@ -1156,6 +1179,12 @@ private void widgetManagerToolStripMenuItem_Click(object sender, EventArgs e) { API.CreateForm(new WidgetManager(), "Widget Manager", API.GetIcon("WidgetManager")); } + + private void optionsToolStripMenuItem_Click(object sender, EventArgs e) + { + var dp = (Skinning.DesktopPanel)SelectedObject.Tag; + API.CreateForm(new PanelManager(dp), "Panel Options", API.GetIcon("PanelOptions")); + } } public class DesktopIconManager diff --git a/source/WindowsFormsApplication1/Shifter.Designer.cs b/source/WindowsFormsApplication1/Shifter.Designer.cs index 83f7655..1d16831 100644 --- a/source/WindowsFormsApplication1/Shifter.Designer.cs +++ b/source/WindowsFormsApplication1/Shifter.Designer.cs @@ -110,14 +110,14 @@ private void InitializeComponent() this.Label95 = new System.Windows.Forms.Label(); this.pnldesktoppaneloptions = new System.Windows.Forms.Panel(); this.btnpanelbuttons = new System.Windows.Forms.Button(); - this.Label27 = new System.Windows.Forms.Label(); + this.lbwarning = new System.Windows.Forms.Label(); this.combodesktoppanelposition = new System.Windows.Forms.ComboBox(); - this.Label46 = new System.Windows.Forms.Label(); + this.lbposition = new System.Windows.Forms.Label(); this.Label47 = new System.Windows.Forms.Label(); this.txtdesktoppanelheight = new System.Windows.Forms.NumericUpDown(); - this.Label48 = new System.Windows.Forms.Label(); + this.lbheight = new System.Windows.Forms.Label(); this.pnldesktoppanelcolour = new System.Windows.Forms.Panel(); - this.Label49 = new System.Windows.Forms.Label(); + this.lbpanelcolor = new System.Windows.Forms.Label(); this.pnldesktopbackgroundoptions = new System.Windows.Forms.Panel(); this.pnldesktopcolour = new System.Windows.Forms.Panel(); this.Label45 = new System.Windows.Forms.Label(); @@ -699,10 +699,10 @@ private void InitializeComponent() | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.pnldesktopoptions.BackColor = System.Drawing.Color.White; + this.pnldesktopoptions.Controls.Add(this.pnldesktoppaneloptions); this.pnldesktopoptions.Controls.Add(this.pnlapplauncheroptions); this.pnldesktopoptions.Controls.Add(this.pnldesktopintro); this.pnldesktopoptions.Controls.Add(this.pnlpanelbuttonsoptions); - this.pnldesktopoptions.Controls.Add(this.pnldesktoppaneloptions); this.pnldesktopoptions.Controls.Add(this.pnldesktopbackgroundoptions); this.pnldesktopoptions.Controls.Add(this.pnlpanelclockoptions); this.pnldesktopoptions.Controls.Add(this.pnldesktoppreview); @@ -1430,14 +1430,14 @@ private void InitializeComponent() // this.pnldesktoppaneloptions.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.pnldesktoppaneloptions.Controls.Add(this.btnpanelbuttons); - this.pnldesktoppaneloptions.Controls.Add(this.Label27); + this.pnldesktoppaneloptions.Controls.Add(this.lbwarning); this.pnldesktoppaneloptions.Controls.Add(this.combodesktoppanelposition); - this.pnldesktoppaneloptions.Controls.Add(this.Label46); + this.pnldesktoppaneloptions.Controls.Add(this.lbposition); this.pnldesktoppaneloptions.Controls.Add(this.Label47); this.pnldesktoppaneloptions.Controls.Add(this.txtdesktoppanelheight); - this.pnldesktoppaneloptions.Controls.Add(this.Label48); + this.pnldesktoppaneloptions.Controls.Add(this.lbheight); this.pnldesktoppaneloptions.Controls.Add(this.pnldesktoppanelcolour); - this.pnldesktoppaneloptions.Controls.Add(this.Label49); + this.pnldesktoppaneloptions.Controls.Add(this.lbpanelcolor); this.pnldesktoppaneloptions.Location = new System.Drawing.Point(135, 159); this.pnldesktoppaneloptions.Name = "pnldesktoppaneloptions"; this.pnldesktoppaneloptions.Size = new System.Drawing.Size(317, 140); @@ -1457,13 +1457,13 @@ private void InitializeComponent() this.btnpanelbuttons.UseVisualStyleBackColor = false; this.btnpanelbuttons.Click += new System.EventHandler(this.btnpanelbuttons_Click); // - // Label27 + // lbwarning // - this.Label27.Location = new System.Drawing.Point(3, 52); - this.Label27.Name = "Label27"; - this.Label27.Size = new System.Drawing.Size(290, 42); - this.Label27.TabIndex = 8; - this.Label27.Text = "Warning: If you set the panel position to the bottom you must hide your windows t" + + this.lbwarning.Location = new System.Drawing.Point(3, 52); + this.lbwarning.Name = "lbwarning"; + this.lbwarning.Size = new System.Drawing.Size(290, 42); + this.lbwarning.TabIndex = 8; + this.lbwarning.Text = "Warning: If you set the panel position to the bottom you must hide your windows t" + "askbar and restart ShiftOS on your host operating system to prevent a visual bug" + "."; // @@ -1480,15 +1480,15 @@ private void InitializeComponent() this.combodesktoppanelposition.TabIndex = 7; this.combodesktoppanelposition.SelectedIndexChanged += new System.EventHandler(this.combodesktoppanelposition_SelectedIndexChanged); // - // Label46 + // lbposition // - this.Label46.AutoSize = true; - this.Label46.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.Label46.Location = new System.Drawing.Point(3, 31); - this.Label46.Name = "Label46"; - this.Label46.Size = new System.Drawing.Size(97, 16); - this.Label46.TabIndex = 6; - this.Label46.Text = "Panel Position:"; + this.lbposition.AutoSize = true; + this.lbposition.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbposition.Location = new System.Drawing.Point(3, 31); + this.lbposition.Name = "lbposition"; + this.lbposition.Size = new System.Drawing.Size(97, 16); + this.lbposition.TabIndex = 6; + this.lbposition.Text = "Panel Position:"; // // Label47 // @@ -1512,15 +1512,15 @@ private void InitializeComponent() this.txtdesktoppanelheight.TabIndex = 4; this.txtdesktoppanelheight.ValueChanged += new System.EventHandler(this.txtdesktoppanelheight_ValueChanged); // - // Label48 + // lbheight // - this.Label48.AutoSize = true; - this.Label48.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.Label48.Location = new System.Drawing.Point(138, 7); - this.Label48.Name = "Label48"; - this.Label48.Size = new System.Drawing.Size(50, 16); - this.Label48.TabIndex = 2; - this.Label48.Text = "Height:"; + this.lbheight.AutoSize = true; + this.lbheight.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbheight.Location = new System.Drawing.Point(138, 7); + this.lbheight.Name = "lbheight"; + this.lbheight.Size = new System.Drawing.Size(50, 16); + this.lbheight.TabIndex = 2; + this.lbheight.Text = "Height:"; // // pnldesktoppanelcolour // @@ -1530,15 +1530,15 @@ private void InitializeComponent() this.pnldesktoppanelcolour.TabIndex = 1; this.pnldesktoppanelcolour.MouseDown += new System.Windows.Forms.MouseEventHandler(this.ChangeDesktopPanelColor); // - // Label49 + // lbpanelcolor // - this.Label49.AutoSize = true; - this.Label49.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.Label49.Location = new System.Drawing.Point(3, 7); - this.Label49.Name = "Label49"; - this.Label49.Size = new System.Drawing.Size(88, 16); - this.Label49.TabIndex = 0; - this.Label49.Text = "Panel Colour:"; + this.lbpanelcolor.AutoSize = true; + this.lbpanelcolor.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbpanelcolor.Location = new System.Drawing.Point(3, 7); + this.lbpanelcolor.Name = "lbpanelcolor"; + this.lbpanelcolor.Size = new System.Drawing.Size(88, 16); + this.lbpanelcolor.TabIndex = 0; + this.lbpanelcolor.Text = "Panel Colour:"; // // pnldesktopbackgroundoptions // @@ -3510,8 +3510,8 @@ private void InitializeComponent() // pgcontents // this.pgcontents.BackColor = System.Drawing.Color.White; - this.pgcontents.Controls.Add(this.pnldesktopcomposition); this.pgcontents.Controls.Add(this.pnldesktopoptions); + this.pgcontents.Controls.Add(this.pnldesktopcomposition); this.pgcontents.Controls.Add(this.pnlreset); this.pgcontents.Controls.Add(this.pnlwindowsoptions); this.pgcontents.Controls.Add(this.pnlmenus); @@ -5201,14 +5201,14 @@ private void InitializeComponent() private System.Windows.Forms.Label Label95; private System.Windows.Forms.Panel pnldesktoppaneloptions; private System.Windows.Forms.Button btnpanelbuttons; - private System.Windows.Forms.Label Label27; + private System.Windows.Forms.Label lbwarning; private System.Windows.Forms.ComboBox combodesktoppanelposition; - private System.Windows.Forms.Label Label46; + private System.Windows.Forms.Label lbposition; private System.Windows.Forms.Label Label47; private System.Windows.Forms.NumericUpDown txtdesktoppanelheight; - private System.Windows.Forms.Label Label48; + private System.Windows.Forms.Label lbheight; private System.Windows.Forms.Panel pnldesktoppanelcolour; - private System.Windows.Forms.Label Label49; + private System.Windows.Forms.Label lbpanelcolor; private System.Windows.Forms.Panel pnlapplauncheroptions; private System.Windows.Forms.Label Label71; private System.Windows.Forms.TextBox txtapplauncherwidth; diff --git a/source/WindowsFormsApplication1/Shifter.cs b/source/WindowsFormsApplication1/Shifter.cs index e54eee1..43ba200 100644 --- a/source/WindowsFormsApplication1/Shifter.cs +++ b/source/WindowsFormsApplication1/Shifter.cs @@ -605,7 +605,16 @@ private void btndesktoppanel_Click(object sender, EventArgs e) pnldesktoppaneloptions.Show(); pnldesktoppaneloptions.BringToFront(); SetupDesktopPanelValues(); - + if(API.Upgrades["advanceddesktop"]) + { + lbpanelcolor.Hide(); + pnldesktoppanelcolour.Hide(); + lbheight.Hide(); + txtdesktoppanelheight.Hide(); + lbposition.Hide(); + combodesktoppanelposition.Hide(); + lbwarning.Text = "Desktop Panel customization has been moved from the Shifter! You can right-click panels to change their settings and add/remove widgets."; + } } private void btnapply_Click(object sender, EventArgs e) diff --git a/source/WindowsFormsApplication1/Terminal.cs b/source/WindowsFormsApplication1/Terminal.cs index 1175b88..5bff0e2 100644 --- a/source/WindowsFormsApplication1/Terminal.cs +++ b/source/WindowsFormsApplication1/Terminal.cs @@ -193,6 +193,35 @@ private void ReadCommand() command = command.ToLower(); } + internal void StartDanaRossStory() + { + var t = new Thread(new ThreadStart(new Action(() => + { + WriteLine("User <65.48.121.24> connecting as 'Dana'"); + API.PlaySound(Properties.Resources.dial_up_modem_02); + WriteLine("Dana: Hey! That was quite the battle, huh?"); + BeepSleep(1000); + WriteLine("Dana: Well - since you beat me, let me let you in on a little secret."); + BeepSleep(3000); + WriteLine("Dana: ShiftOS's desktop may seem pretty complicated and customizable for you right now, but trust me. It gets better."); + BeepSleep(2500); + WriteLine("Dana: I'm gonna patch your Shiftorium so you can get some neat upgrades!"); + BeepSleep(3000); + WriteLine("Dana: Also, if you feel like doing more hacker battles, why not check out Tier 2 in the Network Browser?"); + BeepSleep(2750); + WriteLine("Dana: I've also added my network modules to your network - you'll just have to wait for them to regenerate."); + BeepSleep(500); + WriteLine("Dana: Well, talk to you some other time!"); + BeepSleep(1000); + this.Invoke(new Action(() => + { + API.Upgrades["midgamebridge"] = true; + this.Close(); + })); + }))); + t.Start(); + } + // ERROR: Handles clauses are not supported in C# private void txtterm_Click(object sender, EventArgs e) { @@ -1190,10 +1219,12 @@ internal void StartDevXFuriousStory() WriteLine("DevX: I don't know what I'll do... I don't know when I'll do it... but you will wish you never touched a computer in your life..."); break; case 6: - API.Upgrades["devxfurious"] = true; t.Stop(); Viruses.DropDevXPayload(); this.Close(); + var trm = new Terminal(); + API.CreateForm(trm, API.LoadedNames.TerminalName, API.GetIcon("Terminal")); + trm.StartDevXFuriousStory2(); break; } i += 1; @@ -1201,6 +1232,51 @@ internal void StartDevXFuriousStory() t.Start(); } + private void StartDevXFuriousStory2() + { + var t = new Thread(new ThreadStart(new Action(() => + { + WriteLine("User '???' connecting..."); + API.PlaySound(Properties.Resources.dial_up_modem_02); + WriteLine("???: Hello? Ummm... this is awkward..."); + BeepSleep(3000); + WriteLine("???: Listen - I'm a hacker. Well, not really. I'm friends with one."); + BeepSleep(3000); + WriteLine("???: Seems like DevX completely obliterated your system with one of his viruses."); + BeepSleep(2500); + WriteLine("???: I'll fix that for you."); + API.Upgrades["virusscanner"] = true; + this.Invoke(new Action(() => + { + this.command = "vscan"; + this.DoCommand(); + })); + BeepSleep(1000); + WriteLine("???: Better? Cool. Now, I need your help."); + BeepSleep(1250); + WriteLine("???: I can't reveal my identity yet - but I co-own this chat-room..."); + BeepSleep(1175); + WriteLine("???: It's called the 'Hacker Alliance'."); + BeepSleep(1000); + WriteLine("???: I'm going to install something called 'HoloChat' on your system. It'll be quick."); + BeepSleep(2000); + WriteLine("Installing HoloChat..."); + API.Upgrades["holochat"] = true; + Thread.Sleep(100); + WriteLine("Done. Resetting desktop..."); + this.Invoke(new Action(() => { API.CurrentSession.SetupDesktop(); })); + WriteLine("Done."); + Thread.Sleep(3000); + WriteLine("???: Alright - I'll talk to you soon. Just join that chat room when you're ready."); + BeepSleep(1000); + this.Invoke(new Action(() => + { + this.Close(); + })); + }))); + t.Start(); + } + private LuaInterpreter Interpreter = null; private bool blockctrlt = false; @@ -1215,86 +1291,49 @@ public void StartShiftnetStory() int i = 0; WriteLine("IP <hidden@shiftnet> connecting as 'Maureen Fenn'..."); API.PlaySound(Properties.Resources.dial_up_modem_02); - tmrstory.Tick += (object s, EventArgs a) => + var t = new Thread(new ThreadStart(new Action(() => { - switch(i) + WriteLine("Maureen Fenn: Hey there, user! I have something to show you."); + BeepSleep(4000); + WriteLine("Maureen Fenn: So, there's this thing called the 'Shiftnet'"); + BeepSleep(3750); + WriteLine("Maureen Fenn: Turns out, that DevX wants to keep it a secret, as such he only installed it on his and my systems."); + BeepSleep(4250); + WriteLine("Maureen Fenn: But what's the point of listening to DevX when we have people like you who like to experiment?"); + BeepSleep(4000); + WriteLine("Maureen Fenn: Well, to be fair - he can destroy whatever he wants. Just like he did my company, Minimatch."); + BeepSleep(3000); + WriteLine("Maureen Fenn: But who cares! I'm going to install a few things on your system."); + API.Upgrades["shiftnet"] = true; + this.Invoke(new Action(() => { - case 0: - WriteLine("Maureen Fenn: Hello, My name is Maureen Fenn. I want to talk to you about something."); - break; - case 1: - WriteLine("Maureen Fenn: I am another ShiftOS user. DevX hijacked my computer and installed ShiftOS on it about 2 years ago."); - break; - case 2: - WriteLine("Maureen Fenn: For some reason, he wanted me to develop some applications for ShiftOS and sell them on a Shiftnet website."); - break; - case 3: - WriteLine("Maureen Fenn: He installed the Shiftnet on my system and gave me a neat little API to code them in."); - break; - case 4: - WriteLine("Maureen Fenn: It seems that I am the only one who has access to the Shiftnet, so seeings as you are able to run it on your system,"); - break; - case 5: - WriteLine("Maureen Fenn: I figured I would install the Shiftnet client onto your computer."); - break; - case 6: - WriteLine("Maureen Fenn: Just let me connect to your system and install the Shiftnet for you."); - WriteLine("mf@" + API.OSName + " $> root"); - break; - case 7: - API.PlaySound(Properties.Resources.typesound); - if(API.Upgrades["multitasking"] == true) - { - API.CreateInfoboxSession("Root connection", "A root connection has been established to your system. Be aware of any unusual, unwanted actions.", infobox.InfoboxMode.Info); - } - else - { - WriteLine("mf: Root connection established!"); - } - break; - case 8: - WriteLine("Starting installation of package 'shiftnet.pkg'..."); - if(!Directory.Exists(Paths.Applications)) - { - Directory.CreateDirectory(Paths.Applications); - - } - //Download Shiftnet package using spkg. - API.Upgrades["shiftnet"] = true; - command = "spkg install shiftnet"; - i = 66; - DoCommand(); - break; - case 9: - WriteLine("mf: Root connection disbanded."); - WriteLine("Maureen Fenn: There, the Shiftnet is now installed on your system!"); - break; - case 10: - WriteLine("Maureen Fenn: I have also hacked on a few Shiftorium upgrades for you to make it a bit easier to run applications from the Shiftnet."); - break; - case 11: - WriteLine("Maureen Fenn: Be sure to check the Shiftorium, and my Shiftnet website on shiftnet://main/minimatch/home.rnp"); - break; - case 12: - WriteLine("Maureen Fenn: Also, try not to venture too far off the main server cluster (shiftnet://main/), you may not know who's doing what. The main cluster is safe."); - break; - case 13: - WriteLine("Maureen Fenn: The Shiftnet also comes with a utility that will let you install software from it. Just run 'help' to find out more."); - break; - case 14: - WriteLine("Maureen Fenn: Anyways, I gotta go. Have fun using the Shiftnet! I'm gonna go... work on something else."); - ShiftOS.Hacking.AddCharacter(new Character("Maureen Fenn", "It's time I get back at DevX for what he's done.", 40, 75, 2)); - tmrstory.Stop(); - this.Close(); - break; - case 67: - i = 9; - break; - } - API.PlaySound(Properties.Resources.typesound); - i += 1; - }; - tmrstory.Start(); + this.command = "spkg install shiftnet"; + this.DoCommand(); + })); + WriteLine("Shiftnet installed on system..."); + Thread.Sleep(4000); + WriteLine("Maureen Fenn: All done! Oh - just before I leave... go ahead and explore the Shiftnet!"); + BeepSleep(3000); + WriteLine("Maureen Fenn: But, be careful. Don't venture off the main server. You never know what's elsewhere..."); + BeepSleep(1000); + WriteLine("Maureen Fenn: Well, bye!"); + this.Invoke(new Action(() => + { + API.CurrentSession.SetupDesktop(); + this.Close(); + })); + }))); + t.Start(); + } + + /// <summary> + /// *BEEP* ZZZZZZZZzzzzzzzzzzz....... + /// </summary> + /// <param name="time">Time to sleep.</param> + private void BeepSleep(int time) + { + API.PlaySound(Properties.Resources.writesound); + Thread.Sleep(time); } private List<string> GetFonts() @@ -1389,6 +1428,28 @@ public void DoCommand() string[] args = command.ToLower().Split(' '); switch (args[0]) { + case "upg": + if(API.DeveloperMode) + { + try + { + switch(args[1]) + { + case "get": + WriteLine(API.Upgrades[args[2]].ToString()); + break; + } + } + catch + { + + } + } + else + { + wrongcommand(); + } + break; case "endgame_test": try { diff --git a/source/WindowsFormsApplication1/skins.cs b/source/WindowsFormsApplication1/skins.cs index ddac7fb..bfef221 100644 --- a/source/WindowsFormsApplication1/skins.cs +++ b/source/WindowsFormsApplication1/skins.cs @@ -284,6 +284,8 @@ public class DesktopPanel public string Position = "Top"; public int Height = 24; public Color BackgroundColor = Color.Gray; + public Image BackgroundImage = null; + public string ImagePath = null; } public class PanelWidget @@ -440,6 +442,42 @@ public static void LoadEmbeddedNamePack() } } + /// <summary> + /// Loads background images for all desktop panels + /// </summary> + public static void LoadPanels() + { + foreach(var pnl in loadedSkin.DesktopPanels) + { + string dpath = Paths.LoadedSkin + "panels" + OSInfo.DirectorySeparator + pnl.Position + loadedSkin.DesktopPanels.IndexOf(pnl).ToString(); + if (File.Exists(dpath)) + { + pnl.BackgroundImage = Image.FromFile(dpath); + } + } + } + + /// <summary> + /// Saves background images of panels + /// </summary> + public static void SavePanels() + { + string dir = Paths.LoadedSkin + "panels"; + if(Directory.Exists(dir)) + { + Directory.Delete(dir, true); + } + Directory.CreateDirectory(dir); + foreach(var pnl in loadedSkin.DesktopPanels) + { + string dpath = Paths.LoadedSkin + "panels" + OSInfo.DirectorySeparator + pnl.Position + loadedSkin.DesktopPanels.IndexOf(pnl).ToString(); + if(pnl.BackgroundImage != null) + { + pnl.BackgroundImage.Save(dpath); + pnl.BackgroundImage = null; + } + } + } /// <summary> /// Randomize some skin variables. Used for a virus. /// </summary> @@ -517,26 +555,26 @@ public static void loadskin() { if(Directory.Exists(Paths.LoadedSkin)) { - try - { + //try { string rawData = File.ReadAllText(Paths.LoadedSkin + "data.json"); loadedSkin = JsonConvert.DeserializeObject<Skin>(rawData); if (File.Exists(Paths.LoadedSkin + "panels.json")) { string panels = File.ReadAllText(Paths.LoadedSkin + "panels.json"); loadedSkin.DesktopPanels = JsonConvert.DeserializeObject<List<DesktopPanel>>(panels); + LoadPanels(); } loadimages(); LoadEmbeddedNamePack(); - } - catch (Exception ex) + /*} + catch { //No skin to load. loadedSkin = new Skin(); loadedskin_images = new Images(); saveskin(); - } + }*/ } else { loadedSkin = new Skin(); @@ -751,6 +789,7 @@ public static void saveskin() saveimages(); string rawjson = JsonConvert.SerializeObject(loadedSkin); File.WriteAllText(Paths.LoadedSkin + "data.json", rawjson); + SavePanels(); string panels = JsonConvert.SerializeObject(loadedSkin.DesktopPanels); File.WriteAllText(Paths.LoadedSkin + "panels.json", panels); SaveEmbeddedNamePack();