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; } }
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; } }
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); }