private static int SaveWorldTiles(BinaryWriter writer)
{
byte[] buffer = new byte[13];
for (int i = 0; i < Main.maxTilesX; i++)
{
float num12 = ((float)i) / ((float)Main.maxTilesX);
Main.statusText = string.Concat(new object[] { Lang.gen[0x31], " ", (int)((num12 * 100f) + 1f), "%" });
for (int j = 0; j < Main.maxTilesY; j++)
{
byte num9;
byte num10;
int num11;
Tile tile = Main.tile[i, j];
int index = 3;
byte num8 = num9 = (byte)(num10 = 0);
bool flag = false;
if (tile.active())
{
flag = true;
if (tile.type == 0x7f)
{
WorldGen.KillTile(i, j, false, false, false);
if (!tile.active())
{
flag = false;
if (Main.netMode != 0)
{
NetMessage.SendData(0x11, -1, -1, "", 0, (float)i, (float)j, 0f, 0, 0, 0);
}
}
}
}
if (flag)
{
num8 = (byte)(num8 | 2);
if (tile.type == 0x7f)
{
WorldGen.KillTile(i, j, false, false, false);
if (!tile.active() && (Main.netMode != 0))
{
NetMessage.SendData(0x11, -1, -1, "", 0, (float)i, (float)j, 0f, 0, 0, 0);
}
}
buffer[index] = (byte)tile.type;
index++;
if (tile.type > 0xff)
{
buffer[index] = (byte)(tile.type >> 8);
index++;
num8 = (byte)(num8 | 0x20);
}
if (Main.tileFrameImportant[tile.type])
{
buffer[index] = (byte)(tile.frameX & 0xff);
index++;
buffer[index] = (byte)((tile.frameX & 0xff00) >> 8);
index++;
buffer[index] = (byte)(tile.frameY & 0xff);
index++;
buffer[index] = (byte)((tile.frameY & 0xff00) >> 8);
index++;
}
if (tile.color() != 0)
{
num10 = (byte)(num10 | 8);
buffer[index] = tile.color();
index++;
}
}
if (tile.wall != 0)
{
num8 = (byte)(num8 | 4);
buffer[index] = tile.wall;
index++;
if (tile.wallColor() != 0)
{
num10 = (byte)(num10 | 0x10);
buffer[index] = tile.wallColor();
index++;
}
}
if (tile.liquid != 0)
{
if (tile.lava())
{
num8 = (byte)(num8 | 0x10);
}
else if (tile.honey())
{
num8 = (byte)(num8 | 0x18);
}
else
{
num8 = (byte)(num8 | 8);
}
buffer[index] = tile.liquid;
index++;
}
if (tile.k_HasWireFlags(k_WireFlags.WIRE_RED))
{
num9 = (byte)(num9 | 2);
}
if (tile.k_HasWireFlags(k_WireFlags.WIRE_GREEN))
{
num9 = (byte)(num9 | 4);
}
if (tile.k_HasWireFlags(k_WireFlags.WIRE_BLUE))
{
num9 = (byte)(num9 | 8);
}
if (tile.halfBrick())
{
num11 = 0x10;
}
else if (tile.slope() != 0)
{
num11 = (tile.slope() + 1) << 4;
}
else
{
num11 = 0;
}
num9 = (byte)(num9 | ((byte)num11));
if (tile.k_HasWireFlags(k_WireFlags.WIRE_ACTUATOR))
{
num10 = (byte)(num10 | 2);
}
if (tile.inActive())
{
num10 = (byte)(num10 | 4);
}
int num7 = 2;
if (num10 != 0)
{
num9 = (byte)(num9 | 1);
buffer[num7] = num10;
num7--;
}
if (num9 != 0)
{
num8 = (byte)(num8 | 1);
buffer[num7] = num9;
num7--;
}
short num4 = 0;
int num3 = j + 1;
int num5 = (Main.maxTilesY - j) - 1;
while (num5 > 0)
{
if (!tile.isTheSameAs(Main.tile[i, num3]))
{
break;
}
num4 = (short)(num4 + 1);
num5--;
num3++;
}
j += num4;
if (num4 > 0)
{
buffer[index] = (byte)(num4 & 0xff);
index++;
if (num4 > 0xff)
{
num8 = (byte)(num8 | 0x80);
buffer[index] = (byte)((num4 & 0xff00) >> 8);
index++;
}
else
{
num8 = (byte)(num8 | 0x40);
}
}
buffer[num7] = num8;
writer.Write(buffer, num7, index - num7);
}
}
return (int)writer.BaseStream.Position;
}