| 17 | uint32_t expected_tacp_crc32 = 0xfebbe39e; |
| 18 | |
| 19 | TACP::TACP(std::string file_name) |
| 20 | { |
| 21 | auto file = fw().data->fs.open(file_name); |
| 22 | |
| 23 | if (!file) |
| 24 | { |
| 25 | LogError("Failed to open \"%s\"", file_name.c_str()); |
| 26 | exit(1); |
| 27 | } |
| 28 | |
| 29 | auto data = file.readAll(); |
| 30 | boost::crc_32_type crc; |
| 31 | crc.process_bytes(data.get(), file.size()); |
| 32 | |
| 33 | auto crc32 = crc.checksum(); |
| 34 | |
| 35 | if (crc32 != expected_tacp_crc32) |
| 36 | { |
| 37 | LogError("File \"%s\"\" has an unknown crc32 value of 0x%08x - expected 0x%08x", |
| 38 | file_name.c_str(), crc32, expected_tacp_crc32); |
| 39 | } |
| 40 | |
| 41 | file.seekg(0, std::ios::beg); |
| 42 | file.clear(); |
| 43 | |
| 44 | // hand-filling damage mod names as they are not present in the game exe |
| 45 | { |
| 46 | auto vec = std::vector<std::string>(); |
| 47 | vec.emplace_back("Human"); |
| 48 | vec.emplace_back("Mutant"); |
| 49 | vec.emplace_back("Android"); |
| 50 | vec.emplace_back("Alien Egg"); |
| 51 | vec.emplace_back("Multiworm"); |
| 52 | vec.emplace_back("Hyperworm"); |
| 53 | vec.emplace_back("Chrysalis"); |
| 54 | vec.emplace_back("Brainsucker"); |
| 55 | vec.emplace_back("Queenspawn"); |
| 56 | vec.emplace_back("Anthropod"); |
| 57 | vec.emplace_back("Psimorph"); |
| 58 | vec.emplace_back("Spitter"); |
| 59 | vec.emplace_back("Megaspawn"); |
| 60 | vec.emplace_back("Popper"); |
| 61 | vec.emplace_back("Skeletoid"); |
| 62 | vec.emplace_back("Micronoid Aggregate"); |
| 63 | vec.emplace_back("Disruptor Shield"); |
| 64 | vec.emplace_back("Megapol Armor"); |
| 65 | vec.emplace_back("Marsec Armor"); |
| 66 | vec.emplace_back("X-COM Disruptor Armor"); |
| 67 | vec.emplace_back("Terrain 1?"); |
| 68 | vec.emplace_back("Terrain 2?"); |
| 69 | vec.emplace_back("Gun Emplacement"); |
| 70 | this->damage_modifier_names.reset(new StrTab(vec)); |
| 71 | } |
| 72 | |
| 73 | this->damage_type_names.reset( |
| 74 | new StrTab(file, DAMAGE_TYPE_NAMES_OFFSET_START, DAMAGE_TYPE_NAMES_OFFSET_END, true)); |
| 75 | |
| 76 | this->damage_types.reset(new DataChunk<DamageTypeData>(file, DAMAGE_TYPE_DATA_OFFSET_START, |