Exemple #1
0
        private Result Serialize_WZ_Map(Stream stream)
        {
            var returnResult = new Result("Serializing game.map", false);

            logger.Info("Serializing game.map");

            var fileMAP = new BinaryWriter(stream, App.ASCIIEncoding);

            var x = 0;
            var y = 0;

            IOUtil.WriteText(fileMAP, false, "map ");
            fileMAP.Write(10U);
            fileMAP.Write((uint)map.Terrain.TileSize.X);
            fileMAP.Write((uint)map.Terrain.TileSize.Y);
            byte flip             = 0;
            byte rotation         = 0;
            var  doFlipX          = default(bool);
            var  invalidTileCount = 0;
            var  textureNum       = 0;

            for (y = 0; y <= map.Terrain.TileSize.Y - 1; y++)
            {
                for (x = 0; x <= map.Terrain.TileSize.X - 1; x++)
                {
                    TileUtil.TileOrientation_To_OldOrientation(map.Terrain.Tiles[x, y].Texture.Orientation, ref rotation, ref doFlipX);
                    flip = 0;
                    if (map.Terrain.Tiles[x, y].Tri)
                    {
                        flip += 8;
                    }
                    flip += (byte)(rotation * 16);
                    if (doFlipX)
                    {
                        flip += 128;
                    }
                    textureNum = map.Terrain.Tiles[x, y].Texture.TextureNum;
                    if (textureNum < 0 | textureNum > 255)
                    {
                        textureNum = 0;
                        if (invalidTileCount < 16)
                        {
                            returnResult.WarningAdd(string.Format("Tile texture number {0} is invalid on tile {1}, {2} and was compiled as texture number {3}.",
                                                                  map.Terrain.Tiles[x, y].Texture.TextureNum, x, y, textureNum));
                        }
                        invalidTileCount++;
                    }
                    fileMAP.Write((byte)textureNum);
                    fileMAP.Write(flip);
                    fileMAP.Write(map.Terrain.Vertices[x, y].Height);
                }
            }
            if (invalidTileCount > 0)
            {
                returnResult.WarningAdd(string.Format("{0} tile texture numbers were invalid.", invalidTileCount));
            }
            fileMAP.Write(1U); //gateway version
            fileMAP.Write((uint)map.Gateways.Count);
            foreach (var gateway in map.Gateways)
            {
                fileMAP.Write((byte)(MathUtil.ClampInt(gateway.PosA.X, 0, 255)));
                fileMAP.Write((byte)(MathUtil.ClampInt(gateway.PosA.Y, 0, 255)));
                fileMAP.Write((byte)(MathUtil.ClampInt(gateway.PosB.X, 0, 255)));
                fileMAP.Write((byte)(MathUtil.ClampInt(gateway.PosB.Y, 0, 255)));
            }
            fileMAP.Flush();

            return(returnResult);
        }
