Beispiel #1
0
        /// <summary>
        /// Saves the file to the specified stream.
        /// </summary>
        /// <param name="stream">The stream to save to.</param>
        public override void Save(Stream stream)
        {
            BinaryWriter writer = new BinaryWriter(stream, Encoding.GetEncoding("us-ascii"));

            writer.Write(BLOCK_COUNT);
            long[] offsets = new long[BLOCK_COUNT];

            for (int i = 0; i < BLOCK_COUNT; i++)
            {
                writer.Write(i);
                writer.Write(0);
            }

            offsets[0] = stream.Position;
            writer.Write((int)Type);
            writer.Write(Width);
            writer.Write(Height);
            writer.Write(GridCount);
            writer.Write(GridSize);
            writer.Write(StartPosition.X);
            writer.Write(StartPosition.Y);

            for (int x = 0; x < Width; x++)
            {
                for (int y = 0; y < Height; y++)
                {
                    writer.Write(Positions[x, y].IsUsed);
                    writer.Write(Positions[x, y].Position);
                }
            }

            offsets[1] = stream.Position;
            writer.Write(SpawnPoints.Count);

            SpawnPoints.ForEach(spawnPoint => {
                writer.Write(spawnPoint.Position);
                writer.WriteByteString(spawnPoint.Name);
            });

            offsets[2] = stream.Position;
            writer.Write(Textures.Count);

            Textures.ForEach(texture => {
                writer.WriteByteString(texture);
            });

            offsets[3] = stream.Position;
            writer.Write(Tiles.Count);

            Tiles.ForEach(tile => {
                writer.Write(tile.Layer1);
                writer.Write(tile.Layer2);
                writer.Write(tile.Offset1);
                writer.Write(tile.Offset2);
                writer.Write(tile.BlendingEnabled ? 1 : 0);
                writer.Write((int)tile.Rotation);
                writer.Write(tile.TileType);
            });

            offsets[4] = stream.Position;
            writer.WriteByteString(Name);
            writer.Write(IsUnderground ? 1 : 0);
            writer.WriteByteString(BackgroundMusicFilePath);
            writer.WriteByteString(SkyFilePath);
            writer.Write(EconomyCheckRate);
            writer.Write(PopulationBase);
            writer.Write(PopulationGrowthRate);
            writer.Write(MetalConsumption);
            writer.Write(StoneConsumption);
            writer.Write(WoodConsumption);
            writer.Write(LeatherConsumption);
            writer.Write(ClothConsumption);
            writer.Write(AlchemyConsumption);
            writer.Write(ChemicalConsumption);
            writer.Write(IndustrialConsumption);
            writer.Write(MedicineConsumption);
            writer.Write(FoodConsumption);

            for (int i = 0; i < BLOCK_COUNT; i++)
            {
                stream.Seek(sizeof(int) + i * sizeof(int) * 2 + sizeof(int), SeekOrigin.Begin);
                writer.Write((int)offsets[i]);
            }
        }