fixed shiftorium
just in time for chrimbus
This commit is contained in:
parent
cc55af0c8b
commit
7fe5d790dc
4 changed files with 136 additions and 139 deletions
|
@ -26,8 +26,7 @@ using System;
|
|||
using System.Collections.Generic;
|
||||
using System.Dynamic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Threading;
|
||||
|
||||
namespace ShiftOS.Objects
|
||||
{
|
||||
|
@ -41,33 +40,77 @@ namespace ShiftOS.Objects
|
|||
[Obsolete("This save variable is no longer used in Beta 2.4 and above of ShiftOS. Please use ShiftOS.Engine.SaveSystem.CurrentUser.Username to access the current user's username.")]
|
||||
public string Username { get; set; }
|
||||
|
||||
private ulong _cp = 0;
|
||||
private List<Action> _setCpCallbacks = new List<Action>(); // everything in this list is called by Codepoints.set() and syncCp().
|
||||
private ulong _cp = 0; // locally cached codepoints counter
|
||||
private Object _cpLock = new Object(); // locked when modifying or reading the codepoints counter
|
||||
private Object _webLock = new Object(); // locked when communicating with the server
|
||||
private Timer _updTimer; // timer to start a new sync thread every 5 minutes
|
||||
|
||||
// Sync local Codepoints count with the server.
|
||||
public void syncCp()
|
||||
{
|
||||
new Thread(() =>
|
||||
{
|
||||
lock (_cpLock)
|
||||
{
|
||||
lock (_webLock)
|
||||
{
|
||||
var uc = new ShiftOS.Unite.UniteClient("", UniteAuthToken);
|
||||
_cp = uc.GetCodepoints();
|
||||
}
|
||||
}
|
||||
foreach (Action a in _setCpCallbacks)
|
||||
a();
|
||||
}).Start();
|
||||
}
|
||||
|
||||
// we have to write these wrapper functions so we can keep _setCpCallbacks private,
|
||||
// so that it doesn't get serialised
|
||||
public void addSetCpCallback(Action callback)
|
||||
{
|
||||
_setCpCallbacks.Add(callback);
|
||||
}
|
||||
|
||||
public void removeSetCpCallback(Action callback)
|
||||
{
|
||||
_setCpCallbacks.Remove(callback);
|
||||
}
|
||||
|
||||
public ulong Codepoints
|
||||
{
|
||||
get
|
||||
{
|
||||
try
|
||||
{
|
||||
var uc = new ShiftOS.Unite.UniteClient("", UniteAuthToken);
|
||||
return uc.GetCodepoints();
|
||||
}
|
||||
catch
|
||||
if (_updTimer == null)
|
||||
_updTimer = new Timer((o) => syncCp(), null, 0, 300000);
|
||||
lock (_cpLock)
|
||||
{
|
||||
return _cp;
|
||||
}
|
||||
}
|
||||
set
|
||||
{
|
||||
try
|
||||
lock (_cpLock)
|
||||
{
|
||||
_cp = value;
|
||||
new Thread(() =>
|
||||
{
|
||||
var uc = new ShiftOS.Unite.UniteClient("", UniteAuthToken);
|
||||
uc.SetCodepoints(value);
|
||||
}
|
||||
catch
|
||||
lock (_webLock)
|
||||
{
|
||||
try
|
||||
{
|
||||
var uc = new ShiftOS.Unite.UniteClient("", UniteAuthToken);
|
||||
uc.SetCodepoints(value);
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
}
|
||||
})
|
||||
{
|
||||
_cp = value;
|
||||
}
|
||||
IsBackground = false
|
||||
}.Start();
|
||||
}
|
||||
foreach (Action a in _setCpCallbacks)
|
||||
a();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -189,7 +189,6 @@ namespace ShiftOS.WinForms.Applications
|
|||
this.lblcategorytext.TabIndex = 2;
|
||||
this.lblcategorytext.Text = "No Upgrades";
|
||||
this.lblcategorytext.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
this.lblcategorytext.Click += new System.EventHandler(this.lblcategorytext_Click);
|
||||
//
|
||||
// btncat_forward
|
||||
//
|
||||
|
@ -226,7 +225,6 @@ namespace ShiftOS.WinForms.Applications
|
|||
this.lbcodepoints.Size = new System.Drawing.Size(135, 13);
|
||||
this.lbcodepoints.TabIndex = 3;
|
||||
this.lbcodepoints.Text = "You have: %cp Codepoints";
|
||||
this.lbcodepoints.Click += new System.EventHandler(this.lbcodepoints_Click);
|
||||
//
|
||||
// label1
|
||||
//
|
||||
|
@ -280,7 +278,6 @@ namespace ShiftOS.WinForms.Applications
|
|||
this.ForeColor = System.Drawing.Color.LightGreen;
|
||||
this.Name = "ShiftoriumFrontend";
|
||||
this.Size = new System.Drawing.Size(782, 427);
|
||||
this.Load += new System.EventHandler(this.Shiftorium_Load);
|
||||
this.panel1.ResumeLayout(false);
|
||||
this.panel2.ResumeLayout(false);
|
||||
this.pnlupgradeactions.ResumeLayout(false);
|
||||
|
|
|
@ -47,19 +47,22 @@ namespace ShiftOS.WinForms.Applications
|
|||
public partial class ShiftoriumFrontend : UserControl, IShiftOSWindow
|
||||
{
|
||||
public int CategoryId = 0;
|
||||
public static System.Timers.Timer timer100;
|
||||
private string[] cats = backend.GetCategories();
|
||||
private ShiftoriumUpgrade[] avail;
|
||||
|
||||
|
||||
public void updatecounter()
|
||||
{
|
||||
Desktop.InvokeOnWorkerThread(() => { lbcodepoints.Text = $"You have {SaveSystem.CurrentSave.Codepoints} Codepoints."; });
|
||||
}
|
||||
|
||||
public ShiftoriumFrontend()
|
||||
{
|
||||
cp_update = new System.Windows.Forms.Timer();
|
||||
cp_update.Tick += (o, a) =>
|
||||
{
|
||||
lbcodepoints.Text = $"You have {SaveSystem.CurrentSave.Codepoints} Codepoints.";
|
||||
};
|
||||
cp_update.Interval = 100;
|
||||
InitializeComponent();
|
||||
PopulateShiftorium();
|
||||
SaveSystem.CurrentSave.addSetCpCallback(updatecounter);
|
||||
updatecounter();
|
||||
Populate();
|
||||
SetList();
|
||||
lbupgrades.SelectedIndexChanged += (o, a) =>
|
||||
{
|
||||
try
|
||||
|
@ -82,84 +85,57 @@ namespace ShiftOS.WinForms.Applications
|
|||
public void SelectUpgrade(string name)
|
||||
{
|
||||
btnbuy.Show();
|
||||
var upg = upgrades[name];
|
||||
var upg = upgrades[CategoryId][name];
|
||||
lbupgradetitle.Text = Localization.Parse(upg.Name);
|
||||
lbupgradedesc.Text = Localization.Parse(upg.Description);
|
||||
}
|
||||
|
||||
Dictionary<string, ShiftoriumUpgrade> upgrades = new Dictionary<string, ShiftoriumUpgrade>();
|
||||
|
||||
public void PopulateShiftorium()
|
||||
Dictionary<string, ShiftoriumUpgrade>[] upgrades;
|
||||
|
||||
private void Populate()
|
||||
{
|
||||
var t = new Thread(() =>
|
||||
upgrades = new Dictionary<string, ShiftoriumUpgrade>[cats.Length];
|
||||
int numComplete = 0;
|
||||
avail = backend.GetAvailable();
|
||||
foreach (var it in cats.Select((catName, catId) => new { catName, catId }))
|
||||
{
|
||||
try
|
||||
var upl = new Dictionary<string, ShiftoriumUpgrade>();
|
||||
upgrades[it.catId] = upl;
|
||||
var t = new Thread((tupobj) =>
|
||||
{
|
||||
Desktop.InvokeOnWorkerThread(() =>
|
||||
{
|
||||
lbnoupgrades.Hide();
|
||||
lbupgrades.Items.Clear();
|
||||
upgrades.Clear();
|
||||
Timer();
|
||||
});
|
||||
foreach (var upg in avail.Where(x => x.Category == it.catName))
|
||||
upl.Add(Localization.Parse(upg.Name) + " - " + upg.Cost.ToString() + "CP", upg);
|
||||
numComplete++;
|
||||
});
|
||||
t.Start();
|
||||
}
|
||||
while (numComplete < cats.Length) { } // wait for all threads to finish their job
|
||||
}
|
||||
|
||||
foreach (var upg in backend.GetAvailable().Where(x => x.Category == backend.GetCategories()[CategoryId]))
|
||||
{
|
||||
string name = Localization.Parse(upg.Name) + " - " + upg.Cost.ToString() + "CP";
|
||||
upgrades.Add(name, upg);
|
||||
Desktop.InvokeOnWorkerThread(() =>
|
||||
{
|
||||
lbupgrades.Items.Add(name);
|
||||
});
|
||||
}
|
||||
|
||||
if (lbupgrades.Items.Count == 0)
|
||||
{
|
||||
Desktop.InvokeOnWorkerThread(() =>
|
||||
{
|
||||
lbnoupgrades.Show();
|
||||
lbnoupgrades.Location = new Point(
|
||||
(lbupgrades.Width - lbnoupgrades.Width) / 2,
|
||||
lbupgrades.Top + (lbupgrades.Height - lbnoupgrades.Height) / 2
|
||||
);
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
Desktop.InvokeOnWorkerThread(() =>
|
||||
{
|
||||
lbnoupgrades.Hide();
|
||||
});
|
||||
}
|
||||
|
||||
Desktop.InvokeOnWorkerThread(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
lblcategorytext.Text = Shiftorium.GetCategories()[CategoryId];
|
||||
btncat_back.Visible = (CategoryId > 0);
|
||||
btncat_forward.Visible = (CategoryId < backend.GetCategories().Length - 1);
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
catch
|
||||
{
|
||||
Desktop.InvokeOnWorkerThread(() =>
|
||||
{
|
||||
lbnoupgrades.Show();
|
||||
lbnoupgrades.Location = new Point(
|
||||
(lbupgrades.Width - lbnoupgrades.Width) / 2,
|
||||
lbupgrades.Top + (lbupgrades.Height - lbnoupgrades.Height) / 2
|
||||
);
|
||||
});
|
||||
}
|
||||
});
|
||||
t.IsBackground = true;
|
||||
t.Start();
|
||||
private void SetList()
|
||||
{
|
||||
lbnoupgrades.Hide();
|
||||
lbupgrades.Items.Clear();
|
||||
try
|
||||
{
|
||||
lbupgrades.Items.AddRange(upgrades[CategoryId].Keys.ToArray());
|
||||
}
|
||||
catch
|
||||
{
|
||||
Engine.Infobox.Show("Shiftorium Machine Broke", "Category ID " + CategoryId.ToString() + " is invalid, modulo is broken, and the world is doomed. Please tell Declan about this.");
|
||||
return;
|
||||
}
|
||||
if (lbupgrades.Items.Count == 0)
|
||||
{
|
||||
lbnoupgrades.Show();
|
||||
lbnoupgrades.Location = new Point(
|
||||
(lbupgrades.Width - lbnoupgrades.Width) / 2,
|
||||
lbupgrades.Top + (lbupgrades.Height - lbnoupgrades.Height) / 2
|
||||
);
|
||||
}
|
||||
else
|
||||
lbnoupgrades.Hide();
|
||||
lblcategorytext.Text = cats[CategoryId];
|
||||
}
|
||||
|
||||
public static bool UpgradeInstalled(string upg)
|
||||
|
@ -218,8 +194,9 @@ namespace ShiftOS.WinForms.Applications
|
|||
Dictionary<string, ulong> UpgradesToBuy = new Dictionary<string, ulong>();
|
||||
foreach (var itm in lbupgrades.SelectedItems)
|
||||
{
|
||||
cpCost += upgrades[itm.ToString()].Cost;
|
||||
UpgradesToBuy.Add(upgrades[itm.ToString()].ID, upgrades[itm.ToString()].Cost);
|
||||
var upg = upgrades[CategoryId][itm.ToString()];
|
||||
cpCost += upg.Cost;
|
||||
UpgradesToBuy.Add(upg.ID, upg.Cost);
|
||||
}
|
||||
if (SaveSystem.CurrentSave.Codepoints < cpCost)
|
||||
{
|
||||
|
@ -230,7 +207,6 @@ namespace ShiftOS.WinForms.Applications
|
|||
{
|
||||
foreach(var upg in UpgradesToBuy)
|
||||
{
|
||||
SaveSystem.CurrentSave.Codepoints -= upg.Value;
|
||||
if (SaveSystem.CurrentSave.Upgrades.ContainsKey(upg.Key))
|
||||
{
|
||||
SaveSystem.CurrentSave.Upgrades[upg.Key] = true;
|
||||
|
@ -242,20 +218,15 @@ namespace ShiftOS.WinForms.Applications
|
|||
SaveSystem.SaveGame();
|
||||
backend.InvokeUpgradeInstalled();
|
||||
}
|
||||
SaveSystem.CurrentSave.Codepoints -= cpCost;
|
||||
}
|
||||
|
||||
backend.Silent = false;
|
||||
PopulateShiftorium();
|
||||
btnbuy.Hide();
|
||||
}
|
||||
|
||||
private void Shiftorium_Load(object sender, EventArgs e) {
|
||||
|
||||
}
|
||||
|
||||
public void OnLoad()
|
||||
{
|
||||
cp_update.Start();
|
||||
lbnoupgrades.Hide();
|
||||
}
|
||||
|
||||
|
@ -264,12 +235,9 @@ namespace ShiftOS.WinForms.Applications
|
|||
|
||||
}
|
||||
|
||||
System.Windows.Forms.Timer cp_update = new System.Windows.Forms.Timer();
|
||||
|
||||
public bool OnUnload()
|
||||
{
|
||||
cp_update.Stop();
|
||||
cp_update = null;
|
||||
SaveSystem.CurrentSave.removeSetCpCallback(updatecounter);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -277,44 +245,26 @@ namespace ShiftOS.WinForms.Applications
|
|||
{
|
||||
lbupgrades.SelectionMode = (UpgradeInstalled("shiftorium_gui_bulk_buy") == true) ? SelectionMode.MultiExtended : SelectionMode.One;
|
||||
lbcodepoints.Visible = Shiftorium.UpgradeInstalled("shiftorium_gui_codepoints_display");
|
||||
Populate();
|
||||
SetList();
|
||||
}
|
||||
|
||||
private void lbcodepoints_Click(object sender, EventArgs e)
|
||||
private void moveCat(short direction) // direction is -1 to move backwards or 1 to move forwards
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void Timer()
|
||||
{
|
||||
timer100 = new System.Timers.Timer();
|
||||
timer100.Interval = 2000;
|
||||
//CLARIFICATION: What is this supposed to do? - Michael
|
||||
//timer100.Elapsed += ???;
|
||||
timer100.AutoReset = true;
|
||||
timer100.Enabled = true;
|
||||
CategoryId += direction;
|
||||
CategoryId %= cats.Length;
|
||||
if (CategoryId < 0) CategoryId += cats.Length; // fix modulo on negatives
|
||||
SetList();
|
||||
}
|
||||
|
||||
private void btncat_back_Click(object sender, EventArgs e)
|
||||
{
|
||||
if(CategoryId > 0)
|
||||
{
|
||||
CategoryId--;
|
||||
PopulateShiftorium();
|
||||
}
|
||||
moveCat(-1);
|
||||
}
|
||||
|
||||
private void btncat_forward_Click(object sender, EventArgs e)
|
||||
{
|
||||
if(CategoryId < backend.GetCategories().Length - 1)
|
||||
{
|
||||
CategoryId++;
|
||||
PopulateShiftorium();
|
||||
}
|
||||
}
|
||||
|
||||
private void lblcategorytext_Click(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
moveCat(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -570,8 +570,15 @@ namespace ShiftOS.Engine
|
|||
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}.");
|
||||
|
|
Reference in a new issue