Esempio n. 1
0
        public MapLoader(Stream file)
        {
            Console.WriteLine("### Opening map: " + ((BigStream)file).Name);
            BinaryReader binaryReader = new BinaryReader(file);
            uint         flag         = binaryReader.ReadUInt32();

            switch (flag)
            {
            case 1884121923U:
                Console.WriteLine("### Map is in uncompressed format");
                break;

            case 5390661U:
                Console.WriteLine("### Map is in compressed RefPack format, decompressing...");

                BinaryWriter output = new BinaryWriter((Stream) new MemoryStream((int)binaryReader.BaseStream.Length));
                binaryReader.BaseStream.Position = 8L;
                IOUtility.DecompressData(binaryReader, output);
                binaryReader = new BinaryReader(output.BaseStream);
                byte[] numArray = new byte[(int)output.BaseStream.Length];
                output.BaseStream.Position = 0L;
                output.BaseStream.Read(numArray, 0, (int)output.BaseStream.Length);
                File.WriteAllBytes("decompressed.map", numArray);
                binaryReader.BaseStream.Position = 4L;

                break;

            default:
                Console.WriteLine("### Unknow map format, not supported");
                return;
            }

            Map map = new Map();

            SubAsset.map = map;
            Asset.map    = map;

            binaryReader.BaseStream.Position = 4L;
            string[] assetStrings = new string[binaryReader.ReadInt32()];
            map.nameIDs     = new Dictionary <string, int>(assetStrings.Length);
            map.majorAssets = new Dictionary <string, MajorAsset>();
            StreamWriter streamWriter1 = new StreamWriter("assetStrings.txt");

            for (int index = assetStrings.Length - 1; index >= 0; --index)
            {
                assetStrings[index] = binaryReader.ReadString();
                streamWriter1.WriteLine("{0,-20}\t{1}", (object)assetStrings[index], (object)(index + 1));
                //Console.WriteLine(assetStrings[index]);
                int num = binaryReader.ReadInt32();
                if (num != index + 1)
                {
                    Console.WriteLine("!\t string suffix {0} mismatch with index {1}", (object)num, (object)(index + 1));
                }
            }
            streamWriter1.Close();
            SubAsset.assetNames = assetStrings;
            StreamWriter streamWriter2 = new StreamWriter("majorAssetStrings.txt");
            long         position      = binaryReader.BaseStream.Position;

            while (binaryReader.BaseStream.Position < binaryReader.BaseStream.Length)
            {
                int    num1 = binaryReader.ReadInt32();
                short  num2 = binaryReader.ReadInt16();
                int    num3 = binaryReader.ReadInt32();
                string key  = assetStrings[num1 - 1];
                binaryReader.BaseStream.Position -= 10L;
                streamWriter2.WriteLine("{0,-20}\t{1,-6}\t{2,-3}\t{3}", (object)key, (object)num3, (object)num1, (object)num2);
                File.WriteAllBytes(assetStrings[num1 - 1] + ".bin", binaryReader.ReadBytes(num3 + 10));
                binaryReader.BaseStream.Position -= (long)(num3 + 10);
                switch (key)
                {
                case "AssetList":
                    Console.WriteLine("AssetList");
                    map.majorAssets.Add(key, (MajorAsset)(map.assetList = new AssetList(binaryReader)));
                    continue;

                case "GlobalVersion":
                    Console.WriteLine("GlobalVersion");
                    map.majorAssets.Add(key, (MajorAsset) new GlobalVersion(binaryReader));
                    continue;

                case "HeightMapData":
                    Console.WriteLine("HeigthMapData");
                    map.heightMap = new HeightMapData(binaryReader);
                    map.majorAssets.Add(key, (MajorAsset)map.heightMap);
                    map.mapWidth  = map.heightMap.mapWidth;
                    map.mapHeight = map.heightMap.mapHeight;
                    continue;

                /*
                 * case "BlendTileData":
                 *  Console.WriteLine("BlendTileData");
                 *  map.blendTile = new BlendTileData(binaryReader, map.mapWidth, map.mapHeight);
                 *  map.majorAssets.Add(key, (MajorAsset)map.blendTile);
                 *  continue;
                 * case "WorldInfo":
                 *  Console.WriteLine("WorldInfo");
                 *  map.worldInfo = new WorldInfo(binaryReader, assetStrings);
                 *  map.majorAssets.Add(key, (MajorAsset)map.worldInfo);
                 *  continue;
                 * case "MPPositionList":
                 *  Console.WriteLine("MPPositionList");
                 *  map.mpPositionList = new MPPositionList(binaryReader);
                 *  map.majorAssets.Add(key, (MajorAsset)map.mpPositionList);
                 *  continue;
                 * case "SidesList":
                 *  Console.WriteLine("SidesList");
                 *  map.sidesList = new SidesList(binaryReader);
                 *  map.majorAssets.Add(key, (MajorAsset)map.sidesList);
                 *  continue;
                 * case "LibraryMapLists":
                 *  Console.WriteLine("LibraryMapLists");
                 *  map.majorAssets.Add(key, (MajorAsset)new LibraryMapLists(binaryReader));
                 *  continue;
                 * case "Teams":
                 *  Console.WriteLine("Teams");
                 *  map.majorAssets.Add(key, (MajorAsset)new Teams(binaryReader));
                 *  continue;
                 * case "PlayerScriptsList":
                 *  Console.WriteLine("PlayerScriptsList");
                 *  map.majorAssets.Add(key, (MajorAsset)new PlayerScriptsList(binaryReader));
                 *  continue;
                 * case "BuildLists":
                 *  Console.WriteLine("BuildLists");
                 *  map.majorAssets.Add(key, (MajorAsset)new BuildLists(binaryReader));
                 *  continue;
                 * case "ObjectsList":
                 *  Console.WriteLine("ObjectList");
                 *  map.objectList = new ObjectsList(binaryReader);
                 *  map.majorAssets.Add(key, (MajorAsset)map.objectList);
                 *  continue;
                 * case "TriggerAreas":
                 *  Console.WriteLine("TriggerAreas");
                 *  map.majorAssets.Add(key, (MajorAsset)new TriggerAreas(binaryReader));
                 *  continue;
                 * case "GlobalWaterSettings":
                 *  Console.WriteLine("GlobalWaterSettings");
                 *  map.majorAssets.Add(key, (MajorAsset)new GlobalWaterSettings(binaryReader));
                 *  continue;
                 * case "FogSettings":
                 *  Console.WriteLine("FogSettings");
                 *  map.majorAssets.Add(key, (MajorAsset)new FogSettings(binaryReader));
                 *  continue;
                 * case "MissionHotSpots":
                 *  Console.WriteLine("MissionHotSpots");
                 *  map.majorAssets.Add(key, (MajorAsset)new MissionHotSpots(binaryReader));
                 *  continue;
                 * case "MissionObjectives":
                 *  Console.WriteLine("MissionObjectives");
                 *  map.majorAssets.Add(key, (MajorAsset)new MissionObjectives(binaryReader));
                 *  continue;
                 * case "StandingWaterAreas":
                 *  Console.WriteLine("StandingWaterAreas");
                 *  map.majorAssets.Add(key, (MajorAsset)new StandingWaterAreas(binaryReader));
                 *  continue;
                 * case "RiverAreas":
                 *  Console.WriteLine("RiverAreas");
                 *  map.majorAssets.Add(key, (MajorAsset)new RiverAreas(binaryReader));
                 *  continue;
                 * case "StandingWaveAreas":
                 *  Console.WriteLine("StandingWaveAreas");
                 *  map.majorAssets.Add(key, (MajorAsset)new StandingWaveAreas(binaryReader));
                 *  continue;
                 * case "GlobalLighting":
                 *  Console.WriteLine("GlobalLighting");
                 *  map.majorAssets.Add(key, (MajorAsset)new GlobalLighting(binaryReader));
                 *  continue;
                 * case "PostEffectsChunk":
                 *  Console.WriteLine("PostEffectsChunk");
                 *  map.majorAssets.Add(key, (MajorAsset)new PostEffectsChunk(binaryReader));
                 *  continue;
                 * case "EnvironmentData":
                 *  Console.WriteLine("EnvironmentData");
                 *  map.majorAssets.Add(key, (MajorAsset)new EnvironmentData(binaryReader));
                 *  continue;
                 * case "NamedCameras":
                 *  Console.WriteLine("NamedCameras");
                 *  map.majorAssets.Add(key, (MajorAsset)new NamedCameras(binaryReader));
                 *  continue;
                 * case "CameraAnimationList":
                 *  Console.WriteLine("CameraAnimationList");
                 *  map.majorAssets.Add(key, (MajorAsset)new CameraAnimationList(binaryReader));
                 *  continue;
                 * case "WaypointsList":
                 *  Console.WriteLine("WaypointsList");
                 *  map.majorAssets.Add(key, (MajorAsset)new WaypointsList(binaryReader));
                 *  continue;
                 */
                default:
                    Console.WriteLine("*\t Asset: {0} not parsed, error occurred, ending parsing", (object)key);
                    binaryReader.BaseStream.Position = binaryReader.BaseStream.Length;
                    continue;
                }
            }
            streamWriter2.Close();
            StreamWriter streamWriter3 = new StreamWriter("parsed assetStrings.txt");

            foreach (KeyValuePair <string, int> keyValuePair in map.nameIDs)
            {
                streamWriter3.WriteLine("{0,-20}\t{1}", (object)keyValuePair.Key, (object)keyValuePair.Value);
            }
            streamWriter3.Close();
            //map.mapWidth = map.heightMap.mapWidth;
            //map.mapHeight = map.heightMap.mapHeight;
            //map.mapBorder = map.heightMap.borderWidth;
            //map.PlayerCount = map.objectList.StartingLocationsCount;
            binaryReader.Close();
            file.Close();
            //Console.WriteLine("\t Map exported to \"{0}.bin\"", (object)Path.GetFileNameWithoutExtension(file));
            Console.WriteLine("*\t Done parsing \"{0}\"", (object)file);
        }