| 1780 | } |
| 1781 | |
| 1782 | void SaveLevel(SaveWriter &saveWriter, LevelConversionData *levelConversionData) |
| 1783 | { |
| 1784 | Player &myPlayer = *MyPlayer; |
| 1785 | |
| 1786 | DoUnVision(myPlayer.position.tile, myPlayer._pLightRad); // fix for vision staying on the level |
| 1787 | |
| 1788 | if (leveltype == DTYPE_TOWN) |
| 1789 | glSeedTbl[0] = AdvanceRndSeed(); |
| 1790 | |
| 1791 | char szName[MaxMpqPathSize]; |
| 1792 | GetTempLevelNames(szName); |
| 1793 | SaveHelper file(saveWriter, szName, 256 * 1024); |
| 1794 | |
| 1795 | if (leveltype != DTYPE_TOWN) { |
| 1796 | for (int j = 0; j < MAXDUNY; j++) { |
| 1797 | for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) |
| 1798 | file.WriteLE<int8_t>(dCorpse[i][j]); |
| 1799 | } |
| 1800 | } |
| 1801 | |
| 1802 | file.WriteBE<int32_t>(ActiveMonsterCount); |
| 1803 | file.WriteBE<int32_t>(ActiveItemCount); |
| 1804 | file.WriteBE<int32_t>(ActiveObjectCount); |
| 1805 | |
| 1806 | if (leveltype != DTYPE_TOWN) { |
| 1807 | for (int monsterId : ActiveMonsters) |
| 1808 | file.WriteBE<int32_t>(monsterId); |
| 1809 | for (size_t i = 0; i < ActiveMonsterCount; i++) { |
| 1810 | MonsterConversionData *monsterConversionData = nullptr; |
| 1811 | if (levelConversionData != nullptr) |
| 1812 | monsterConversionData = &levelConversionData->monsterConversionData[ActiveMonsters[i]]; |
| 1813 | SaveMonster(&file, Monsters[ActiveMonsters[i]], monsterConversionData); |
| 1814 | } |
| 1815 | for (int objectId : ActiveObjects) |
| 1816 | file.WriteLE<int8_t>(objectId); |
| 1817 | for (int objectId : AvailableObjects) |
| 1818 | file.WriteLE<int8_t>(objectId); |
| 1819 | for (int i = 0; i < ActiveObjectCount; i++) { |
| 1820 | SaveObject(file, Objects[ActiveObjects[i]]); |
| 1821 | } |
| 1822 | } |
| 1823 | |
| 1824 | auto itemIndexes = SaveDroppedItems(file); |
| 1825 | |
| 1826 | for (int j = 0; j < MAXDUNY; j++) { |
| 1827 | for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) |
| 1828 | file.WriteLE<uint8_t>(static_cast<uint8_t>(dFlags[i][j] & DungeonFlag::SavedFlags)); |
| 1829 | } |
| 1830 | SaveDroppedItemLocations(file, itemIndexes); |
| 1831 | |
| 1832 | if (leveltype != DTYPE_TOWN) { |
| 1833 | for (int j = 0; j < MAXDUNY; j++) { |
| 1834 | for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) |
| 1835 | file.WriteBE<int32_t>(dMonster[i][j]); |
| 1836 | } |
| 1837 | for (int j = 0; j < MAXDUNY; j++) { |
| 1838 | for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) |
| 1839 | file.WriteLE<int8_t>(dObject[i][j]); |
no test coverage detected