Ok. I honestly though I got out of this phase.
private void saveFileDialog1_FileOk(object sender, CancelEventArgs e)
{
List<int> wallX = new List<int>();
List<int> wallY = new List<int>();
List<Color> wallColor = new List<Color>();
List<int> spikeX = new List<int>();
List<int> spikeY = new List<int>();
List<int> switchX = new List<int>();
List<int> switchY = new List<int>();
List<Color> switchColor = new List<Color>();
List<int> laserWallX = new List<int>();
List<int> laserWallY = new List<int>();
List<Color> laserWallColor = new List<Color>();
List<int> laserX = new List<int>();
List<int> laserY = new List<int>();
List<Color> laserColor = new List<Color>();
List<bool> isHorizontal = new List<bool>();
int ballX = -1;
int ballY = -1;
Color ballColor = Color.Transparent;
int exitX = -1;
int exitY = -1;
for (int x = 0; x < tiles.GetLength(0); x++)
for (int y = 0; y < tiles.GetLength(1); y++)
{
switch (tiles[x, y])
{
case Tiles.GrayWall:
wallX.Add(x);
wallY.Add(y);
wallColor.Add(Color.Gray);
break;
case Tiles.CyanWall:
wallX.Add(x);
wallY.Add(y);
wallColor.Add(Color.Cyan);
break;
case Tiles.YellowWall:
wallX.Add(x);
wallY.Add(y);
wallColor.Add(Color.Yellow);
break;
case Tiles.MagentaWall:
wallX.Add(x);
wallY.Add(y);
wallColor.Add(Color.Magenta);
break;
case Tiles.GrayLaserWall:
laserWallX.Add(x);
laserWallY.Add(y);
laserWallColor.Add(Color.Gray);
break;
case Tiles.CyanLaserWall:
laserWallX.Add(x);
laserWallY.Add(y);
laserWallColor.Add(Color.Cyan);
break;
case Tiles.YellowLaserWall:
laserWallX.Add(x);
laserWallY.Add(y);
laserWallColor.Add(Color.Yellow);
break;
case Tiles.MagentaLaserWall:
laserWallX.Add(x);
laserWallY.Add(y);
laserWallColor.Add(Color.Magenta);
break;
case Tiles.GraySwitch:
switchX.Add(x);
switchY.Add(y);
switchColor.Add(Color.Gray);
break;
case Tiles.RedSwitch:
switchX.Add(x);
switchY.Add(y);
switchColor.Add(Color.Red);
break;
case Tiles.BlueSwitch:
switchX.Add(x);
switchY.Add(y);
switchColor.Add(Color.Blue);
break;
case Tiles.GreenSwitch:
switchX.Add(x);
switchY.Add(y);
switchColor.Add(Color.Green);
break;
case Tiles.Spikes:
spikeX.Add(x);
spikeY.Add(y);
break;
case Tiles.Exit:
exitX = x;
exitY = y;
break;
case Tiles.GrayBall:
ballX = x;
ballY = y;
ballColor = Color.Gray;
break;
case Tiles.RedBall:
ballX = x;
ballY = y;
ballColor = Color.Red;
break;
case Tiles.BlueBall:
ballX = x;
ballY = y;
ballColor = Color.Blue;
break;
case Tiles.GreenBall:
ballX = x;
ballY = y;
ballColor = Color.Green;
break;
case Tiles.HorizontalGrayLaser:
laserX.Add(x);
laserY.Add(y);
laserColor.Add(Color.Gray);
isHorizontal.Add(true);
break;
case Tiles.HorizontalRedLaser:
laserX.Add(x);
laserY.Add(y);
laserColor.Add(Color.Red);
isHorizontal.Add(true);
break;
case Tiles.HorizontalBlueLaser:
laserX.Add(x);
laserY.Add(y);
laserColor.Add(Color.Blue);
isHorizontal.Add(true);
break;
case Tiles.HorizontalGreenLaser:
laserX.Add(x);
laserY.Add(y);
laserColor.Add(Color.Green);
isHorizontal.Add(true);
break;
case Tiles.VerticalGrayLaser:
laserX.Add(x);
laserY.Add(y);
laserColor.Add(Color.Gray);
isHorizontal.Add(false);
break;
case Tiles.VerticalRedLaser:
laserX.Add(x);
laserY.Add(y);
laserColor.Add(Color.Red);
isHorizontal.Add(false);
break;
case Tiles.VerticalBlueLaser:
laserX.Add(x);
laserY.Add(y);
laserColor.Add(Color.Blue);
isHorizontal.Add(false);
break;
case Tiles.VerticalGreenLaser:
laserX.Add(x);
laserY.Add(y);
laserColor.Add(Color.Green);
isHorizontal.Add(false);
break;
}
}
using (BinaryWriter writer = new BinaryWriter(File.Create(saveFileDialog1.FileName)))
{
writer.Write(tiles.GetLength(0));
writer.Write(tiles.GetLength(1));
writer.Write("#");
writer.Write(ballX);
writer.Write(ballY);
writer.Write(ballColor.ToArgb());
writer.Write("#");
writer.Write(exitX);
writer.Write(exitY);
writer.Write("#");
writer.Write(spikeX.Count);
for (int i = 0; i < spikeX.Count; i++)
{
writer.Write(spikeX[i]);
writer.Write(spikeY[i]);
}
writer.Write("#");
writer.Write(wallX.Count);
for (int i = 0; i < wallColor.Count; i++)
{
writer.Write(wallX[i]);
writer.Write(wallY[i]);
writer.Write(wallColor[i].ToArgb());
}
writer.Write("#");
writer.Write(laserWallX.Count);
for (int i = 0; i < laserWallColor.Count; i++)
{
writer.Write(laserWallX[i]);
writer.Write(laserWallY[i]);
writer.Write(laserWallColor[i].ToArgb());
}
writer.Write("#");
writer.Write(switchX.Count);
for (int i = 0; i < switchColor.Count; i++)
{
writer.Write(switchX[i]);
writer.Write(switchY[i]);
writer.Write(switchColor[i].ToArgb());
}
writer.Write("#");
writer.Write(laserX.Count);
for (int i = 0; i < laserX.Count; i++)
{
writer.Write(laserX[i]);
writer.Write(laserY[i]);
writer.Write(laserColor[i].ToArgb());
writer.Write(isHorizontal[i]);
}
writer.Write("#");
}
}
Code is pretty much self explanatory (I hope). And no, I have no idea in which state my mind was when I wrote that.
Now, if I don't get that under 30 lines of maintainable code...
EDIT: I did it. 18 lines of code. Slap me.