From a9c9a5287bfa5b9174cbd4e80348c855b0401322 Mon Sep 17 00:00:00 2001 From: Zero Fanker Date: Mon, 30 Dec 2024 20:21:02 -0500 Subject: [PATCH] Fix: #116 field data out of range issue (#128) * fix: #116, using std::vector instead of bare array . * added guardian checks . * now unwanted cells to the edges will no longer be affected --------- Co-authored-by: handama <55939089+handama@users.noreply.github.com> --- MissionEditor/IsoView.cpp | 75 +++++++++++++++---- MissionEditor/MapData.cpp | 104 +++++++++++--------------- MissionEditor/MapData.h | 35 +++++---- MissionEditor/MapOperationMiniMap.cpp | 2 +- MissionEditor/MapOperationSmooth.cpp | 2 +- 5 files changed, 126 insertions(+), 92 deletions(-) diff --git a/MissionEditor/IsoView.cpp b/MissionEditor/IsoView.cpp index a6978b6..7614d61 100644 --- a/MissionEditor/IsoView.cpp +++ b/MissionEditor/IsoView.cpp @@ -1654,6 +1654,9 @@ void CIsoView::OnMouseMove(UINT nFlags, CPoint point) for (m = left; m < right; m++) { for (n = top; n < bottom; n++) { + if (!Map->isInside(x + m, y + n)) { + continue; + } int pos = x + m + (y + n) * isosize; int ground = Map->GetFielddataAt(pos)->wGround; if (ground == 0xFFFF) { @@ -1699,6 +1702,9 @@ void CIsoView::OnMouseMove(UINT nFlags, CPoint point) for (m = left; m < right; m++) { for (n = top; n < bottom; n++) { + if (!Map->isInside(x + m, y + n)) { + continue; + } int ground = Map->GetFielddataAt(x + m + (y + n) * Map->GetIsoSize())->wGround; if (ground == 0xFFFF) { ground = 0; @@ -1729,6 +1735,9 @@ void CIsoView::OnMouseMove(UINT nFlags, CPoint point) ASSERT(m_funcRect.top <= m_funcRect.bottom); for (m = m_funcRect.left - 1; m <= m_funcRect.right + 1; m++) { for (n = m_funcRect.top - 1; n <= m_funcRect.bottom + 1; n++) { + if (!Map->isInside(m, n)) { + continue; + } Map->CreateSlopesAt(m + n * isosize); } } @@ -2568,6 +2577,9 @@ void CIsoView::OnLButtonDown(UINT nFlags, CPoint point) int oheight = Map->GetHeightAt(x + y * Map->GetIsoSize()); for (f = -m_BrushSize_x / 2; f < m_BrushSize_x / 2 + 1; f++) { for (n = -m_BrushSize_y / 2; n < m_BrushSize_y / 2 + 1; n++) { + if (!Map->isInside(x + f, y + n)) { + continue; + } int pos = x + f + (y + n) * Map->GetIsoSize(); int ground = Map->GetFielddataAt(pos)->wGround; if (ground == 0xFFFF) ground = 0; @@ -2579,6 +2591,9 @@ void CIsoView::OnLButtonDown(UINT nFlags, CPoint point) } for (f = -m_BrushSize_x / 2; f < m_BrushSize_x / 2 + 1; f++) { for (n = -m_BrushSize_y / 2; n < m_BrushSize_y / 2 + 1; n++) { + if (!Map->isInside(x + f, y + n)) { + continue; + } int pos = x + f + (y + n) * Map->GetIsoSize(); int ground = Map->GetFielddataAt(pos)->wGround; if (ground == 0xFFFF) ground = 0; @@ -2608,6 +2623,9 @@ void CIsoView::OnLButtonDown(UINT nFlags, CPoint point) int f, n; for (f = m_funcRect.left - 1; f <= m_funcRect.right + 1; f++) { for (n = m_funcRect.top - 1; n <= m_funcRect.bottom + 1; n++) { + if (!Map->isInside(f, n)) { + continue; + } int pos = f + (n)*Map->GetIsoSize(); Map->CreateSlopesAt(pos); } @@ -2661,6 +2679,9 @@ void CIsoView::OnLButtonDown(UINT nFlags, CPoint point) int oheight = Map->GetHeightAt(x + y * Map->GetIsoSize()); for (f = -m_BrushSize_x / 2; f < m_BrushSize_x / 2 + 1; f++) { for (n = -m_BrushSize_y / 2; n < m_BrushSize_y / 2 + 1; n++) { + if (!Map->isInside(x + f, y + n)) { + continue; + } int pos = x + f + (y + n) * Map->GetIsoSize(); int ground = Map->GetFielddataAt(pos)->wGround; if (ground == 0xFFFF) ground = 0; @@ -2672,6 +2693,9 @@ void CIsoView::OnLButtonDown(UINT nFlags, CPoint point) } for (f = -m_BrushSize_x / 2; f < m_BrushSize_x / 2 + 1; f++) { for (n = -m_BrushSize_y / 2; n < m_BrushSize_y / 2 + 1; n++) { + if (!Map->isInside(x + f, y + n)) { + continue; + } int pos = x + f + (y + n) * Map->GetIsoSize(); int ground = Map->GetFielddataAt(pos)->wGround; if (ground == 0xFFFF) ground = 0; @@ -2698,6 +2722,9 @@ void CIsoView::OnLButtonDown(UINT nFlags, CPoint point) int f, n; for (f = m_funcRect.left - 1; f <= m_funcRect.right + 1; f++) { for (n = m_funcRect.top - 1; n <= m_funcRect.bottom + 1; n++) { + if (!Map->isInside(f, n)) { + continue; + } int pos = f + (n)*Map->GetIsoSize(); Map->CreateSlopesAt(pos); } @@ -2724,19 +2751,27 @@ void CIsoView::OnLButtonDown(UINT nFlags, CPoint point) } else if (AD.mode == ACTIONMODE_HEIGHTENTILE) { Map->TakeSnapshot(); - int n, m; - for (m = -m_BrushSize_x / 2; m < m_BrushSize_x / 2 + 1; m++) { - for (n = -m_BrushSize_y / 2; n < m_BrushSize_y / 2 + 1; n++) { - Map->SetHeightAt(x + m + (y + n) * Map->GetIsoSize(), Map->GetHeightAt(x + m + (y + n) * Map->GetIsoSize()) + 1); + for (int m = -m_BrushSize_x / 2; m < m_BrushSize_x / 2 + 1; m++) { + for (int n = -m_BrushSize_y / 2; n < m_BrushSize_y / 2 + 1; n++) { + if (!Map->isInside(x + m, y + n)) { + continue; + } + auto const pos = x + m + (y + n) * Map->GetIsoSize(); + Map->SetHeightAt(pos, Map->GetHeightAt(pos) + 1); } } - if (nFlags & MK_CONTROL) - for (m = -m_BrushSize_x / 2 - 1; m < m_BrushSize_x / 2 + 2; m++) { - for (n = -m_BrushSize_y / 2 - 1; n < m_BrushSize_y / 2 + 2; n++) { - Map->CreateSlopesAt(x + m + (y + n) * Map->GetIsoSize()); + if (nFlags & MK_CONTROL) { + for (int m = -m_BrushSize_x / 2 - 1; m < m_BrushSize_x / 2 + 2; m++) { + for (int n = -m_BrushSize_y / 2 - 1; n < m_BrushSize_y / 2 + 2; n++) { + if (!Map->isInside(x + m, y + n)) { + continue; + } + auto const pos = x + m + (y + n) * Map->GetIsoSize(); + Map->CreateSlopesAt(pos); } } + } Map->TakeSnapshot(); Map->Undo(); @@ -2745,19 +2780,27 @@ void CIsoView::OnLButtonDown(UINT nFlags, CPoint point) } else if (AD.mode == ACTIONMODE_LOWERTILE) { Map->TakeSnapshot(); - int n, m; - for (m = -m_BrushSize_x / 2; m < m_BrushSize_x / 2 + 1; m++) { - for (n = -m_BrushSize_y / 2; n < m_BrushSize_y / 2 + 1; n++) { - Map->SetHeightAt(x + m + (y + n) * Map->GetIsoSize(), Map->GetHeightAt(x + m + (y + n) * Map->GetIsoSize()) - 1); + for (int m = -m_BrushSize_x / 2; m < m_BrushSize_x / 2 + 1; m++) { + for (int n = -m_BrushSize_y / 2; n < m_BrushSize_y / 2 + 1; n++) { + if (!Map->isInside(x + m, y + n)) { + continue; + } + auto const pos = x + m + (y + n) * Map->GetIsoSize(); + Map->SetHeightAt(pos, Map->GetHeightAt(pos) - 1); } } - if (nFlags & MK_CONTROL) - for (m = -m_BrushSize_x / 2 - 1; m < m_BrushSize_x / 2 + 2; m++) { - for (n = -m_BrushSize_y / 2 - 1; n < m_BrushSize_y / 2 + 2; n++) { - Map->CreateSlopesAt(x + m + (y + n) * Map->GetIsoSize()); + if (nFlags & MK_CONTROL) { + for (int m = -m_BrushSize_x / 2 - 1; m < m_BrushSize_x / 2 + 2; m++) { + for (int n = -m_BrushSize_y / 2 - 1; n < m_BrushSize_y / 2 + 2; n++) { + if (!Map->isInside(x + m, y + n)) { + continue; + } + auto const pos = x + m + (y + n) * Map->GetIsoSize(); + Map->CreateSlopesAt(pos); } } + } Map->TakeSnapshot(); Map->Undo(); diff --git a/MissionEditor/MapData.cpp b/MissionEditor/MapData.cpp index 1080411..11e219a 100644 --- a/MissionEditor/MapData.cpp +++ b/MissionEditor/MapData.cpp @@ -181,8 +181,6 @@ CMapData::CMapData() m_noAutoObjectUpdate = FALSE; m_money = 0; m_cursnapshot = -1; - fielddata = NULL; - fielddata_size = 0; m_IsoSize = 0; isInitialized = FALSE; tiledata = NULL; @@ -212,9 +210,6 @@ CMapData::~CMapData() tiledata = NULL; if (m_mfd != NULL) delete[] m_mfd; m_mfd = NULL; - if (fielddata != NULL) delete[] fielddata; - fielddata = NULL; - fielddata_size = 0; int i; @@ -542,9 +537,7 @@ void CMapData::LoadMap(const std::string& file) errstream << "LoadMap() frees memory\n"; errstream.flush(); - if (fielddata != NULL) { - delete[] fielddata; - } + fielddata.clear(); for (auto i = 0; i < dwSnapShotCount; i++) { delete[] m_snapshots[i].bHeight; @@ -557,12 +550,10 @@ void CMapData::LoadMap(const std::string& file) delete[] m_snapshots[i].overlaydata; // m_snapshots[i].mapfile.Clear(); } - if (m_snapshots != NULL) delete[] m_snapshots; + if (m_snapshots != NULL) { + delete[] m_snapshots; + } - - - fielddata = NULL; - fielddata_size = 0; m_snapshots = NULL; dwSnapShotCount = 0; m_cursnapshot = -1; @@ -882,8 +873,7 @@ void CMapData::LoadMap(const std::string& file) errstream << "LoadMap() allocates fielddata\n"; errstream.flush(); - fielddata = new(FIELDDATA[(GetIsoSize() + 1) * (GetIsoSize() + 1)]); - fielddata_size = (GetIsoSize() + 1) * (GetIsoSize() + 1); + fielddata.resize((GetIsoSize() + 1)* (GetIsoSize() + 1)); errstream << "LoadMap() unpacks data\n"; errstream.flush(); @@ -1372,7 +1362,9 @@ void CMapData::SetOverlayAt(DWORD dwPos, BYTE bValue) BYTE CMapData::GetOverlayAt(DWORD dwPos) { - if (dwPos > fielddata_size) return 0; + if (dwPos > fielddata.size()) { + return 0; + } return fielddata[dwPos].overlay; } @@ -1480,9 +1472,11 @@ void CMapData::UpdateInfantry(BOOL bSave) int spp = sp - 1; if (spp < 0) spp = 0; - if (spp < SUBPOS_COUNT) - if (pos < fielddata_size) + if (spp < SUBPOS_COUNT) { + if (pos < fielddata.size()) { fielddata[pos].infantry[spp] = iv.size() - 1; + } + } Mini_UpdatePos(x, y, IsMultiplayer()); @@ -1544,7 +1538,7 @@ void CMapData::UpdateAircraft(BOOL bSave) int x = atoi(GetParam(sec.Nth(i).second, 4)); int y = atoi(GetParam(sec.Nth(i).second, 3)); int pos = x + y * GetIsoSize(); - if (pos < fielddata_size) { + if (pos < fielddata.size()) { fielddata[pos].aircraft = i; } Mini_UpdatePos(x, y, IsMultiplayer()); @@ -1592,7 +1586,7 @@ void CMapData::UpdateStructures(BOOL bSave) for (d = 0; d < buildinginfo[bid].h; d++) { for (e = 0; e < buildinginfo[bid].w; e++) { int pos = (x + d) + (y + e) * GetIsoSize(); - if (pos < fielddata_size) { + if (pos < fielddata.size()) { fielddata[pos].structure = i; fielddata[pos].structuretype = bid; } @@ -1699,7 +1693,7 @@ void CMapData::UpdateUnits(BOOL bSave) int x = atoi(GetParam(sec.Nth(i).second, 4)); int y = atoi(GetParam(sec.Nth(i).second, 3)); int pos = x + y * GetIsoSize(); - if (pos < fielddata_size) { + if (pos < fielddata.size()) { fielddata[pos].unit = i; } Mini_UpdatePos(x, y, IsMultiplayer()); @@ -1726,7 +1720,7 @@ void CMapData::UpdateWaypoints(BOOL bSave) PosToXY(coord, &x, &y); int pos = x + y * GetIsoSize(); - if (pos < 0 || pos >= fielddata_size) { + if (pos < 0 || pos >= fielddata.size()) { continue; } fielddata[pos].waypoint = atoi(id); @@ -1823,7 +1817,7 @@ void CMapData::UpdateCelltags(BOOL bSave) PosToXY(sec.Nth(i).first, &x, &y); int pos = x + y * GetIsoSize(); - if (pos < fielddata_size) { + if (pos < fielddata.size()) { fielddata[pos].celltag = i; } } @@ -1866,7 +1860,7 @@ void CMapData::DeleteInfantry(DWORD dwIndex) pos--; } - if (x + y * m_IsoSize < fielddata_size) { + if (x + y * m_IsoSize < fielddata.size()) { fielddata[x + y * m_IsoSize].infantry[pos] = -1; } @@ -2014,7 +2008,7 @@ void CMapData::DeleteTerrain(DWORD dwIndex) m_terrain[dwIndex].deleted = 1; int pos = x + y * GetIsoSize(); - if (x + y * m_IsoSize < fielddata_size) { + if (x + y * m_IsoSize < fielddata.size()) { fielddata[pos].terrain = -1; fielddata[pos].terraintype = -1; } @@ -2122,7 +2116,7 @@ BOOL CMapData::AddNode(NODE* lpNode, WORD dwPos) BOOL CMapData::AddInfantry(INFANTRY* lpInfantry, int suggestedIndex, LPCTSTR lpType, LPCTSTR lpHouse, DWORD dwPos) { - if (dwPos >= fielddata_size) { + if (dwPos >= fielddata.size()) { return FALSE; } @@ -2742,7 +2736,7 @@ BOOL CMapData::AddTerrain(LPCTSTR lpType, DWORD dwPos, int suggestedIndex) if (suggestedIndex >= 0 && suggestedIndex < m_terrain.size()) { if (m_terrain[suggestedIndex].deleted) { m_terrain[suggestedIndex] = td; - if (dwPos < fielddata_size) { + if (dwPos < fielddata.size()) { fielddata[dwPos].terrain = suggestedIndex; fielddata[dwPos].terraintype = terrainid[lpType]; } @@ -2757,7 +2751,7 @@ BOOL CMapData::AddTerrain(LPCTSTR lpType, DWORD dwPos, int suggestedIndex) if (m_terrain[i].deleted) // yep, found one, replace it { m_terrain[i] = td; - if (dwPos < fielddata_size) { + if (dwPos < fielddata.size()) { fielddata[dwPos].terrain = i; fielddata[dwPos].terraintype = terrainid[lpType]; } @@ -2769,7 +2763,7 @@ BOOL CMapData::AddTerrain(LPCTSTR lpType, DWORD dwPos, int suggestedIndex) if (!bFound) { m_terrain.push_back(td); int pos = x + y * GetIsoSize(); - if (pos < fielddata_size) { + if (pos < fielddata.size()) { fielddata[pos].terrain = m_terrain.size() - 1; fielddata[pos].terraintype = terrainid[lpType]; } @@ -3225,7 +3219,7 @@ void CMapData::UpdateMapFieldData(BOOL bSave) int dwX, dwY; for (dwX = 0; dwX <= m_IsoSize; dwX++) { for (dwY = 0; dwY <= m_IsoSize; dwY++) { - /*for(i=0;i= (*tiledata_count)) return FALSE; @@ -4682,7 +4668,7 @@ void CMapData::Redo() /* int i; - for(i=0;i fielddata_size) { + if (dwPos > fielddata.size()) { return; } @@ -5535,7 +5521,7 @@ int CMapData::CalcMoneyOnMap() { int i; int money = 0; - for (i = 0; i < fielddata_size; i++) { + for (i = 0; i < fielddata.size(); i++) { FIELDDATA& fd = fielddata[i]; BYTE& ovrl = fd.overlay; @@ -5728,11 +5714,11 @@ void CMapData::ResizeMap(int iLeft, int iTop, DWORD dwNewWidth, DWORD dwNewHeigh DeleteCelltag(0); } - FIELDDATA* old_fd = fielddata; + auto const old_fd = std::exchange(fielddata, {}); int ow = GetWidth(); int oh = GetHeight(); int os = GetIsoSize(); - int old_fds = fielddata_size; + auto const old_fds = fielddata.size(); int left = iLeft; int top = iTop; @@ -5751,11 +5737,10 @@ void CMapData::ResizeMap(int iLeft, int iTop, DWORD dwNewWidth, DWORD dwNewHeigh delete[] m_snapshots[i].overlaydata; // m_snapshots[i].mapfile.Clear(); } - if (m_snapshots != NULL) delete[] m_snapshots; + if (m_snapshots != NULL) { + delete[] m_snapshots; + } - - fielddata = NULL; - fielddata_size = 0; m_snapshots = NULL; dwSnapShotCount = 0; m_cursnapshot = -1; @@ -5790,8 +5775,7 @@ void CMapData::ResizeMap(int iLeft, int iTop, DWORD dwNewWidth, DWORD dwNewHeigh errstream << "ResizeMap() allocates memory\n"; errstream.flush(); - fielddata = new(FIELDDATA[(GetIsoSize() + 1) * (GetIsoSize() + 1)]); // +1 because of some unpacking problems - fielddata_size = (GetIsoSize() + 1) * (GetIsoSize() + 1); + fielddata.resize((GetIsoSize() + 1)* (GetIsoSize() + 1)); // +1 because of some unpacking problems dwIsoMapSize = 0; // our iso mappack is empty now, as we didn“t load from a file errstream << "ResizeMap() frees m_mfd\n"; @@ -5839,7 +5823,7 @@ void CMapData::ResizeMap(int iLeft, int iTop, DWORD dwNewWidth, DWORD dwNewHeigh } FIELDDATA& fdd = fielddata[x + y * m_IsoSize]; - FIELDDATA& fdo = old_fd[i + e * os]; + const FIELDDATA& fdo = old_fd.at(i + e * os); fdd.bCliffHack = fdo.bCliffHack; fdd.bHeight = fdo.bHeight; @@ -6054,8 +6038,6 @@ void CMapData::ResizeMap(int iLeft, int iTop, DWORD dwNewWidth, DWORD dwNewHeigh dlg->SetRange(0, m_IsoSize * m_IsoSize); dlg->ShowWindow(SW_SHOW); - if (old_fd) delete[] old_fd; - errstream << "Init minimap" << endl; errstream.flush(); @@ -6133,7 +6115,7 @@ BOOL CMapData::IsYRMap() int yroverlay = g_data.GetInteger("YROverlay", "Begin"); - for (i = 0; i < fielddata_size; i++) { + for (i = 0; i < fielddata.size(); i++) { if (fielddata[i].wGround != 0xFFFF && fielddata[i].wGround >= max) { return TRUE; } @@ -6265,7 +6247,7 @@ BOOL CMapData::AddSmudge(SMUDGE* lpSmudge) if (m_smudges[i].deleted) // yep, found one, replace it { m_smudges[i] = td; - if (pos < fielddata_size) { + if (pos < fielddata.size()) { fielddata[pos].smudge = i; fielddata[pos].smudgetype = smudgeid[td.type]; } @@ -6278,7 +6260,7 @@ BOOL CMapData::AddSmudge(SMUDGE* lpSmudge) if (!bFound) { m_smudges.push_back(td); - if (pos < fielddata_size) { + if (pos < fielddata.size()) { fielddata[pos].smudge = m_smudges.size() - 1; fielddata[pos].smudgetype = smudgeid[td.type]; } @@ -6299,7 +6281,7 @@ void CMapData::DeleteSmudge(DWORD dwIndex) m_smudges[dwIndex].deleted = 1; int pos = x + y * GetIsoSize(); - if (x + y * m_IsoSize < fielddata_size) { + if (x + y * m_IsoSize < fielddata.size()) { fielddata[pos].smudge = -1; fielddata[pos].smudgetype = -1; } diff --git a/MissionEditor/MapData.h b/MissionEditor/MapData.h index 3758677..3a45c9d 100644 --- a/MissionEditor/MapData.h +++ b/MissionEditor/MapData.h @@ -160,7 +160,9 @@ public: void SetFielddataAt(DWORD dwPos, FIELDDATA* lpFd) { - if (dwPos >= fielddata_size) return; + if (dwPos >= fielddata.size()) { + return; + } RemoveOvrlMoney(fielddata[dwPos].overlay, fielddata[dwPos].overlaydata); fielddata[dwPos] = (*lpFd); @@ -186,7 +188,7 @@ public: void CreateMap(DWORD dwWidth, DWORD dwHeight, LPCTSTR lpTerrainType, DWORD dwGroundHeight); BOOL SetTileAt(DWORD dwPos, DWORD dwID, DWORD dwTile) { - if (dwPos > fielddata_size) { + if (dwPos > fielddata.size()) { return FALSE; } @@ -222,10 +224,10 @@ public: void SetHeightAt(DWORD dwPos, BYTE bHeight) { - int height = (char)bHeight; - if (height > MAXHEIGHT) height = MAXHEIGHT; // too high else - if (height < 0) height = 0; - if (dwPos < fielddata_size) fielddata[dwPos].bHeight = height; + auto const height = std::max(0, std::min(bHeight, MAXHEIGHT)); + if (dwPos < fielddata.size()) { + fielddata[dwPos].bHeight = height; + } } @@ -362,7 +364,10 @@ public: } INT GetHeightAt(DWORD dwPos) const { - return fielddata[dwPos].bHeight; + if (dwPos < fielddata.size()) { + return fielddata[dwPos].bHeight; + } + return 0; } INT GetHeightAt(const MapCoords& coords) const { @@ -371,7 +376,7 @@ public: const FIELDDATA* GetFielddataAt(DWORD dwPos) const { - if (dwPos >= fielddata_size) { + if (dwPos >= fielddata.size()) { outside_f.bReserved = 1; return &outside_f; } @@ -381,7 +386,7 @@ public: FIELDDATA* GetFielddataAt(DWORD dwPos) { - if (dwPos >= fielddata_size) { + if (dwPos >= fielddata.size()) { outside_f.bReserved = 1; return &outside_f; } @@ -397,7 +402,7 @@ public: const FIELDDATA* GetFielddataAt(const MapCoords& pos) const { auto dwPos = GetMapPos(pos); - if (dwPos >= fielddata_size) { + if (dwPos >= fielddata.size()) { outside_f.bReserved = 1; return &outside_f; } @@ -408,7 +413,7 @@ public: FIELDDATA* GetFielddataAt(const MapCoords& pos) { auto dwPos = GetMapPos(pos); - if (dwPos >= fielddata_size) { + if (dwPos >= fielddata.size()) { outside_f.bReserved = 1; return &outside_f; } @@ -472,6 +477,7 @@ public: bool IsCoordInMap(int X, int Y) const; inline int GetCoordIndex(int X, int Y) const { return X + Y * GetIsoSize(); } bool isInside(MapCoords xy) const; + bool isInside(int x, int y) const; __forceinline CPoint GetMiniMapPos(MapCoords mapCoords) { @@ -517,8 +523,7 @@ private: CIniFile m_mapfile; RECT m_maprect; RECT m_vismaprect; - FIELDDATA* fielddata; - int fielddata_size; + std::vector fielddata; SNAPSHOTDATA* m_snapshots; DWORD dwSnapShotCount; int m_cursnapshot; @@ -688,6 +693,10 @@ inline bool CMapData::isInside(MapCoords xy) const { return xy.x >= 0 && xy.y >= 0 && xy.x < m_IsoSize&& xy.y < m_IsoSize; } +inline bool CMapData::isInside(int x, int y) const +{ + return x >= 0 && y >= 0 && x < m_IsoSize&& y < m_IsoSize; +} inline MapCoords CMapData::ToMapCoords(ProjectedCoords xy) const { diff --git a/MissionEditor/MapOperationMiniMap.cpp b/MissionEditor/MapOperationMiniMap.cpp index c7d4ba9..48a257b 100644 --- a/MissionEditor/MapOperationMiniMap.cpp +++ b/MissionEditor/MapOperationMiniMap.cpp @@ -164,7 +164,7 @@ void CMapData::Mini_UpdatePos(const int i, const int e, bool isMultiplayer) int i, e; for (i = -1; i < 2; i++) { for (e = -1; e < 2; e++) { - if (dwPos + i + e * m_IsoSize < fielddata_size) { + if (dwPos + i + e * m_IsoSize < fielddata.size()) { int w = GetWaypointAt(dwPos + i + e * m_IsoSize); if (w >= 0) { GetWaypointData(w, &id, &p); diff --git a/MissionEditor/MapOperationSmooth.cpp b/MissionEditor/MapOperationSmooth.cpp index ed58376..531c4e5 100644 --- a/MissionEditor/MapOperationSmooth.cpp +++ b/MissionEditor/MapOperationSmooth.cpp @@ -42,7 +42,7 @@ void CMapData::SmoothAt(DWORD dwPos, int iSmoothSet, int iLatSet, int iTargetSet for (i = 0; i < 3; i++) { for (e = 0; e < 3; e++) { int pos = dwPos + (i - 1) + (e - 1) * m_IsoSize; - if (pos < 0 || pos >= fielddata_size) { + if (pos < 0 || pos >= fielddata.size()) { ts[i][e] = 0; } else { FIELDDATA m2 = *GetFielddataAt(pos);