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>
This commit is contained in:
Zero Fanker 2024-12-30 20:21:02 -05:00 committed by GitHub
parent ac22ab9aab
commit a9c9a5287b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 126 additions and 92 deletions

View file

@ -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();

View file

@ -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<fielddata_size;i++)
/*for(i=0;i<fielddata.size();i++)
{*/
//int dwX=i%m_IsoSize;
//int dwY=i/m_IsoSize;
@ -3716,9 +3710,7 @@ MAPFIELDDATA* CMapData::GetMappackPointer(DWORD dwPos)
void CMapData::CreateMap(DWORD dwWidth, DWORD dwHeight, LPCTSTR lpTerrainType, DWORD dwGroundHeight)
{
if (fielddata != NULL) {
delete[] fielddata;
}
fielddata.clear();
int i;
for (i = 0; i < dwSnapShotCount; i++) {
delete[] m_snapshots[i].bHeight;
@ -3735,11 +3727,6 @@ void CMapData::CreateMap(DWORD dwWidth, DWORD dwHeight, LPCTSTR lpTerrainType, D
delete[] m_snapshots;
}
fielddata = NULL;
fielddata_size = 0;
m_snapshots = NULL;
dwSnapShotCount = 0;
m_cursnapshot = -1;
@ -4068,12 +4055,11 @@ void CMapData::CreateMap(DWORD dwWidth, DWORD dwHeight, LPCTSTR lpTerrainType, D
ClearOverlayData();
isInitialized = TRUE;
if (fielddata != NULL) delete[] fielddata;
fielddata.clear();
errstream << "CreateMap() 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;
errstream << "CreateMap() frees m_mfd\n";
@ -4092,7 +4078,7 @@ void CMapData::CreateMap(DWORD dwWidth, DWORD dwHeight, LPCTSTR lpTerrainType, D
errstream.flush();
for (i = 0; i < fielddata_size; i++) {
for (i = 0; i < fielddata.size(); i++) {
fielddata[i].bHeight = dwGroundHeight;
}
@ -4447,7 +4433,7 @@ or if loading maps made with modified tilesets
BOOL CMapData::CheckMapPackData()
{
int i;
for (i = 0; i < fielddata_size; i++) {
for (i = 0; i < fielddata.size(); i++) {
int gr = fielddata[i].wGround;
if (gr != 0xFFFF && gr >= (*tiledata_count))
return FALSE;
@ -4682,7 +4668,7 @@ void CMapData::Redo()
/*
int i;
for(i=0;i<fielddata_size;i++)
for(i=0;i<fielddata.size();i++)
{
fielddata[i].bHeight=m_snapshots[m_cursnapshot+1].bHeight[i];
fielddata[i].bMapData=m_snapshots[m_cursnapshot+1].bMapData[i];
@ -4738,7 +4724,7 @@ void CMapData::SmoothAllAt(DWORD dwPos)
return;
}
if (dwPos > 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;
}

View file

@ -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<int>(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> 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
{

View file

@ -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);

View file

@ -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);