mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@21 3b4a5df2-a311-0410-b5c6-a8a6f20db521
248 lines
5.2 KiB
C++
248 lines
5.2 KiB
C++
#include "worlddef.h"
|
|
#include "renderworld.h"
|
|
#include "Isometric Utils.h"
|
|
|
|
INT16 gsRScreenCenterX, gsRScreenCenterY;
|
|
INT16 gsRDistToCenterY, gsRDistToCenterX;
|
|
|
|
#define GetMapXYWorldY( sWorldCellX, sWorldCellY, sWorldY )\
|
|
{\
|
|
\
|
|
gsRDistToCenterX = ( sWorldCellX * CELL_X_SIZE ) - gCenterWorldX;\
|
|
gsRDistToCenterY = ( sWorldCellY * CELL_Y_SIZE ) - gCenterWorldY;\
|
|
\
|
|
gsRScreenCenterY = gsRDistToCenterX + gsRDistToCenterY;\
|
|
\
|
|
sWorldY = gsRScreenCenterY + gsCY - gsTLY;\
|
|
}
|
|
|
|
#define GetMapXYWorldYFromCellCoords( sWorldCellX, sWorldCellY, sWorldY )\
|
|
{\
|
|
\
|
|
gsRDistToCenterX = sWorldCellX - gCenterWorldX;\
|
|
gsRDistToCenterY = sWorldCellY - gCenterWorldY;\
|
|
\
|
|
gsRScreenCenterY = gsRDistToCenterX + gsRDistToCenterY;\
|
|
\
|
|
sWorldY = gsRScreenCenterY + gsCY - gsTLY;\
|
|
}
|
|
|
|
|
|
#define LandZLevel( sMapX, sMapY )\
|
|
{\
|
|
sZLevel = LAND_Z_LEVEL;\
|
|
}
|
|
|
|
|
|
#define ObjectZLevel( TileElem, pNode, sMapX, sMapY )\
|
|
{\
|
|
GetMapXYWorldY( sMapX, sMapY, sWorldY );\
|
|
\
|
|
if ( uiTileElemFlags & CLIFFHANG_TILE )\
|
|
{\
|
|
sZLevel=LAND_Z_LEVEL;\
|
|
}\
|
|
else if ( uiTileElemFlags & OBJECTLAYER_USEZHEIGHT )\
|
|
{\
|
|
sZLevel=( ( sWorldY ) *Z_SUBLAYERS)+LAND_Z_LEVEL;\
|
|
}\
|
|
else\
|
|
{\
|
|
sZLevel=OBJECT_Z_LEVEL;\
|
|
}\
|
|
}
|
|
|
|
|
|
#define StructZLevel( sMapX, sMapY )\
|
|
{\
|
|
\
|
|
GetMapXYWorldY( sMapX, sMapY, sWorldY );\
|
|
\
|
|
if ( ( uiLevelNodeFlags & LEVELNODE_ROTTINGCORPSE ) )\
|
|
{\
|
|
if ( pCorpse->def.usFlags & ROTTING_CORPSE_VEHICLE )\
|
|
{\
|
|
\
|
|
if ( pNode->pStructureData != NULL )\
|
|
{\
|
|
sZOffsetX = pNode->pStructureData->pDBStructureRef->pDBStructure->bZTileOffsetX;\
|
|
sZOffsetY = pNode->pStructureData->pDBStructureRef->pDBStructure->bZTileOffsetY;\
|
|
}\
|
|
\
|
|
GetMapXYWorldY( (sMapX + sZOffsetX), (sMapY + sZOffsetY), sWorldY );\
|
|
\
|
|
GetMapXYWorldY( (sMapX + sZOffsetX), (sMapY + sZOffsetY), sWorldY );\
|
|
\
|
|
sZLevel=( ( sWorldY ) * Z_SUBLAYERS)+STRUCT_Z_LEVEL;\
|
|
\
|
|
}\
|
|
else\
|
|
{\
|
|
sZOffsetX = -1;\
|
|
sZOffsetY = -1;\
|
|
GetMapXYWorldY( (sMapX + sZOffsetX), (sMapY + sZOffsetY), sWorldY );\
|
|
\
|
|
sWorldY += 20;\
|
|
\
|
|
sZLevel=( ( sWorldY ) * Z_SUBLAYERS)+LAND_Z_LEVEL;\
|
|
}\
|
|
}\
|
|
else if ( uiLevelNodeFlags & LEVELNODE_PHYSICSOBJECT )\
|
|
{\
|
|
sWorldY += pNode->sRelativeZ;\
|
|
\
|
|
sZLevel=(sWorldY*Z_SUBLAYERS)+ONROOF_Z_LEVEL;\
|
|
\
|
|
}\
|
|
else if ( uiLevelNodeFlags & LEVELNODE_ITEM )\
|
|
{\
|
|
if ( pNode->pItemPool->bRenderZHeightAboveLevel > 0 )\
|
|
{\
|
|
sZLevel=(sWorldY*Z_SUBLAYERS)+STRUCT_Z_LEVEL;\
|
|
sZLevel+=( pNode->pItemPool->bRenderZHeightAboveLevel );\
|
|
}\
|
|
else\
|
|
{\
|
|
sZLevel=(sWorldY*Z_SUBLAYERS)+OBJECT_Z_LEVEL;\
|
|
}\
|
|
}\
|
|
else if ( uiAniTileFlags & ANITILE_SMOKE_EFFECT )\
|
|
{\
|
|
sZLevel=(sWorldY*Z_SUBLAYERS)+OBJECT_Z_LEVEL;\
|
|
}\
|
|
else if ( ( uiLevelNodeFlags & LEVELNODE_USEZ ) )\
|
|
{\
|
|
\
|
|
if ( ( uiLevelNodeFlags & LEVELNODE_NOZBLITTER ) )\
|
|
{\
|
|
sWorldY += 40;\
|
|
}\
|
|
else\
|
|
{\
|
|
sWorldY += pNode->sRelativeZ;\
|
|
}\
|
|
\
|
|
sZLevel=(sWorldY*Z_SUBLAYERS)+ONROOF_Z_LEVEL;\
|
|
}\
|
|
else\
|
|
{\
|
|
sZLevel=(sWorldY*Z_SUBLAYERS)+STRUCT_Z_LEVEL;\
|
|
}\
|
|
\
|
|
}
|
|
|
|
#define RoofZLevel( sMapX, sMapY )\
|
|
{\
|
|
\
|
|
GetMapXYWorldY( sMapX, sMapY, sWorldY );\
|
|
\
|
|
sWorldY += WALL_HEIGHT;\
|
|
\
|
|
sZLevel=(sWorldY*Z_SUBLAYERS)+ROOF_Z_LEVEL;\
|
|
\
|
|
}
|
|
|
|
#define OnRoofZLevel( sMapX, sMapY )\
|
|
{\
|
|
\
|
|
GetMapXYWorldY( sMapX, sMapY, sWorldY );\
|
|
\
|
|
if ( uiLevelNodeFlags & LEVELNODE_ROTTINGCORPSE )\
|
|
{\
|
|
sWorldY += ( WALL_HEIGHT + 40 );\
|
|
}\
|
|
if ( uiLevelNodeFlags & LEVELNODE_ROTTINGCORPSE )\
|
|
{\
|
|
sWorldY += ( WALL_HEIGHT + 40 );\
|
|
}\
|
|
else\
|
|
{\
|
|
sWorldY += WALL_HEIGHT;\
|
|
}\
|
|
\
|
|
sZLevel=(sWorldY*Z_SUBLAYERS)+ONROOF_Z_LEVEL;\
|
|
\
|
|
}
|
|
|
|
#define TopmostZLevel( sMapX, sMapY )\
|
|
{\
|
|
\
|
|
GetMapXYWorldY( sMapX, sMapY, sWorldY );\
|
|
\
|
|
sZLevel=TOPMOST_Z_LEVEL;\
|
|
\
|
|
}
|
|
|
|
#define ShadowZLevel( sMapX, sMapY )\
|
|
{\
|
|
\
|
|
GetMapXYWorldY( sMapX, sMapY, sWorldY );\
|
|
\
|
|
sZLevel=__max( ( (sWorldY - 80 ) *Z_SUBLAYERS )+SHADOW_Z_LEVEL, 0 );\
|
|
\
|
|
}
|
|
|
|
#define SoldierZLevel( pSoldier, sMapX, sMapY )\
|
|
{\
|
|
\
|
|
if ( ( pSoldier->uiStatusFlags & SOLDIER_MULTITILE ) )\
|
|
{\
|
|
\
|
|
if ( pNode->pStructureData != NULL )\
|
|
{\
|
|
sZOffsetX = pNode->pStructureData->pDBStructureRef->pDBStructure->bZTileOffsetX;\
|
|
sZOffsetY = pNode->pStructureData->pDBStructureRef->pDBStructure->bZTileOffsetY;\
|
|
}\
|
|
\
|
|
GetMapXYWorldY( (sMapX + sZOffsetX), (sMapY + sZOffsetY), sWorldY );\
|
|
\
|
|
}\
|
|
else\
|
|
{\
|
|
GetMapXYWorldY( sMapX, sMapY, sWorldY );\
|
|
}\
|
|
\
|
|
if ( pSoldier->uiStatusFlags & SOLDIER_VEHICLE )\
|
|
{\
|
|
sZLevel=(sWorldY*Z_SUBLAYERS)+STRUCT_Z_LEVEL;\
|
|
}\
|
|
else\
|
|
{\
|
|
if ( pSoldier->dHeightAdjustment > 0 )\
|
|
{\
|
|
sWorldY += ( WALL_HEIGHT + 20 );\
|
|
\
|
|
sZLevel=(sWorldY*Z_SUBLAYERS)+ONROOF_Z_LEVEL;\
|
|
}\
|
|
else\
|
|
{\
|
|
if ( ( pSoldier->uiStatusFlags & SOLDIER_DEAD ) )\
|
|
{\
|
|
sZLevel=(sWorldY*Z_SUBLAYERS)+MERC_Z_LEVEL;\
|
|
}\
|
|
else\
|
|
{\
|
|
sZLevel=(sWorldY*Z_SUBLAYERS)+MERC_Z_LEVEL;\
|
|
}\
|
|
}\
|
|
\
|
|
if ( pSoldier->sZLevelOverride != -1 )\
|
|
{\
|
|
sZLevel = pSoldier->sZLevelOverride;\
|
|
}\
|
|
\
|
|
if ( gsForceSoldierZLevel != 0 )\
|
|
{\
|
|
sZLevel = gsForceSoldierZLevel;\
|
|
}\
|
|
}\
|
|
\
|
|
}
|
|
|
|
|
|
//#if 0
|
|
// sZOffsetX = pNode->pStructureData->pDBStructureRef->pDBStructure->bZTileOffsetX;\
|
|
//// sZOffsetY = pNode->pStructureData->pDBStructureRef->pDBStructure->bZTileOffsetY;\
|
|
//#endif
|
|
|