mirror of
https://github.com/electronicarts/CNC_TS_and_RA2_Mission_Editor.git
synced 2025-04-30 17:11:40 -04:00
173 lines
No EOL
4.7 KiB
C++
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);
|
|
|
|
}
|
|
}
|
|
} |