holy ashit

This commit is contained in:
Michael VanOverbeek 2017-05-21 12:21:41 +00:00
parent 3b1c71e671
commit 31cc9148dd
38 changed files with 2506 additions and 3067 deletions

File diff suppressed because it is too large Load diff

View file

@ -32,23 +32,16 @@ using System.Threading;
namespace ShiftOS.Objects.ShiftFS
{
public enum Permissions
{
User,
Administrator,
Superuser,
All
}
public class File
{
public string Name;
public byte[] Data;
public byte[] HeaderData;
public bool ReadAccessToLowUsers;
public Permissions permissions;
public UserPermissions permissions;
public System.IO.Stream GetStream()
{
if ((int)CurrentUser >= (int)permissions || permissions == Permissions.All)
if ((int)CurrentUser <= (int)permissions)
{
return new System.IO.MemoryStream(Data);
}
@ -59,7 +52,7 @@ namespace ShiftOS.Objects.ShiftFS
return null;
}
public File(string name, byte[] data, bool ReadAccess_to_low_users, Permissions perm)
public File(string name, byte[] data, bool ReadAccess_to_low_users, UserPermissions perm)
{
Name = name;
Data = data;
@ -73,31 +66,31 @@ namespace ShiftOS.Objects.ShiftFS
public List<File> Files = new List<File>();
public List<Directory> Subdirectories = new List<Directory>();
public bool ReadAccessToLowUsers;
public Permissions permissions;
public UserPermissions permissions;
public void AddFile(File file)
{
if ((int)CurrentUser >= (int)permissions || permissions == Permissions.All)
if ((int)CurrentUser <= (int)permissions)
{
Files.Add(file);
}
}
public void RemoveFile(string name)
{
if ((int)CurrentUser >= (int)permissions || permissions == Permissions.All)
if ((int)CurrentUser <= (int)permissions)
{
Files.Remove(Files.Find(x => x.Name == name));
}
}
public void RemoveFile(File file)
{
if ((int)CurrentUser >= (int)permissions || permissions == Permissions.All)
if ((int)CurrentUser <= (int)permissions)
{
Files.Remove(file);
}
}
public File FindFileByName(string name)
{
if ((int)CurrentUser >= (int)permissions || permissions == Permissions.All)
if ((int)CurrentUser <= (int)permissions)
{
return Files.Find(x => x.Name == name);
}
@ -105,28 +98,28 @@ namespace ShiftOS.Objects.ShiftFS
}
public void AddDirectory(Directory dir)
{
if ((int)CurrentUser >= (int)permissions || permissions == Permissions.All)
if ((int)CurrentUser <= (int)permissions)
{
Subdirectories.Add(dir);
}
}
public void RemoveDirectory(string name)
{
if ((int)CurrentUser >= (int)permissions || permissions == Permissions.All)
if ((int)CurrentUser <= (int)permissions)
{
Subdirectories.Remove(Subdirectories.Find(x => x.Name == name));
}
}
public void RemoveDirectory(Directory dir)
{
if ((int)CurrentUser >= (int)permissions || permissions == Permissions.All)
if ((int)CurrentUser <= (int)permissions)
{
Subdirectories.Remove(dir);
}
}
public Directory FindDirectoryByName(string name)
{
if ((int)CurrentUser >= (int)permissions || permissions == Permissions.All)
if ((int)CurrentUser <= (int)permissions)
{
return Subdirectories.Find(x => x.Name == name);
}
@ -136,7 +129,7 @@ namespace ShiftOS.Objects.ShiftFS
public static class Utils
{
public static Permissions CurrentUser { get; set; }
public static UserPermissions CurrentUser { get; set; }
public static List<Directory> Mounts { get; set; }
@ -232,7 +225,7 @@ namespace ShiftOS.Objects.ShiftFS
{
try
{
dir.AddFile(new File(pathlist[pathlist.Length - 1], Encoding.UTF8.GetBytes(contents), false, Permissions.All));
dir.AddFile(new File(pathlist[pathlist.Length - 1], Encoding.UTF8.GetBytes(contents), false, CurrentUser));
}
catch { }
}
@ -281,7 +274,7 @@ namespace ShiftOS.Objects.ShiftFS
if (!FileExists(path))
{
dir.AddFile(new File(pathlist[pathlist.Length - 1], contents, false, Permissions.All));
dir.AddFile(new File(pathlist[pathlist.Length - 1], contents, false, CurrentUser));
}
else
{

View file

@ -58,6 +58,7 @@
<Compile Include="Shop.cs" />
<Compile Include="Unite\Download.cs" />
<Compile Include="Unite\ReleaseQuery.cs" />
<Compile Include="UserConfig.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />

View file

@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace ShiftOS.Objects
{
public class UserConfig
{
public string UniteUrl { get; set; }
public string DigitalSocietyAddress { get; set; }
public int DigitalSocietyPort { get; set; }
public static UserConfig Get()
{
var conf = new UserConfig
{
UniteUrl = "http://getshiftos.ml",
DigitalSocietyAddress = "michaeltheshifter.me",
DigitalSocietyPort = 13370
};
if (!File.Exists("servers.json"))
{
File.WriteAllText("servers.json", JsonConvert.SerializeObject(conf, Formatting.Indented));
}
else
{
conf = JsonConvert.DeserializeObject<UserConfig>(File.ReadAllText("servers.json"));
}
return conf;
}
}
}

View file

@ -189,7 +189,7 @@ namespace ShiftOS.Server
//Update the shiftos website with the user's codepoints.
if (!string.IsNullOrWhiteSpace(sav.UniteAuthToken))
{
var wreq = WebRequest.Create("http://getshiftos.ml/API/SetCodepoints/" + sav.Codepoints.ToString());
var wreq = WebRequest.Create(UserConfig.Get().UniteUrl + "/API/SetCodepoints/" + sav.Codepoints.ToString());
wreq.Headers.Add("Authentication: Token " + sav.UniteAuthToken);
wreq.GetResponse();
}
@ -216,6 +216,21 @@ namespace ShiftOS.Server
WriteEncFile(savefile, JsonConvert.SerializeObject(save));
}
try
{
var wr = System.Net.HttpWebRequest.Create("http://getshiftos.ml/API/GetCodepoints");
wr.Headers.Add("Authentication: Token " + save.UniteAuthToken);
var response = wr.GetResponse();
using (var rstr = response.GetResponseStream())
{
using (var sreader = new StreamReader(rstr))
{
long cp = Convert.ToInt64(sreader.ReadToEnd());
save.Codepoints = cp;
}
}
}
catch { }
Program.server.DispatchTo(new Guid(guid), new NetObject("mud_savefile", new ServerMessage
{

View file

@ -69,10 +69,10 @@ namespace ShiftOS.WinForms.Applications
//
// lvitems
//
this.lvitems.Dock = System.Windows.Forms.DockStyle.Right;
this.lvitems.Location = new System.Drawing.Point(120, 0);
this.lvitems.Dock = System.Windows.Forms.DockStyle.Fill;
this.lvitems.Location = new System.Drawing.Point(149, 0);
this.lvitems.Name = "lvitems";
this.lvitems.Size = new System.Drawing.Size(514, 332);
this.lvitems.Size = new System.Drawing.Size(485, 332);
this.lvitems.TabIndex = 0;
this.lvitems.UseCompatibleStateImageBehavior = false;
this.lvitems.ItemSelectionChanged += new System.Windows.Forms.ListViewItemSelectionChangedEventHandler(this.lvitems_ItemSelectionChanged);
@ -81,8 +81,8 @@ namespace ShiftOS.WinForms.Applications
//
// panel1
//
this.panel1.Controls.Add(this.pinnedItems);
this.panel1.Controls.Add(this.lvitems);
this.panel1.Controls.Add(this.pinnedItems);
this.panel1.Controls.Add(this.lbcurrentfolder);
this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel1.Location = new System.Drawing.Point(0, 24);
@ -95,8 +95,9 @@ namespace ShiftOS.WinForms.Applications
this.pinnedItems.Dock = System.Windows.Forms.DockStyle.Left;
this.pinnedItems.Location = new System.Drawing.Point(0, 0);
this.pinnedItems.Name = "pinnedItems";
this.pinnedItems.Size = new System.Drawing.Size(114, 332);
this.pinnedItems.Size = new System.Drawing.Size(149, 332);
this.pinnedItems.TabIndex = 3;
this.pinnedItems.Click += new System.EventHandler(this.pinnedItems_Click);
//
// lbcurrentfolder
//

View file

@ -34,8 +34,8 @@ using System.Threading.Tasks;
using System.Windows.Forms;
using static ShiftOS.Objects.ShiftFS.Utils;
using Newtonsoft.Json;
using ShiftOS.Engine;
using Newtonsoft.Json;
namespace ShiftOS.WinForms.Applications
{
@ -129,8 +129,14 @@ namespace ShiftOS.WinForms.Applications
{
int amountsCalled = -1;
amountsCalled = amountsCalled + 1;
pinnedItems.Nodes.Add(path);
pinnedItems.Nodes[amountsCalled].Nodes.Add("test");
List<string> Pinned = new List<string>();
if(FileExists(Paths.GetPath("data") + "/pinned_items.dat"))
{
Pinned = JsonConvert.DeserializeObject<List<string>>(ReadAllText(Paths.GetPath("data") + "/pinned_items.dat"));
}
Pinned.Add(path);
WriteAllText(Paths.GetPath("data") + "/pinned_items.dat", JsonConvert.SerializeObject(Pinned));
ResetList();
}
public void ChangeDirectory(string path)
@ -153,8 +159,40 @@ namespace ShiftOS.WinForms.Applications
}
}
public void PopulatePinned(TreeNode node, string[] items)
{
foreach(var dir in items)
{
var treenode = new TreeNode();
if (DirectoryExists(dir))
{
var dinf = GetDirectoryInfo(dir);
treenode.Text = dinf.Name;
}
else if (FileExists(dir))
{
var finf = GetFileInfo(dir);
treenode.Text = finf.Name;
}
treenode.Tag = dir;
node.Nodes.Add(treenode);
}
}
public void ResetList()
{
pinnedItems.Nodes.Clear();
List<string> Pinned = new List<string>();
if(FileExists(Paths.GetPath("data") + "/pinned_items.dat"))
{
Pinned = JsonConvert.DeserializeObject<List<string>>(ReadAllText(Paths.GetPath("data") + "/pinned_items.dat"));
}
var node = new TreeNode();
node.Text = "Pinned";
PopulatePinned(node, Pinned.ToArray());
pinnedItems.Nodes.Add(node);
node.ExpandAll();
if(lvitems.LargeImageList == null)
{
lvitems.LargeImageList = new ImageList();
@ -423,14 +461,14 @@ namespace ShiftOS.WinForms.Applications
{
if (result == true)
{
if (currentdir != "__system")
if (currentdir != "__system" && lvitems.SelectedItems[0].Text != "Up one")
{
pinDirectory(currentdir + "/" + lvitems.SelectedItems[0].Text);
ResetList();
}
else
{
Infobox.Show("Cannot Pin", "You cannot pin a system drive.");
Infobox.Show("Cannot Pin", "You can only pin files or folders.");
}
}
@ -438,5 +476,26 @@ namespace ShiftOS.WinForms.Applications
}
catch { }
}
private void pinnedItems_Click(object sender, EventArgs e)
{
try
{
if (pinnedItems.SelectedNode != null)
{
string path = pinnedItems.SelectedNode.Tag.ToString();
if (DirectoryExists(path))
{
currentdir = path;
ResetList();
}
else if (FileExists(path))
{
FileSkimmerBackend.OpenFile(path);
}
}
}
catch { }
}
}
}

View file

@ -1,769 +0,0 @@
/*
* MIT License
*
* Copyright (c) 2017 Michael VanOverbeek and ShiftOS devs
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
/*
* MIT License
*
* Copyright (c) 2017 Michael VanOverbeek and ShiftOS devs
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
using ShiftOS.WinForms.Controls;
namespace ShiftOS.WinForms.Applications
{
partial class Pong
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.gameTimer = new System.Windows.Forms.Timer(this.components);
this.counter = new System.Windows.Forms.Timer(this.components);
this.tmrcountdown = new System.Windows.Forms.Timer(this.components);
this.tmrstoryline = new System.Windows.Forms.Timer(this.components);
this.pgcontents = new ShiftOS.WinForms.Controls.Canvas();
this.pnlhighscore = new System.Windows.Forms.Panel();
this.lbhighscore = new System.Windows.Forms.ListView();
this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();
this.button2 = new System.Windows.Forms.Button();
this.label10 = new System.Windows.Forms.Label();
this.pnlgamestats = new System.Windows.Forms.Panel();
this.button1 = new System.Windows.Forms.Button();
this.label12 = new System.Windows.Forms.Label();
this.lblnextstats = new System.Windows.Forms.Label();
this.Label7 = new System.Windows.Forms.Label();
this.lblpreviousstats = new System.Windows.Forms.Label();
this.Label4 = new System.Windows.Forms.Label();
this.btnplayon = new System.Windows.Forms.Button();
this.Label3 = new System.Windows.Forms.Label();
this.btncashout = new System.Windows.Forms.Button();
this.Label2 = new System.Windows.Forms.Label();
this.lbllevelreached = new System.Windows.Forms.Label();
this.pnlfinalstats = new System.Windows.Forms.Panel();
this.btnplayagain = new System.Windows.Forms.Button();
this.lblfinalcodepoints = new System.Windows.Forms.Label();
this.Label11 = new System.Windows.Forms.Label();
this.lblfinalcomputerreward = new System.Windows.Forms.Label();
this.Label9 = new System.Windows.Forms.Label();
this.lblfinallevelreward = new System.Windows.Forms.Label();
this.lblfinallevelreached = new System.Windows.Forms.Label();
this.lblfinalcodepointswithtext = new System.Windows.Forms.Label();
this.pnllose = new System.Windows.Forms.Panel();
this.lblmissedout = new System.Windows.Forms.Label();
this.lblbutyougained = new System.Windows.Forms.Label();
this.btnlosetryagain = new System.Windows.Forms.Button();
this.Label5 = new System.Windows.Forms.Label();
this.Label1 = new System.Windows.Forms.Label();
this.pnlintro = new System.Windows.Forms.Panel();
this.Label6 = new System.Windows.Forms.Label();
this.btnstartgame = new System.Windows.Forms.Button();
this.Label8 = new System.Windows.Forms.Label();
this.lblbeatai = new System.Windows.Forms.Label();
this.lblcountdown = new System.Windows.Forms.Label();
this.ball = new ShiftOS.WinForms.Controls.Canvas();
this.paddleHuman = new System.Windows.Forms.PictureBox();
this.paddleComputer = new System.Windows.Forms.Panel();
this.lbllevelandtime = new System.Windows.Forms.Label();
this.lblstatscodepoints = new System.Windows.Forms.Label();
this.lblstatsY = new System.Windows.Forms.Label();
this.lblstatsX = new System.Windows.Forms.Label();
this.btnmatchmake = new System.Windows.Forms.Button();
this.pgcontents.SuspendLayout();
this.pnlhighscore.SuspendLayout();
this.flowLayoutPanel1.SuspendLayout();
this.pnlgamestats.SuspendLayout();
this.pnlfinalstats.SuspendLayout();
this.pnllose.SuspendLayout();
this.pnlintro.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.paddleHuman)).BeginInit();
this.SuspendLayout();
//
// gameTimer
//
this.gameTimer.Interval = 30;
this.gameTimer.Tick += new System.EventHandler(this.gameTimer_Tick);
//
// counter
//
this.counter.Interval = 1000;
this.counter.Tick += new System.EventHandler(this.counter_Tick);
//
// tmrcountdown
//
this.tmrcountdown.Interval = 1000;
this.tmrcountdown.Tick += new System.EventHandler(this.countdown_Tick);
//
// tmrstoryline
//
this.tmrstoryline.Interval = 1000;
this.tmrstoryline.Tick += new System.EventHandler(this.tmrstoryline_Tick);
//
// pgcontents
//
this.pgcontents.BackColor = System.Drawing.Color.White;
this.pgcontents.Controls.Add(this.pnlintro);
this.pgcontents.Controls.Add(this.pnlhighscore);
this.pgcontents.Controls.Add(this.pnlgamestats);
this.pgcontents.Controls.Add(this.pnlfinalstats);
this.pgcontents.Controls.Add(this.pnllose);
this.pgcontents.Controls.Add(this.lblbeatai);
this.pgcontents.Controls.Add(this.lblcountdown);
this.pgcontents.Controls.Add(this.ball);
this.pgcontents.Controls.Add(this.paddleHuman);
this.pgcontents.Controls.Add(this.paddleComputer);
this.pgcontents.Controls.Add(this.lbllevelandtime);
this.pgcontents.Controls.Add(this.lblstatscodepoints);
this.pgcontents.Controls.Add(this.lblstatsY);
this.pgcontents.Controls.Add(this.lblstatsX);
this.pgcontents.Dock = System.Windows.Forms.DockStyle.Fill;
this.pgcontents.Location = new System.Drawing.Point(0, 0);
this.pgcontents.Name = "pgcontents";
this.pgcontents.Size = new System.Drawing.Size(912, 504);
this.pgcontents.TabIndex = 20;
this.pgcontents.Paint += new System.Windows.Forms.PaintEventHandler(this.pgcontents_Paint);
this.pgcontents.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pongMain_MouseMove);
//
// pnlhighscore
//
this.pnlhighscore.Controls.Add(this.lbhighscore);
this.pnlhighscore.Controls.Add(this.flowLayoutPanel1);
this.pnlhighscore.Controls.Add(this.label10);
this.pnlhighscore.Location = new System.Drawing.Point(688, 302);
this.pnlhighscore.Name = "pnlhighscore";
this.pnlhighscore.Size = new System.Drawing.Size(539, 311);
this.pnlhighscore.TabIndex = 14;
this.pnlhighscore.Visible = false;
//
// lbhighscore
//
this.lbhighscore.Dock = System.Windows.Forms.DockStyle.Fill;
this.lbhighscore.Location = new System.Drawing.Point(0, 36);
this.lbhighscore.Name = "lbhighscore";
this.lbhighscore.Size = new System.Drawing.Size(539, 246);
this.lbhighscore.TabIndex = 1;
this.lbhighscore.UseCompatibleStateImageBehavior = false;
//
// flowLayoutPanel1
//
this.flowLayoutPanel1.AutoSize = true;
this.flowLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.flowLayoutPanel1.Controls.Add(this.button2);
this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;
this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 282);
this.flowLayoutPanel1.Name = "flowLayoutPanel1";
this.flowLayoutPanel1.Size = new System.Drawing.Size(539, 29);
this.flowLayoutPanel1.TabIndex = 2;
//
// button2
//
this.button2.AutoSize = true;
this.button2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.button2.Location = new System.Drawing.Point(476, 3);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(60, 23);
this.button2.TabIndex = 0;
this.button2.Text = "{CLOSE}";
this.button2.UseVisualStyleBackColor = true;
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// label10
//
this.label10.Dock = System.Windows.Forms.DockStyle.Top;
this.label10.Location = new System.Drawing.Point(0, 0);
this.label10.Name = "label10";
this.label10.Size = new System.Drawing.Size(539, 36);
this.label10.TabIndex = 0;
this.label10.Text = "{HIGH_SCORES}";
this.label10.TextAlign = System.Drawing.ContentAlignment.TopCenter;
//
// pnlgamestats
//
this.pnlgamestats.Controls.Add(this.button1);
this.pnlgamestats.Controls.Add(this.label12);
this.pnlgamestats.Controls.Add(this.lblnextstats);
this.pnlgamestats.Controls.Add(this.Label7);
this.pnlgamestats.Controls.Add(this.lblpreviousstats);
this.pnlgamestats.Controls.Add(this.Label4);
this.pnlgamestats.Controls.Add(this.btnplayon);
this.pnlgamestats.Controls.Add(this.Label3);
this.pnlgamestats.Controls.Add(this.btncashout);
this.pnlgamestats.Controls.Add(this.Label2);
this.pnlgamestats.Controls.Add(this.lbllevelreached);
this.pnlgamestats.Location = new System.Drawing.Point(104, 375);
this.pnlgamestats.Name = "pnlgamestats";
this.pnlgamestats.Size = new System.Drawing.Size(466, 284);
this.pnlgamestats.TabIndex = 6;
this.pnlgamestats.Visible = false;
//
// button1
//
this.button1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.button1.Location = new System.Drawing.Point(32, 223);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(191, 35);
this.button1.TabIndex = 10;
this.button1.Text = "{PONG_VIEW_HIGHSCORES}";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.btnhighscore_Click);
//
// label12
//
this.label12.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label12.Location = new System.Drawing.Point(8, 187);
this.label12.Name = "label12";
this.label12.Size = new System.Drawing.Size(245, 33);
this.label12.TabIndex = 9;
this.label12.Text = "{PONG_HIGHSCORE_EXP}";
this.label12.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// lblnextstats
//
this.lblnextstats.AutoSize = true;
this.lblnextstats.Location = new System.Drawing.Point(278, 136);
this.lblnextstats.Name = "lblnextstats";
this.lblnextstats.Size = new System.Drawing.Size(0, 13);
this.lblnextstats.TabIndex = 8;
//
// Label7
//
this.Label7.AutoSize = true;
this.Label7.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.Label7.Location = new System.Drawing.Point(278, 119);
this.Label7.Name = "Label7";
this.Label7.Size = new System.Drawing.Size(124, 16);
this.Label7.TabIndex = 7;
this.Label7.Text = "Next Level Stats:";
//
// lblpreviousstats
//
this.lblpreviousstats.AutoSize = true;
this.lblpreviousstats.Location = new System.Drawing.Point(278, 54);
this.lblpreviousstats.Name = "lblpreviousstats";
this.lblpreviousstats.Size = new System.Drawing.Size(0, 13);
this.lblpreviousstats.TabIndex = 6;
//
// Label4
//
this.Label4.AutoSize = true;
this.Label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.Label4.Location = new System.Drawing.Point(278, 37);
this.Label4.Name = "Label4";
this.Label4.Size = new System.Drawing.Size(154, 16);
this.Label4.TabIndex = 5;
this.Label4.Text = "Previous Level Stats:";
//
// btnplayon
//
this.btnplayon.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btnplayon.Location = new System.Drawing.Point(32, 147);
this.btnplayon.Name = "btnplayon";
this.btnplayon.Size = new System.Drawing.Size(191, 35);
this.btnplayon.TabIndex = 4;
this.btnplayon.Text = "Play on for 3 codepoints!";
this.btnplayon.UseVisualStyleBackColor = true;
this.btnplayon.Click += new System.EventHandler(this.btnplayon_Click);
//
// Label3
//
this.Label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.Label3.Location = new System.Drawing.Point(8, 111);
this.Label3.Name = "Label3";
this.Label3.Size = new System.Drawing.Size(245, 33);
this.Label3.TabIndex = 3;
this.Label3.Text = "{PONG_PLAYON_DESC}";
this.Label3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// btncashout
//
this.btncashout.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btncashout.Location = new System.Drawing.Point(32, 73);
this.btncashout.Name = "btncashout";
this.btncashout.Size = new System.Drawing.Size(191, 35);
this.btncashout.TabIndex = 2;
this.btncashout.Text = "Cash out with 1 codepoint!";
this.btncashout.UseVisualStyleBackColor = true;
this.btncashout.Click += new System.EventHandler(this.btncashout_Click);
//
// Label2
//
this.Label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.Label2.Location = new System.Drawing.Point(8, 37);
this.Label2.Name = "Label2";
this.Label2.Size = new System.Drawing.Size(245, 33);
this.Label2.TabIndex = 1;
this.Label2.Text = "{PONG_CASHOUT_DESC}";
this.Label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// lbllevelreached
//
this.lbllevelreached.AutoSize = true;
this.lbllevelreached.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lbllevelreached.Location = new System.Drawing.Point(149, 6);
this.lbllevelreached.Name = "lbllevelreached";
this.lbllevelreached.Size = new System.Drawing.Size(185, 20);
this.lbllevelreached.TabIndex = 0;
this.lbllevelreached.Text = "You Reached Level 2!";
//
// pnlfinalstats
//
this.pnlfinalstats.Controls.Add(this.btnplayagain);
this.pnlfinalstats.Controls.Add(this.lblfinalcodepoints);
this.pnlfinalstats.Controls.Add(this.Label11);
this.pnlfinalstats.Controls.Add(this.lblfinalcomputerreward);
this.pnlfinalstats.Controls.Add(this.Label9);
this.pnlfinalstats.Controls.Add(this.lblfinallevelreward);
this.pnlfinalstats.Controls.Add(this.lblfinallevelreached);
this.pnlfinalstats.Controls.Add(this.lblfinalcodepointswithtext);
this.pnlfinalstats.Location = new System.Drawing.Point(172, 74);
this.pnlfinalstats.Name = "pnlfinalstats";
this.pnlfinalstats.Size = new System.Drawing.Size(362, 226);
this.pnlfinalstats.TabIndex = 9;
this.pnlfinalstats.Visible = false;
//
// btnplayagain
//
this.btnplayagain.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btnplayagain.Location = new System.Drawing.Point(5, 194);
this.btnplayagain.Name = "btnplayagain";
this.btnplayagain.Size = new System.Drawing.Size(352, 29);
this.btnplayagain.TabIndex = 16;
this.btnplayagain.Text = "{PLAY}";
this.btnplayagain.UseVisualStyleBackColor = true;
this.btnplayagain.Click += new System.EventHandler(this.btnplayagain_Click);
//
// lblfinalcodepoints
//
this.lblfinalcodepoints.Font = new System.Drawing.Font("Microsoft Sans Serif", 48F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblfinalcodepoints.Location = new System.Drawing.Point(3, 124);
this.lblfinalcodepoints.Name = "lblfinalcodepoints";
this.lblfinalcodepoints.Size = new System.Drawing.Size(356, 73);
this.lblfinalcodepoints.TabIndex = 15;
this.lblfinalcodepoints.Tag = "header1";
this.lblfinalcodepoints.Text = "134 CP";
this.lblfinalcodepoints.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// Label11
//
this.Label11.AutoSize = true;
this.Label11.Font = new System.Drawing.Font("Microsoft Sans Serif", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.Label11.Location = new System.Drawing.Point(162, 82);
this.Label11.Name = "Label11";
this.Label11.Size = new System.Drawing.Size(33, 33);
this.Label11.TabIndex = 14;
this.Label11.Tag = "header2";
this.Label11.Text = "+";
this.Label11.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// lblfinalcomputerreward
//
this.lblfinalcomputerreward.Font = new System.Drawing.Font("Microsoft Sans Serif", 27.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblfinalcomputerreward.Location = new System.Drawing.Point(193, 72);
this.lblfinalcomputerreward.Name = "lblfinalcomputerreward";
this.lblfinalcomputerreward.Size = new System.Drawing.Size(151, 52);
this.lblfinalcomputerreward.TabIndex = 12;
this.lblfinalcomputerreward.Tag = "header2";
this.lblfinalcomputerreward.Text = "34";
this.lblfinalcomputerreward.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// Label9
//
this.Label9.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.Label9.Location = new System.Drawing.Point(179, 31);
this.Label9.Name = "Label9";
this.Label9.Size = new System.Drawing.Size(180, 49);
this.Label9.TabIndex = 11;
this.Label9.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// lblfinallevelreward
//
this.lblfinallevelreward.Font = new System.Drawing.Font("Microsoft Sans Serif", 27.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblfinallevelreward.Location = new System.Drawing.Point(12, 72);
this.lblfinallevelreward.Name = "lblfinallevelreward";
this.lblfinallevelreward.Size = new System.Drawing.Size(151, 52);
this.lblfinallevelreward.TabIndex = 10;
this.lblfinallevelreward.Tag = "header2";
this.lblfinallevelreward.Text = "100";
this.lblfinallevelreward.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// lblfinallevelreached
//
this.lblfinallevelreached.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblfinallevelreached.Location = new System.Drawing.Point(3, 31);
this.lblfinallevelreached.Name = "lblfinallevelreached";
this.lblfinallevelreached.Size = new System.Drawing.Size(170, 49);
this.lblfinallevelreached.TabIndex = 9;
this.lblfinallevelreached.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// lblfinalcodepointswithtext
//
this.lblfinalcodepointswithtext.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblfinalcodepointswithtext.Location = new System.Drawing.Point(3, 2);
this.lblfinalcodepointswithtext.Name = "lblfinalcodepointswithtext";
this.lblfinalcodepointswithtext.Size = new System.Drawing.Size(356, 26);
this.lblfinalcodepointswithtext.TabIndex = 1;
this.lblfinalcodepointswithtext.Tag = "header2";
this.lblfinalcodepointswithtext.Text = "You cashed out with 134 codepoints!";
this.lblfinalcodepointswithtext.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// pnllose
//
this.pnllose.Controls.Add(this.lblmissedout);
this.pnllose.Controls.Add(this.lblbutyougained);
this.pnllose.Controls.Add(this.btnlosetryagain);
this.pnllose.Controls.Add(this.Label5);
this.pnllose.Controls.Add(this.Label1);
this.pnllose.Location = new System.Drawing.Point(209, 71);
this.pnllose.Name = "pnllose";
this.pnllose.Size = new System.Drawing.Size(266, 214);
this.pnllose.TabIndex = 10;
this.pnllose.Visible = false;
//
// lblmissedout
//
this.lblmissedout.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblmissedout.Location = new System.Drawing.Point(3, 175);
this.lblmissedout.Name = "lblmissedout";
this.lblmissedout.Size = new System.Drawing.Size(146, 35);
this.lblmissedout.TabIndex = 3;
this.lblmissedout.Text = "You Missed Out On: 500 Codepoints";
this.lblmissedout.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// lblbutyougained
//
this.lblbutyougained.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblbutyougained.Location = new System.Drawing.Point(3, 125);
this.lblbutyougained.Name = "lblbutyougained";
this.lblbutyougained.Size = new System.Drawing.Size(146, 35);
this.lblbutyougained.TabIndex = 3;
this.lblbutyougained.Text = "But you gained 5 Codepoints";
this.lblbutyougained.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// btnlosetryagain
//
this.btnlosetryagain.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btnlosetryagain.Location = new System.Drawing.Point(155, 176);
this.btnlosetryagain.Name = "btnlosetryagain";
this.btnlosetryagain.Size = new System.Drawing.Size(106, 35);
this.btnlosetryagain.TabIndex = 2;
this.btnlosetryagain.Text = "Try Again";
this.btnlosetryagain.UseVisualStyleBackColor = true;
this.btnlosetryagain.Click += new System.EventHandler(this.btnlosetryagain_Click);
//
// Label5
//
this.Label5.Location = new System.Drawing.Point(7, 26);
this.Label5.Name = "Label5";
this.Label5.Size = new System.Drawing.Size(260, 163);
this.Label5.TabIndex = 1;
//
// Label1
//
this.Label1.Dock = System.Windows.Forms.DockStyle.Top;
this.Label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.Label1.Location = new System.Drawing.Point(0, 0);
this.Label1.Name = "Label1";
this.Label1.Size = new System.Drawing.Size(266, 16);
this.Label1.TabIndex = 0;
this.Label1.Text = "You lose!";
this.Label1.TextAlign = System.Drawing.ContentAlignment.TopCenter;
//
// pnlintro
//
this.pnlintro.Controls.Add(this.btnmatchmake);
this.pnlintro.Controls.Add(this.Label6);
this.pnlintro.Controls.Add(this.btnstartgame);
this.pnlintro.Controls.Add(this.Label8);
this.pnlintro.Location = new System.Drawing.Point(0, 0);
this.pnlintro.Name = "pnlintro";
this.pnlintro.Size = new System.Drawing.Size(595, 303);
this.pnlintro.TabIndex = 13;
this.pnlintro.Tag = "header2";
//
// Label6
//
this.Label6.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.Label6.Location = new System.Drawing.Point(3, 39);
this.Label6.Name = "Label6";
this.Label6.Size = new System.Drawing.Size(589, 159);
this.Label6.TabIndex = 15;
this.Label6.Text = "{PONG_DESC}";
this.Label6.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.Label6.Click += new System.EventHandler(this.Label6_Click);
//
// btnstartgame
//
this.btnstartgame.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btnstartgame.Location = new System.Drawing.Point(188, 215);
this.btnstartgame.Name = "btnstartgame";
this.btnstartgame.Size = new System.Drawing.Size(242, 28);
this.btnstartgame.TabIndex = 15;
this.btnstartgame.Text = "{PLAY}";
this.btnstartgame.UseVisualStyleBackColor = true;
this.btnstartgame.Click += new System.EventHandler(this.btnstartgame_Click);
//
// Label8
//
this.Label8.AutoSize = true;
this.Label8.Font = new System.Drawing.Font("Microsoft Sans Serif", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.Label8.ForeColor = System.Drawing.Color.Black;
this.Label8.Location = new System.Drawing.Point(250, 5);
this.Label8.Name = "Label8";
this.Label8.Size = new System.Drawing.Size(280, 31);
this.Label8.TabIndex = 14;
this.Label8.Text = "{PONG_WELCOME}";
this.Label8.Click += new System.EventHandler(this.Label8_Click);
//
// lblbeatai
//
this.lblbeatai.Font = new System.Drawing.Font("Microsoft Sans Serif", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblbeatai.Location = new System.Drawing.Point(47, 41);
this.lblbeatai.Name = "lblbeatai";
this.lblbeatai.Size = new System.Drawing.Size(600, 30);
this.lblbeatai.TabIndex = 8;
this.lblbeatai.Tag = "header2";
this.lblbeatai.Text = "You got 2 codepoints for beating the Computer!";
this.lblbeatai.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.lblbeatai.Visible = false;
//
// lblcountdown
//
this.lblcountdown.Font = new System.Drawing.Font("Microsoft Sans Serif", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblcountdown.Location = new System.Drawing.Point(182, 152);
this.lblcountdown.Name = "lblcountdown";
this.lblcountdown.Size = new System.Drawing.Size(315, 49);
this.lblcountdown.TabIndex = 7;
this.lblcountdown.Text = "3";
this.lblcountdown.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.lblcountdown.Visible = false;
//
// ball
//
this.ball.BackColor = System.Drawing.Color.Black;
this.ball.Location = new System.Drawing.Point(300, 152);
this.ball.Name = "ball";
this.ball.Size = new System.Drawing.Size(20, 20);
this.ball.TabIndex = 2;
this.ball.MouseEnter += new System.EventHandler(this.ball_MouseEnter);
this.ball.MouseLeave += new System.EventHandler(this.ball_MouseLeave);
//
// paddleHuman
//
this.paddleHuman.BackColor = System.Drawing.Color.Black;
this.paddleHuman.Location = new System.Drawing.Point(10, 134);
this.paddleHuman.Name = "paddleHuman";
this.paddleHuman.Size = new System.Drawing.Size(20, 100);
this.paddleHuman.TabIndex = 3;
this.paddleHuman.TabStop = false;
//
// paddleComputer
//
this.paddleComputer.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.paddleComputer.BackColor = System.Drawing.Color.Black;
this.paddleComputer.Location = new System.Drawing.Point(878, 134);
this.paddleComputer.MaximumSize = new System.Drawing.Size(20, 150);
this.paddleComputer.Name = "paddleComputer";
this.paddleComputer.Size = new System.Drawing.Size(20, 100);
this.paddleComputer.TabIndex = 1;
//
// lbllevelandtime
//
this.lbllevelandtime.Dock = System.Windows.Forms.DockStyle.Top;
this.lbllevelandtime.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lbllevelandtime.Location = new System.Drawing.Point(0, 0);
this.lbllevelandtime.Name = "lbllevelandtime";
this.lbllevelandtime.Size = new System.Drawing.Size(912, 22);
this.lbllevelandtime.TabIndex = 4;
this.lbllevelandtime.Tag = "header1";
this.lbllevelandtime.Text = "Level: 1 - 58 Seconds Left";
this.lbllevelandtime.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// lblstatscodepoints
//
this.lblstatscodepoints.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lblstatscodepoints.AutoSize = true;
this.lblstatscodepoints.Font = new System.Drawing.Font("Georgia", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblstatscodepoints.Location = new System.Drawing.Point(239, 460);
this.lblstatscodepoints.Name = "lblstatscodepoints";
this.lblstatscodepoints.Size = new System.Drawing.Size(116, 23);
this.lblstatscodepoints.TabIndex = 12;
this.lblstatscodepoints.Tag = "header2";
this.lblstatscodepoints.Text = "Codepoints: ";
this.lblstatscodepoints.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// lblstatsY
//
this.lblstatsY.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.lblstatsY.AutoSize = true;
this.lblstatsY.Font = new System.Drawing.Font("Georgia", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblstatsY.Location = new System.Drawing.Point(440, 460);
this.lblstatsY.Name = "lblstatsY";
this.lblstatsY.Size = new System.Drawing.Size(76, 23);
this.lblstatsY.TabIndex = 11;
this.lblstatsY.Tag = "header2";
this.lblstatsY.Text = "Yspeed:";
this.lblstatsY.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// lblstatsX
//
this.lblstatsX.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.lblstatsX.AutoSize = true;
this.lblstatsX.Font = new System.Drawing.Font("Georgia", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblstatsX.Location = new System.Drawing.Point(3, 460);
this.lblstatsX.Name = "lblstatsX";
this.lblstatsX.Size = new System.Drawing.Size(83, 23);
this.lblstatsX.TabIndex = 5;
this.lblstatsX.Tag = "header2";
this.lblstatsX.Text = "Xspeed: ";
this.lblstatsX.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// btnmatchmake
//
this.btnmatchmake.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btnmatchmake.Location = new System.Drawing.Point(188, 253);
this.btnmatchmake.Name = "btnmatchmake";
this.btnmatchmake.Size = new System.Drawing.Size(242, 28);
this.btnmatchmake.TabIndex = 16;
this.btnmatchmake.Text = "Or, play against another Shifter!";
this.btnmatchmake.UseVisualStyleBackColor = true;
this.btnmatchmake.Click += new System.EventHandler(this.btnmatchmake_Click);
//
// Pong
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.White;
this.Controls.Add(this.pgcontents);
this.DoubleBuffered = true;
this.Name = "Pong";
this.Size = new System.Drawing.Size(912, 504);
this.Load += new System.EventHandler(this.Pong_Load);
this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pongMain_MouseMove);
this.pgcontents.ResumeLayout(false);
this.pgcontents.PerformLayout();
this.pnlhighscore.ResumeLayout(false);
this.pnlhighscore.PerformLayout();
this.flowLayoutPanel1.ResumeLayout(false);
this.flowLayoutPanel1.PerformLayout();
this.pnlgamestats.ResumeLayout(false);
this.pnlgamestats.PerformLayout();
this.pnlfinalstats.ResumeLayout(false);
this.pnlfinalstats.PerformLayout();
this.pnllose.ResumeLayout(false);
this.pnlintro.ResumeLayout(false);
this.pnlintro.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.paddleHuman)).EndInit();
this.ResumeLayout(false);
}
internal System.Windows.Forms.Panel paddleComputer;
internal System.Windows.Forms.Timer gameTimer;
internal System.Windows.Forms.PictureBox paddleHuman;
internal System.Windows.Forms.Label lbllevelandtime;
internal System.Windows.Forms.Label lblstatsX;
internal System.Windows.Forms.Timer counter;
internal System.Windows.Forms.Panel pnlgamestats;
internal System.Windows.Forms.Label lblnextstats;
internal System.Windows.Forms.Label Label7;
internal System.Windows.Forms.Label lblpreviousstats;
internal System.Windows.Forms.Label Label4;
internal System.Windows.Forms.Button btnplayon;
internal System.Windows.Forms.Label Label3;
internal System.Windows.Forms.Button btncashout;
internal System.Windows.Forms.Label Label2;
internal System.Windows.Forms.Label lbllevelreached;
internal System.Windows.Forms.Label lblcountdown;
internal System.Windows.Forms.Timer tmrcountdown;
internal System.Windows.Forms.Label lblbeatai;
internal System.Windows.Forms.Panel pnlfinalstats;
internal System.Windows.Forms.Button btnplayagain;
internal System.Windows.Forms.Label lblfinalcodepoints;
internal System.Windows.Forms.Label Label11;
internal System.Windows.Forms.Label lblfinalcomputerreward;
internal System.Windows.Forms.Label Label9;
internal System.Windows.Forms.Label lblfinallevelreward;
internal System.Windows.Forms.Label lblfinallevelreached;
internal System.Windows.Forms.Label lblfinalcodepointswithtext;
internal System.Windows.Forms.Panel pnllose;
internal System.Windows.Forms.Label lblmissedout;
internal System.Windows.Forms.Label lblbutyougained;
internal System.Windows.Forms.Button btnlosetryagain;
internal System.Windows.Forms.Label Label5;
internal System.Windows.Forms.Label Label1;
internal System.Windows.Forms.Label lblstatscodepoints;
internal System.Windows.Forms.Label lblstatsY;
internal System.Windows.Forms.Panel pnlintro;
internal System.Windows.Forms.Label Label6;
internal System.Windows.Forms.Button btnstartgame;
internal System.Windows.Forms.Label Label8;
internal System.Windows.Forms.Timer tmrstoryline;
private System.Windows.Forms.Panel pnlhighscore;
private System.Windows.Forms.ListView lbhighscore;
private System.Windows.Forms.Label label10;
internal Canvas pgcontents;
internal Canvas ball;
internal System.Windows.Forms.Button button1;
internal System.Windows.Forms.Label label12;
private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;
private System.Windows.Forms.Button button2;
internal System.Windows.Forms.Button btnmatchmake;
}
}

View file

@ -1,977 +0,0 @@
/*
* MIT License
*
* Copyright (c) 2017 Michael VanOverbeek and ShiftOS devs
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
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;
using Newtonsoft.Json;
using ShiftOS.Engine;
using ShiftOS.Objects;
using ShiftOS.WinForms.Tools;
namespace ShiftOS.WinForms.Applications
{
[MultiplayerOnly]
[Launcher("Pong", true, "al_pong", "Games")]
[WinOpen("pong")]
[DefaultIcon("iconPong")]
public partial class Pong : UserControl, IShiftOSWindow
{
//I can assure you guaranteed that there is an acorn somewhere, in this place, and the sailors are looking for it
int xVel = 7;
int yVel = 8;
int computerspeed = 8;
int level = 1;
int secondsleft = 60;
int casualposition;
double xveldec = 3.0;
double yveldec = 3.0;
double incrementx = 0.4;
double incrementy = 0.2;
int levelxspeed = 3;
int levelyspeed = 3;
int beatairewardtotal;
int beataireward = 1;
int[] levelrewards = new int[50];
int totalreward;
int countdown = 3;
bool aiShouldIsbeEnabled = true;
public Pong()
{
InitializeComponent();
}
private void Pong_Load(object sender, EventArgs e)
{
setuplevelrewards();
}
// Move the paddle according to the mouse position.
private void pongMain_MouseMove(object sender, MouseEventArgs e)
{
var loc = this.PointToClient(MousePosition);
if (IsMultiplayerSession)
{
if (IsLeader)
{
paddleHuman.Location = new Point(paddleHuman.Location.X, (loc.Y) - (paddleHuman.Height / 2));
ServerManager.Forward(OpponentGUID, "pong_mp_setopponenty", paddleHuman.Top.ToString());
}
else
{
paddleComputer.Location = new Point(paddleComputer.Location.X, (loc.Y) - (paddleComputer.Height / 2));
ServerManager.Forward(OpponentGUID, "pong_mp_setopponenty", paddleComputer.Top.ToString());
}
}
else
{
paddleHuman.Location = new Point(paddleHuman.Location.X, (loc.Y) - (paddleHuman.Height / 2));
}
}
private void CenterPanels()
{
pnlfinalstats.CenterParent();
pnlgamestats.CenterParent();
pnlhighscore.CenterParent();
pnlintro.CenterParent();
pnllose.CenterParent();
lblcountdown.CenterParent();
lblbeatai.Left = (this.Width - lblbeatai.Width) / 2;
SetupStats();
}
public void SetupStats()
{
lblstatsX.Location = new Point(5, this.Height - lblstatsX.Height - 5);
lblstatsY.Location = new Point(this.Width - lblstatsY.Width - 5, this.Height - lblstatsY.Height - 5);
lblstatscodepoints.Top = this.Height - lblstatscodepoints.Height - 5;
lblstatscodepoints.Left = (this.Width - lblstatscodepoints.Width) / 2;
}
int OpponentY = 0;
bool IsLeader = false;
int LeaderX = 0;
int LeaderY = 0;
// ERROR: Handles clauses are not supported in C#
private void gameTimer_Tick(object sender, EventArgs e)
{
if (this.Left < Screen.PrimaryScreen.Bounds.Width)
{
ball.BackColor = SkinEngine.LoadedSkin.ControlTextColor;
paddleComputer.BackColor = SkinEngine.LoadedSkin.ControlTextColor;
paddleHuman.BackColor = SkinEngine.LoadedSkin.ControlTextColor;
//Check if paddle upgrade has been bought and change paddles accordingly
//if (ShiftoriumFrontend.UpgradeInstalled("pong_increased_paddle_size"))
//{
// paddleHuman.Height = 150;
// paddleComputer.Height = 150;
//}
//I don't know the point of this but I'm fucking 86ing it. - Michael
//Set the computer player to move according to the ball's position.
if (IsMultiplayerSession == true)
{
//If we're multiplayer, then we want to set the computer Y to the opponent's Y.
//If we're the leader, we set the AI paddle, else we set the player paddle.
if (IsLeader)
paddleComputer.Top = OpponentY;
else
paddleHuman.Top = OpponentY;
}
else
{
if (aiShouldIsbeEnabled)
if (ball.Location.X > (this.Width - (this.Width / 3)) - xVel * 10 && xVel > 0)
{
if (ball.Location.Y > paddleComputer.Location.Y + 50)
{
paddleComputer.Location = new Point(paddleComputer.Location.X, paddleComputer.Location.Y + computerspeed);
}
if (ball.Location.Y < paddleComputer.Location.Y + 50)
{
paddleComputer.Location = new Point(paddleComputer.Location.X, paddleComputer.Location.Y - computerspeed);
}
casualposition = rand.Next(-150, 201);
}
else
{
//used to be me.location.y - except it's fucking C# and this comment is misleading as fuck. OH WAIT! I didn't write it! And none of the current devs did either! - Michael
if (paddleComputer.Location.Y > this.Size.Height / 2 - paddleComputer.Height + casualposition)
{
paddleComputer.Location = new Point(paddleComputer.Location.X, paddleComputer.Location.Y - computerspeed);
}
//Rylan is hot. Used to be //used to be me.location.y
if (paddleComputer.Location.Y < this.Size.Height / 2 - paddleComputer.Height + casualposition)
{
paddleComputer.Location = new Point(paddleComputer.Location.X, paddleComputer.Location.Y + computerspeed);
}
}
}
//Set Xvel and Yvel speeds from decimal
if (xVel > 0)
xVel = (int)Math.Round(xveldec);
if (xVel < 0)
xVel = (int)-Math.Round(xveldec);
if (yVel > 0)
yVel = (int)Math.Round(yveldec);
if (yVel < 0)
yVel = (int)-Math.Round(yveldec);
bool BallPhysics = true;
if (IsMultiplayerSession)
{
//Logic for moving the ball in Multiplayer.
if (IsLeader)
{
ball.Location = new Point(ball.Location.X + xVel, ball.Location.Y + yVel);
}
else
{
//Move it to the leader's ball position.
ball.Location = new Point(LeaderX, LeaderY);
BallPhysics = false;
}
}
else
{// Move the game ball.
ball.Location = new Point(ball.Location.X + xVel, ball.Location.Y + yVel);
}
if (BallPhysics)
{
// Check for top wall.
if (ball.Location.Y < 0)
{
ball.Location = new Point(ball.Location.X, 0);
yVel = -yVel;
ShiftOS.Engine.AudioManager.PlayStream(Properties.Resources.typesound);
}
// Check for bottom wall.
if (ball.Location.Y > pgcontents.Height - ball.Height)
{
ball.Location = new Point(ball.Location.X, pgcontents.Height - ball.Size.Height);
yVel = -yVel;
ShiftOS.Engine.AudioManager.PlayStream(Properties.Resources.typesound);
}
// Check for player paddle.
if (ball.Bounds.IntersectsWith(paddleHuman.Bounds))
{
ball.Location = new Point(paddleHuman.Location.X + ball.Size.Width + 1, ball.Location.Y);
//randomly increase x or y speed of ball
switch (rand.Next(1, 3))
{
case 1:
xveldec = xveldec + incrementx;
break;
case 2:
if (yveldec > 0)
yveldec = yveldec + incrementy;
if (yveldec < 0)
yveldec = yveldec - incrementy;
break;
}
xVel = -xVel;
ShiftOS.Engine.AudioManager.PlayStream(Properties.Resources.writesound);
}
// Check for computer paddle.
if (ball.Bounds.IntersectsWith(paddleComputer.Bounds))
{
ball.Location = new Point(paddleComputer.Location.X - paddleComputer.Size.Width - 1, ball.Location.Y);
xveldec = xveldec + incrementx;
xVel = -xVel;
ShiftOS.Engine.AudioManager.PlayStream(Properties.Resources.writesound);
}
}
// Check for left wall.
if (ball.Location.X < -100)
{
//If we are in multiplayer, and not the leader, we won.
if (IsMultiplayerSession)
{
if (IsLeader)
{
//We lost.
NotifyLoseToTarget();
}
else
{
//We won.
NotifyWinToTarget();
Win();
}
}
else
{
ball.Location = new Point(this.Size.Width / 2 + 200, this.Size.Height / 2);
paddleComputer.Location = new Point(paddleComputer.Location.X, ball.Location.Y);
if (xVel > 0)
xVel = -xVel;
pnllose.Show();
gameTimer.Stop();
counter.Stop();
lblmissedout.Text = Localization.Parse("{YOU_MISSED_OUT_ON}:") + Environment.NewLine + lblstatscodepoints.Text.Replace(Localization.Parse("{CODEPOINTS}: "), "") + Localization.Parse(" {CODEPOINTS}");
if (ShiftoriumFrontend.UpgradeInstalled("pong_upgrade_2"))
{
totalreward = levelrewards[level - 1] + beatairewardtotal;
double onePercent = (totalreward / 100);
lblbutyougained.Show();
lblbutyougained.Text = Localization.Parse("{BUT_YOU_GAINED}:") + Environment.NewLine + onePercent.ToString("") + (Localization.Parse(" {CODEPOINTS}"));
SaveSystem.TransferCodepointsFrom("pong", (totalreward / 100));
}
else
{
lblbutyougained.Hide();
}
}
}
// Check for right wall.
if (ball.Location.X > this.Width - ball.Size.Width - paddleComputer.Width + 100)
{
if (IsMultiplayerSession)
{
//If we are the leader we won.
if (IsLeader)
{
NotifyWinToTarget();
Win();
}
else
{
NotifyLoseToTarget();
}
}
else
{
Win();
}
}
if (IsMultiplayerSession)
{
if (IsLeader)
{
ServerManager.Forward(OpponentGUID, "pong_mp_setballpos", JsonConvert.SerializeObject(ball.Location));
}
}
if (IsLeader)
{
//lblstats.Text = "Xspeed: " & Math.Abs(xVel) & " Yspeed: " & Math.Abs(yVel) & " Human Location: " & paddleHuman.Location.ToString & " Computer Location: " & paddleComputer.Location.ToString & Environment.NewLine & " Ball Location: " & ball.Location.ToString & " Xdec: " & xveldec & " Ydec: " & yveldec & " Xinc: " & incrementx & " Yinc: " & incrementy
lblstatsX.Text = Localization.Parse("{H_VEL}: ") + xveldec;
lblstatsY.Text = Localization.Parse("{V_VEL}: ") + yveldec;
lblstatscodepoints.Text = Localization.Parse("{CODEPOINTS}: ") + (levelrewards[level - 1] + beatairewardtotal).ToString();
lbllevelandtime.Text = Localization.Parse("{LEVEL}: " + level + " - " + secondsleft + " {SECONDS_LEFT}");
if (xVel > 20 || xVel < -20)
{
paddleHuman.Width = Math.Abs(xVel);
paddleComputer.Width = Math.Abs(xVel);
}
else
{
paddleHuman.Width = 20;
paddleComputer.Width = 20;
}
}
if (!IsMultiplayerSession)
{
computerspeed = Math.Abs(yVel);
}
}
}
public void ServerMessageReceivedHandler(ServerMessage msg)
{
if(msg.Name == "pong_mp_setballpos")
{
var pt = JsonConvert.DeserializeObject<Point>(msg.Contents);
LeaderX = pt.X;
LeaderY = pt.Y;
}
else if(msg.Name == "pong_mp_youlose")
{
LoseMP();
}
else if(msg.Name == "pong_mp_setopponenty")
{
int y = Convert.ToInt32(msg.Contents);
OpponentY = y;
}
else if(msg.Name == "pong_handshake_matchmake")
{
PossibleMatchmakes.Add(msg.Contents);
}
else if(msg.Name == "pong_handshake_complete")
{
LeaveMatchmake();
StartLevel();
}
else if(msg.Name == "pong_handshake_giveleaderid")
{
IsLeader = false;
OpponentGUID = msg.Contents;
YouGUID = ServerManager.thisGuid.ToString();
SendFollowerGUID();
}
else if(msg.Name == "pong_handshake_left")
{
if (this.PossibleMatchmakes.Contains(msg.Contents))
this.PossibleMatchmakes.Remove(msg.Contents);
}
else if(msg.Name == "pong_handshake_setfollowerguid")
{
IsLeader = false;
OpponentGUID = msg.Contents;
}
else if(msg.Name == "pong_mp_youwin")
{
Win();
}
}
public void NotifyLoseToTarget()
{
ServerManager.Forward(OpponentGUID, "pong_mp_youwin", null);
}
public void NotifyWinToTarget()
{
ServerManager.Forward(OpponentGUID, "pong_mp_youlose", null);
}
public void LeaveMatchmake()
{
ServerManager.Forward("all", "pong_handshake_left", YouGUID);
}
List<string> PossibleMatchmakes = new List<string>();
public void SendLeaderGUID()
{
ServerManager.Forward(OpponentGUID, "pong_handshake_giveleaderid", YouGUID);
}
public void StartMultiplayer()
{
IsMultiplayerSession = true;
YouGUID = ServerManager.thisGuid.ToString();
ServerManager.SendMessage("pong_handshake_matchmake", YouGUID);
}
public void SendFollowerGUID()
{
ServerManager.Forward(OpponentGUID, "pong_handshake_setfollowerguid", YouGUID);
}
public void LoseMP()
{
ball.Location = new Point(this.Size.Width / 2 + 200, this.Size.Height / 2);
if(IsLeader)
if (xVel > 0)
xVel = -xVel;
lblbeatai.Show();
lblbeatai.Text = "The opponent has beaten you!";
tmrcountdown.Start();
gameTimer.Stop();
counter.Stop();
}
public void Win()
{
ball.Location = new Point(this.Size.Width / 2 + 200, this.Size.Height / 2);
paddleComputer.Location = new Point(paddleComputer.Location.X, ball.Location.Y);
if (xVel > 0)
xVel = -xVel;
beatairewardtotal = beatairewardtotal + beataireward;
lblbeatai.Show();
lblbeatai.Text = Localization.Parse($"{{PONG_BEAT_AI_REWARD_SECONDARY}}: {beataireward}");
tmrcountdown.Start();
gameTimer.Stop();
counter.Stop();
}
// ERROR: Handles clauses are not supported in C#
private void counter_Tick(object sender, EventArgs e)
{
if (this.Left < Screen.PrimaryScreen.Bounds.Width)
{
secondsleft = secondsleft - 1;
if (secondsleft == 1)
{
secondsleft = 60;
level = level + 1;
if (SaveSystem.CurrentSave.UniteAuthToken != null)
{
try
{
var unite = new ShiftOS.Unite.UniteClient("http://getshiftos.ml", SaveSystem.CurrentSave.UniteAuthToken);
if (unite.GetPongLevel() < level)
unite.SetPongLevel(level);
}
catch { }
}
generatenextlevel();
pnlgamestats.Show();
pnlgamestats.BringToFront();
pnlgamestats.Location = new Point((pgcontents.Width / 2) - (pnlgamestats.Width / 2), (pgcontents.Height / 2) - (pnlgamestats.Height / 2));
counter.Stop();
gameTimer.Stop();
SendHighscores();
}
lblstatscodepoints.Text = Localization.Parse("{CODEPOINTS}: ") + (levelrewards[level - 1] + beatairewardtotal).ToString();
}
SetupStats();
}
[Obsolete("This method does nothing. Use UniteClient for highscore queries.")]
public void SendHighscores()
{
}
// ERROR: Handles clauses are not supported in C#
private void btnplayon_Click(object sender, EventArgs e)
{
xveldec = levelxspeed;
yveldec = levelyspeed;
secondsleft = 60;
tmrcountdown.Start();
lblbeatai.Text = Localization.Parse($"{{PONG_BEAT_AI_REWARD}}: {beataireward}");
pnlgamestats.Hide();
lblbeatai.Show();
ball.Location = new Point(paddleHuman.Location.X + paddleHuman.Width + 50, paddleHuman.Location.Y + paddleHuman.Height / 2);
if (xVel < 0)
xVel = Math.Abs(xVel);
lbllevelandtime.Text = Localization.Parse("{LEVEL}: " + level + " - " + secondsleft + " {SECONDS_LEFT}");
}
//Increase the ball speed stats for the next level
private void generatenextlevel()
{
lbllevelreached.Text = Localization.Parse("{YOU_REACHED_LEVEL} " + level + "!");
lblpreviousstats.Text = Localization.Parse("{INITIAL_H_VEL}: " + levelxspeed + Environment.NewLine + "{INITIAL_V_VEL}: " + levelyspeed + Environment.NewLine + "{INC_H_VEL}: " + incrementx + Environment.NewLine + "{INC_V_VEL}: " + incrementy);
switch (rand.Next(1, 3))
{
case 1:
levelxspeed = levelxspeed + 1;
break;
case 2:
levelxspeed = levelxspeed + 2;
break;
}
switch (rand.Next(1, 3))
{
case 1:
levelyspeed = levelyspeed + 1;
break;
case 2:
levelyspeed = levelyspeed + 2;
break;
}
switch (rand.Next(1, 6))
{
case 1:
incrementx = incrementx + 0.1;
break;
case 2:
incrementx = incrementx + 0.2;
break;
case 3:
incrementy = incrementy + 0.1;
break;
case 4:
incrementy = incrementy + 0.2;
break;
case 5:
incrementy = incrementy + 0.3;
break;
}
lblnextstats.Text = Localization.Parse("{INITIAL_H_VEL}: " + levelxspeed + Environment.NewLine + "{INITIAL_V_VEL}: " + levelyspeed + Environment.NewLine + "{INC_H_VEL}: " + incrementx + Environment.NewLine + "{INC_V_VEL}: " + incrementy);
if (level < 15)
{
if (ShiftoriumFrontend.UpgradeInstalled("pong_upgrade"))
{
beataireward = level * 10;
} else
{
beataireward = level * 5;
}
}
else
{
if (ShiftoriumFrontend.UpgradeInstalled("pong_upgrade"))
{
double br = levelrewards[level - 1] / 10;
beataireward = (int)Math.Round(br) * 10;
} else
{
double br = levelrewards[level - 1] / 10;
beataireward = (int)Math.Round(br) * 5;
}
}
totalreward = levelrewards[level - 1] + beatairewardtotal;
btncashout.Text = Localization.Parse("{CASH_OUT_WITH_CODEPOINTS}");
btnplayon.Text = Localization.Parse("{PONG_PLAY_ON_FOR_MORE}");
}
private void setuplevelrewards()
{
if (ShiftoriumFrontend.UpgradeInstalled("pong_upgrade"))
{
levelrewards[0] = 0;
levelrewards[1] = 40;
levelrewards[2] = 120;
levelrewards[3] = 280;
levelrewards[4] = 580;
levelrewards[5] = 800;
levelrewards[6] = 1200;
levelrewards[7] = 1800;
levelrewards[8] = 2400;
levelrewards[9] = 3200;
levelrewards[10] = 4000;
levelrewards[11] = 5000;
levelrewards[12] = 6000;
levelrewards[13] = 8000;
levelrewards[14] = 10000;
levelrewards[15] = 12000;
levelrewards[16] = 16000;
levelrewards[17] = 20000;
levelrewards[18] = 26000;
levelrewards[19] = 32000;
levelrewards[20] = 40000;
levelrewards[21] = 50000;
levelrewards[22] = 64000;
levelrewards[23] = 80000;
levelrewards[24] = 100000;
levelrewards[25] = 120000;
levelrewards[26] = 150000;
levelrewards[27] = 180000;
levelrewards[28] = 220000;
levelrewards[29] = 280000;
levelrewards[30] = 360000;
levelrewards[31] = 440000;
levelrewards[32] = 540000;
levelrewards[33] = 640000;
levelrewards[34] = 800000;
levelrewards[35] = 1000000;
levelrewards[36] = 1280000;
levelrewards[37] = 1600000;
levelrewards[38] = 2000000;
levelrewards[39] = 3000000;
levelrewards[40] = 4000000;
} else
{
levelrewards[0] = 0;
levelrewards[1] = 20;
levelrewards[2] = 60;
levelrewards[3] = 140;
levelrewards[4] = 290;
levelrewards[5] = 400;
levelrewards[6] = 600;
levelrewards[7] = 900;
levelrewards[8] = 1200;
levelrewards[9] = 1600;
levelrewards[10] = 2000;
levelrewards[11] = 2500;
levelrewards[12] = 3000;
levelrewards[13] = 4000;
levelrewards[14] = 5000;
levelrewards[15] = 6000;
levelrewards[16] = 8000;
levelrewards[17] = 10000;
levelrewards[18] = 13000;
levelrewards[19] = 16000;
levelrewards[20] = 20000;
levelrewards[21] = 25000;
levelrewards[22] = 32000;
levelrewards[23] = 40000;
levelrewards[24] = 50000;
levelrewards[25] = 60000;
levelrewards[26] = 75000;
levelrewards[27] = 90000;
levelrewards[28] = 110000;
levelrewards[29] = 140000;
levelrewards[30] = 180000;
levelrewards[31] = 220000;
levelrewards[32] = 270000;
levelrewards[33] = 320000;
levelrewards[34] = 400000;
levelrewards[35] = 500000;
levelrewards[36] = 640000;
levelrewards[37] = 800000;
levelrewards[38] = 1000000;
levelrewards[39] = 1500000;
levelrewards[40] = 2000000;
}
}
// ERROR: Handles clauses are not supported in C#
private void countdown_Tick(object sender, EventArgs e)
{
if (this.Left < Screen.PrimaryScreen.Bounds.Width)
{
switch (countdown)
{
case 0:
countdown = 3;
lblcountdown.Hide();
lblbeatai.Hide();
gameTimer.Start();
counter.Start();
tmrcountdown.Stop();
break;
case 1:
lblcountdown.Text = "1";
countdown = countdown - 1;
ShiftOS.Engine.AudioManager.PlayStream(Properties.Resources.typesound);
break;
case 2:
lblcountdown.Text = "2";
countdown = countdown - 1;
ShiftOS.Engine.AudioManager.PlayStream(Properties.Resources.typesound);
break;
case 3:
lblcountdown.Text = "3";
countdown = countdown - 1;
lblcountdown.Show();
ShiftOS.Engine.AudioManager.PlayStream(Properties.Resources.typesound);
break;
}
}
}
// ERROR: Handles clauses are not supported in C#
private void btncashout_Click(object sender, EventArgs e)
{
pnlgamestats.Hide();
pnlfinalstats.Show();
lblfinalcodepointswithtext.Text = Localization.Parse("{YOU_WON} " + totalreward + " {CODEPOINTS}!");
lblfinallevelreached.Text = Localization.Parse("{CODEPOINTS_FOR_BEATING_LEVEL}: ") + (level - 1).ToString();
lblfinallevelreward.Text = levelrewards[level - 1].ToString();
lblfinalcomputerreward.Text = beatairewardtotal.ToString();
lblfinalcodepoints.Text = totalreward + Localization.Parse(" {CODEPOINTS_SHORT}");
SaveSystem.TransferCodepointsFrom("pong", totalreward);
if (!string.IsNullOrWhiteSpace(SaveSystem.CurrentSave.UniteAuthToken))
{
var unite = new ShiftOS.Unite.UniteClient("http://getshiftos.ml", SaveSystem.CurrentSave.UniteAuthToken);
if (unite.GetPongCP() < totalreward)
{
unite.SetPongCP(totalreward);
}
}
}
private void newgame()
{
pnlfinalstats.Hide();
pnllose.Hide();
pnlintro.Hide();
level = 1;
totalreward = 0;
if (ShiftoriumFrontend.UpgradeInstalled("pong_upgrade"))
{
beataireward = 10;
} else
{
beataireward = 5;
}
beatairewardtotal = 0;
secondsleft = 60;
lblstatscodepoints.Text = Localization.Parse("{CODEPOINTS}: ");
//reset stats text
lblstatsX.Text = Localization.Parse("{H_VEL}: ");
lblstatsY.Text = Localization.Parse("{V_VEL}: ");
levelxspeed = 3;
levelyspeed = 3;
incrementx = 0.4;
incrementy = 0.2;
xveldec = levelxspeed;
yveldec = levelyspeed;
tmrcountdown.Start();
lblbeatai.Text = Localization.Parse($"{{PONG_BEAT_AI_REWARD}}: {beataireward}");
pnlgamestats.Hide();
lblbeatai.Show();
ball.Location = new Point(paddleHuman.Location.X + paddleHuman.Width + 50, (paddleHuman.Location.Y + paddleHuman.Height) / 2);
if (xVel < 0)
xVel = Math.Abs(xVel);
lbllevelandtime.Text = Localization.Parse("{{LEVEL}}: " + level + " - " + secondsleft + " {SECONDS_LEFT}");
}
public void btnhighscore_Click(object s, EventArgs a)
{
pnlhighscore.BringToFront();
SetupHighScores();
}
bool IsMultiplayerSession = false;
string YouGUID = "";
string OpponentGUID = "";
public void SetupHighScores()
{
lbhighscore.Items.Clear();
lbhighscore.View = View.Details;
lbhighscore.FullRowSelect = true;
lbhighscore.Columns.Clear();
var n = new ColumnHeader();
n.Text = "Player";
n.Width = lbhighscore.Width / 3;
var l = new ColumnHeader();
l.Text = "Level";
l.Width = n.Width;
var c = new ColumnHeader();
c.Text = "Codepoints";
c.Width = n.Width;
lbhighscore.Columns.Add(n);
lbhighscore.Columns.Add(l);
lbhighscore.Columns.Add(c);
var t = new Thread(() =>
{
try
{
var unite = new ShiftOS.Unite.UniteClient("http://getshiftos.ml", SaveSystem.CurrentSave.UniteAuthToken);
var hs = unite.GetPongHighscores();
foreach (var score in hs.Highscores)
{
string username = unite.GetDisplayNameId(score.UserId);
this.Invoke(new Action(() =>
{
var name_item = new ListViewItem();
name_item.Text = username;
lbhighscore.Items.Add(name_item);
name_item.SubItems.Add(score.Level.ToString());
name_item.SubItems.Add(score.CodepointsCashout.ToString());
}));
}
}
catch
{
Infobox.Show("Service unavailable.", "The Pong Highscore service is unavailable at this time.");
this.Invoke(new Action(pnlgamestats.BringToFront));
return;
}
});
t.Start();
pnlhighscore.Show();
}
// ERROR: Handles clauses are not supported in C#
private void btnplayagain_Click(object sender, EventArgs e)
{
newgame();
}
// ERROR: Handles clauses are not supported in C#
private void btnlosetryagain_Click(object sender, EventArgs e)
{
newgame();
}
public void StartLevel()
{
newgame();
}
// ERROR: Handles clauses are not supported in C#
private void btnstartgame_Click(object sender, EventArgs e)
{
newgame();
}
Random rand = new Random();
// ERROR: Handles clauses are not supported in C#
private void tmrstoryline_Tick(object sender, EventArgs e)
{
// Random chance of showing getshiftnet storyline
int i = rand.Next(0, 100);
if (i >= 25 && i <= 50)
{
tmrstoryline.Stop();
}
}
// ERROR: Handles clauses are not supported in C#
private void me_closing(object sender, FormClosingEventArgs e)
{
tmrstoryline.Stop();
}
private void Label6_Click(object sender, EventArgs e)
{
}
private void Label8_Click(object sender, EventArgs e)
{
}
private void pgcontents_Paint(object sender, PaintEventArgs e) {
}
private void ball_MouseEnter(object sender, EventArgs e) {
aiShouldIsbeEnabled = false;
}
private void ball_MouseLeave(object sender, EventArgs e) {
aiShouldIsbeEnabled = true;
}
public void OnLoad()
{
pnlintro.BringToFront();
pnlintro.Show();
pnlhighscore.Hide();
pnlgamestats.Hide();
pnlfinalstats.Hide();
CenterPanels();
lblbeatai.Hide();
}
public void OnSkinLoad()
{
CenterPanels();
this.SizeChanged += (o, a) =>
{
CenterPanels();
};
}
public bool OnUnload()
{
return true;
}
public void OnUpgrade()
{
CenterPanels();
}
private void button2_Click(object sender, EventArgs e)
{
pnlhighscore.Hide();
}
private void btnmatchmake_Click(object sender, EventArgs e)
{
this.StartMultiplayer();
pnlintro.Hide();
lblbeatai.Text = "Beat the other player to earn Codepoints.";
lblcountdown.Text = "Waiting for another player...";
lblcountdown.Left = (this.Width - lblcountdown.Width) / 2;
}
}
}

View file

@ -1,317 +0,0 @@
/*
* MIT License
*
* Copyright (c) 2017 Michael VanOverbeek and ShiftOS devs
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
using ShiftOS.WinForms.Controls;
namespace ShiftOS.WinForms.Applications
{
partial class ShiftoriumFrontend
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.panel1 = new System.Windows.Forms.Panel();
this.panel2 = new System.Windows.Forms.Panel();
this.lbupgradedesc = new System.Windows.Forms.Label();
this.pnlupgradeactions = new System.Windows.Forms.Panel();
this.btnbuy = new System.Windows.Forms.Button();
this.lbupgradetitle = new System.Windows.Forms.Label();
this.pnllist = new System.Windows.Forms.Panel();
this.lbcodepoints = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.pgupgradeprogress = new ShiftOS.WinForms.Controls.ShiftedProgressBar();
this.lbupgrades = new System.Windows.Forms.ListBox();
this.label3 = new System.Windows.Forms.Label();
this.panel3 = new System.Windows.Forms.Panel();
this.btncat_back = new System.Windows.Forms.Button();
this.btncat_forward = new System.Windows.Forms.Button();
this.lblcategorytext = new System.Windows.Forms.Label();
this.lbnoupgrades = new System.Windows.Forms.Label();
this.panel1.SuspendLayout();
this.panel2.SuspendLayout();
this.pnlupgradeactions.SuspendLayout();
this.pnllist.SuspendLayout();
this.panel3.SuspendLayout();
this.SuspendLayout();
//
// panel1
//
this.panel1.Controls.Add(this.panel2);
this.panel1.Controls.Add(this.pnllist);
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(782, 427);
this.panel1.TabIndex = 0;
//
// panel2
//
this.panel2.Controls.Add(this.lbupgradedesc);
this.panel2.Controls.Add(this.pnlupgradeactions);
this.panel2.Controls.Add(this.lbupgradetitle);
this.panel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel2.Location = new System.Drawing.Point(406, 0);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(376, 427);
this.panel2.TabIndex = 1;
//
// lbupgradedesc
//
this.lbupgradedesc.Dock = System.Windows.Forms.DockStyle.Fill;
this.lbupgradedesc.Location = new System.Drawing.Point(0, 42);
this.lbupgradedesc.Name = "lbupgradedesc";
this.lbupgradedesc.Size = new System.Drawing.Size(376, 348);
this.lbupgradedesc.TabIndex = 2;
this.lbupgradedesc.Text = "{SHIFTORIUM_EXP}";
this.lbupgradedesc.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.lbupgradedesc.UseCompatibleTextRendering = true;
//
// pnlupgradeactions
//
this.pnlupgradeactions.Controls.Add(this.btnbuy);
this.pnlupgradeactions.Dock = System.Windows.Forms.DockStyle.Bottom;
this.pnlupgradeactions.Location = new System.Drawing.Point(0, 390);
this.pnlupgradeactions.Name = "pnlupgradeactions";
this.pnlupgradeactions.Size = new System.Drawing.Size(376, 37);
this.pnlupgradeactions.TabIndex = 1;
//
// btnbuy
//
this.btnbuy.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnbuy.AutoSize = true;
this.btnbuy.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.btnbuy.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnbuy.Location = new System.Drawing.Point(327, 9);
this.btnbuy.Name = "btnbuy";
this.btnbuy.Size = new System.Drawing.Size(37, 25);
this.btnbuy.TabIndex = 0;
this.btnbuy.Text = "Buy";
this.btnbuy.UseVisualStyleBackColor = true;
this.btnbuy.Visible = false;
this.btnbuy.Click += new System.EventHandler(this.btnbuy_Click);
//
// lbupgradetitle
//
this.lbupgradetitle.Dock = System.Windows.Forms.DockStyle.Top;
this.lbupgradetitle.Location = new System.Drawing.Point(0, 0);
this.lbupgradetitle.Name = "lbupgradetitle";
this.lbupgradetitle.Size = new System.Drawing.Size(376, 42);
this.lbupgradetitle.TabIndex = 0;
this.lbupgradetitle.Text = "{WELCOME_TO_SHIFTORIUM}";
this.lbupgradetitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.lbupgradetitle.UseCompatibleTextRendering = true;
//
// pnllist
//
this.pnllist.Controls.Add(this.lbnoupgrades);
this.pnllist.Controls.Add(this.panel3);
this.pnllist.Controls.Add(this.lbcodepoints);
this.pnllist.Controls.Add(this.label1);
this.pnllist.Controls.Add(this.pgupgradeprogress);
this.pnllist.Controls.Add(this.lbupgrades);
this.pnllist.Dock = System.Windows.Forms.DockStyle.Left;
this.pnllist.Location = new System.Drawing.Point(0, 0);
this.pnllist.Name = "pnllist";
this.pnllist.Size = new System.Drawing.Size(406, 427);
this.pnllist.TabIndex = 0;
//
// lbcodepoints
//
this.lbcodepoints.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.lbcodepoints.AutoSize = true;
this.lbcodepoints.Location = new System.Drawing.Point(128, 357);
this.lbcodepoints.Name = "lbcodepoints";
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
//
this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(3, 399);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(137, 13);
this.label1.TabIndex = 2;
this.label1.Text = "{UPGRADE_PROGRESS}:";
//
// pgupgradeprogress
//
this.pgupgradeprogress.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.pgupgradeprogress.BlockSize = 5;
this.pgupgradeprogress.Location = new System.Drawing.Point(146, 390);
this.pgupgradeprogress.Maximum = 100;
this.pgupgradeprogress.Name = "pgupgradeprogress";
this.pgupgradeprogress.Size = new System.Drawing.Size(254, 23);
this.pgupgradeprogress.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
this.pgupgradeprogress.TabIndex = 1;
this.pgupgradeprogress.Value = 25;
//
// lbupgrades
//
this.lbupgrades.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.lbupgrades.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
this.lbupgrades.FormattingEnabled = true;
this.lbupgrades.Location = new System.Drawing.Point(3, 105);
this.lbupgrades.Name = "lbupgrades";
this.lbupgrades.Size = new System.Drawing.Size(397, 238);
this.lbupgrades.TabIndex = 0;
this.lbupgrades.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.lbupgrades_DrawItem);
//
// 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(3, 399);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(137, 13);
this.label3.TabIndex = 2;
//
// panel3
//
this.panel3.Controls.Add(this.lblcategorytext);
this.panel3.Controls.Add(this.btncat_forward);
this.panel3.Controls.Add(this.btncat_back);
this.panel3.Location = new System.Drawing.Point(6, 76);
this.panel3.Name = "panel3";
this.panel3.Size = new System.Drawing.Size(394, 23);
this.panel3.TabIndex = 5;
//
// btncat_back
//
this.btncat_back.AutoSize = true;
this.btncat_back.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.btncat_back.Dock = System.Windows.Forms.DockStyle.Left;
this.btncat_back.Location = new System.Drawing.Point(0, 0);
this.btncat_back.Name = "btncat_back";
this.btncat_back.Size = new System.Drawing.Size(29, 23);
this.btncat_back.TabIndex = 0;
this.btncat_back.Text = "<--";
this.btncat_back.UseVisualStyleBackColor = true;
this.btncat_back.Click += new System.EventHandler(this.btncat_back_Click);
//
// btncat_forward
//
this.btncat_forward.AutoSize = true;
this.btncat_forward.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.btncat_forward.Dock = System.Windows.Forms.DockStyle.Right;
this.btncat_forward.Location = new System.Drawing.Point(365, 0);
this.btncat_forward.Name = "btncat_forward";
this.btncat_forward.Size = new System.Drawing.Size(29, 23);
this.btncat_forward.TabIndex = 1;
this.btncat_forward.Text = "-->";
this.btncat_forward.UseVisualStyleBackColor = true;
this.btncat_forward.Click += new System.EventHandler(this.btncat_forward_Click);
//
// lblcategorytext
//
this.lblcategorytext.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblcategorytext.Location = new System.Drawing.Point(29, 0);
this.lblcategorytext.Name = "lblcategorytext";
this.lblcategorytext.Size = new System.Drawing.Size(336, 23);
this.lblcategorytext.TabIndex = 2;
this.lblcategorytext.Text = "label2";
this.lblcategorytext.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// lbnoupgrades
//
this.lbnoupgrades.AutoSize = true;
this.lbnoupgrades.Location = new System.Drawing.Point(69, 183);
this.lbnoupgrades.Name = "lbnoupgrades";
this.lbnoupgrades.Size = new System.Drawing.Size(71, 13);
this.lbnoupgrades.TabIndex = 6;
this.lbnoupgrades.Tag = "header2";
this.lbnoupgrades.Text = "No upgrades!";
this.lbnoupgrades.Visible = false;
//
// ShiftoriumFrontend
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.Black;
this.Controls.Add(this.panel1);
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);
this.pnlupgradeactions.PerformLayout();
this.pnllist.ResumeLayout(false);
this.pnllist.PerformLayout();
this.panel3.ResumeLayout(false);
this.panel3.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Panel panel2;
private System.Windows.Forms.Panel pnllist;
private System.Windows.Forms.ListBox lbupgrades;
private System.Windows.Forms.Label lbupgradedesc;
private System.Windows.Forms.Panel pnlupgradeactions;
private System.Windows.Forms.Label lbupgradetitle;
private System.Windows.Forms.Button btnbuy;
private ShiftedProgressBar pgupgradeprogress;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label lbcodepoints;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Panel panel3;
private System.Windows.Forms.Label lblcategorytext;
private System.Windows.Forms.Button btncat_forward;
private System.Windows.Forms.Button btncat_back;
private System.Windows.Forms.Label lbnoupgrades;
}
}

View file

@ -1,274 +0,0 @@
/*
* MIT License
*
* Copyright (c) 2017 Michael VanOverbeek and ShiftOS devs
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ShiftOS.Engine;
using static ShiftOS.Engine.SkinEngine;
using backend = ShiftOS.Engine.Shiftorium;
namespace ShiftOS.WinForms.Applications
{
[Launcher("Shiftorium", true, "al_shiftorium", "Utilities")]
[RequiresUpgrade("shiftorium_gui")]
[MultiplayerOnly]
[WinOpen("shiftorium")]
[DefaultTitle("Shiftorium")]
[DefaultIcon("iconShiftorium")]
public partial class ShiftoriumFrontend : UserControl, IShiftOSWindow
{
public int CategoryId = 0;
public static System.Timers.Timer timer100;
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();
lbupgrades.SelectedIndexChanged += (o, a) =>
{
try
{
lbupgrades.Refresh();
SelectUpgrade(lbupgrades.SelectedItem.ToString());
}
catch { }
};
this.pgupgradeprogress.Maximum = backend.GetDefaults().Count;
this.pgupgradeprogress.Value = SaveSystem.CurrentSave.CountUpgrades();
backend.Installed += () =>
{
this.pgupgradeprogress.Maximum = backend.GetDefaults().Count;
this.pgupgradeprogress.Value = SaveSystem.CurrentSave.CountUpgrades();
};
}
public void SelectUpgrade(string name)
{
btnbuy.Show();
var upg = upgrades[name];
lbupgradetitle.Text = Localization.Parse(upg.Name);
lbupgradedesc.Text = Localization.Parse(upg.Description);
}
Dictionary<string, ShiftoriumUpgrade> upgrades = new Dictionary<string, ShiftoriumUpgrade>();
public void PopulateShiftorium()
{
try
{
lbnoupgrades.Hide();
lbupgrades.Items.Clear();
upgrades.Clear();
Timer();
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);
lbupgrades.Items.Add(name);
}
if (lbupgrades.Items.Count == 0)
{
lbnoupgrades.Show();
lbnoupgrades.Location = new Point(
(lbupgrades.Width - lbnoupgrades.Width) / 2,
(lbupgrades.Height - lbnoupgrades.Height) / 2
);
}
else
{
lbnoupgrades.Hide();
}
lblcategorytext.Text = Shiftorium.GetCategories()[CategoryId];
btncat_back.Visible = (CategoryId > 0);
btncat_forward.Visible = (CategoryId < backend.GetCategories().Length - 1);
}
catch
{
lbnoupgrades.Show();
lbnoupgrades.Location = new Point(
(lbupgrades.Width - lbnoupgrades.Width) / 2,
(lbupgrades.Height - lbnoupgrades.Height) / 2
);
}
}
public static bool UpgradeInstalled(string upg)
{
return backend.UpgradeInstalled(upg);
}
public static bool UpgradeAttributesUnlocked(FieldInfo finf)
{
return backend.UpgradeAttributesUnlocked(finf);
}
public static bool UpgradeAttributesUnlocked(MethodInfo finf)
{
return backend.UpgradeAttributesUnlocked(finf);
}
public static bool UpgradeAttributesUnlocked(Type finf)
{
return backend.UpgradeAttributesUnlocked(finf);
}
public static bool UpgradeAttributesUnlocked(PropertyInfo finf)
{
return backend.UpgradeAttributesUnlocked(finf);
}
private void lbupgrades_DrawItem(object sender, DrawItemEventArgs e)
{
var foreground = new SolidBrush(LoadedSkin.ControlTextColor);
var background = new SolidBrush(LoadedSkin.ControlColor);
e.Graphics.FillRectangle(background, e.Bounds);
try
{
if (lbupgrades.GetSelected(e.Index) == true)
{
e.Graphics.FillRectangle(foreground, e.Bounds);
e.Graphics.DrawString(lbupgrades.Items[e.Index].ToString(), e.Font, background, e.Bounds.Location);
}
else
{
e.Graphics.FillRectangle(background, e.Bounds);
e.Graphics.DrawString(lbupgrades.Items[e.Index].ToString(), e.Font, foreground, e.Bounds.Location);
}
}
catch
{
}
}
private void btnbuy_Click(object sender, EventArgs e)
{
long cpCost = 0;
backend.Silent = true;
Dictionary<string, long> UpgradesToBuy = new Dictionary<string, long>();
foreach (var itm in lbupgrades.SelectedItems)
{
cpCost += upgrades[itm.ToString()].Cost;
UpgradesToBuy.Add(upgrades[itm.ToString()].ID, upgrades[itm.ToString()].Cost);
}
if (SaveSystem.CurrentSave.Codepoints < cpCost)
{
Infobox.Show("Insufficient Codepoints", $"You do not have enough Codepoints to perform this action. You need {cpCost - SaveSystem.CurrentSave.Codepoints} more.");
}
else
{
foreach(var upg in UpgradesToBuy)
{
backend.Buy(upg.Key, upg.Value);
}
}
backend.Silent = false;
PopulateShiftorium();
btnbuy.Hide();
}
private void Shiftorium_Load(object sender, EventArgs e) {
}
public void OnLoad()
{
cp_update.Start();
lbnoupgrades.Hide();
}
public void OnSkinLoad()
{
}
Timer cp_update = new System.Windows.Forms.Timer();
public bool OnUnload()
{
cp_update.Stop();
cp_update = null;
return true;
}
public void OnUpgrade()
{
lbupgrades.SelectionMode = (UpgradeInstalled("shiftorium_gui_bulk_buy") == true) ? SelectionMode.MultiExtended : SelectionMode.One;
lbcodepoints.Visible = Shiftorium.UpgradeInstalled("shiftorium_gui_codepoints_display");
}
private void lbcodepoints_Click(object sender, EventArgs e)
{
}
void Timer()
{
timer100 = new System.Timers.Timer();
timer100.Interval = 2000;
//timer100.Elapsed += ???;
timer100.AutoReset = true;
timer100.Enabled = true;
}
private void btncat_back_Click(object sender, EventArgs e)
{
if(CategoryId > 0)
{
CategoryId--;
PopulateShiftorium();
}
}
private void btncat_forward_Click(object sender, EventArgs e)
{
if(CategoryId < backend.GetCategories().Length - 1)
{
CategoryId++;
PopulateShiftorium();
}
}
}
}

View file

@ -1,342 +0,0 @@
/*
* MIT License
*
* Copyright (c) 2017 Michael VanOverbeek and ShiftOS devs
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
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;
using Newtonsoft.Json;
using ShiftOS.Engine;
using ShiftOS.WinForms.Tools;
namespace ShiftOS.WinForms.Applications
{
[Launcher("Skin Loader", true, "al_skin_loader", "Customization")]
[RequiresUpgrade("skinning")]
[WinOpen("skin_loader")]
[DefaultTitle("Skin Loader")]
[DefaultIcon("iconSkinLoader")]
public partial class Skin_Loader : UserControl, IShiftOSWindow
{
public Skin_Loader()
{
InitializeComponent();
SetupControls(pnlborder);
SetupControls(pnldesktop);
LoadedSkin = JsonConvert.DeserializeObject<Skin>(JsonConvert.SerializeObject(SkinEngine.LoadedSkin));
this.Load += (o, a) => { SetupUI(); };
}
public void SetupControls(Control ctrl)
{
ctrl.Tag = "keepbg keepfg keepfont";
foreach (Control c in ctrl.Controls)
SetupControls(c);
}
public Skin LoadedSkin { get; set; }
public void SetupUI()
{
SetupDesktop();
Setup();
}
public void SetupDesktop()
{
menuStrip1.Renderer = new ShiftOSMenuRenderer();
this.DoubleBuffered = true;
desktoppanel.BackColor = Color.Green;
//upgrades
if (SaveSystem.CurrentSave != null)
{
desktoppanel.Visible = ShiftoriumFrontend.UpgradeInstalled("desktop");
lbtime.Visible = ShiftoriumFrontend.UpgradeInstalled("desktop_clock_widget");
//skinning
lbtime.ForeColor = LoadedSkin.DesktopPanelClockColor;
sysmenuholder.Visible = ShiftoriumFrontend.UpgradeInstalled("app_launcher");
//The Color Picker can give us transparent colors - which Windows Forms fucking despises when dealing with form backgrounds.
//To compensate, we must recreate the desktop color and make the alpha channel '255'.
pnldesktop.BackColor = Color.FromArgb(LoadedSkin.DesktopColor.R, LoadedSkin.DesktopColor.G, LoadedSkin.DesktopColor.B);
//Not doing this will cause an ArgumentException.
pnldesktop.BackgroundImage = GetImage("desktopbackground");
pnldesktop.BackgroundImageLayout = GetImageLayout("desktopbackground");
desktoppanel.BackgroundImage = GetImage("desktoppanel");
menuStrip1.BackgroundImage = GetImage("applauncher");
lbtime.ForeColor = LoadedSkin.DesktopPanelClockColor;
lbtime.Font = LoadedSkin.DesktopPanelClockFont;
lbtime.Text = Applications.Terminal.GetTime();
lbtime.Left = desktoppanel.Width - lbtime.Width - LoadedSkin.DesktopPanelClockFromRight.X;
lbtime.Top = LoadedSkin.DesktopPanelClockFromRight.Y;
if (desktoppanel.BackgroundImage == null)
{
lbtime.BackColor = LoadedSkin.DesktopPanelClockBackgroundColor;
}
else
{
lbtime.BackColor = Color.Transparent;
}
apps.Text = LoadedSkin.AppLauncherText;
sysmenuholder.Location = LoadedSkin.AppLauncherFromLeft;
sysmenuholder.Size = LoadedSkin.AppLauncherHolderSize;
apps.Size = sysmenuholder.Size;
menuStrip1.Renderer = new ShiftOSMenuRenderer(new AppLauncherColorTable());
desktoppanel.BackColor = LoadedSkin.DesktopPanelColor;
desktoppanel.BackgroundImageLayout = GetImageLayout("desktoppanel");
desktoppanel.Height = LoadedSkin.DesktopPanelHeight;
if (LoadedSkin.DesktopPanelPosition == 1)
{
desktoppanel.Dock = DockStyle.Bottom;
}
else
{
desktoppanel.Dock = DockStyle.Top;
}
}
}
public ImageLayout GetImageLayout(string img)
{
if (LoadedSkin.SkinImageLayouts.ContainsKey(img))
{
return LoadedSkin.SkinImageLayouts[img];
}
else
{
LoadedSkin.SkinImageLayouts.Add(img, ImageLayout.Tile);
return ImageLayout.Tile;
}
}
public Image GetImage(string img)
{
var type = typeof(Skin);
foreach (var field in type.GetFields())
{
foreach (var attr in field.GetCustomAttributes(false))
{
if (attr is ImageAttribute)
{
var iattr = attr as ImageAttribute;
if (iattr.Name == img)
{
byte[] image = (byte[])field.GetValue(LoadedSkin);
return SkinEngine.ImageFromBinary(image);
}
}
}
}
return null;
}
bool IsDialog = false;
public void Setup()
{
pnlcontents.BackColor = LoadedSkin.ControlColor;
this.lbtitletext.Text = Localization.Parse("{TEMPLATE}");
this.Dock = DockStyle.Fill;
if (SaveSystem.CurrentSave != null)
{
this.pnltitle.Visible = ShiftoriumFrontend.UpgradeInstalled("wm_titlebar");
this.pnlclose.Visible = ShiftoriumFrontend.UpgradeInstalled("close_button");
this.pnlminimize.Visible = (IsDialog == false) && ShiftoriumFrontend.UpgradeInstalled("minimize_button");
this.pnlmaximize.Visible = (IsDialog == false) && ShiftoriumFrontend.UpgradeInstalled("maximize_button");
SetupSkin();
}
else
{
this.pnltitle.Visible = false;
this.pnlclose.Visible = false;
this.pnlminimize.Visible = false;
this.pnlmaximize.Visible = false;
}
}
public void SetupSkin()
{
pnltitlemaster.Height = LoadedSkin.TitlebarHeight;
pnltitle.BackColor = LoadedSkin.TitleBackgroundColor;
pnltitle.BackgroundImage = GetImage("titlebar");
pnltitleleft.Visible = LoadedSkin.ShowTitleCorners;
pnltitleright.Visible = LoadedSkin.ShowTitleCorners;
pnltitleleft.BackColor = LoadedSkin.TitleLeftCornerBackground;
pnltitleright.BackColor = LoadedSkin.TitleRightCornerBackground;
pnltitleleft.Width = LoadedSkin.TitleLeftCornerWidth;
pnltitleright.Width = LoadedSkin.TitleRightCornerWidth;
pnltitleleft.BackgroundImage = GetImage("titleleft");
pnltitleleft.BackgroundImageLayout = GetImageLayout("titleleft");
pnltitleright.BackgroundImage = GetImage("titleright");
pnltitleright.BackgroundImageLayout = GetImageLayout("titleright");
lbtitletext.BackColor = LoadedSkin.TitleBackgroundColor;
lbtitletext.ForeColor = LoadedSkin.TitleTextColor;
lbtitletext.Font = LoadedSkin.TitleFont;
pnlleft.BackColor = LoadedSkin.BorderLeftBackground;
pnlleft.BackgroundImage = GetImage("leftborder");
pnlleft.BackgroundImageLayout = GetImageLayout("leftborder");
pnlleft.Width = LoadedSkin.LeftBorderWidth;
pnlright.BackColor = LoadedSkin.BorderRightBackground;
pnlright.BackgroundImage = GetImage("rightborder");
pnlright.BackgroundImageLayout = GetImageLayout("rightborder");
pnlright.Width = LoadedSkin.RightBorderWidth;
pnlbottom.BackColor = LoadedSkin.BorderBottomBackground;
pnlbottom.BackgroundImage = GetImage("bottomborder");
pnlbottom.BackgroundImageLayout = GetImageLayout("bottomborder");
pnlbottom.Height = LoadedSkin.BottomBorderWidth;
pnlbottomr.BackColor = LoadedSkin.BorderBottomRightBackground;
pnlbottomr.BackgroundImage = GetImage("bottomrborder");
pnlbottomr.BackgroundImageLayout = GetImageLayout("bottomrborder");
pnlbottoml.BackColor = LoadedSkin.BorderBottomLeftBackground;
pnlbottoml.BackgroundImage = GetImage("bottomlborder");
pnlbottoml.BackgroundImageLayout = GetImageLayout("bottomlborder");
lbtitletext.ForeColor = LoadedSkin.TitleTextColor;
lbtitletext.Font = LoadedSkin.TitleFont;
pnlclose.BackColor = LoadedSkin.CloseButtonColor;
pnlclose.BackgroundImage = GetImage("closebutton");
pnlclose.BackgroundImageLayout = GetImageLayout("closebutton");
pnlminimize.BackColor = LoadedSkin.MinimizeButtonColor;
pnlminimize.BackgroundImage = GetImage("minimizebutton");
pnlminimize.BackgroundImageLayout = GetImageLayout("minimizebutton");
pnlmaximize.BackColor = LoadedSkin.MaximizeButtonColor;
pnlmaximize.BackgroundImage = GetImage("maximizebutton");
pnlmaximize.BackgroundImageLayout = GetImageLayout("maximizebutton");
pnlclose.Size = LoadedSkin.CloseButtonSize;
pnlminimize.Size = LoadedSkin.MinimizeButtonSize;
pnlmaximize.Size = LoadedSkin.MaximizeButtonSize;
pnlclose.Location = FromRight(LoadedSkin.CloseButtonFromSide);
pnlminimize.Location = FromRight(LoadedSkin.MinimizeButtonFromSide);
pnlmaximize.Location = FromRight(LoadedSkin.MaximizeButtonFromSide);
pnlclose.Left -= pnlclose.Width;
pnlmaximize.Left -= pnlmaximize.Width;
pnlminimize.Left -= pnlminimize.Width;
switch (LoadedSkin.TitleTextCentered)
{
case false:
lbtitletext.Location = LoadedSkin.TitleTextLeft;
break;
default:
lbtitletext.Left = (pnltitle.Width - lbtitletext.Width) / 2;
lbtitletext.Top = LoadedSkin.TitleTextLeft.Y;
break;
}
}
public Point FromRight(Point input)
{
return new Point(pnltitle.Width - input.X, input.Y);
}
private void btnapply_Click(object sender, EventArgs e)
{
ShiftOS.Objects.ShiftFS.Utils.WriteAllText(Paths.GetPath("skin.json"), JsonConvert.SerializeObject(LoadedSkin));
SkinEngine.LoadSkin();
}
private void btnclose_Click(object sender, EventArgs e)
{
this.Close();
}
private void btnloaddefault_Click(object sender, EventArgs e)
{
this.LoadedSkin = new ShiftOS.Engine.Skin();
SetupUI();
}
private void btnexport_Click(object sender, EventArgs e)
{
AppearanceManager.SetupDialog(new FileDialog(new[] { ".skn" }, FileOpenerStyle.Save, new Action<string>((filename) =>
{
ShiftOS.Objects.ShiftFS.Utils.WriteAllText(filename, JsonConvert.SerializeObject(LoadedSkin));
string fname = filename.Split('/')[filename.Split('/').Length - 1];
if(!System.IO.Directory.Exists(Paths.SharedFolder + "\\skins"))
{
System.IO.Directory.CreateDirectory(Paths.SharedFolder + "\\skins");
}
string path = Paths.SharedFolder + "\\skins\\" + SaveSystem.CurrentSave.Username + "-" + fname;
System.IO.File.WriteAllText(path, JsonConvert.SerializeObject(LoadedSkin));
})));
}
private void btnimport_Click(object sender, EventArgs e)
{
AppearanceManager.SetupDialog(new FileDialog(new[] { ".skn" }, FileOpenerStyle.Open, new Action<string>((filename) =>
{
LoadedSkin = JsonConvert.DeserializeObject<Skin>(ShiftOS.Objects.ShiftFS.Utils.ReadAllText(filename));
SetupUI();
})));
}
public void OnLoad()
{
SetupUI();
}
public void OnSkinLoad()
{
SetupUI();
}
public bool OnUnload()
{
return true;
}
public void OnUpgrade()
{
SetupUI();
}
}
}

View file

@ -1,192 +0,0 @@
namespace ShiftOS.WinForms.Applications
{
partial class TriWrite
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TriWrite));
this.menuStrip1 = new System.Windows.Forms.MenuStrip();
this.addContactToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.removeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.tvcontacts = new System.Windows.Forms.TreeView();
this.panel1 = new System.Windows.Forms.Panel();
this.txtbody = new System.Windows.Forms.Label();
this.lbtitle = new System.Windows.Forms.Label();
this.txtcontents = new System.Windows.Forms.TextBox();
this.menuStrip2 = new System.Windows.Forms.MenuStrip();
this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.menuStrip3 = new System.Windows.Forms.MenuStrip();
this.menuStrip1.SuspendLayout();
this.panel1.SuspendLayout();
this.menuStrip2.SuspendLayout();
this.SuspendLayout();
//
// menuStrip1
//
this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.addContactToolStripMenuItem,
this.removeToolStripMenuItem});
this.menuStrip1.Location = new System.Drawing.Point(0, 0);
this.menuStrip1.Name = "menuStrip1";
this.menuStrip1.Size = new System.Drawing.Size(872, 24);
this.menuStrip1.TabIndex = 0;
this.menuStrip1.Text = "menuStrip1";
//
// addContactToolStripMenuItem
//
this.addContactToolStripMenuItem.Name = "addContactToolStripMenuItem";
this.addContactToolStripMenuItem.Size = new System.Drawing.Size(32, 19);
//
// removeToolStripMenuItem
//
this.removeToolStripMenuItem.Name = "removeToolStripMenuItem";
this.removeToolStripMenuItem.Size = new System.Drawing.Size(32, 19);
//
// tvcontacts
//
this.tvcontacts.Dock = System.Windows.Forms.DockStyle.Left;
this.tvcontacts.Location = new System.Drawing.Point(0, 24);
this.tvcontacts.Name = "tvcontacts";
this.tvcontacts.Size = new System.Drawing.Size(224, 551);
this.tvcontacts.TabIndex = 1;
//
// panel1
//
this.panel1.Controls.Add(this.txtbody);
this.panel1.Controls.Add(this.lbtitle);
this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel1.Location = new System.Drawing.Point(224, 24);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(648, 551);
this.panel1.TabIndex = 2;
//
// txtbody
//
this.txtbody.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.txtbody.Location = new System.Drawing.Point(7, 54);
this.txtbody.Name = "txtbody";
this.txtbody.Size = new System.Drawing.Size(626, 481);
this.txtbody.TabIndex = 1;
this.txtbody.Text = resources.GetString("txtbody.Text");
//
// lbtitle
//
this.lbtitle.AutoSize = true;
this.lbtitle.Location = new System.Drawing.Point(7, 4);
this.lbtitle.Name = "lbtitle";
this.lbtitle.Size = new System.Drawing.Size(44, 13);
this.lbtitle.TabIndex = 0;
this.lbtitle.Tag = "header1";
this.lbtitle.Text = "TriWrite";
//
// txtcontents
//
this.txtcontents.Dock = System.Windows.Forms.DockStyle.Fill;
this.txtcontents.Location = new System.Drawing.Point(0, 53);
this.txtcontents.Multiline = true;
this.txtcontents.Name = "txtcontents";
this.txtcontents.Size = new System.Drawing.Size(527, 460);
this.txtcontents.TabIndex = 1;
this.txtcontents.TabStop = false;
//
// menuStrip2
//
this.menuStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.newToolStripMenuItem,
this.openToolStripMenuItem,
this.saveToolStripMenuItem});
this.menuStrip2.Location = new System.Drawing.Point(0, 0);
this.menuStrip2.Name = "menuStrip2";
this.menuStrip2.Size = new System.Drawing.Size(527, 24);
this.menuStrip2.TabIndex = 2;
this.menuStrip2.Text = "menuStrip2";
//
// newToolStripMenuItem
//
this.newToolStripMenuItem.Name = "newToolStripMenuItem";
this.newToolStripMenuItem.Size = new System.Drawing.Size(43, 20);
this.newToolStripMenuItem.Text = "New";
//
// openToolStripMenuItem
//
this.openToolStripMenuItem.Name = "openToolStripMenuItem";
this.openToolStripMenuItem.Size = new System.Drawing.Size(48, 20);
this.openToolStripMenuItem.Text = "Open";
//
// saveToolStripMenuItem
//
this.saveToolStripMenuItem.Name = "saveToolStripMenuItem";
this.saveToolStripMenuItem.Size = new System.Drawing.Size(43, 20);
this.saveToolStripMenuItem.Text = "Save";
//
// menuStrip3
//
this.menuStrip3.Location = new System.Drawing.Point(0, 30);
this.menuStrip3.Name = "menuStrip3";
this.menuStrip3.Size = new System.Drawing.Size(527, 24);
this.menuStrip3.TabIndex = 3;
this.menuStrip3.Text = "menuStrip3";
//
// TriWrite
//
this.Controls.Add(this.txtcontents);
this.Controls.Add(this.menuStrip3);
this.Controls.Add(this.menuStrip2);
this.Name = "TriWrite";
this.Size = new System.Drawing.Size(527, 513);
this.menuStrip1.ResumeLayout(false);
this.menuStrip1.PerformLayout();
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.menuStrip2.ResumeLayout(false);
this.menuStrip2.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.MenuStrip menuStrip1;
private System.Windows.Forms.ToolStripMenuItem addContactToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem removeToolStripMenuItem;
private System.Windows.Forms.TreeView tvcontacts;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Label txtbody;
private System.Windows.Forms.Label lbtitle;
private System.Windows.Forms.TextBox txtcontents;
private System.Windows.Forms.MenuStrip menuStrip2;
private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem;
private System.Windows.Forms.MenuStrip menuStrip3;
}
}

View file

@ -1,76 +0,0 @@
using ShiftOS.Objects.ShiftFS;
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;
using ShiftOS.Engine;
namespace ShiftOS.WinForms.Applications
{
[WinOpen("triwrite")]
[AppscapeEntry("TriWrite", "Part of the trilogy of office applications for enhancement of your system. TriWrite is easliy the best text editor out there for ShiftOS.", 1024, 750, null, "Office")]
[DefaultTitle("TriWrite")]
[Launcher("TriWrite", false, null, "Office")]
public partial class TriWrite : UserControl, IShiftOSWindow
{
public TriWrite()
{
InitializeComponent();
}
private void newToolStripMenuItem_Click(object sender, EventArgs e)
{
txtcontents.Text = "";
}
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
var txt = new List<string>();
txt.Add(".txt");
AppearanceManager.SetupDialog(new FileDialog(txt.ToArray(), FileOpenerStyle.Open, new Action<string>((file) => this.LoadFile(file))));
}
public void LoadFile(string file)
{
txtcontents.Text = Utils.ReadAllText(file);
}
public void SaveFile(string file)
{
Utils.WriteAllText(file, txtcontents.Text);
}
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
var txt = new List<string>();
txt.Add(".txt");
AppearanceManager.SetupDialog(new FileDialog(txt.ToArray(), FileOpenerStyle.Save, new Action<string>((file) => this.SaveFile(file))));
}
public void OnLoad()
{
}
public void OnSkinLoad()
{
}
public bool OnUnload()
{
return true;
}
public void OnUpgrade()
{
}
}
}

View file

@ -130,7 +130,113 @@ To add a contact, simply click "Add Contact", and to remove one, click "Remove".
<metadata name="menuStrip2.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>132, 17</value>
</metadata>
<metadata name="menuStrip3.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>247, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="bold.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG
YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9
0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw
bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc
VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9
c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32
Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo
mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+
kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D
TgDQASA1MVpwzwAAAABJRU5ErkJggg==
</value>
</data>
<data name="italic.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG
YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9
0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw
bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc
VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9
c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32
Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo
mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+
kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D
TgDQASA1MVpwzwAAAABJRU5ErkJggg==
</value>
</data>
<data name="underline.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG
YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9
0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw
bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc
VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9
c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32
Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo
mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+
kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D
TgDQASA1MVpwzwAAAABJRU5ErkJggg==
</value>
</data>
<data name="strikethrough.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG
YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9
0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw
bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc
VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9
c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32
Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo
mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+
kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D
TgDQASA1MVpwzwAAAABJRU5ErkJggg==
</value>
</data>
<data name="left.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG
YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9
0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw
bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc
VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9
c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32
Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo
mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+
kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D
TgDQASA1MVpwzwAAAABJRU5ErkJggg==
</value>
</data>
<data name="center.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG
YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9
0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw
bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc
VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9
c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32
Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo
mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+
kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D
TgDQASA1MVpwzwAAAABJRU5ErkJggg==
</value>
</data>
<data name="right.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG
YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9
0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw
bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc
VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9
c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32
Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo
mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+
kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D
TgDQASA1MVpwzwAAAABJRU5ErkJggg==
</value>
</data>
</root>

View file

@ -86,6 +86,7 @@ namespace ShiftOS.WinForms.Controls
public void WriteLine(string text)
{
Engine.AudioManager.PlayStream(Properties.Resources.writesound);
this.HideSelection = true;
this.Select(this.TextLength, 0);
this.SelectionFont = ConstructFont();
@ -119,6 +120,135 @@ namespace ShiftOS.WinForms.Controls
base.OnMouseUp(mevent);
}
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
if (!TerminalBackend.InStory)
{
switch (e.KeyCode) {
case Keys.Add:
case Keys.Alt:
case Keys.Apps:
case Keys.Attn:
case Keys.BrowserBack:
case Keys.BrowserFavorites:
case Keys.BrowserForward:
case Keys.BrowserHome:
case Keys.BrowserRefresh:
case Keys.BrowserSearch:
case Keys.BrowserStop:
case Keys.Cancel:
case Keys.Capital:
case Keys.Clear:
case Keys.Control:
case Keys.ControlKey:
case Keys.Crsel:
case Keys.Decimal:
case Keys.Divide:
case Keys.Down:
case Keys.End:
case Keys.Enter:
case Keys.EraseEof:
case Keys.Escape:
case Keys.Execute:
case Keys.Exsel:
case Keys.F1:
case Keys.F10:
case Keys.F11:
case Keys.F12:
case Keys.F13:
case Keys.F14:
case Keys.F15:
case Keys.F16:
case Keys.F17:
case Keys.F18:
case Keys.F19:
case Keys.F2:
case Keys.F20:
case Keys.F21:
case Keys.F22:
case Keys.F23:
case Keys.F24:
case Keys.F3:
case Keys.F4:
case Keys.F5:
case Keys.F6:
case Keys.F7:
case Keys.F8:
case Keys.F9:
case Keys.FinalMode:
case Keys.HanguelMode:
case Keys.HanjaMode:
case Keys.Help:
case Keys.Home:
case Keys.IMEAccept:
case Keys.IMEConvert:
case Keys.IMEModeChange:
case Keys.IMENonconvert:
case Keys.Insert:
case Keys.JunjaMode:
case Keys.KeyCode:
case Keys.LaunchApplication1:
case Keys.LaunchApplication2:
case Keys.LaunchMail:
case Keys.LButton:
case Keys.LControlKey:
case Keys.Left:
case Keys.LineFeed:
case Keys.LMenu:
case Keys.LShiftKey:
case Keys.LWin:
case Keys.MButton:
case Keys.MediaNextTrack:
case Keys.MediaPlayPause:
case Keys.MediaPreviousTrack:
case Keys.MediaStop:
case Keys.Menu:
case Keys.Modifiers:
case Keys.Multiply:
case Keys.Next:
case Keys.NoName:
case Keys.None:
case Keys.NumLock:
case Keys.Pa1:
case Keys.Packet:
case Keys.PageUp:
case Keys.Pause:
case Keys.Play:
case Keys.Print:
case Keys.PrintScreen:
case Keys.ProcessKey:
case Keys.RButton:
case Keys.RControlKey:
case Keys.Right:
case Keys.RMenu:
case Keys.RShiftKey:
case Keys.RWin:
case Keys.Scroll:
case Keys.Select:
case Keys.SelectMedia:
case Keys.Separator:
case Keys.Shift:
case Keys.ShiftKey:
case Keys.Sleep:
case Keys.Subtract:
case Keys.Tab:
case Keys.Up:
case Keys.VolumeDown:
case Keys.VolumeMute:
case Keys.VolumeUp:
case Keys.XButton1:
case Keys.XButton2:
case Keys.Zoom:
break;
default:
//Engine.AudioManager.PlayStream(Properties.Resources.typesound); // infernal beeping noise only enable for the trailers
break;
}
}
}
public TerminalBox() : base()
{
this.Tag = "keepbg keepfg keepfont";

View file

@ -0,0 +1,62 @@
namespace ShiftOS.WinForms.DesktopWidgets
{
partial class HeartbeatWidget
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.lbheartbeat = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// lbheartbeat
//
this.lbheartbeat.AutoSize = true;
this.lbheartbeat.Dock = System.Windows.Forms.DockStyle.Fill;
this.lbheartbeat.Location = new System.Drawing.Point(0, 0);
this.lbheartbeat.Name = "lbheartbeat";
this.lbheartbeat.Size = new System.Drawing.Size(35, 13);
this.lbheartbeat.TabIndex = 0;
this.lbheartbeat.Text = "label1";
//
// HeartbeatWidget
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoSize = true;
this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.Controls.Add(this.lbheartbeat);
this.Name = "HeartbeatWidget";
this.Size = new System.Drawing.Size(35, 13);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label lbheartbeat;
}
}

View file

@ -0,0 +1,51 @@
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;
using ShiftOS.WinForms.Tools;
using ShiftOS.Engine;
namespace ShiftOS.WinForms.DesktopWidgets
{
[DesktopWidget("Server ping", "See the time spent between client requests and server replies in the digital society.")]
public partial class HeartbeatWidget : UserControl, IDesktopWidget
{
public HeartbeatWidget()
{
InitializeComponent();
tmr.Interval = 1;
tmr.Tick += (o, a) =>
{
if(ts != ServerManager.DigitalSocietyPing)
{
ts = ServerManager.DigitalSocietyPing;
lbheartbeat.Text = "Server ping: " + ts.ToString() + " MS";
}
};
}
//Fun fact. I misspelled this as "TimeSpam."
long ts = 0;
public void OnSkinLoad()
{
ControlManager.SetupControls(this);
}
public void OnUpgrade()
{
}
Timer tmr = new Timer();
public void Setup()
{
tmr.Start();
}
}
}

View file

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

135
ShiftOS.WinForms/GUILogin.Designer.cs generated Normal file
View file

@ -0,0 +1,135 @@
namespace ShiftOS.WinForms
{
partial class GUILogin
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.pnlloginform = new System.Windows.Forms.Panel();
this.btnlogin = new System.Windows.Forms.Button();
this.txtpassword = new System.Windows.Forms.TextBox();
this.txtusername = new System.Windows.Forms.TextBox();
this.lblogintitle = new System.Windows.Forms.Label();
this.btnshutdown = new System.Windows.Forms.Button();
this.pnlloginform.SuspendLayout();
this.SuspendLayout();
//
// pnlloginform
//
this.pnlloginform.Controls.Add(this.btnlogin);
this.pnlloginform.Controls.Add(this.txtpassword);
this.pnlloginform.Controls.Add(this.txtusername);
this.pnlloginform.Location = new System.Drawing.Point(13, 13);
this.pnlloginform.Name = "pnlloginform";
this.pnlloginform.Size = new System.Drawing.Size(358, 236);
this.pnlloginform.TabIndex = 0;
this.pnlloginform.Tag = "";
//
// btnlogin
//
this.btnlogin.AutoSize = true;
this.btnlogin.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.btnlogin.Location = new System.Drawing.Point(159, 163);
this.btnlogin.Name = "btnlogin";
this.btnlogin.Size = new System.Drawing.Size(43, 23);
this.btnlogin.TabIndex = 2;
this.btnlogin.Text = "Login";
this.btnlogin.UseVisualStyleBackColor = true;
this.btnlogin.Click += new System.EventHandler(this.btnlogin_Click);
//
// txtpassword
//
this.txtpassword.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtpassword.Location = new System.Drawing.Point(69, 115);
this.txtpassword.Name = "txtpassword";
this.txtpassword.Size = new System.Drawing.Size(300, 20);
this.txtpassword.TabIndex = 1;
this.txtpassword.UseSystemPasswordChar = true;
//
// txtusername
//
this.txtusername.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtusername.Location = new System.Drawing.Point(3, 14);
this.txtusername.Name = "txtusername";
this.txtusername.Size = new System.Drawing.Size(300, 20);
this.txtusername.TabIndex = 0;
//
// lblogintitle
//
this.lblogintitle.AutoSize = true;
this.lblogintitle.Location = new System.Drawing.Point(99, 553);
this.lblogintitle.Name = "lblogintitle";
this.lblogintitle.Size = new System.Drawing.Size(103, 13);
this.lblogintitle.TabIndex = 1;
this.lblogintitle.Tag = "header1 keepbg";
this.lblogintitle.Text = "Welcome to ShiftOS";
//
// btnshutdown
//
this.btnshutdown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnshutdown.AutoSize = true;
this.btnshutdown.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.btnshutdown.Location = new System.Drawing.Point(924, 652);
this.btnshutdown.Name = "btnshutdown";
this.btnshutdown.Size = new System.Drawing.Size(65, 23);
this.btnshutdown.TabIndex = 2;
this.btnshutdown.Text = "Shutdown";
this.btnshutdown.UseVisualStyleBackColor = true;
this.btnshutdown.Click += new System.EventHandler(this.btnshutdown_Click);
//
// GUILogin
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.Black;
this.ClientSize = new System.Drawing.Size(1001, 687);
this.Controls.Add(this.btnshutdown);
this.Controls.Add(this.lblogintitle);
this.Controls.Add(this.pnlloginform);
this.ForeColor = System.Drawing.Color.White;
this.Name = "GUILogin";
this.Text = "GUILogin";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.GUILogin_FormClosing);
this.Load += new System.EventHandler(this.GUILogin_Load);
this.pnlloginform.ResumeLayout(false);
this.pnlloginform.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Panel pnlloginform;
private System.Windows.Forms.Button btnlogin;
private System.Windows.Forms.TextBox txtpassword;
private System.Windows.Forms.TextBox txtusername;
private System.Windows.Forms.Label lblogintitle;
private System.Windows.Forms.Button btnshutdown;
}
}

View file

@ -0,0 +1,136 @@
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;
using ShiftOS.Engine;
using ShiftOS.Objects;
using ShiftOS.WinForms.Tools;
namespace ShiftOS.WinForms
{
public partial class GUILogin : Form
{
public GUILogin()
{
InitializeComponent();
uiTimer.Tick += (o, a) =>
{
btnlogin.Left = txtusername.Left + ((txtusername.Width - btnlogin.Width) / 2);
btnlogin.Top = txtpassword.Top + txtpassword.Height + 5;
lblogintitle.Left = pnlloginform.Left + ((pnlloginform.Width - lblogintitle.Width) / 2);
lblogintitle.Top = pnlloginform.Top - lblogintitle.Width - 5;
};
uiTimer.Interval = 100;
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
this.TopMost = true;
}
Timer uiTimer = new Timer();
public event Action<ClientSave> LoginComplete;
private void GUILogin_Load(object sender, EventArgs e)
{
uiTimer.Start();
ControlManager.SetupControl(lblogintitle);
ControlManager.SetupControls(pnlloginform);
ControlManager.SetupControl(btnshutdown);
pnlloginform.CenterParent();
txtusername.CenterParent();
txtusername.Location = new System.Drawing.Point(txtusername.Location.X, 77);
txtpassword.CenterParent();
btnlogin.CenterParent();
btnlogin.Location = new System.Drawing.Point(btnlogin.Location.X, 143);
this.BackColor = SkinEngine.LoadedSkin.LoginScreenColor;
this.BackgroundImage = SkinEngine.GetImage("login");
this.BackgroundImageLayout = SkinEngine.GetImageLayout("login");
}
private ClientSave User = null;
bool userRequestClose = true;
bool shuttingdown = false;
private void GUILogin_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = userRequestClose;
if (!e.Cancel)
{
uiTimer.Stop();
if (shuttingdown == false)
{
LoginComplete?.Invoke(User);
}
}
}
private void btnlogin_Click(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(txtusername.Text))
{
Infobox.Show("Enter a username", "You must enter your username to login.");
return;
}
//Don't check for blank passwords.
var user = SaveSystem.CurrentSave.Users.FirstOrDefault(x => x.Username == txtusername.Text);
if(user == null)
{
Infobox.Show("Invalid username", "That username was not found on your system.");
return;
}
if (user.Password != txtpassword.Text)
{
Infobox.Show("Access denied.", "That password didn't work. Please try a different one.");
return;
}
User = user;
userRequestClose = false;
shuttingdown = false;
this.Close();
}
private void btnshutdown_Click(object sender, EventArgs e)
{
userRequestClose = false;
shuttingdown = true;
this.Close();
SaveSystem.CurrentUser = SaveSystem.CurrentSave.Users.FirstOrDefault(x => x.Username == "root");
TerminalBackend.InvokeCommand("sos.shutdown");
}
}
public class GUILoginFrontend : ILoginFrontend
{
public bool UseGUILogin
{
get
{
return Shiftorium.UpgradeInstalled("gui_based_login_screen");
}
}
public event Action<ClientSave> LoginComplete;
public void Login()
{
var lform = new GUILogin();
lform.LoginComplete += (user) =>
{
LoginComplete?.Invoke(user);
};
lform.Show();
}
}
}

View file

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View file

@ -312,11 +312,15 @@ You must join the digital society, rise up the ranks, and save us.
sve.Codepoints = 0;
sve.Upgrades = new Dictionary<string, bool>();
sve.ID = Guid.NewGuid();
sve.StoriesExperienced = new List<string>();
sve.StoriesExperienced.Add("mud_fundamentals");
Infobox.Show("Welcome to ShiftOS.", "Welcome to ShiftOS, " + client.GetDisplayName() + ". We have created a save file for you. Now, go on and Shift It Your Way.", () =>
{
sve.StoryPosition = 8675309;
SaveSystem.CurrentSave = sve;
Shiftorium.Silent = true;
SaveSystem.SaveGame();
Shiftorium.Silent = false;
});
}

View file

@ -120,7 +120,7 @@ namespace ShiftOS.WinForms
Console.Write(" ");
ConsoleEx.BackgroundColor = ConsoleColor.Black;
}
Engine.AudioManager.PlayStream(Properties.Resources.typesound);
Desktop.InvokeOnWorkerThread(() => Engine.AudioManager.PlayStream(Properties.Resources.typesound));
formatProgress++;
Thread.Sleep(175);
}
@ -135,15 +135,15 @@ namespace ShiftOS.WinForms
{
Console.WriteLine("Creating: " + dir);
Thread.Sleep(125);
Engine.AudioManager.PlayStream(Properties.Resources.writesound);
Desktop.InvokeOnWorkerThread(() => Engine.AudioManager.PlayStream(Properties.Resources.writesound));
}
}
Console.WriteLine();
Console.WriteLine("Next, let's get user information.");
Console.WriteLine();
ShiftOS.Engine.OutOfBoxExperience.PromptForLogin();
}
private static bool isValid(string text, string chars)
{
foreach(var c in text)

View file

@ -49,6 +49,7 @@ namespace ShiftOS.WinForms
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//if ANYONE puts code before those two winforms config lines they will be declared a drunky. - Michael
LoginManager.Init(new GUILoginFrontend());
CrashHandler.SetGameMetadata(Assembly.GetExecutingAssembly());
SkinEngine.SetIconProber(new ShiftOSIconProvider());
ShiftOS.Engine.AudioManager.Init(new ShiftOSAudioProvider());

View file

@ -7,6 +7,13 @@
Dependencies: "desktop",
Category: "Enhancements",
},
{
Name: "GUI Based Login Screen",
Cost: 500,
Description: "Tired of using the text-based login screen in ShiftOS? Well, we have a functioning window manager, and a functioning desktop, why not use these tools to create a functioning and awesome-looking login screen?",
Dependencies: "skinning;desktop;wm_free_placement",
Category: "Kernel & System"
},
{
Name: "Shift Screensavers",
Cost: 100,

View file

@ -70,9 +70,7 @@
<Compile Include="Applications\About.Designer.cs">
<DependentUpon>About.cs</DependentUpon>
</Compile>
<Compile Include="Applications\TriWrite.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Applications\TriWrite.cs" />
<Compile Include="Applications\TriWrite.Designer.cs">
<DependentUpon>TriWrite.cs</DependentUpon>
</Compile>
@ -178,9 +176,7 @@
<Compile Include="Applications\Notifications.Designer.cs">
<DependentUpon>Notifications.cs</DependentUpon>
</Compile>
<Compile Include="Applications\Pong.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Applications\Pong.cs" />
<Compile Include="Applications\Pong.Designer.cs">
<DependentUpon>Pong.cs</DependentUpon>
</Compile>
@ -202,9 +198,7 @@
<Compile Include="Applications\Shiftnet.Designer.cs">
<DependentUpon>Shiftnet.cs</DependentUpon>
</Compile>
<Compile Include="Applications\ShiftoriumFrontend.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Applications\ShiftoriumFrontend.cs" />
<Compile Include="Applications\ShiftoriumFrontend.Designer.cs">
<DependentUpon>ShiftoriumFrontend.cs</DependentUpon>
</Compile>
@ -226,9 +220,7 @@
<Compile Include="Applications\ShopItemCreator.Designer.cs">
<DependentUpon>ShopItemCreator.cs</DependentUpon>
</Compile>
<Compile Include="Applications\Skin Loader.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Applications\Skin Loader.cs" />
<Compile Include="Applications\Skin Loader.Designer.cs">
<DependentUpon>Skin Loader.cs</DependentUpon>
</Compile>
@ -298,6 +290,12 @@
<Compile Include="DesktopWidgets\CodepointsWidget.Designer.cs">
<DependentUpon>CodepointsWidget.cs</DependentUpon>
</Compile>
<Compile Include="DesktopWidgets\HeartbeatWidget.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="DesktopWidgets\HeartbeatWidget.Designer.cs">
<DependentUpon>HeartbeatWidget.cs</DependentUpon>
</Compile>
<Compile Include="DesktopWidgets\TerminalWidget.cs">
<SubType>UserControl</SubType>
</Compile>
@ -317,6 +315,12 @@
<DependentUpon>DownloadControl.cs</DependentUpon>
</Compile>
<Compile Include="GUIFunctions.cs" />
<Compile Include="GUILogin.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="GUILogin.Designer.cs">
<DependentUpon>GUILogin.cs</DependentUpon>
</Compile>
<Compile Include="HackerCommands.cs" />
<Compile Include="IDesktopWidget.cs" />
<Compile Include="JobTasks.cs" />
@ -502,6 +506,9 @@
<EmbeddedResource Include="DesktopWidgets\CodepointsWidget.resx">
<DependentUpon>CodepointsWidget.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="DesktopWidgets\HeartbeatWidget.resx">
<DependentUpon>HeartbeatWidget.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="DesktopWidgets\TerminalWidget.resx">
<DependentUpon>TerminalWidget.cs</DependentUpon>
</EmbeddedResource>
@ -511,6 +518,9 @@
<EmbeddedResource Include="DownloadControl.resx">
<DependentUpon>DownloadControl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="GUILogin.resx">
<DependentUpon>GUILogin.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Oobe.resx">
<DependentUpon>Oobe.cs</DependentUpon>
</EmbeddedResource>

View file

@ -9,6 +9,7 @@ using System.Threading.Tasks;
using System.Windows.Forms;
using ShiftOS.Engine;
using System.Net;
using ShiftOS.Objects;
namespace ShiftOS.WinForms
{
@ -59,7 +60,7 @@ namespace ShiftOS.WinForms
try
{
var webrequest = HttpWebRequest.Create("http://getshiftos.ml/Auth/Login?appname=ShiftOS&appdesc=ShiftOS+client&version=1_0_beta_2_4");
var webrequest = HttpWebRequest.Create(UserConfig.Get().UniteUrl + "/Auth/Login?appname=ShiftOS&appdesc=ShiftOS+client&version=1_0_beta_2_4");
string base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{u}:{p}"));
webrequest.Headers.Add("Authentication: Basic " + base64);
var response = webrequest.GetResponse();

View file

@ -10,6 +10,7 @@ using System.Windows.Forms;
using ShiftOS.Engine;
using Newtonsoft.Json;
using System.Net;
using ShiftOS.Objects;
namespace ShiftOS.WinForms
{
@ -99,7 +100,7 @@ namespace ShiftOS.WinForms
try
{
var webrequest = HttpWebRequest.Create("http://getshiftos.ml/Auth/Register?appname=ShiftOS&appdesc=ShiftOS+client&version=1_0_beta_2_4&displayname=" + txtdisplay.Text + "&sysname=" + txtsysname.Text);
var webrequest = HttpWebRequest.Create(UserConfig.Get().UniteUrl + "/Auth/Register?appname=ShiftOS&appdesc=ShiftOS+client&version=1_0_beta_2_4&displayname=" + txtdisplay.Text + "&sysname=" + txtsysname.Text);
string base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{u}:{p}"));
webrequest.Headers.Add("Authentication: Basic " + base64);
var response = webrequest.GetResponse();

View file

@ -515,6 +515,17 @@ namespace ShiftOS.WinForms
if(resizing == true)
{
this.Width += e.X;
switch (LoadedSkin.TitleTextCentered)
{
case false:
lbtitletext.Location = new Point(16 + LoadedSkin.TitlebarIconFromSide.X + LoadedSkin.TitleTextLeft.X,
LoadedSkin.TitleTextLeft.Y);
break;
default:
lbtitletext.Left = (pnltitle.Width - lbtitletext.Width) / 2;
lbtitletext.Top = LoadedSkin.TitleTextLeft.Y;
break;
}
}
}
@ -522,6 +533,17 @@ namespace ShiftOS.WinForms
{
resizing = false;
pnlcontents.Show();
switch (LoadedSkin.TitleTextCentered)
{
case false:
lbtitletext.Location = new Point(16 + LoadedSkin.TitlebarIconFromSide.X + LoadedSkin.TitleTextLeft.X,
LoadedSkin.TitleTextLeft.Y);
break;
default:
lbtitletext.Left = (pnltitle.Width - lbtitletext.Width) / 2;
lbtitletext.Top = LoadedSkin.TitleTextLeft.Y;
break;
}
}
private void pnlleft_MouseMove(object sender, MouseEventArgs e)
@ -530,6 +552,17 @@ namespace ShiftOS.WinForms
{
this.Left += e.X;
this.Width -= e.X;
switch (LoadedSkin.TitleTextCentered)
{
case false:
lbtitletext.Location = new Point(16 + LoadedSkin.TitlebarIconFromSide.X + LoadedSkin.TitleTextLeft.X,
LoadedSkin.TitleTextLeft.Y);
break;
default:
lbtitletext.Left = (pnltitle.Width - lbtitletext.Width) / 2;
lbtitletext.Top = LoadedSkin.TitleTextLeft.Y;
break;
}
}
}
@ -547,6 +580,17 @@ namespace ShiftOS.WinForms
{
this.Width += e.X;
this.Height += e.Y;
switch (LoadedSkin.TitleTextCentered)
{
case false:
lbtitletext.Location = new Point(16 + LoadedSkin.TitlebarIconFromSide.X + LoadedSkin.TitleTextLeft.X,
LoadedSkin.TitleTextLeft.Y);
break;
default:
lbtitletext.Left = (pnltitle.Width - lbtitletext.Width) / 2;
lbtitletext.Top = LoadedSkin.TitleTextLeft.Y;
break;
}
}
}
@ -557,6 +601,17 @@ namespace ShiftOS.WinForms
this.Width -= e.X;
this.Height += e.Y;
this.Left += e.X;
switch (LoadedSkin.TitleTextCentered)
{
case false:
lbtitletext.Location = new Point(16 + LoadedSkin.TitlebarIconFromSide.X + LoadedSkin.TitleTextLeft.X,
LoadedSkin.TitleTextLeft.Y);
break;
default:
lbtitletext.Left = (pnltitle.Width - lbtitletext.Width) / 2;
lbtitletext.Top = LoadedSkin.TitleTextLeft.Y;
break;
}
}
}

View file

@ -276,6 +276,17 @@ namespace ShiftOS.Engine
return true;
}
[Command("restart")]
public static bool Restart()
{
SaveSystem.CurrentSave.Upgrades = new Dictionary<string, bool>();
SaveSystem.CurrentSave.Codepoints = 0;
SaveSystem.CurrentSave.StoriesExperienced.Clear();
SaveSystem.CurrentSave.StoriesExperienced.Add("mud_fundamentals");
SaveSystem.SaveGame();
Shiftorium.InvokeUpgradeInstalled();
return true;
}
[Command("freecp")]
public static bool FreeCodepoints(Dictionary<string, object> args)
@ -283,8 +294,8 @@ namespace ShiftOS.Engine
if (args.ContainsKey("amount"))
try
{
Int64 codepointsToAdd = Convert.ToInt64(args["amount"].ToString());
SaveSystem.TransferCodepointsFrom("dev", codepointsToAdd);
long codepointsToAdd = Convert.ToInt64(args["amount"].ToString());
SaveSystem.CurrentSave.Codepoints += codepointsToAdd;
return true;
}
catch (Exception ex)
@ -293,7 +304,7 @@ namespace ShiftOS.Engine
return true;
}
SaveSystem.TransferCodepointsFrom("dev", 1000);
SaveSystem.CurrentSave.Codepoints += 1000;
return true;
}

View file

@ -0,0 +1,65 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ShiftOS.Objects;
namespace ShiftOS.Engine
{
public static class LoginManager
{
private static ILoginFrontend _login = null;
public static void Init(ILoginFrontend login)
{
_login = login;
}
public static void PromptForLogin()
{
_login.LoginComplete += (user) =>
{
LoginComplete?.Invoke(user);
};
_login.Login();
}
public static bool ShouldUseGUILogin
{
get
{
if (_login == null)
return false;
return _login.UseGUILogin;
}
}
public static event Action<ClientSave> LoginComplete;
}
/// <summary>
/// Interface for GUI-based logins.
/// </summary>
public interface ILoginFrontend
{
/// <summary>
/// When implemented, shows the login UI.
/// </summary>
void Login();
/// <summary>
/// Gets whether the ShiftOS engine should use a GUI-based login system or the default one.
/// </summary>
bool UseGUILogin { get; }
/// <summary>
/// Occurs when the login is complete.
/// </summary>
event Action<ClientSave> LoginComplete;
}
}

View file

@ -70,7 +70,7 @@ namespace ShiftOS.Engine
{
var root = new ShiftOS.Objects.ShiftFS.Directory();
root.Name = "System";
root.permissions = Permissions.All;
root.permissions = UserPermissions.Guest;
System.IO.File.WriteAllText(Paths.SaveFile, JsonConvert.SerializeObject(root));
}
@ -98,13 +98,25 @@ 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("{CONNECTING_TO_MUD}");
Console.WriteLine("[inetd] Connecting to network...");
if (defaultConf.ConnectToMud == true)
{
@ -113,32 +125,32 @@ namespace ShiftOS.Engine
{
//Connection successful! Stop waiting!
guidReceived = true;
Console.WriteLine("Connection successful.");
Console.WriteLine("[inetd] Connection successful.");
};
try
{
ServerManager.Initiate("secondary4162.cloudapp.net", 13370);
ServerManager.Initiate(UserConfig.Get().DigitalSocietyAddress, UserConfig.Get().DigitalSocietyPort);
//This haults the client until the connection is successful.
while (ServerManager.thisGuid == new Guid())
{
Thread.Sleep(10);
}
Console.WriteLine("GUID received - bootstrapping complete.");
Console.WriteLine("[inetd] DHCP GUID recieved, finished setup");
FinishBootstrap();
}
catch (Exception ex)
{
//No errors, this never gets called.
Console.WriteLine("{ERROR}: " + ex.Message);
Console.WriteLine("[inetd] SEVERE: " + ex.Message);
Thread.Sleep(3000);
ServerManager.StartLANServer();
while (ServerManager.thisGuid == new Guid())
{
Thread.Sleep(10);
}
Console.WriteLine("GUID received - bootstrapping complete.");
Console.WriteLine("[inetd] DHCP GUID recieved, finished setup");
FinishBootstrap();
}
}
@ -196,14 +208,60 @@ 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;
bool gobacktosysname = false;
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) =>
{
if (string.IsNullOrWhiteSpace(name))
Infobox.Show("Invalid name", "Please enter a valid name.", () =>
{
gobacktosysname = true;
waitingForNewSysName = false;
});
else if (name.Length < 5)
Infobox.Show("Value too small.", "Your system name must have at least 5 characters in it.", () =>
{
gobacktosysname = true;
waitingForNewSysName = false;
});
else
{
CurrentSave.SystemName = name;
if (!string.IsNullOrWhiteSpace(CurrentSave.UniteAuthToken))
{
var unite = new Unite.UniteClient("http://getshiftos.ml", CurrentSave.UniteAuthToken);
unite.SetSysName(name);
}
SaveSystem.SaveGame();
gobacktosysname = false;
waitingForNewSysName = false;
}
});
}
while (waitingForNewSysName)
{
Thread.Sleep(10);
}
if (gobacktosysname)
{
goto Sysname;
}
if (CurrentSave.Users == null)
CurrentSave.Users = new List<ClientSave>();
if(CurrentSave.Users.Count == 0)
if (CurrentSave.Users.Count == 0)
{
CurrentSave.Users.Add(new ClientSave
{
@ -211,76 +269,101 @@ 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)
{
if (progress == 0)
Action<ClientSave> Completed = null;
Completed += (user) =>
{
if (!string.IsNullOrWhiteSpace(text))
CurrentUser = user;
LoginManager.LoginComplete -= Completed;
};
LoginManager.LoginComplete += Completed;
Desktop.InvokeOnWorkerThread(() =>
{
LoginManager.PromptForLogin();
});
while (CurrentUser == null)
{
Thread.Sleep(10);
}
}
else
{
Login:
string username = "";
int progress = 0;
bool goback = false;
TextSentEventHandler ev = null;
ev = (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.");
if (CurrentSave.Users.FirstOrDefault(x => x.Username == getuser) == null)
{
Console.WriteLine("User not found.");
goback = true;
progress++;
TerminalBackend.TextSent -= ev;
return;
}
username = getuser;
progress++;
}
else
{
Console.WriteLine("Username not provided.");
TerminalBackend.TextSent -= ev;
goback = true;
progress++;
TerminalBackend.TextSent -= ev;
return;
}
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("Welcome to ShiftOS.");
CurrentUser = user;
Thread.Sleep(2000);
progress++;
}
else
{
Console.WriteLine("Access denied.");
goback = true;
progress++;
}
TerminalBackend.TextSent -= ev;
goback = true;
progress++;
}
}
else if (progress == 1)
};
TerminalBackend.TextSent += ev;
Console.Write(CurrentSave.SystemName + " login: ");
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.Write("password: ");
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(() =>

View file

@ -35,6 +35,7 @@ using ShiftOS;
using static ShiftOS.Engine.SaveSystem;
using Newtonsoft.Json;
using System.Net.Sockets;
using System.Diagnostics;
namespace ShiftOS.Engine
{
@ -54,6 +55,12 @@ namespace ShiftOS.Engine
private static NetObjectClient client { get; set; }
private static bool UserDisconnect = false;
public static long DigitalSocietyPing
{
get;
private set;
}
public static void Disconnect()
{
UserDisconnect = true;
@ -139,6 +146,11 @@ namespace ShiftOS.Engine
};
client.OnReceived += (o, a) =>
{
if (PingTimer.IsRunning)
{
DigitalSocietyPing = PingTimer.ElapsedMilliseconds;
PingTimer.Reset();
}
var msg = a.Data.Object as ServerMessage;
if (msg.Name == "Welcome")
{
@ -207,6 +219,8 @@ namespace ShiftOS.Engine
}
}
private static Stopwatch PingTimer = new Stopwatch();
public static void SendMessage(string name, string contents)
{
var sMsg = new ServerMessage
@ -215,7 +229,7 @@ namespace ShiftOS.Engine
Contents = contents,
GUID = thisGuid.ToString(),
};
PingTimer.Start();
client.Send(new NetObject("msg", sMsg));
}

View file

@ -111,6 +111,7 @@
<Compile Include="IShiftOSWindow.cs" />
<Compile Include="KernelWatchdog.cs" />
<Compile Include="Localization.cs" />
<Compile Include="LoginManager.cs" />
<Compile Include="NotificationDaemon.cs" />
<Compile Include="OutOfBoxExperience.cs" />
<Compile Include="Paths.cs" />

View file

@ -267,6 +267,22 @@ namespace ShiftOS.Engine
[ShifterHidden]
public Dictionary<string, byte[]> AppIcons = new Dictionary<string, byte[]>();
[ShifterMeta("System")]
[ShifterCategory("Login Screen")]
[RequiresUpgrade("gui_based_login_screen")]
[ShifterName("Login Screen Background Color")]
[ShifterDescription("Change the background color of the login screen.")]
public Color LoginScreenColor = Skin.DesktopBG;
[ShifterMeta("System")]
[ShifterCategory("Login Screen")]
[RequiresUpgrade("skinning;gui_based_login_screen")]
[ShifterName("Login Screen Background Image")]
[ShifterDescription("Set an image as your login screen!")]
[Image("login")]
public byte[] LoginScreenBG = null;
[RequiresUpgrade("shift_screensaver")]
[ShifterMeta("System")]
[ShifterCategory("Screen saver")]

View file

@ -5,13 +5,20 @@ using System.Net;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using ShiftOS.Objects;
namespace ShiftOS.Unite
{
public class UniteClient
{
public string Token { get; private set; }
public string BaseURL { get; private set; }
public string BaseURL
{
get
{
return UserConfig.Get().UniteUrl;
}
}
public string GetDisplayNameId(string id)
{
@ -25,7 +32,8 @@ namespace ShiftOS.Unite
public UniteClient(string baseurl, string usertoken)
{
BaseURL = baseurl;
//Handled by the servers.json file
//BaseURL = baseurl;
Token = usertoken;
}

View file

@ -47,6 +47,11 @@ namespace ShiftOS.Engine
}
var user = SaveSystem.CurrentSave.Users.FirstOrDefault(x => x.Username == name);
if(user.Username != SaveSystem.CurrentUser.Username)
{
Console.WriteLine("Error: Cannot remove yourself.");
return true;
}
SaveSystem.CurrentSave.Users.Remove(user);
Console.WriteLine($"Removing user \"{name}\" from system...");
SaveSystem.SaveGame();
@ -55,13 +60,121 @@ namespace ShiftOS.Engine
[Command("set_acl")]
[RequiresArgument("user")]
[RequiresArgument("val")]
public static bool SetUserPermission(Dictionary<string, object> args)
{
int permission = 0;
string username = args["user"].ToString();
try
{
permission = Convert.ToInt32(args["val"].ToString());
}
catch
{
Console.WriteLine("Error: Permission value must be an integer.");
return true;
}
if(SaveSystem.CurrentSave.Users.FirstOrDefault(x=>x.Username==username) == null)
{
Console.WriteLine("Error: User not found.");
return true;
}
UserPermissions uperm = UserPermissions.Guest;
switch (permission)
{
case 0:
uperm = UserPermissions.Guest;
break;
case 1:
uperm = UserPermissions.User;
break;
case 2:
uperm = UserPermissions.Admin;
break;
case 3:
uperm = UserPermissions.Root;
break;
default:
Console.WriteLine("Permission value must be between 0 and 4.");
return true;
}
//Permissions are backwards... oops...
if(uperm < SaveSystem.CurrentUser.Permissions)
{
Console.WriteLine("Error: Cannot set user permissions to values greater than your own!");
return true;
}
var oldperm = SaveSystem.Users.FirstOrDefault(x => x.Username == username).Permissions;
if (SaveSystem.CurrentUser.Permissions > oldperm)
{
Console.WriteLine("Error: Can't set the permission of this user. They have more rights than you.");
return true;
}
SaveSystem.CurrentSave.Users.FirstOrDefault(x => x.Username == username).Permissions = uperm;
Console.WriteLine("User permissions updated.");
return true;
}
[Command("users", description = "Get a list of all users on the system.")]
public static bool GetUsers()
{
foreach (var u in SaveSystem.CurrentSave.Users)
{
if (u.Username == SaveSystem.CurrentUser.Username)
{
ConsoleEx.ForegroundColor = ConsoleColor.Magenta;
ConsoleEx.Bold = true;
}
else
{
ConsoleEx.ForegroundColor = ConsoleColor.Gray;
ConsoleEx.Bold = false;
}
Console.WriteLine(u.Username);
}
return true;
}
}
[Namespace("user")]
[RequiresUpgrade("mud_fundamentals")]
public static class UserManagementCommands
{
[Command("login", description = "Log in as another user.")]
[RequiresArgument("user")]
[RequiresArgument("pass")]
public static bool Login(Dictionary<string, object> args)
{
string user = args["user"].ToString();
string pass = args["pass"].ToString();
var usr = SaveSystem.CurrentSave.Users.FirstOrDefault(x => x.Username == user);
if(usr==null)
{
Console.WriteLine("Error: No such user.");
return true;
}
if (usr.Password != pass)
{
Console.WriteLine("Access denied.");
return true;
}
SaveSystem.CurrentUser = usr;
Console.WriteLine("Access granted.");
return true;
}
[Command("setpass", description ="Allows you to set your password to a new value.", usage ="old:,new:")]
[RequiresArgument("old")]