| 13 | namespace Abyss::DataTypes { |
| 14 | |
| 15 | DT1::DT1(const std::string_view path, const Palette &palette) { |
| 16 | if (const auto lastSeparator = std::max(path.find_last_of('/'), path.find_last_of('\\')); lastSeparator != std::string_view::npos) { |
| 17 | name = std::string(path.substr(lastSeparator + 1)); |
| 18 | } else { |
| 19 | name = std::string(path); |
| 20 | } |
| 21 | |
| 22 | auto file = AbyssEngine::getInstance().loadFile(path); |
| 23 | Streams::StreamReader sr(file); |
| 24 | |
| 25 | int versionMajor = sr.readUInt32(); |
| 26 | int versionMinor = sr.readUInt32(); |
| 27 | if (versionMajor != 7 || versionMinor != 6) { |
| 28 | throw std::runtime_error("DT1 version not supported"); |
| 29 | } |
| 30 | |
| 31 | sr.skip(260); |
| 32 | uint32_t numberOfTiles = sr.readUInt32(); |
| 33 | uint32_t pointerToTileHeaders = sr.readUInt32(); |
| 34 | sr.seek(pointerToTileHeaders); |
| 35 | |
| 36 | std::vector<DT1TileHeader> tileHeaders(numberOfTiles); |
| 37 | |
| 38 | for (auto &tileHeader : tileHeaders) { |
| 39 | tileHeader.direction = sr.readUInt32(); |
| 40 | tileHeader.roofHeight = sr.readUInt16(); |
| 41 | tileHeader.soundIndex = sr.readUInt8(); |
| 42 | tileHeader.animated = sr.readUInt8(); |
| 43 | tileHeader.height = sr.readInt32(); |
| 44 | tileHeader.width = sr.readInt32(); |
| 45 | sr.skip(4); |
| 46 | tileHeader.orientation = static_cast<TileType>(sr.readUInt32()); |
| 47 | tileHeader.mainIndex = sr.readUInt32(); |
| 48 | tileHeader.subIndex = sr.readUInt32(); |
| 49 | tileHeader.rarityOrFrameIndex = sr.readUInt32(); |
| 50 | sr.skip(4); |
| 51 | for (DT1SubtileFlag &flag : tileHeader.subtileFlags) { |
| 52 | flag = static_cast<DT1SubtileFlag>(sr.readByte()); |
| 53 | } |
| 54 | sr.skip(7); |
| 55 | tileHeader.blockHeaderPointer = sr.readUInt32(); |
| 56 | tileHeader.blockDataLength = sr.readUInt32(); |
| 57 | tileHeader.numberOfBlocks = sr.readUInt32(); |
| 58 | sr.skip(12); |
| 59 | } |
| 60 | |
| 61 | for (auto &tileHeader : tileHeaders) { |
| 62 | auto ¤tTile = tiles.emplace_back(); |
| 63 | currentTile.header = tileHeader; |
| 64 | |
| 65 | std::vector<DT1BlockHeader> blockHeaders(tileHeader.numberOfBlocks); |
| 66 | sr.seek(tileHeader.blockHeaderPointer); |
| 67 | for (auto &blockHeader : blockHeaders) { |
| 68 | blockHeader.posX = sr.readInt16(); |
| 69 | blockHeader.posY = sr.readInt16(); |
| 70 | sr.skip(2); |
| 71 | blockHeader.gridX = sr.readUInt8(); |
| 72 | blockHeader.gridY = sr.readUInt8(); |
nothing calls this directly
no test coverage detected