Terraria.IO.WorldFile.SaveWorldTiles C# (CSharp) Method

SaveWorldTiles() private static method

private static SaveWorldTiles ( BinaryWriter writer ) : int
writer System.IO.BinaryWriter
return int
        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;
        }