Пример #1
0
        private void CancelItem(Player player, uint itemId, int time)
        {
            if (itemId < 0x41000000 || itemId > 0x7a000000)
            {
                return;
            }
            string stringId = ParserUtility.StringFromUInt(itemId);

            switch (ParserUtility.ItemTypeFromId(stringId))
            {
            case ItemType.None:
                break;

            case ItemType.Hero:
                player.Heroes.Cancel(stringId, time);
                break;

            case ItemType.Building:
                player.Buildings.Cancel(new OrderItem(stringId, time, true));;
                break;

            case ItemType.Research:
                player.Researches.Cancel(new OrderItem(stringId, time, true));;
                break;

            case ItemType.Unit:
                player.Units.Cancel(new OrderItem(stringId, time, true));;
                break;

            case ItemType.Upgrade:
                player.Upgrades.Cancel(new OrderItem(stringId, time, true));;
                break;
            }
        }
Пример #2
0
        private void OrderItem(Player player, uint itemId, int time)
        {
            if (itemId < 0x41000000 || itemId > 0x7a000000)
            {
                return;
            }
            string stringId = ParserUtility.StringFromUInt(itemId);

            switch (ParserUtility.ItemTypeFromId(stringId))
            {
            case ItemType.None:
                if ((itemId >> 16) == 0x00000233)
                {
                    player.Units.Order(new OrderItem("ubsp", time));
                }
                break;

            case ItemType.Hero:
                player.Heroes.Order(stringId, time);
                break;

            case ItemType.HeroAbility:
                player.Heroes.Train(stringId, time);
                break;

            case ItemType.Building:
                player.Buildings.Order(new OrderItem(stringId, time));
                break;

            case ItemType.Item:
                player.Items.Order(new OrderItem(stringId, time));
                if (stringId == "tret")
                {
                    player.Heroes.PossibleRetrained(time);
                }
                break;

            case ItemType.Unit:
                player.Units.Order(new OrderItem(stringId, time));
                break;

            case ItemType.Upgrade:
                player.Upgrades.Order(new OrderItem(stringId, time));;
                break;

            case ItemType.Research:
                player.Researches.Order(new OrderItem(stringId, time));;
                break;
            }
        }
Пример #3
0
        private MemoryStream LoadHeader(Stream stream)
        {
            MemoryStream blocksData = new MemoryStream();

            using (BinaryReader reader = new BinaryReader(stream))
            {
                #region 2.0 [Header]

                #region doc

                //offset | size/type | Description
                //-------+-----------+-----------------------------------------------------------
                //0x0000 | 28 chars  | zero terminated string "Warcraft III recorded game\0x1A\0"
                //0x001c |  1 dword  | fileoffset of first compressed data block (header size)
                //       |           |  0x40 for WarCraft III with patch <= v1.06
                //       |           |  0x44 for WarCraft III patch >= 1.07 and TFT replays
                //0x0020 |  1 dword  | overall size of compressed file
                //0x0024 |  1 dword  | replay header version:
                //       |           |  0x00 for WarCraft III with patch <= 1.06
                //       |           |  0x01 for WarCraft III patch >= 1.07 and TFT replays
                //0x0028 |  1 dword  | overall size of decompressed data (excluding header)
                //0x002c |  1 dword  | number of compressed data blocks in file
                //0x0030 |  n bytes  | SubHeader (see section 2.1 and 2.2)

                #endregion

                ValidateHeaderString(reader.ReadBytes(28));

                int headerSize = reader.ReadInt32();
                //overall size of compressed file
                reader.ReadInt32();
                int versionFlag = reader.ReadInt32();
                //overall size of decompressed data (excluding header)
                reader.ReadInt32();
                int nBlocks = reader.ReadInt32();

                #endregion

                #region SubHeader

                if (versionFlag == 0)
                {
                    throw new W3gParserException("本软件不支持1.06及更低版本录像.");
                }
                else if (versionFlag == 1)
                {
                    #region 2.2 [SubHeader] for header version 1

                    #region doc

                    //offset | size/type | Description
                    //-------+-----------+-----------------------------------------------------------
                    //0x0000 |  1 dword  | version identifier string reading:
                    //       |           |  'WAR3' for WarCraft III Classic
                    //       |           |  'W3XP' for WarCraft III Expansion Set 'The Frozen Throne'
                    //0x0004 |  1 dword  | version number (corresponds to patch 1.xx so far)
                    //0x0008 |  1  word  | build number (see section 2.3)
                    //0x000A |  1  word  | flags
                    //       |           |   0x0000 for single player games
                    //       |           |   0x8000 for multiplayer games (LAN or Battle.net)
                    //0x000C |  1 dword  | replay length in msec
                    //0x0010 |  1 dword  | CRC32 checksum for the header
                    //       |           | (the checksum is calculated for the complete header
                    //       |           |  including this field which is set to zero)

                    #endregion

                    string war3string = ParserUtility.StringFromUInt(reader.ReadUInt32());
                    if (war3string != "W3XP")
                    {
                        throw new W3gParserException("本软件只支持冰封王座录像,不支持混乱之治录像.");
                    }

                    version = reader.ReadInt32();
                    buildNo = reader.ReadInt32();
                    //flags
                    reader.ReadInt16();
                    length = reader.ReadInt32();
                    //CRC32 checksum for the header
                    reader.ReadInt32();

                    #endregion
                }

                #endregion

                reader.BaseStream.Seek(headerSize, SeekOrigin.Begin);
                for (int i = 0; i < nBlocks; i++)
                {
                    #region [Data block header]

                    #region doc

                    //offset | size/type | Description
                    //-------+-----------+-----------------------------------------------------------
                    //0x0000 |  1  word  | size n of compressed data block (excluding header)
                    //0x0002 |  1  word  | size of decompressed data block (currently 8k)
                    //0x0004 |  1 dword  | unknown (probably checksum)
                    //0x0008 |  n bytes  | compressed data (decompress using zlib)

                    #endregion

                    ushort compressedSize   = reader.ReadUInt16();
                    ushort decompressedSize = reader.ReadUInt16();
                    //unknown (probably checksum)
                    reader.ReadInt32();

                    byte[] decompressed = new byte[decompressedSize];
                    byte[] compressed   = reader.ReadBytes(compressedSize);
                    using (InflaterInputStream zipStream = new InflaterInputStream(new MemoryStream(compressed)))
                    {
                        zipStream.Read(decompressed, 0, decompressedSize);
                    }
                    blocksData.Write(decompressed, 0, decompressedSize);

                    #endregion
                }
            }
            blocksData.Seek(0, SeekOrigin.Begin);
            return(blocksData);
        }