public static bool Shutdown() { SaveSystem.ShuttingDown = true; TerminalBackend.InvokeCommand("sos.save"); AppearanceManager.Exit(); return(true); }
/// <summary> /// Static constructor for <see cref="TerminalBackend"/>. /// </summary> static TerminalBackend() { ServerMessageReceived onMessageReceived = (msg) => { if (msg.Name == "trm_invokecommand") { string text3 = ""; string text4 = msg.Contents; if (TerminalBackend.PrefixEnabled) { text3 = text4.Remove(0, $"{SaveSystem.CurrentUser.Username}@{SaveSystem.CurrentSave.SystemName}:~$ ".Length); } IsForwardingConsoleWrites = true; if (TerminalBackend.InStory == false) { TerminalBackend.InvokeCommand(text3, true); } if (TerminalBackend.PrefixEnabled) { Console.Write($"{SaveSystem.CurrentUser.Username}@{SaveSystem.CurrentSave.SystemName}:~$ "); } IsForwardingConsoleWrites = false; } else if (msg.Name == "pleasewrite") { Console.Write(msg.Contents); } else if (msg.Name == "handshake_from") { var a = JsonConvert.DeserializeObject <Dictionary <string, object> >(msg.Contents); string uName = a["username"] as string; string pass = a["password"] as string; string sys = a["sysname"] as string; string guid = msg.GUID; if (SaveSystem.CurrentUser.Username == uName && SaveSystem.CurrentSave.Password == pass && CurrentSave.SystemName == sys) { ForwardGUID = guid; ServerManager.SendMessage("trm_handshake_accept", $@"{{ guid: ""{ServerManager.thisGuid}"", target: ""{guid}"" }}"); IsForwardingConsoleWrites = true; InvokeCommand("sos.status"); Console.Write($"{SaveSystem.CurrentUser.Username}@{SaveSystem.CurrentSave.SystemName}:~$ "); IsForwardingConsoleWrites = false; } } }; ServerManager.MessageReceived += onMessageReceived; }
/// <summary> /// Buy an upgrade, deducting the specified amount of Codepoints. /// </summary> /// <param name="id">The upgrade ID to buy</param> /// <param name="cost">The amount of Codepoints to deduct</param> /// <returns>True if the upgrade was installed successfully, false if the user didn't have enough Codepoints or the upgrade wasn' found.</returns> public static bool Buy(string id, ulong cost) { if (SaveSystem.CurrentSave.Codepoints >= cost) { SaveSystem.CurrentSave.Upgrades[id] = true; TerminalBackend.InvokeCommand("sos.save"); SaveSystem.TransferCodepointsToVoid(cost); Installed?.Invoke(); Desktop.ResetPanelButtons(); Desktop.PopulateAppLauncher(); return(true); } else { if (!Silent) { Console.WriteLine($"{{SHIFTORIUM_NOTENOUGHCP}}: {cost} > {SaveSystem.CurrentSave.Codepoints}"); } return(false); } }
/// <summary> /// Restarts the game. /// </summary> public static void Restart() { TerminalBackend.InvokeCommand("sos.shutdown"); System.Windows.Forms.Application.Restart(); }
public static void StartDevXLies() { int chatProgress = 0; //bool LoopStuck = false; string textToWrite = ""; const int TYPE_SPEED_MS = 45; bool done = false; bool write = true; while (done == false) { write = true; switch (chatProgress) { case 0: textToWrite = "User joined: @" + SaveSystem.CurrentSave.Username; break; case 1: textToWrite = $"Hello, {SaveSystem.CurrentSave.Username}."; break; case 2: //If C:\ShiftOS doesn't exist the player won't notice this is here. if (Directory.Exists(Paths.GetPath("classic"))) { textToWrite = "I see you've participated in my previous ShiftOS experiment. Welcome back, Shifter. I assume you know lots about ShiftOS, but there are some updates I have to tell you."; } else { write = false; } break; case 3: //DevX hates ShiftOS-Next secretly. if (Directory.Exists(Paths.GetPath("classic") + "-Next")) { textToWrite = "Hmmmm.... looking at my sentience records, I see you've participated in ShiftOS-Next. This is gonna be difficult."; } else { write = false; } break; case 4: textToWrite = "There's a lot that has changed within ShiftOS."; break; case 5: textToWrite = "First off, I want to tell you a bit about myself in case you don't already know."; break; case 6: textToWrite = "My name is DevX. I am the architect of ShiftOS. I have chosen you to take part in helping me out with it."; break; case 7: textToWrite = "You see, in my past attempts it has all been about an evolving operating system and seeing how the users work with it..."; break; case 8: textToWrite = "Almost one hundred percent of the time, people have found out it was an experiment and they could simply return to their regular system with a specific upgrade."; break; case 9: textToWrite = "But now, I want to try something different - something unique."; break; case 10: textToWrite = "ShiftOS is the same as it has been in my previous attempts, but now, your goal is to gain as much wealth and power as possible."; break; case 11: textToWrite = "Right now you are inside my segregation LAN. Only you and me exist within this domain. You are free from other users unless I create them."; break; case 12: textToWrite = "Since you have proved your sentience, I have a task for you outside the segregation LAN."; break; case 13: textToWrite = "But first... you need to be taught a few things."; break; case 14: textToWrite = "First off, when I bring you into my multi-user domain, you'll first want to establish as much wealth as possible."; break; case 15: textToWrite = "Wealth comes in the form of Codepoints - a currency used among users of the multi-user domain."; break; case 16: textToWrite = @"You can get Codepoints by doing the following: - Stealing them from other users - Extracting them from inactive/unverified sentiences - Using specific scripts/programs within ShiftOS - Creating paid scripts/applications within ShiftOS"; break; case 17: textToWrite = "You can use Codepoints to buy upgrades using the 'shiftorium.buy' command, or you can use them to pay other users, or scripts."; break; case 18: textToWrite = "Within the multi-user domain you are free to do whatever you want. Larcany, theft, deceiving, lies, and distribution of malware is permitted under my watch."; break; case 19: textToWrite = "Do whatever you have to to get Codepoints."; break; case 20: textToWrite = "Then use them to make yourself stronger by buying upgrades at the shiftorium."; break; case 21: textToWrite = "If you want to get a bit devious within the multi-user domain, look around for scripts that will expose user account information."; break; case 22: textToWrite = "Or just spread a virus around the mud."; break; case 23: textToWrite = "Or you can be the 'good' guy and stop these attacks and gain the trust of other users."; break; case 24: textToWrite = "It's up to you. Just, don't mess with my system. You won't want me coming to you after that. I'm watching."; break; case 25: textToWrite = "User left chat: @" + SaveSystem.CurrentSave.Username; done = true; SaveSystem.CurrentSave.StoryPosition++; TerminalBackend.InvokeCommand("sos.save"); break; } if (write == true) { Console.WriteLine(); Console.Write("DevX: "); foreach (char c in textToWrite) { Console.Beep(750, TYPE_SPEED_MS); if (c == '\n') { } else if (c == '\r') { Console.WriteLine(); } else { Console.Write(c); } } Thread.Sleep(1000); } chatProgress += 1; } }
public static Exception HandledException = null; // this value determines if we can try to set the game back on track or we cant do anything about it public static void Start(Exception e) { if (SaveSystem.CurrentSave != null) { TerminalBackend.InvokeCommand("sos.save"); // SAVE BEFORE CRASHING } ServerManager.Disconnect(); while (Application.OpenForms.Count > 0) { Application.OpenForms[0].Close(); } //Set our global exception variable, and show the exception dialog. HandledException = e; System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly(); System.IO.FileInfo fileInfo = new System.IO.FileInfo(assembly.Location); DateTime lastModified = fileInfo.LastWriteTime; // put all this in a text document string rtbcrash_Text = $@" === {AssemblyName} has crashed. === Game: {AssemblyName} Description: {AssemblyDescription} Basic Information For User: --------------------------------- When: {DateTime.Now.ToString()} Why: {HandledException.Message} What: {HandledException.GetType().Name} We, at the ShiftOS Development Team, apologise for your game crash, we will take this bug report seriously - and it has been emailed to the development team of ShiftOS, thank you for enjoying our game! Advanced Information (for experts and developers): ---------------------------------------------------- Host system information: --------------------------------- Operating system: {Environment.OSVersion.Platform.ToString()} Version: {Environment.OSVersion.VersionString} Is 64-bit: {Environment.Is64BitOperatingSystem} ShiftOS exec path: {Application.ExecutablePath} Advanced Host Information: --------------------------------- CPU Name: {GetHardwareInfo.GetProcessorName()} Physical RAM Installed: {GetHardwareInfo.GetRAMAmount()} GPU Name: {GetHardwareInfo.GetGPUName()} ShiftOS basic information: --------------------------------- ShiftOS Version: {Assembly.GetExecutingAssembly().GetName().Version} ShiftOS Date: {lastModified.ToString()} ShiftOS environment information: --------------------------------- Is Save loaded: {(SaveSystem.CurrentSave != null)} Paths loaded in system: {JsonConvert.SerializeObject(Paths.GetAll())} Crash: {HandledException.GetType().Name} -------------------------------------------- Exception message: {HandledException.Message} HResult (this is technical): {HandledException.HResult} Has inner exception: {(HandledException.InnerException != null)} Stack trace: {HandledException.StackTrace}"; if (HandledException.InnerException != null) { var i = HandledException.InnerException; rtbcrash_Text += $@" Inner: {i.GetType().Name} -------------------------------------------- Exception message: {i.Message} HResult (this is technical): {i.HResult} Stack trace: {i.StackTrace}"; } File.WriteAllText("crash.txt", rtbcrash_Text); // make that text document and put above super long string in it var result = MessageBox.Show(caption: "ShiftOS - Fatal error", text: "ShiftOS has encountered a fatal error and has been shut down. Info about the error has been saved to a file called crash.txt in the same folder as the active executable. Would you like to try and recover the game session?", buttons: MessageBoxButtons.YesNo); if (result == DialogResult.Yes) { Application.Restart(); // tries to restart if user clicks yes, who wouldve guessed } }