/* * 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; ulong beatairewardtotal; ulong beataireward = 1; readonly uint[] levelrewards = { 0, 20, 60, 140, 290, 400, 600, 900, 1200, 1600, 2000, 2500, 3000, 4000, 5000, 6000, 8000, 10000, 13000, 16000, 20000, 25000, 32000, 40000, 50000, 60000, 75000, 90000, 110000, 140000, 180000, 220000, 270000, 320000, 400000, 500000, 640000, 800000, 1000000, 1500000, 2000000}; ulong totalreward; int countdown = 3; int rwdmultiplier; Thread soundThread; bool aiShouldIsbeEnabled = true; // who named this variable? and were they having a stroke? private void playsound(System.IO.Stream stream) { soundThread = new Thread((a) => ShiftOS.Engine.AudioManager.PlayStream((System.IO.Stream)a)); soundThread.Start(stream); } public Pong() { InitializeComponent(); } private void Pong_Load(object sender, EventArgs e) { rwdmultiplier = ShiftoriumFrontend.UpgradeInstalled("pong_upgrade") ? 2 : 1; } // 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 = true; 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 = paddleComputer.BackColor = 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) { //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.Top > paddleComputer.Top + 50) paddleComputer.Top += computerspeed; else paddleComputer.Top -= 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.Top > this.Height / 2 - paddleComputer.Height + casualposition) paddleComputer.Top -= computerspeed; else paddleComputer.Top += computerspeed; } } //Set Xvel and Yvel speeds from decimal if (xVel > 0) xVel = (int)Math.Round(xveldec); else xVel = (int)-Math.Round(xveldec); if (yVel > 0) yVel = (int)Math.Round(yveldec); else yVel = (int)-Math.Round(yveldec); if (IsMultiplayerSession && !IsLeader) { // Move it to the leader's ball position. ball.Location = new Point(LeaderX, LeaderY); } else { var newRect = new Rectangle(ball.Location, ball.Size); // copy ball's Bounds newRect.X += xVel; newRect.Y += yVel; // Check for top wall. if (newRect.Y < 0) { newRect.Y = 0; yVel = -yVel; playsound(Properties.Resources.typesound); } // Check for bottom wall. if (newRect.Y > pgcontents.Height - ball.Height) { newRect.Y = pgcontents.Height - ball.Height; yVel = -yVel; playsound(Properties.Resources.typesound); } // Check for player paddle. if (newRect.IntersectsWith(paddleHuman.Bounds)) { newRect.X = paddleHuman.Left + ball.Width + 1; //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; else yveldec = yveldec - incrementy; break; } xVel = -xVel; playsound(Properties.Resources.writesound); } // Check for computer paddle. if (newRect.IntersectsWith(paddleComputer.Bounds)) { newRect.X = paddleComputer.Left - paddleComputer.Width - 1; xveldec = xveldec + incrementx; xVel = -xVel; playsound(Properties.Resources.writesound); } ball.Location = newRect.Location; } // 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] * (ulong) rwdmultiplier + beatairewardtotal); double onePercent = (totalreward / 100); lblbutyougained.Show(); lblbutyougained.Text = Localization.Parse("{BUT_YOU_GAINED}:") + Environment.NewLine + onePercent.ToString("") + (Localization.Parse(" {CODEPOINTS}")); SaveSystem.TransferCodepointsFrom("pong", (ulong)(onePercent)); } 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 = "X vel: " + xveldec; lblstatsY.Text = "Y vel: " + yveldec; lblstatscodepoints.Text = "Codepoints: " + (levelrewards[level - 1] * (ulong) rwdmultiplier + beatairewardtotal).ToString(); lbllevelandtime.Text = "Level: " + level + " - " + secondsleft + " seconds left"; if (xVel > 20 || xVel < -20) { paddleHuman.Width = Math.Abs(xVel); paddleComputer.Width = Math.Abs(xVel); } else { paddleHuman.Width = paddleComputer.Width = 20; } } if (!IsMultiplayerSession) { computerspeed = Math.Abs(yVel); } } } public void ServerMessageReceivedHandler(ServerMessage msg) { if (IsMultiplayerSession) { if (msg.Name == "pong_mp_setballpos") { var pt = JsonConvert.DeserializeObject(msg.Contents); LeaderX = pt.X; LeaderY = pt.Y; } else if (msg.Name == "pong_mp_left") { this.Invoke(new Action(() => { AppearanceManager.Close(this); })); Infobox.Show("Opponent has closed Pong.", "The opponent has closed Pong, therefore the connection between you two has dropped."); } else if (msg.Name == "pong_mp_youlose") { this.Invoke(new Action(LoseMP)); } else if (msg.Name == "pong_mp_setopponenty") { int y = Convert.ToInt32(msg.Contents); OpponentY = y; } else if (msg.Name == "pong_handshake_matchmake") { if (!PossibleMatchmakes.Contains(msg.Contents)) PossibleMatchmakes.Add(msg.Contents); this.Invoke(new Action(ListMatchmakes)); } else if (msg.Name == "pong_handshake_resendid") { ServerManager.Forward("all", "pong_handshake_matchmake", YouGUID); } else if (msg.Name == "pong_handshake_complete") { IsLeader = true; OpponentGUID = msg.Contents; LeaveMatchmake(); this.Invoke(new Action(() => { pnlmultiplayerhandshake.Hide(); StartLevel(); })); } else if (msg.Name == "pong_mp_levelcompleted") { level = Convert.ToInt32(msg.Contents) + 1; this.Invoke(new Action(CompleteLevel)); } else if (msg.Name == "pong_handshake_chosen") { IsLeader = false; LeaveMatchmake(); OpponentGUID = msg.Contents; YouGUID = ServerManager.thisGuid.ToString(); //Start the timers. counter.Start(); SendFollowerGUID(); this.Invoke(new Action(() => { pnlmultiplayerhandshake.Hide(); })); } else if (msg.Name == "pong_mp_cashedout") { this.Invoke(new Action(() => { btncashout_Click(this, EventArgs.Empty); })); Infobox.Show("Cashed out.", "The other player has cashed out their Codepoints. Therefore, we have automatically cashed yours out."); } else if (msg.Name == "pong_mp_startlevel") { OpponentAgrees = true; if (YouAgree == false) { Infobox.PromptYesNo("Play another level?", "The opponent wants to play another level. Would you like to as well?", (answer) => { YouAgree = answer; ServerManager.Forward(OpponentGUID, "pong_mp_level_callback", YouAgree.ToString()); }); } } else if (msg.Name == "pong_mp_level_callback") { bool agreed = bool.Parse(msg.Contents); OpponentAgrees = agreed; if (OpponentAgrees) { if (IsLeader) { //this.Invoke(new Action(())) } } } else if (msg.Name == "pong_handshake_left") { if (this.PossibleMatchmakes.Contains(msg.Contents)) this.PossibleMatchmakes.Remove(msg.Contents); this.Invoke(new Action(ListMatchmakes)); } else if (msg.Name == "pong_mp_clockupdate") { secondsleft = Convert.ToInt32(msg.Contents); } else if (msg.Name == "pong_mp_youwin") { this.Invoke(new Action(Win)); } } } bool OpponentAgrees = false; bool YouAgree = false; public void ListMatchmakes() { lvotherplayers.Items.Clear(); var c = new ColumnHeader(); c.Width = lvotherplayers.Width; c.Text = "Player"; lvotherplayers.Columns.Clear(); lvotherplayers.Columns.Add(c); lvotherplayers.FullRowSelect = true; foreach (var itm in PossibleMatchmakes) { if (itm != YouGUID) { var l = new ListViewItem(); l.Text = itm; lvotherplayers.Items.Add(l); } } if (PossibleMatchmakes.Count > 0) { lbmpstatus.Text = "Select a player."; } else { lbmpstatus.Text = "Waiting for players..."; } } 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 PossibleMatchmakes = new List(); public void SendLeaderGUID(string target) { ServerManager.Forward(target, "pong_handshake_chosen", YouGUID); } public void StartMultiplayer() { IsMultiplayerSession = true; YouGUID = ServerManager.thisGuid.ToString(); ServerManager.SendMessage("pong_handshake_matchmake", YouGUID); StartMatchmake(); } public void StartMatchmake() { pnlmultiplayerhandshake.Show(); pnlmultiplayerhandshake.CenterParent(); pnlmultiplayerhandshake.BringToFront(); ServerManager.Forward("all", "pong_handshake_resendid", null); } public void SendFollowerGUID() { ServerManager.Forward(OpponentGUID, "pong_handshake_complete", 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(); } public void CompleteLevel() { 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 { } } //Only set these stats if the user is the leader. if (IsLeader) { secondsleft = 60; level = level + 1; 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(); } // ERROR: Handles clauses are not supported in C# private void counter_Tick(object sender, EventArgs e) { if (IsLeader) { if (this.Left < Screen.PrimaryScreen.Bounds.Width) { secondsleft = secondsleft - 1; if (secondsleft == 0) { CompleteLevel(); } lblstatscodepoints.Text = "Codepoints: " + (levelrewards[level - 1] * (ulong) rwdmultiplier + 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); levelxspeed += rand.Next(1, 3); levelyspeed += rand.Next(1, 3); int rndinc = rand.Next(1, 6); if (rndinc == 5) incrementy += 0.3; else incrementy += (((rndinc - 1) % 2) + 1) / 10; 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) { beataireward = (ulong)(level * 5); if (ShiftoriumFrontend.UpgradeInstalled("pong_upgrade")) beataireward *= 2; } else if (ShiftoriumFrontend.UpgradeInstalled("pong_upgrade")) beataireward = levelrewards[level - 1]; else beataireward = (ulong)Math.Round((double) levelrewards[level - 1] / 2); totalreward = levelrewards[level - 1] * (ulong) rwdmultiplier + beatairewardtotal; btncashout.Text = Localization.Parse("{CASH_OUT_WITH_CODEPOINTS}"); btnplayon.Text = Localization.Parse("{PONG_PLAY_ON_FOR_MORE}"); } // ERROR: Handles clauses are not supported in C# private void countdown_Tick(object sender, EventArgs e) { if (this.Left < Screen.PrimaryScreen.Bounds.Width) { if (countdown == 0) { countdown = 3; lblcountdown.Hide(); lblbeatai.Hide(); gameTimer.Start(); counter.Start(); tmrcountdown.Stop(); return; } if (!lblcountdown.Visible) lblcountdown.Show(); lblcountdown.Text = countdown.ToString(); countdown -= 1; playsound(Properties.Resources.typesound); } } // 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] * rwdmultiplier).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); } } if (IsMultiplayerSession) { ServerManager.Forward(OpponentGUID, "pong_mp_cashedout", null); StopMultiplayerSession(); } } public void StopMultiplayerSession() { IsMultiplayerSession = false; IsLeader = true; OpponentGUID = ""; YouGUID = ""; } 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) { if (this.ParentForm.Visible == false) { Thread.CurrentThread.Abort(); } 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 { try { if (this.ParentForm.Visible) { Infobox.Show("Service unavailable.", "The Pong Highscore service is unavailable at this time."); this.Invoke(new Action(pnlgamestats.BringToFront)); } } catch { } //JUST. ABORT. THE. FUCKING. THREAD. 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 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(); ServerManager.MessageReceived += this.ServerMessageReceivedHandler; } public void OnSkinLoad() { CenterPanels(); this.SizeChanged += (o, a) => { CenterPanels(); }; } public bool OnUnload() { if (IsMultiplayerSession) { if (!string.IsNullOrWhiteSpace(OpponentGUID)) ServerManager.Forward(OpponentGUID, "pong_mp_left", null); LeaveMatchmake(); } ServerManager.MessageReceived -= this.ServerMessageReceivedHandler; 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; } private void lvotherplayers_DoubleClick(object sender, EventArgs e) { if (lvotherplayers.SelectedItems.Count > 0) { SendLeaderGUID(lvotherplayers.SelectedItems[0].Text); } } } }