aboutsummaryrefslogtreecommitdiff
path: root/ShiftOS_TheReturn/SaveSystem.cs
diff options
context:
space:
mode:
authorAShifter <[email protected]>2017-06-05 09:49:46 -0600
committerAShifter <[email protected]>2017-06-05 09:49:46 -0600
commit61c906e596145bbedd60725c6dcee68c34a27907 (patch)
treecd7a00d501affe96028bfb21a8dec90c2ee63f2c /ShiftOS_TheReturn/SaveSystem.cs
parent66ea2cf2fdeeaa025bd22961a0400423233c505d (diff)
parent3e11eca70481841b6e2f2253d667944779cfd5fb (diff)
downloadshiftos_thereturn-61c906e596145bbedd60725c6dcee68c34a27907.tar.gz
shiftos_thereturn-61c906e596145bbedd60725c6dcee68c34a27907.tar.bz2
shiftos_thereturn-61c906e596145bbedd60725c6dcee68c34a27907.zip
Merge remote-tracking branch 'refs/remotes/shiftos-game/master'
Diffstat (limited to 'ShiftOS_TheReturn/SaveSystem.cs')
-rw-r--r--ShiftOS_TheReturn/SaveSystem.cs372
1 files changed, 274 insertions, 98 deletions
diff --git a/ShiftOS_TheReturn/SaveSystem.cs b/ShiftOS_TheReturn/SaveSystem.cs
index f29e5b8..e98a51e 100644
--- a/ShiftOS_TheReturn/SaveSystem.cs
+++ b/ShiftOS_TheReturn/SaveSystem.cs
@@ -21,6 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
+// #define NOSAVE
//#define ONLINEMODE
@@ -39,6 +40,7 @@ using static System.Net.Mime.MediaTypeNames;
namespace ShiftOS.Engine
{
+ [Obsolete("Use the servers.conf file instead.")]
public class EngineConfig
{
public bool ConnectToMud = true;
@@ -46,13 +48,34 @@ namespace ShiftOS.Engine
public int MudDefaultPort = 13370;
}
+ /// <summary>
+ /// Management class for the ShiftOS save system.
+ /// </summary>
public static class SaveSystem
{
+ /// <summary>
+ /// Boolean representing whether the system is shutting down.
+ /// </summary>
public static bool ShuttingDown = false;
+ /// <summary>
+ /// Gets or sets the current logged in client-side user.
+ /// </summary>
public static ClientSave CurrentUser { get; set; }
+ /// <summary>
+ /// Boolean representing whether the save system is ready to be used.
+ /// </summary>
+ public static bool Ready = false;
+ /// <summary>
+ /// Occurs before the save system connects to the ShiftOS Digital Society.
+ /// </summary>
+ public static event Action PreDigitalSocietyConnection;
+
+ /// <summary>
+ /// Gets or sets the current server-side save file.
+ /// </summary>
public static Save CurrentSave { get; set; }
/// <summary>
@@ -98,64 +121,92 @@ namespace ShiftOS.Engine
}
Thread.Sleep(350);
- Console.WriteLine("Initiating kernel...");
+ Console.WriteLine("ShiftKernel v0.4.2");
+ Console.WriteLine("(MIT) DevX 2017, Very Little Rights Reserved");
+ Console.WriteLine("");
+ Console.WriteLine("THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR");
+ Console.WriteLine("IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,");
+ Console.WriteLine("FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE");
+ Console.WriteLine("AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER");
+ Console.WriteLine("LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,");
+ Console.WriteLine("OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE");
+ Console.WriteLine("SOFTWARE.");
+ Console.WriteLine("");
Thread.Sleep(250);
- Console.WriteLine("Reading filesystem...");
+ Console.WriteLine("[init] Kernel boot complete.");
+ Console.WriteLine("[sfs] Loading SFS driver v3");
Thread.Sleep(100);
- Console.WriteLine("Reading configuration...");
+ Console.WriteLine("[sfs] 4096 blocks read.");
+ Console.WriteLine("[simpl-conf] Reading configuration files (global-3.conf)");
+ Console.WriteLine("[termdb] Building command database from filesystem...");
+ TerminalBackend.PopulateTerminalCommands();
+ Console.WriteLine("[inetd] Connecting to network...");
- Console.WriteLine("{CONNECTING_TO_MUD}");
+ Ready = false;
- if (defaultConf.ConnectToMud == true)
+ if (PreDigitalSocietyConnection != null)
{
- bool guidReceived = false;
- ServerManager.GUIDReceived += (str) =>
+ PreDigitalSocietyConnection?.Invoke();
+
+ while (!Ready)
{
+ Thread.Sleep(10);
+ }
+ }
+
+
+
+ bool guidReceived = false;
+ ServerManager.GUIDReceived += (str) =>
+ {
//Connection successful! Stop waiting!
guidReceived = true;
- Console.WriteLine("Connection successful.");
- };
+ Console.WriteLine("[inetd] Connection successful.");
+ };
- try
- {
-
- ServerManager.Initiate("secondary4162.cloudapp.net", 13370);
- //This haults the client until the connection is successful.
- while (ServerManager.thisGuid == new Guid())
- {
- Thread.Sleep(10);
- }
- Console.WriteLine("GUID received - bootstrapping complete.");
- FinishBootstrap();
- }
- catch (Exception ex)
+ try
+ {
+
+ ServerManager.Initiate(UserConfig.Get().DigitalSocietyAddress, UserConfig.Get().DigitalSocietyPort);
+ //This haults the client until the connection is successful.
+ while (ServerManager.thisGuid == new Guid())
{
- //No errors, this never gets called.
- Console.WriteLine("{ERROR}: " + ex.Message);
- Thread.Sleep(3000);
- ServerManager.StartLANServer();
- while (ServerManager.thisGuid == new Guid())
- {
- Thread.Sleep(10);
- }
- Console.WriteLine("GUID received - bootstrapping complete.");
- FinishBootstrap();
+ Thread.Sleep(10);
}
+ Console.WriteLine("[inetd] DHCP GUID recieved, finished setup");
+ FinishBootstrap();
}
- else
+ catch (Exception ex)
{
- ServerManager.StartLANServer();
+ //No errors, this never gets called.
+ Console.WriteLine("[inetd] SEVERE: " + ex.Message);
+ Thread.Sleep(3000);
+ Console.WriteLine("[sys] SEVERE: Cannot connect to server. Shutting down in 5...");
+ Thread.Sleep(1000);
+ Console.WriteLine("[sys] 4...");
+ Thread.Sleep(1000);
+ Console.WriteLine("[sys] 3...");
+ Thread.Sleep(1000);
+ Console.WriteLine("[sys] 2...");
+ Thread.Sleep(1000);
+ Console.WriteLine("[sys] 1...");
+ Thread.Sleep(1000);
+ Console.WriteLine("[sys] Bye bye.");
+ System.Diagnostics.Process.GetCurrentProcess().Kill();
}
//Nothing happens past this point - but the client IS connected! It shouldn't be stuck in that while loop above.
-
+
}));
thread.IsBackground = true;
thread.Start();
}
- public static void FinishBootstrap()
+ /// <summary>
+ /// Finish bootstrapping the engine.
+ /// </summary>
+ private static void FinishBootstrap()
{
KernelWatchdog.Log("mud_handshake", "handshake successful: kernel watchdog access code is \"" + ServerManager.thisGuid.ToString() + "\"");
@@ -165,13 +216,21 @@ namespace ShiftOS.Engine
{
if (msg.Name == "mud_savefile")
{
- CurrentSave = JsonConvert.DeserializeObject<Save>(msg.Contents);
ServerManager.MessageReceived -= savehandshake;
- }
+ try
+ {
+ CurrentSave = JsonConvert.DeserializeObject<Save>(msg.Contents);
+ }
+ catch
+ {
+ Console.WriteLine("[system] [SEVERE] Cannot parse configuration file.");
+ oobe.PromptForLogin();
+ }
+ }
else if (msg.Name == "mud_login_denied")
{
- oobe.PromptForLogin();
ServerManager.MessageReceived -= savehandshake;
+ oobe.PromptForLogin();
}
};
ServerManager.MessageReceived += savehandshake;
@@ -196,7 +255,7 @@ namespace ShiftOS.Engine
Thread.Sleep(75);
Thread.Sleep(50);
- Console.WriteLine("{SYSTEM_INITIATED}");
+ Console.WriteLine("[usr-man] Accepting logins on local tty 1.");
Sysname:
bool waitingForNewSysName = false;
@@ -204,7 +263,7 @@ namespace ShiftOS.Engine
if (string.IsNullOrWhiteSpace(CurrentSave.SystemName))
{
- Infobox.PromptText("Enter a system name", "Your system does not have a name. All systems within the digital society must have a name. Please enter one.", (name)=>
+ Infobox.PromptText("Enter a system name", "Your system does not have a name. All systems within the digital society must have a name. Please enter one.", (name) =>
{
if (string.IsNullOrWhiteSpace(name))
Infobox.Show("Invalid name", "Please enter a valid name.", () =>
@@ -248,8 +307,34 @@ namespace ShiftOS.Engine
if (CurrentSave.Users == null)
CurrentSave.Users = new List<ClientSave>();
-
- if(CurrentSave.Users.Count == 0)
+ Console.WriteLine($@"
+ `-:/++++::.`
+ .+ydNMMMMMNNMMMMMNhs/.
+ /yNMMmy+:-` `````.-/ohNMMms-
+ `oNMMh/.`:oydmNMMMMNmhs+- .+dMMm+` Welcome to ShiftOS.
+ `oMMmo``+dMMMMMMMMMMMMMMMMMNh/`.sNMN+
+ :NMN+ -yMMMMMMMNdhyssyyhdmNMMMMNs``sMMd. SYSTEM STATUS:
+ oMMd.`sMMMMMMd+. `/MMMMN+ -mMN: ----------------------
+ oMMh .mMMMMMM/ `-::::-.` :MMMMMMh`.mMM:
+ :MMd .NMMMMMMs .dMMMMMMMMMNddMMMMMMMd`.NMN. Codepoints: {SaveSystem.CurrentSave.Codepoints}
+ mMM. dMMMMMMMo -mMMMMMMMMMMMMMMMMMMMMs /MMy Upgrades: {SaveSystem.CurrentSave.CountUpgrades()} installed
+ :MMh :MMMMMMMMm` .+shmMMMMMMMMMMMMMMMN` NMN` {Shiftorium.GetAvailable().Count()} available
+ oMM+ sMMMMMMMMMN+` `-/smMMMMMMMMMMM: hMM: Filesystems: {Utils.Mounts.Count} filesystems mounted in memory.
+ sMM+ sMMMMMMMMMMMMds/-` .sMMMMMMMMM/ yMM/
+ +MMs +MMMMMMMMMMMMMMMMMmhs:` +MMMMMMMM- dMM- System name: {CurrentSave.SystemName.ToUpper()}
+ .MMm `NMMMMMMMMMMMMMMMMMMMMMo `NMMMMMMd .MMN Users: {Users.Count()} found.
+ hMM+ +MMMMMMmsdNMMMMMMMMMMN/ -MMMMMMN- yMM+
+ `NMN- oMMMMMd `-/+osso+- .mMMMMMN: +MMd
+ -NMN: /NMMMm` :yMMMMMMm- oMMd`
+ -mMMs``sMMMMNdhso++///+oydNMMMMMMNo .hMMh`
+ `yMMm/ .omMMMMMMMMMMMMMMMMMMMMd+``oNMNo
+ -hMMNo. -ohNMMMMMMMMMMMMmy+. -yNMNy`
+ .sNMMms/. `-/+++++/:-` ./yNMMmo`
+ :sdMMMNdyso+++ooshdNMMMdo-
+ `:+yhmNNMMMMNNdhs+-
+ ```` ");
+
+ if (CurrentSave.Users.Count == 0)
{
CurrentSave.Users.Add(new ClientSave
{
@@ -257,76 +342,107 @@ namespace ShiftOS.Engine
Password = "",
Permissions = UserPermissions.Root
});
- Console.WriteLine("No users found. Creating new user with username \"root\", with no password.");
+ Console.WriteLine("[usr-man] WARN: No users found. Creating new user with username \"root\", with no password.");
}
TerminalBackend.InStory = false;
TerminalBackend.PrefixEnabled = false;
- Login:
- string username = "";
- int progress = 0;
- bool goback = false;
- TextSentEventHandler ev = null;
- ev = (text) =>
+ if (LoginManager.ShouldUseGUILogin)
+ {
+ Action<ClientSave> Completed = null;
+ Completed += (user) =>
+ {
+ CurrentUser = user;
+ LoginManager.LoginComplete -= Completed;
+ };
+ LoginManager.LoginComplete += Completed;
+ Desktop.InvokeOnWorkerThread(() =>
+ {
+ LoginManager.PromptForLogin();
+ });
+ while (CurrentUser == null)
+ {
+ Thread.Sleep(10);
+ }
+ }
+ else
{
- if (progress == 0)
+
+ Login:
+ string username = "";
+ int progress = 0;
+ bool goback = false;
+ TextSentEventHandler ev = null;
+ ev = (text) =>
{
- if (!string.IsNullOrWhiteSpace(text))
+ if (progress == 0)
{
- if (CurrentSave.Users.FirstOrDefault(x => x.Username == text) == null)
+ string loginstr = CurrentSave.SystemName + " login: ";
+ string getuser = text.Remove(0, loginstr.Length);
+ if (!string.IsNullOrWhiteSpace(getuser))
{
- Console.WriteLine("User not found.");
- goback = true;
+ if (CurrentSave.Users.FirstOrDefault(x => x.Username == getuser) == null)
+ {
+ Console.WriteLine();
+ Console.WriteLine("User not found.");
+ goback = true;
+ progress++;
+ TerminalBackend.TextSent -= ev;
+ return;
+ }
+ username = getuser;
progress++;
+ }
+ else
+ {
+ Console.WriteLine();
+ Console.WriteLine("Username not provided.");
TerminalBackend.TextSent -= ev;
- return;
+ goback = true;
+ progress++;
}
- username = text;
- progress++;
}
- else
+ else if (progress == 1)
{
- Console.WriteLine("Username not provided.");
+ string passwordstr = "password: ";
+ string getpass = text.Remove(0, passwordstr.Length);
+ var user = CurrentSave.Users.FirstOrDefault(x => x.Username == username);
+ if (user.Password == getpass)
+ {
+ Console.WriteLine();
+ Console.WriteLine("Welcome to ShiftOS.");
+ CurrentUser = user;
+ progress++;
+ }
+ else
+ {
+ Console.WriteLine();
+ Console.WriteLine("Access denied.");
+ goback = true;
+ progress++;
+ }
TerminalBackend.TextSent -= ev;
- goback = true;
- progress++;
}
- }
- else if (progress == 1)
+ };
+ TerminalBackend.TextSent += ev;
+ Console.WriteLine();
+ Console.Write(CurrentSave.SystemName + " login: ");
+ ConsoleEx.Flush();
+ while (progress == 0)
{
- var user = CurrentSave.Users.FirstOrDefault(x => x.Username == username);
- if (user.Password == text)
- {
- Console.WriteLine("Welcome to ShiftOS.");
- CurrentUser = user;
- Thread.Sleep(2000);
- progress++;
- }
- else
- {
- Console.WriteLine("Access denied.");
- goback = true;
- progress++;
- }
- TerminalBackend.TextSent -= ev;
+ Thread.Sleep(10);
}
- };
- TerminalBackend.TextSent += ev;
- Console.WriteLine(CurrentSave.SystemName + " login:");
- while(progress == 0)
- {
- Thread.Sleep(10);
+ if (goback)
+ goto Login;
+ Console.WriteLine();
+ Console.Write("password: ");
+ ConsoleEx.Flush();
+ while (progress == 1)
+ Thread.Sleep(10);
+ if (goback)
+ goto Login;
}
- if (goback)
- goto Login;
- Console.WriteLine("password:");
- while (progress == 1)
- Thread.Sleep(10);
- if (goback)
- goto Login;
-
-
TerminalBackend.PrefixEnabled = true;
Shiftorium.LogOrphanedUpgrades = true;
Desktop.InvokeOnWorkerThread(new Action(() =>
@@ -337,10 +453,26 @@ namespace ShiftOS.Engine
Desktop.InvokeOnWorkerThread(new Action(() => Desktop.PopulateAppLauncher()));
GameReady?.Invoke();
+
+ if (!string.IsNullOrWhiteSpace(CurrentSave.PickupPoint))
+ {
+ try
+ {
+ Story.Start(CurrentSave.PickupPoint);
+ TerminalBackend.PrintPrompt();
+ }
+ catch { }
+ }
}
+ /// <summary>
+ /// Delegate type for events with no caller objects or event arguments. You can use the () => {...} (C#) lambda expression with this delegate
+ /// </summary>
public delegate void EmptyEventHandler();
+ /// <summary>
+ /// Gets a list of all client-side users.
+ /// </summary>
public static List<ClientSave> Users
{
get
@@ -349,20 +481,35 @@ namespace ShiftOS.Engine
}
}
+ /// <summary>
+ /// Occurs when the engine is loaded and the game can take over.
+ /// </summary>
public static event EmptyEventHandler GameReady;
- public static void TransferCodepointsToVoid(long amount)
+ /// <summary>
+ /// Deducts a set amount of Codepoints from the save file... and sends them to a place where they'll never be seen again.
+ /// </summary>
+ /// <param name="amount">The amount of Codepoints to deduct.</param>
+ public static void TransferCodepointsToVoid(ulong amount)
{
+ if (amount < 0)
+ throw new ArgumentOutOfRangeException("We see what you did there. Trying to pull Codepoints from the void? That won't work.");
CurrentSave.Codepoints -= amount;
NotificationDaemon.AddNotification(NotificationType.CodepointsSent, amount);
}
+ /// <summary>
+ /// Restarts the game.
+ /// </summary>
public static void Restart()
{
TerminalBackend.InvokeCommand("sos.shutdown");
System.Windows.Forms.Application.Restart();
}
+ /// <summary>
+ /// Requests the save file from the server. If authentication fails, this will cause the user to be prompted for their website login and a new save will be created if none is associated with the login.
+ /// </summary>
public static void ReadSave()
{
//Migrate old saves.
@@ -406,6 +553,9 @@ namespace ShiftOS.Engine
}
+ /// <summary>
+ /// Creates a new save, starting the Out Of Box Experience (OOBE).
+ /// </summary>
public static void NewSave()
{
AppearanceManager.Invoke(new Action(() =>
@@ -418,31 +568,57 @@ namespace ShiftOS.Engine
}));
}
+ /// <summary>
+ /// Saves the game to the server, updating website stats if possible.
+ /// </summary>
public static void SaveGame()
{
+#if !NOSAVE
if(!Shiftorium.Silent)
Console.WriteLine("");
if(!Shiftorium.Silent)
Console.Write("{SE_SAVING}... ");
if (SaveSystem.CurrentSave != null)
{
- Utils.WriteAllText(Paths.GetPath("user.dat"), CurrentSave.UniteAuthToken);
- ServerManager.SendMessage("mud_save", JsonConvert.SerializeObject(CurrentSave, Formatting.Indented));
+ Utils.WriteAllText(Paths.GetPath("user.dat"), CurrentSave.UniteAuthToken);
+ var serialisedSaveFile = JsonConvert.SerializeObject(CurrentSave, Formatting.Indented);
+ new Thread(() =>
+ {
+ // please don't do networking on the main thread if you're just going to
+ // discard the response, it's extremely slow
+ ServerManager.SendMessage("mud_save", serialisedSaveFile);
+ })
+ { IsBackground = false }.Start();
}
if (!Shiftorium.Silent)
Console.WriteLine(" ...{DONE}.");
System.IO.File.WriteAllText(Paths.SaveFile, Utils.ExportMount(0));
+#endif
}
- public static void TransferCodepointsFrom(string who, long amount)
+ /// <summary>
+ /// Transfers codepoints from an arbitrary character to the save file.
+ /// </summary>
+ /// <param name="who">The character name</param>
+ /// <param name="amount">The amount of Codepoints.</param>
+ public static void TransferCodepointsFrom(string who, ulong amount)
{
+ if (amount < 0)
+ throw new ArgumentOutOfRangeException("We see what you did there... You can't just give a fake character Codepoints like that. It's better if you transfer them to the void.");
NotificationDaemon.AddNotification(NotificationType.CodepointsReceived, amount);
CurrentSave.Codepoints += amount;
}
}
+ /// <summary>
+ /// Delegate for handling Terminal text input.
+ /// </summary>
+ /// <param name="text">The text inputted by the user (including prompt text).</param>
public delegate void TextSentEventHandler(string text);
+ /// <summary>
+ /// Denotes that this Terminal command or namespace is for developers.
+ /// </summary>
public class DeveloperAttribute : Attribute
{