Exemple #2
0
        public Result Save(string path, bool overwrite, bool compress = false) // Compress is ignored.
        {
            var returnResult =
                new Result("Writing LND to \"{0}\"".Format2(path), false);

            logger.Info("Writing LND to \"{0}\"".Format2(path));

            if (System.IO.File.Exists(path))
            {
                if (overwrite)
                {
                    System.IO.File.Delete(path);
                }
                else
                {
                    returnResult.ProblemAdd("The selected file already exists.");
                    return(returnResult);
                }
            }

            StreamWriter File = null;

            try
            {
                var  text     = "";
                var  endChar  = '\n';
                var  quote    = '\"';;
                var  a        = 0;
                var  x        = 0;
                var  y        = 0;
                byte flip     = 0;
                var  b        = 0;
                var  vf       = 0;
                var  tf       = 0;
                var  c        = 0;
                byte rotation = 0;
                var  flipX    = default(bool);

                File = new StreamWriter(new FileStream(path, FileMode.CreateNew), App.UTF8Encoding);

                if (map.Tileset == App.Tileset_Arizona)
                {
                    text = "DataSet WarzoneDataC1.eds" + Convert.ToString(endChar);
                }
                else if (map.Tileset == App.Tileset_Urban)
                {
                    text = "DataSet WarzoneDataC2.eds" + Convert.ToString(endChar);
                }
                else if (map.Tileset == App.Tileset_Rockies)
                {
                    text = "DataSet WarzoneDataC3.eds" + Convert.ToString(endChar);
                }
                else
                {
                    text = "DataSet " + Convert.ToString(endChar);
                }
                File.Write(text);
                text = "GrdLand {" + Convert.ToString(endChar);
                File.Write(text);
                text = "    Version 4" + Convert.ToString(endChar);
                File.Write(text);
                text = "    3DPosition 0.000000 3072.000000 0.000000" + Convert.ToString(endChar);
                File.Write(text);
                text = "    3DRotation 80.000000 0.000000 0.000000" + Convert.ToString(endChar);
                File.Write(text);
                text = "    2DPosition 0 0" + Convert.ToString(endChar);
                File.Write(text);
                text = "    CustomSnap 16 16" + Convert.ToString(endChar);
                File.Write(text);
                text = "    SnapMode 0" + Convert.ToString(endChar);
                File.Write(text);
                text = "    Gravity 1" + Convert.ToString(endChar);
                File.Write(text);
                text = "    HeightScale " + map.HeightMultiplier.ToStringInvariant() + Convert.ToString(endChar);
                File.Write(text);
                text = "    MapWidth " + map.Terrain.TileSize.X.ToStringInvariant() + Convert.ToString(endChar);
                File.Write(text);
                text = "    MapHeight " + map.Terrain.TileSize.Y.ToStringInvariant() + Convert.ToString(endChar);
                File.Write(text);
                text = "    TileWidth 128" + Convert.ToString(endChar);
                File.Write(text);
                text = "    TileHeight 128" + Convert.ToString(endChar);
                File.Write(text);
                text = "    SeaLevel 0" + Convert.ToString(endChar);
                File.Write(text);
                text = "    TextureWidth 64" + Convert.ToString(endChar);
                File.Write(text);
                text = "    TextureHeight 64" + Convert.ToString(endChar);
                File.Write(text);
                text = "    NumTextures 1" + Convert.ToString(endChar);
                File.Write(text);
                text = "    Textures {" + Convert.ToString(endChar);
                File.Write(text);
                if (map.Tileset == App.Tileset_Arizona)
                {
                    text = "        texpages\\tertilesc1.pcx" + Convert.ToString(endChar);
                }
                else if (map.Tileset == App.Tileset_Urban)
                {
                    text = "        texpages\\tertilesc2.pcx" + Convert.ToString(endChar);
                }
                else if (map.Tileset == App.Tileset_Rockies)
                {
                    text = "        texpages\\tertilesc3.pcx" + Convert.ToString(endChar);
                }
                else
                {
                    text = "        " + Convert.ToString(endChar);
                }
                File.Write(text);
                text = "    }" + Convert.ToString(endChar);
                File.Write(text);
                text = "    NumTiles " + (map.Terrain.TileSize.X * map.Terrain.TileSize.Y).ToStringInvariant() + Convert.ToString(endChar);
                File.Write(text);
                text = "    Tiles {" + Convert.ToString(endChar);
                File.Write(text);
                for (y = 0; y <= map.Terrain.TileSize.Y - 1; y++)
                {
                    for (x = 0; x <= map.Terrain.TileSize.X - 1; x++)
                    {
                        TileUtil.TileOrientation_To_OldOrientation(map.Terrain.Tiles[x, y].Texture.Orientation, ref rotation, ref flipX);
                        flip = 0;
                        if (map.Terrain.Tiles[x, y].Tri)
                        {
                            flip += 2;
                        }
                        if (flipX)
                        {
                            flip += 4;
                        }
                        flip += (byte)(rotation * 16);

                        if (map.Terrain.Tiles[x, y].Tri)
                        {
                            vf = 1;
                        }
                        else
                        {
                            vf = 0;
                        }
                        if (flipX)
                        {
                            tf = 1;
                        }
                        else
                        {
                            tf = 0;
                        }

                        text = "        TID " + (map.Terrain.Tiles[x, y].Texture.TextureNum + 1) + " VF " + vf.ToStringInvariant() + " TF " +
                               tf.ToStringInvariant() + " F " + (flip).ToStringInvariant() + " VH " +
                               Convert.ToByte(map.Terrain.Vertices[x, y].Height).ToStringInvariant() + " " +
                               map.Terrain.Vertices[x + 1, y].Height.ToStringInvariant() + " " + Convert.ToString(map.Terrain.Vertices[x + 1, y + 1].Height) +
                               " " + Convert.ToByte(map.Terrain.Vertices[x, y + 1].Height).ToStringInvariant() + Convert.ToString(endChar);
                        File.Write(text);
                    }
                }
                text = "    }" + Convert.ToString(endChar);
                File.Write(text);
                text = "}" + Convert.ToString(endChar);
                File.Write(text);
                text = "ObjectList {" + Convert.ToString(endChar);
                File.Write(text);
                text = "    Version 3" + Convert.ToString(endChar);
                File.Write(text);
                if (map.Tileset == App.Tileset_Arizona)
                {
                    text = "    FeatureSet WarzoneDataC1.eds" + Convert.ToString(endChar);
                }
                else if (map.Tileset == App.Tileset_Urban)
                {
                    text = "    FeatureSet WarzoneDataC2.eds" + Convert.ToString(endChar);
                }
                else if (map.Tileset == App.Tileset_Rockies)
                {
                    text = "    FeatureSet WarzoneDataC3.eds" + Convert.ToString(endChar);
                }
                else
                {
                    text = "    FeatureSet " + Convert.ToString(endChar);
                }
                File.Write(text);
                text = "    NumObjects " + map.Units.Count.ToStringInvariant() + Convert.ToString(endChar);
                File.Write(text);
                text = "    Objects {" + Convert.ToString(endChar);
                File.Write(text);
                var    XYZ_int          = new XYZInt(0, 0, 0);
                string Code             = null;
                var    CustomDroidCount = 0;
                foreach (var unit in map.Units)
                {
                    switch (unit.TypeBase.Type)
                    {
                    case UnitType.Feature:
                        b = 0;
                        break;

                    case UnitType.PlayerStructure:
                        b = 1;
                        break;

                    case UnitType.PlayerDroid:
                        if (((DroidDesign)unit.TypeBase).IsTemplate)
                        {
                            b = 2;
                        }
                        else
                        {
                            b = -1;
                        }
                        break;

                    default:
                        b = -1;
                        returnResult.WarningAdd("Unit type classification not accounted for.");
                        break;
                    }
                    XYZ_int = lndPos_From_MapPos(map.Units[a].Pos.Horizontal);
                    if (b >= 0)
                    {
                        if (unit.TypeBase.GetCode(ref Code))
                        {
                            text = "        " + unit.ID.ToStringInvariant() + " " + Convert.ToString(b) + " " + Convert.ToString(quote) +
                                   Code + Convert.ToString(quote) + " " + unit.UnitGroup.GetLNDPlayerText() + " " + Convert.ToString(quote) + "NONAME" +
                                   Convert.ToString(quote) + " " + XYZ_int.X.ToStringInvariant() + ".00 " + XYZ_int.Y.ToStringInvariant() +
                                   ".00 " + XYZ_int.Z.ToStringInvariant() + ".00 0.00 " + unit.Rotation.ToStringInvariant() + ".00 0.00" +
                                   Convert.ToString(endChar);
                            File.Write(text);
                        }
                        else
                        {
                            returnResult.WarningAdd("Error. Code not found.");
                        }
                    }
                    else
                    {
                        CustomDroidCount++;
                    }
                }
                text = "    }" + Convert.ToString(endChar);
                File.Write(text);
                text = "}" + Convert.ToString(endChar);
                File.Write(text);
                text = "ScrollLimits {" + Convert.ToString(endChar);
                File.Write(text);
                text = "    Version 1" + Convert.ToString(endChar);
                File.Write(text);
                text = "    NumLimits 1" + Convert.ToString(endChar);
                File.Write(text);
                text = "    Limits {" + Convert.ToString(endChar);
                File.Write(text);
                text = "        " + Convert.ToString(quote) + "Entire Map" + Convert.ToString(quote) + " 0 0 0 " +
                       map.Terrain.TileSize.X.ToStringInvariant() + " " + map.Terrain.TileSize.Y.ToStringInvariant() + Convert.ToString(endChar);
                File.Write(text);
                text = "    }" + Convert.ToString(endChar);
                File.Write(text);
                text = "}" + Convert.ToString(endChar);
                File.Write(text);
                text = "Gateways {" + Convert.ToString(endChar);
                File.Write(text);
                text = "    Version 1" + Convert.ToString(endChar);
                File.Write(text);
                text = "    NumGateways " + map.Gateways.Count.ToStringInvariant() + Convert.ToString(endChar);
                File.Write(text);
                text = "    Gates {" + Convert.ToString(endChar);
                File.Write(text);
                foreach (var gateway in map.Gateways)
                {
                    text = "        " + gateway.PosA.X.ToStringInvariant() + " " + gateway.PosA.Y.ToStringInvariant() + " " +
                           gateway.PosB.X.ToStringInvariant() + " " + gateway.PosB.Y.ToStringInvariant() + Convert.ToString(endChar);
                    File.Write(text);
                }
                text = "    }" + Convert.ToString(endChar);
                File.Write(text);
                text = "}" + Convert.ToString(endChar);
                File.Write(text);
                text = "TileTypes {" + Convert.ToString(endChar);
                File.Write(text);
                text = "    NumTiles " + Convert.ToString(map.Tileset.TileCount) + Convert.ToString(endChar);
                File.Write(text);
                text = "    Tiles {" + Convert.ToString(endChar);
                File.Write(text);
                for (a = 0; a <= Math.Ceiling(Convert.ToDecimal((map.Tileset.TileCount + 1) / 16.0D)).ToInt() - 1; a++)
                //+1 because the first number is not a tile type
                {
                    text = "        ";
                    c    = a * 16 - 1; //-1 because the first number is not a tile type
                    for (b = 0; b <= Math.Min(16, map.Tileset.TileCount - c) - 1; b++)
                    {
                        if (c + b < 0)
                        {
                            text = text + "2 ";
                        }
                        else
                        {
                            text = text + map.TileTypeNum[c + b].ToStringInvariant() + " ";
                        }
                    }
                    text = text + Convert.ToString(endChar);
                    File.Write(text);
                }
                text = "    }" + Convert.ToString(endChar);
                File.Write(text);
                text = "}" + Convert.ToString(endChar);
                File.Write(text);
                text = "TileFlags {" + Convert.ToString(endChar);
                File.Write(text);
                text = "    NumTiles 90" + Convert.ToString(endChar);
                File.Write(text);
                text = "    Flags {" + Convert.ToString(endChar);
                File.Write(text);
                text = "        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " + Convert.ToString(endChar);
                File.Write(text);
                text = "        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " + Convert.ToString(endChar);
                File.Write(text);
                text = "        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " + Convert.ToString(endChar);
                File.Write(text);
                text = "        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " + Convert.ToString(endChar);
                File.Write(text);
                text = "        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " + Convert.ToString(endChar);
                File.Write(text);
                text = "        0 0 0 0 0 0 0 0 0 0 " + Convert.ToString(endChar);
                File.Write(text);
                text = "    }" + Convert.ToString(endChar);
                File.Write(text);
                text = "}" + Convert.ToString(endChar);
                File.Write(text);
                text = "Brushes {" + Convert.ToString(endChar);
                File.Write(text);
                text = "    Version 2" + Convert.ToString(endChar);
                File.Write(text);
                text = "    NumEdgeBrushes 0" + Convert.ToString(endChar);
                File.Write(text);
                text = "    NumUserBrushes 0" + Convert.ToString(endChar);
                File.Write(text);
                text = "    EdgeBrushes {" + Convert.ToString(endChar);
                File.Write(text);
                text = "    }" + Convert.ToString(endChar);
                File.Write(text);
                text = "}" + Convert.ToString(endChar);
                File.Write(text);
            }
            catch (Exception ex)
            {
                returnResult.ProblemAdd(ex.Message);
            }
            if (File != null)
            {
                File.Close();
            }

            return(returnResult);
        }