Fixed Pong?

there are some sound crashes but Michael told me to just make the
PR and let him fix the audio backend so that's what I'm doing.
This commit is contained in:
RogueAI42 2017-06-03 00:43:20 +10:00
parent ce5469464a
commit 17f3f6f685
3 changed files with 140 additions and 272 deletions

View file

@ -182,7 +182,6 @@ namespace ShiftOS.WinForms.Applications
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);
//
// pnlmultiplayerhandshake
@ -250,7 +249,6 @@ namespace ShiftOS.WinForms.Applications
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
//
@ -273,7 +271,6 @@ namespace ShiftOS.WinForms.Applications
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);
//
// pnlhighscore
//

View file

@ -60,11 +60,60 @@ namespace ShiftOS.WinForms.Applications
int levelyspeed = 3;
ulong beatairewardtotal;
ulong beataireward = 1;
ulong[] levelrewards = new ulong[50];
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;
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()
{
@ -73,11 +122,9 @@ namespace ShiftOS.WinForms.Applications
private void Pong_Load(object sender, EventArgs e)
{
setuplevelrewards();
rwdmultiplier = ShiftoriumFrontend.UpgradeInstalled("pong_upgrade") ? 2 : 1;
}
// Move the paddle according to the mouse position.
private void pongMain_MouseMove(object sender, MouseEventArgs e)
{
@ -133,9 +180,7 @@ namespace ShiftOS.WinForms.Applications
{
if (this.Left < Screen.PrimaryScreen.Bounds.Width)
{
ball.BackColor = SkinEngine.LoadedSkin.ControlTextColor;
paddleComputer.BackColor = SkinEngine.LoadedSkin.ControlTextColor;
paddleHuman.BackColor = SkinEngine.LoadedSkin.ControlTextColor;
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"))
@ -146,7 +191,7 @@ namespace ShiftOS.WinForms.Applications
//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 (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.
@ -160,83 +205,63 @@ namespace ShiftOS.WinForms.Applications
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);
}
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.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);
}
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);
if (xVel < 0)
else
xVel = (int)-Math.Round(xveldec);
if (yVel > 0)
yVel = (int)Math.Round(yveldec);
if (yVel < 0)
else
yVel = (int)-Math.Round(yveldec);
bool BallPhysics = true;
if (IsMultiplayerSession)
if (IsMultiplayerSession && !IsLeader)
{
//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;
}
// Move it to the leader's ball position.
ball.Location = new Point(LeaderX, LeaderY);
}
else
{// Move the game ball.
ball.Location = new Point(ball.Location.X + xVel, ball.Location.Y + yVel);
}
if (BallPhysics)
{
var newRect = new Rectangle(ball.Location, ball.Size); // copy ball's Bounds
newRect.X += xVel;
newRect.Y += yVel;
// Check for top wall.
if (ball.Location.Y < 0)
if (newRect.Y < 0)
{
ball.Location = new Point(ball.Location.X, 0);
newRect.Y = 0;
yVel = -yVel;
ShiftOS.Engine.AudioManager.PlayStream(Properties.Resources.typesound);
playsound(Properties.Resources.typesound);
}
// Check for bottom wall.
if (ball.Location.Y > pgcontents.Height - ball.Height)
if (newRect.Y > pgcontents.Height - ball.Height)
{
ball.Location = new Point(ball.Location.X, pgcontents.Height - ball.Size.Height);
newRect.Y = pgcontents.Height - ball.Height;
yVel = -yVel;
ShiftOS.Engine.AudioManager.PlayStream(Properties.Resources.typesound);
playsound(Properties.Resources.typesound);
}
// Check for player paddle.
if (ball.Bounds.IntersectsWith(paddleHuman.Bounds))
if (newRect.IntersectsWith(paddleHuman.Bounds))
{
ball.Location = new Point(paddleHuman.Location.X + ball.Size.Width + 1, ball.Location.Y);
newRect.X = paddleHuman.Left + ball.Width + 1;
//randomly increase x or y speed of ball
switch (rand.Next(1, 3))
{
@ -246,23 +271,24 @@ namespace ShiftOS.WinForms.Applications
case 2:
if (yveldec > 0)
yveldec = yveldec + incrementy;
if (yveldec < 0)
else
yveldec = yveldec - incrementy;
break;
}
xVel = -xVel;
ShiftOS.Engine.AudioManager.PlayStream(Properties.Resources.writesound);
playsound(Properties.Resources.writesound);
}
// Check for computer paddle.
if (ball.Bounds.IntersectsWith(paddleComputer.Bounds))
if (newRect.IntersectsWith(paddleComputer.Bounds))
{
ball.Location = new Point(paddleComputer.Location.X - paddleComputer.Size.Width - 1, ball.Location.Y);
newRect.X = paddleComputer.Left - paddleComputer.Width - 1;
xveldec = xveldec + incrementx;
xVel = -xVel;
ShiftOS.Engine.AudioManager.PlayStream(Properties.Resources.writesound);
playsound(Properties.Resources.writesound);
}
ball.Location = newRect.Location;
}
@ -297,11 +323,11 @@ namespace ShiftOS.WinForms.Applications
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 = (ulong)(levelrewards[level - 1] + beatairewardtotal);
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)(totalreward / 100));
SaveSystem.TransferCodepointsFrom("pong", (ulong)(onePercent));
}
else
{
@ -345,7 +371,7 @@ namespace ShiftOS.WinForms.Applications
//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] + beatairewardtotal).ToString();
lblstatscodepoints.Text = "Codepoints: " + (levelrewards[level - 1] * (ulong) rwdmultiplier + beatairewardtotal).ToString();
lbllevelandtime.Text = "Level: " + level + " - " + secondsleft + " seconds left";
if (xVel > 20 || xVel < -20)
@ -355,8 +381,7 @@ namespace ShiftOS.WinForms.Applications
}
else
{
paddleHuman.Width = 20;
paddleComputer.Width = 20;
paddleHuman.Width = paddleComputer.Width = 20;
}
}
if (!IsMultiplayerSession)
@ -415,7 +440,7 @@ namespace ShiftOS.WinForms.Applications
StartLevel();
}));
}
else if(msg.Name == "pong_mp_levelcompleted")
else if (msg.Name == "pong_mp_levelcompleted")
{
level = Convert.ToInt32(msg.Contents) + 1;
this.Invoke(new Action(CompleteLevel));
@ -434,7 +459,7 @@ namespace ShiftOS.WinForms.Applications
pnlmultiplayerhandshake.Hide();
}));
}
else if(msg.Name == "pong_mp_cashedout")
else if (msg.Name == "pong_mp_cashedout")
{
this.Invoke(new Action(() =>
{
@ -442,19 +467,19 @@ namespace ShiftOS.WinForms.Applications
}));
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")
else if (msg.Name == "pong_mp_startlevel")
{
OpponentAgrees = true;
if(YouAgree == false)
if (YouAgree == false)
{
Infobox.PromptYesNo("Play another level?", "The opponent wants to play another level. Would you like to as well?", (answer)=>
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")
else if (msg.Name == "pong_mp_level_callback")
{
bool agreed = bool.Parse(msg.Contents);
OpponentAgrees = agreed;
@ -472,7 +497,7 @@ namespace ShiftOS.WinForms.Applications
this.PossibleMatchmakes.Remove(msg.Contents);
this.Invoke(new Action(ListMatchmakes));
}
else if(msg.Name == "pong_mp_clockupdate")
else if (msg.Name == "pong_mp_clockupdate")
{
secondsleft = Convert.ToInt32(msg.Contents);
}
@ -566,7 +591,7 @@ namespace ShiftOS.WinForms.Applications
public void LoseMP()
{
ball.Location = new Point(this.Size.Width / 2 + 200, this.Size.Height / 2);
if(IsLeader)
if (IsLeader)
if (xVel > 0)
xVel = -xVel;
lblbeatai.Show();
@ -634,7 +659,7 @@ namespace ShiftOS.WinForms.Applications
CompleteLevel();
}
lblstatscodepoints.Text = "Codepoints: " + (levelrewards[level - 1] + beatairewardtotal).ToString();
lblstatscodepoints.Text = "Codepoints: " + (levelrewards[level - 1] * (ulong) rwdmultiplier + beatairewardtotal).ToString();
}
}
SetupStats();
@ -670,200 +695,56 @@ namespace ShiftOS.WinForms.Applications
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;
}
levelxspeed += rand.Next(1, 3);
switch (rand.Next(1, 3))
{
case 1:
levelyspeed = levelyspeed + 1;
break;
case 2:
levelyspeed = levelyspeed + 2;
break;
}
levelyspeed += rand.Next(1, 3);
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;
}
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 = (ulong)(level * 10);
} else
{
beataireward = (ulong)(level * 5);
}
beataireward *= 2;
}
else
{
if (ShiftoriumFrontend.UpgradeInstalled("pong_upgrade"))
{
double br = levelrewards[level - 1] / 10;
beataireward = (ulong)Math.Round(br) * 10;
} else
{
double br = levelrewards[level - 1] / 10;
beataireward = (ulong)Math.Round(br) * 5;
}
}
beataireward = levelrewards[level - 1];
else
beataireward = (ulong)Math.Round((double) levelrewards[level - 1] / 2);
totalreward = levelrewards[level - 1] + beatairewardtotal;
totalreward = levelrewards[level - 1] * (ulong) rwdmultiplier + 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)
if (countdown == 0)
{
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;
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);
}
}
@ -874,7 +755,7 @@ namespace ShiftOS.WinForms.Applications
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();
lblfinallevelreward.Text = (levelrewards[level - 1] * rwdmultiplier).ToString();
lblfinalcomputerreward.Text = beatairewardtotal.ToString();
lblfinalcodepoints.Text = totalreward + Localization.Parse(" {CODEPOINTS_SHORT}");
SaveSystem.TransferCodepointsFrom("pong", totalreward);
@ -912,7 +793,8 @@ namespace ShiftOS.WinForms.Applications
if (ShiftoriumFrontend.UpgradeInstalled("pong_upgrade"))
{
beataireward = 10;
} else
}
else
{
beataireward = 5;
}
@ -981,7 +863,7 @@ namespace ShiftOS.WinForms.Applications
var hs = unite.GetPongHighscores();
foreach (var score in hs.Highscores)
{
if(this.ParentForm.Visible == false)
if (this.ParentForm.Visible == false)
{
Thread.CurrentThread.Abort();
}
@ -1000,7 +882,7 @@ namespace ShiftOS.WinForms.Applications
{
try
{
if (this.ParentForm.Visible == true)
if (this.ParentForm.Visible)
{
Infobox.Show("Service unavailable.", "The Pong Highscore service is unavailable at this time.");
this.Invoke(new Action(pnlgamestats.BringToFront));
@ -1030,7 +912,7 @@ namespace ShiftOS.WinForms.Applications
{
newgame();
}
// ERROR: Handles clauses are not supported in C#
private void btnstartgame_Click(object sender, EventArgs e)
{
@ -1045,9 +927,7 @@ namespace ShiftOS.WinForms.Applications
int i = rand.Next(0, 100);
if (i >= 25 && i <= 50)
{
tmrstoryline.Stop();
}
}
@ -1057,25 +937,13 @@ namespace ShiftOS.WinForms.Applications
tmrstoryline.Stop();
}
private void Label6_Click(object sender, EventArgs e)
private void ball_MouseEnter(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) {
private void ball_MouseLeave(object sender, EventArgs e)
{
aiShouldIsbeEnabled = true;
}
@ -1102,9 +970,9 @@ namespace ShiftOS.WinForms.Applications
public bool OnUnload()
{
if(IsMultiplayerSession == true)
if (IsMultiplayerSession)
{
if(!string.IsNullOrWhiteSpace(OpponentGUID))
if (!string.IsNullOrWhiteSpace(OpponentGUID))
ServerManager.Forward(OpponentGUID, "pong_mp_left", null);
LeaveMatchmake();
}
@ -1134,10 +1002,10 @@ namespace ShiftOS.WinForms.Applications
private void lvotherplayers_DoubleClick(object sender, EventArgs e)
{
if(lvotherplayers.SelectedItems.Count > 0)
if (lvotherplayers.SelectedItems.Count > 0)
{
SendLeaderGUID(lvotherplayers.SelectedItems[0].Text);
}
}
}
}
}

View file

@ -129,4 +129,7 @@
<metadata name="tmrstoryline.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="soundtimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>472, 17</value>
</metadata>
</root>