diff options
| author | Michael <[email protected]> | 2017-06-15 17:08:42 -0400 |
|---|---|---|
| committer | Michael <[email protected]> | 2017-06-15 17:08:42 -0400 |
| commit | e6d58c235c4d772cd5245d89cdc7dde6207165b8 (patch) | |
| tree | da0371b483a6e9f29f3d7988edfa721b2084c6f7 /ShiftOS.WinForms/Applications/Pong.cs | |
| parent | effbf091b72d2c75af18dac6ac7036a6141aec9a (diff) | |
| download | shiftos_thereturn-e6d58c235c4d772cd5245d89cdc7dde6207165b8.tar.gz shiftos_thereturn-e6d58c235c4d772cd5245d89cdc7dde6207165b8.tar.bz2 shiftos_thereturn-e6d58c235c4d772cd5245d89cdc7dde6207165b8.zip | |
Use GDI+ to render Pong
Diffstat (limited to 'ShiftOS.WinForms/Applications/Pong.cs')
| -rw-r--r-- | ShiftOS.WinForms/Applications/Pong.cs | 995 |
1 files changed, 85 insertions, 910 deletions
diff --git a/ShiftOS.WinForms/Applications/Pong.cs b/ShiftOS.WinForms/Applications/Pong.cs index 87f0306..a88d69f 100644 --- a/ShiftOS.WinForms/Applications/Pong.cs +++ b/ShiftOS.WinForms/Applications/Pong.cs @@ -1,1011 +1,186 @@ -/* - * 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; using System.Collections.Generic; using System.ComponentModel; -using System.Data; using System.Drawing; +using System.Data; 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")] + [DefaultTitle("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 + paddleWidth = pnlcanvas.Width / 30; + drawTimer = new Timer(); + drawTimer.Interval = 16; + drawTimer.Tick += (o, a) => { - 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; + UpdateBall(); + pnlcanvas.Refresh(); + }; } - int OpponentY = 0; - - bool IsLeader = true; + private double ballX = 0.0f; + private double ballY = 0.0f; - 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(); - } - } - } + private double speedFactor = 0.025; - // 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(); - } - } + private double xVel = 1; + private double yVel = 1; - if (IsMultiplayerSession) - { - if (IsLeader) - { - ServerManager.Forward(OpponentGUID, "pong_mp_setballpos", JsonConvert.SerializeObject(ball.Location)); - } - } + private int paddleWidth; - 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); - } - } - } + private double playerY = 0.0; + private double opponentY = 0.0; - public void ServerMessageReceivedHandler(ServerMessage msg) + public void UpdateBall() { - if (IsMultiplayerSession) - { - 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_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)); - } - } - } + double ballXLocal = linear(ballX, -1.0, 1.0, 0, pnlcanvas.Width); + double ballYLocal = linear(ballY, -1.0, 1.0, 0, pnlcanvas.Height); - bool OpponentAgrees = false; - bool YouAgree = false; + ballXLocal -= ((double)paddleWidth / 2); + ballYLocal -= ((double)paddleWidth / 2); - 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); - } - } + double playerYLocal = linear(playerY, -1.0, 1.0, 0, pnlcanvas.Height); + double opponentYLocal = linear(opponentY, -1.0, 1.0, 0, pnlcanvas.Height); - if (PossibleMatchmakes.Count > 0) - { - lbmpstatus.Text = "Select a player."; - } - else - { - lbmpstatus.Text = "Waiting for players..."; - } - } + int paddleHeight = pnlcanvas.Height / 5; - public void NotifyLoseToTarget() - { - ServerManager.Forward(OpponentGUID, "pong_mp_youwin", null); - } - public void NotifyWinToTarget() - { - ServerManager.Forward(OpponentGUID, "pong_mp_youlose", null); - } + Rectangle ballRect = new Rectangle((int)ballXLocal, (int)ballYLocal, paddleWidth, paddleWidth); - public void LeaveMatchmake() - { - ServerManager.Forward("all", "pong_handshake_left", YouGUID); - } + Rectangle playerRect = new Rectangle((int)paddleWidth, (int)(playerYLocal - (int)(paddleHeight / 2)), (int)paddleWidth, (int)paddleHeight); + Rectangle opponentRect = new Rectangle((int)(pnlcanvas.Width - (paddleWidth * 2)), (int)(opponentYLocal - (int)(paddleHeight / 2)), (int)paddleWidth, (int)paddleHeight); - List<string> PossibleMatchmakes = new List<string>(); + //Top and bottom walls: + if (ballRect.Top <= 0 || ballRect.Bottom >= pnlcanvas.Height) + yVel = -yVel; //reverse the Y velocity - public void SendLeaderGUID(string target) - { - ServerManager.Forward(target, "pong_handshake_chosen", YouGUID); - } + //Left and right walls (NOTE: TEMPORARY) + if (ballRect.Left <= 0 || ballRect.Right >= pnlcanvas.Width) + xVel = -xVel; //reverse the Y velocity - 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) + //Enemy paddle: + if (ballRect.IntersectsWith(opponentRect)) + { + //check if the ball x is greater than the player paddle's middle coordinate + if (ballRect.Right <= opponentRect.Right - (opponentRect.Width / 2)) + { + //reverse x velocity to send the ball the other way 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(); - } + //set y velocity based on where the ball hit the paddle + yVel = linear((ballRect.Top + (ballRect.Height / 2)), opponentRect.Top, opponentRect.Bottom, -1, 1); - 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) + //Player paddle: + if (ballRect.IntersectsWith(playerRect)) { - if (this.Left < Screen.PrimaryScreen.Bounds.Width) + //check if the ball x is greater than the player paddle's middle coordinate + if(ballRect.Left >= playerRect.Left + (playerRect.Width / 2)) { - 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); + //reverse x velocity to send the ball the other way + xVel = -xVel; - int rndinc = rand.Next(1, 6); - if (rndinc == 5) - incrementy += 0.3; - else - incrementy += (((rndinc - 1) % 2) + 1) / 10; + //set y velocity based on where the ball hit the paddle + yVel = linear((ballRect.Top + (ballRect.Height / 2)), playerRect.Top, playerRect.Bottom, -1, 1); - 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(); + ballX += xVel * speedFactor; + ballY += yVel * speedFactor; - 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) + private void pnlcanvas_Paint(object sender, PaintEventArgs e) { - pnlhighscore.BringToFront(); - SetupHighScores(); - } - bool IsMultiplayerSession = false; + paddleWidth = pnlcanvas.Width / 30; + double ballXLocal = linear(ballX, -1.0, 1.0, 0, pnlcanvas.Width); + double ballYLocal = linear(ballY, -1.0, 1.0, 0, pnlcanvas.Height); - string YouGUID = ""; - string OpponentGUID = ""; + ballXLocal -= ((double)paddleWidth / 2); + ballYLocal -= ((double)paddleWidth / 2); - 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(); - } + e.Graphics.Clear(pnlcanvas.BackColor); - // ERROR: Handles clauses are not supported in C# - private void btnplayagain_Click(object sender, EventArgs e) - { - newgame(); - } + //draw the ball + e.Graphics.FillEllipse(new SolidBrush(pnlcanvas.ForeColor), new RectangleF((float)ballXLocal, (float)ballYLocal, (float)paddleWidth, (float)paddleWidth)); - // ERROR: Handles clauses are not supported in C# - private void btnlosetryagain_Click(object sender, EventArgs e) - { - newgame(); - } + double playerYLocal = linear(playerY, -1.0, 1.0, 0, pnlcanvas.Height); + double opponentYLocal = linear(opponentY, -1.0, 1.0, 0, pnlcanvas.Height); - public void StartLevel() - { - newgame(); - } + int paddleHeight = pnlcanvas.Height / 5; - // ERROR: Handles clauses are not supported in C# - private void btnstartgame_Click(object sender, EventArgs e) - { - newgame(); - } + int paddleStart = paddleWidth; - 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); + //draw player paddle + e.Graphics.FillRectangle(new SolidBrush(pnlcanvas.ForeColor), new RectangleF((float)paddleWidth, (float)(playerYLocal - (float)(paddleHeight / 2)), (float)paddleWidth, (float)paddleHeight)); - if (i >= 25 && i <= 50) - tmrstoryline.Stop(); + //draw opponent + e.Graphics.FillRectangle(new SolidBrush(pnlcanvas.ForeColor), new RectangleF((float)(pnlcanvas.Width - (paddleWidth*2)), (float)(opponentYLocal - (float)(paddleHeight / 2)), (float)paddleWidth, (float)paddleHeight)); } - // ERROR: Handles clauses are not supported in C# - private void me_closing(object sender, FormClosingEventArgs e) + static public double linear(double x, double x0, double x1, double y0, double y1) { - tmrstoryline.Stop(); - } - - private void ball_MouseEnter(object sender, EventArgs e) - { - aiShouldIsbeEnabled = false; + if ((x1 - x0) == 0) + { + return (y0 + y1) / 2; + } + return y0 + (x - x0) * (y1 - y0) / (x1 - x0); } - private void ball_MouseLeave(object sender, EventArgs e) - { - aiShouldIsbeEnabled = true; - } + Timer drawTimer = null; public void OnLoad() { - pnlintro.BringToFront(); - pnlintro.Show(); - pnlhighscore.Hide(); - pnlgamestats.Hide(); - pnlfinalstats.Hide(); - CenterPanels(); - lblbeatai.Hide(); - ServerManager.MessageReceived += this.ServerMessageReceivedHandler; + drawTimer.Start(); } 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; - + drawTimer.Stop(); 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) + private void pnlcanvas_MouseMove(object sender, MouseEventArgs e) { - if (lvotherplayers.SelectedItems.Count > 0) - { - SendLeaderGUID(lvotherplayers.SelectedItems[0].Text); - } + playerY = linear(e.Y, 0, pnlcanvas.Height, -1, 1); } } -}
\ No newline at end of file +} |
