CNC_TS_and_RA2_Mission_Editor/MissionEditor/MapOperationSlopes.cpp
2024-06-18 00:35:49 -04:00

173 lines
No EOL
4.7 KiB
C++

#include "stdafx.h"
#include "MapData.h"
void CMapData::CreateSlopesAt(DWORD dwPos)
{
//OutputDebugString("CreateSlopes()\n");
auto& m = *GetFielddataAt(dwPos);
if (m.wGround == 0xFFFF) {
m.wGround = 0;
}
TILEDATA& d = (*tiledata)[m.wGround];
int ns = -1;
int i, e, p = 0;
int h[3][3];
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 >= m_IsoSize * m_IsoSize) {
h[i][e] = 0;
} else {
auto const& m2 = *GetFielddataAt(pos);
h[i][e] = m.bHeight - m2.bHeight;
}
}
}
// check if the current tile must be heightened anyway
if (!theApp.m_Options.bDisableSlopeCorrection && d.bMorphable) {
if ((h[0][1] < 0 && h[2][1] < 0) || (h[1][0] < 0 && h[1][2] < 0)
|| (h[1][0] < 0 && h[0][2] < 0 && h[0][1] >= 0)
|| (h[1][0] < 0 && h[2][2] < 0 && h[2][1] >= 0)
|| (h[0][1] < 0 && h[2][0] < 0 && h[1][0] >= 0)
|| (h[0][1] < 0 && h[2][2] < 0 && h[1][2] >= 0)
|| (h[1][2] < 0 && h[0][0] < 0 && h[0][1] >= 0)
|| (h[1][2] < 0 && h[2][0] < 0 && h[2][1] >= 0)
|| (h[2][1] < 0 && h[0][0] < 0 && h[1][0] >= 0)
|| (h[2][1] < 0 && h[0][2] < 0 && h[1][2] >= 0)
|| (h[1][0] < 0 && h[0][1] < 0 && h[0][0] >= 0)
|| (h[0][1] < 0 && h[1][2] < 0 && h[0][2] >= 0)
|| (h[1][2] < 0 && h[2][1] < 0 && h[2][2] >= 0)
|| (h[2][1] < 0 && h[1][0] < 0 && h[2][0] >= 0)
) {
SetHeightAt(dwPos, m.bHeight + 1);
for (i = -1; i < 2; i++) {
for (e = -1; e < 2; e++) {
CreateSlopesAt(dwPos + i + e * m_IsoSize);
}
}
return;
}
}
BOOL checkOtherSlopes = FALSE;
if (h[0][0] == -1 && h[2][2] == -1 && h[2][0] >= 0 && h[0][2] >= 0 && h[1][0] >= 0 && h[1][2] >= 0 && h[0][1] >= 0 && h[2][1] >= 0) {
ns = SLOPE_UP_LEFTTOP_AND_RIGHTBOTTOM;
}
if (h[0][2] == -1 && h[2][0] == -1 && h[0][0] >= 0 && h[2][2] >= 0 && h[0][1] >= 0 && h[1][0] >= 0 && h[1][2] >= 0 && h[2][1] >= 0) {
ns = SLOPE_UP_LEFTBOTTOM_AND_RIGHTTOP;
}
if (ns == -1) {
if (h[1][0] == -1 && h[0][1] != -1 && h[1][2] != -1 && h[2][1] != -1) {
ns = SLOPE_UP_LEFT;
} else if (h[0][1] == -1 && h[1][0] != -1 && h[2][1] != -1 && h[1][2] != -1) {
ns = SLOPE_UP_TOP;
} else if (h[1][2] == -1 && h[0][1] != -1 && h[1][0] != -1 && h[2][1] != -1) {
ns = SLOPE_UP_RIGHT;
} else if (h[2][1] == -1 && h[0][1] != -1 && h[1][0] != -1 && h[1][2] != -1) {
ns = SLOPE_UP_BOTTOM;
}
if (ns == -1) {
if (h[0][0] == -2) {
ns = SLOPE_DOWN_BOTTOM;
}
if (h[2][0] == -2) {
ns = SLOPE_DOWN_RIGHT;
}
if (h[0][2] == -2) {
ns = SLOPE_DOWN_LEFT;
}
if (h[2][2] == -2) {
ns = SLOPE_DOWN_TOP;
}
}
if (ns == -1 && h[0][0] == -1) {
if (h[1][0] == -1 && h[0][1] == -1) {
ns = SLOPE_DOWN_RIGHTBOTTOM;
} else if (h[1][0] == 0 && h[0][1] == 0) {
ns = SLOPE_UP_LEFTTOP;
}
//else if(h[2][2]==1) ns=SLOPE_DOWN_BOTTOM;
}
if (ns == -1 && h[2][0] == -1) {
if (h[1][0] == -1 && h[2][1] == -1) {
ns = SLOPE_DOWN_RIGHTTOP;
} else if (h[1][0] == 0 && h[2][1] == 0) {
ns = SLOPE_UP_LEFTBOTTOM;
}
//else if(h[0][2]==1) ns=SLOPE_DOWN_RIGHT;
}
if (ns == -1 && h[0][2] == -1) {
if (h[1][2] == -1 && h[0][1] == -1) {
ns = SLOPE_DOWN_LEFTBOTTOM;
} else if (h[1][2] == 0 && h[0][1] == 0) {
ns = SLOPE_UP_RIGHTTOP;
}
//else if(h[2][0]==1) ns=SLOPE_DOWN_LEFT;
}
if (ns == -1 && h[2][2] == -1) {
if (h[1][2] == -1 && h[2][1] == -1) {
ns = SLOPE_DOWN_LEFTTOP;
} else if (h[1][2] == 0 && h[2][1] == 0) {
ns = SLOPE_UP_RIGHTBOTTOM;
}
//else if(h[0][0]==1) ns=SLOPE_DOWN_TOP;
}
if (ns == -1 && h[1][0] == -1 && h[2][1] == -1) {
ns = SLOPE_DOWN_RIGHTTOP;
}
if (ns == -1 && h[1][2] == -1 && h[2][1] == -1) {
ns = SLOPE_DOWN_LEFTTOP;
}
if (ns == -1 && h[1][0] == -1 && h[0][1] == -1) {
ns = SLOPE_DOWN_RIGHTBOTTOM;
}
if (ns == -1 && h[1][2] == -1 && h[0][1] == -1) {
ns = SLOPE_DOWN_LEFTBOTTOM;
}
int rampbase = rampset_start;//atoi((*tiles).sections["General"].values["RampBase"]);
int rampsmooth = tiles->GetInteger("General", "RampSmooth");
if (ns == -1 && (d.wTileSet == rampset || d.wTileSet == rampsmooth) && d.bMorphable) {
SetTileAt(dwPos, 0, 0);
}
if (tiledata == &un_tiledata) {
int r = ramp2set;
int m = pave2set;
if (ns == -1 && (d.wTileSet == r || d.wTileSet == m) && d.bMorphable) {
SetTileAt(dwPos, pave2set_start/*GetTileID(m,0)*/, 0);
}
}
if (d.bMorphable && ns != -1) {
// NEW URBAN FIX FOR URBAN PAVEMENT
if (tiledata == &un_tiledata) {
//[NewUrbanInfo]
//Morphable2=114
//Ramps2=117
int r = ramp2set;
int m = pave2set;
if (d.wTileSet == r || d.wTileSet == m) {
rampbase = ramp2set_start;
}
}
SetTileAt(dwPos, rampbase + ns - 1, 0);
}
}
}