diff --git a/MissionEditor/IsoView.cpp b/MissionEditor/IsoView.cpp index 2677fe0..cf07500 100644 --- a/MissionEditor/IsoView.cpp +++ b/MissionEditor/IsoView.cpp @@ -5919,7 +5919,7 @@ void CIsoView::DrawMap() //#endif if (pic.pic == NULL) { - auto const& buildingId = rules.GetSection("BuildingTypes").Nth(m.node.type).second; + auto const& buildingId = CMapData::GetBuildingIDBy(m.node.type); if (!buildingId.IsEmpty() && !missingimages[buildingId]) { SetError("Loading graphics"); theApp.m_loading->LoadUnitGraphic(buildingId); diff --git a/MissionEditor/MapData.cpp b/MissionEditor/MapData.cpp index 4ca3233..6a84cf2 100644 --- a/MissionEditor/MapData.cpp +++ b/MissionEditor/MapData.cpp @@ -77,6 +77,7 @@ This function calculates a number for the specified building type. Because this function is slow, you should only use it to fill the buildingid map */ +static size_t constexpr mapDefinedStartOffset = 0x0C00; int getItemNumber(const CString& section, const CString& name) { auto const& ini = Map->GetIniFile(); @@ -89,11 +90,33 @@ int getItemNumber(const CString& section, const CString& name) { idx = ini.GetSection(section).FindValue(name); if (idx > -1) { // why ? - return idx + 0x0C00; + return idx + mapDefinedStartOffset; } return -1; } +CString getItemId(const CString& section, size_t offset) { + auto const& rulesSec = rules.GetSection(section); + if (offset < rulesSec.Size()) { + return rulesSec.Nth(offset).second; + } + + do { + if (offset < mapDefinedStartOffset) { + break; + } + offset -= mapDefinedStartOffset; + auto const& mapSec = Map->GetIniFile().GetSection(section); + if (offset >= mapSec.Size()) { + break; + } + return mapSec.Nth(offset).second; + + } while (0); + + throw std::runtime_error("invalid offset"); +} + inline int GetBuildingNumber(const CString& name) { return getItemNumber("BuildingTypes", name); @@ -111,6 +134,11 @@ inline int GetSmudgeNumber(const CString& name) } #endif +CString CMapData::GetBuildingIDBy(size_t offset) +{ + return getItemId("BuildingTypes", offset); +} + SNAPSHOTDATA::SNAPSHOTDATA() { memset(this, 0, sizeof(SNAPSHOTDATA)); diff --git a/MissionEditor/MapData.h b/MissionEditor/MapData.h index 80ab177..984c68d 100644 --- a/MissionEditor/MapData.h +++ b/MissionEditor/MapData.h @@ -487,6 +487,8 @@ public: return CPoint(static_cast(x), static_cast(y)); } + static CString GetBuildingIDBy(size_t offset); + private: void UpdateTubes(BOOL bSave); MAPFIELDDATA* GetMappackPointer(DWORD dwPos); @@ -505,10 +507,6 @@ private: void UpdateInfantry(BOOL bSave = FALSE); void UpdateAircraft(BOOL bSave = FALSE); - - - - map buildingid; map terrainid; #ifdef SMUDGE_SUPP