Files
source/Tactical/Structure Wrap.cpp
T
Wanne 91087ca8c0 ************************************************************
* Merged Source Code from Development Trunk: Revision 4063 *
************************************************************
- Source Code is merged from: https://81.169.133.124/source/ja2/branches/Wanne/JA2%201.13%20MP
- This will be the Source for the Beta 2011 Test

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@4064 3b4a5df2-a311-0410-b5c6-a8a6f20db521
2011-01-18 09:11:09 +00:00

652 lines
15 KiB
C++

#ifdef PRECOMPILEDHEADERS
#include "Tactical All.h"
#else
#include <stdio.h>
#include "debug.h"
#include "wcheck.h"
#include "worlddef.h"
#include "worldman.h"
#include "structure wrap.h"
#include "isometric utils.h"
#include "worldman.h"
#include "overhead.h"
#include "renderworld.h"
#include "strategicmap.h"
#include "rotting corpses.h"
#endif
extern BOOLEAN DoesSAMExistHere( INT16 sSectorX, INT16 sSectorY, INT16 sSectorZ, INT32 sGridNo );
//----------------legion by Jazz
BOOLEAN IsJumpableWindowPresentAtGridNo( INT32 sGridNo, INT8 direction2 )
{
STRUCTURE * pStructure;
pStructure = FindStructure( sGridNo, STRUCTURE_WALLNWINDOW );
if ( pStructure )
{
if ( ( direction2 == SOUTH || direction2 == NORTH ) && (pStructure->ubWallOrientation == OUTSIDE_TOP_LEFT || pStructure->ubWallOrientation == INSIDE_TOP_LEFT ) && pStructure->fFlags & STRUCTURE_WALLNWINDOW && !(pStructure->fFlags & STRUCTURE_SPECIAL) && ( pStructure->fFlags & STRUCTURE_OPEN ) )
{
return( TRUE );
}
if ( ( direction2 == EAST || direction2 == WEST ) && ( pStructure->ubWallOrientation == OUTSIDE_TOP_RIGHT || pStructure->ubWallOrientation == INSIDE_TOP_RIGHT ) && pStructure->fFlags & STRUCTURE_WALLNWINDOW && !(pStructure->fFlags & STRUCTURE_SPECIAL) && ( pStructure->fFlags & STRUCTURE_OPEN ) )
{
return( TRUE );
}
}
return( FALSE );
}
BOOLEAN IsOknoFencePresentAtGridno( INT32 sGridNo )
{
STRUCTURE * pStructure;
pStructure = FindStructure( sGridNo, STRUCTURE_WALLNWINDOW );
if ( pStructure )
{
if ( pStructure->fFlags & STRUCTURE_WALLNWINDOW && !(pStructure->fFlags & STRUCTURE_SPECIAL) && ( pStructure->fFlags & STRUCTURE_OPEN ) )
{
return( TRUE );
}
}
/* STRUCTURE * pStructure;
STRUCTURE * pStructure2;
pStructure = FindStructure( sGridNo, STRUCTURE_WALLNWINDOW );
if ( pStructure )
{
// pStructure2 = FindStructure( sGridNo, STRUCTURE_WALL );
// if ( !pStructure2 )
// {
if ( pStructure->fFlags & STRUCTURE_WALLNWINDOW && !(pStructure->fFlags & STRUCTURE_SPECIAL) && ( pStructure->fFlags & STRUCTURE_OPEN ))
{
return( TRUE );
}
// }
}
*/
return( FALSE );
}
BOOLEAN IsLegionFencePresentAtGridno( INT32 sGridNo )
{
STRUCTURE * pStructure;
pStructure = FindStructure( sGridNo, STRUCTURE_FENCE );
if ( pStructure )
{
if ( pStructure->fFlags & STRUCTURE_FENCE ) // && (pStructure->fFlags & STRUCTURE_SPECIAL))//&& !(pStructure->fFlags & STRUCTURE_SPECIAL) && ( pStructure->fFlags & STRUCTURE_OPEN ))
{
return( TRUE );
}
}
return( FALSE );
}
//-------------------------------------------------------------------------------------
BOOLEAN IsFencePresentAtGridNo( INT32 sGridNo )
{
if ( FindStructure( sGridNo, STRUCTURE_ANYFENCE ) != NULL )
{
return( TRUE );
}
return( FALSE );
}
BOOLEAN IsRoofPresentAtGridNo( INT32 sGridNo )
{
if ( FindStructure( sGridNo, STRUCTURE_ROOF ) != NULL )
{
return( TRUE );
}
return( FALSE );
}
BOOLEAN IsJumpableFencePresentAtGridNo( INT32 sGridNo )
{
STRUCTURE * pStructure;
pStructure = FindStructure( sGridNo, STRUCTURE_OBSTACLE );
if ( pStructure )
{
if ( pStructure->fFlags & STRUCTURE_FENCE && !(pStructure->fFlags & STRUCTURE_SPECIAL) )
{
return( TRUE );
}
if ( pStructure->pDBStructureRef->pDBStructure->ubArmour == MATERIAL_SANDBAG && StructureHeight( pStructure ) < 2 )
{
return( TRUE );
}
}
return( FALSE );
}
BOOLEAN IsDoorPresentAtGridNo( INT32 sGridNo )
{
if ( FindStructure( sGridNo, STRUCTURE_ANYDOOR ) != NULL )
{
return( TRUE );
}
return( FALSE );
}
BOOLEAN IsTreePresentAtGridNo( INT32 sGridNo )
{
if ( FindStructure( sGridNo, STRUCTURE_TREE ) != NULL )
{
return( TRUE );
}
return( FALSE );
}
LEVELNODE *IsWallPresentAtGridNo( INT32 sGridNo )
{
LEVELNODE *pNode = NULL;
STRUCTURE * pStructure;
pStructure = FindStructure( sGridNo, STRUCTURE_WALLSTUFF );
if ( pStructure != NULL )
{
pNode = FindLevelNodeBasedOnStructure( sGridNo, pStructure );
}
return( pNode );
}
LEVELNODE *GetWallLevelNodeOfSameOrientationAtGridNo( INT32 sGridNo, INT8 ubOrientation )
{
LEVELNODE *pNode = NULL;
STRUCTURE * pStructure;
pStructure = FindStructure( sGridNo, STRUCTURE_WALLSTUFF );
while ( pStructure != NULL )
{
// Check orientation
if ( pStructure->ubWallOrientation == ubOrientation )
{
pNode = FindLevelNodeBasedOnStructure( sGridNo, pStructure );
return( pNode );
}
pStructure = FindNextStructure( pStructure, STRUCTURE_WALLSTUFF );
}
return( NULL );
}
LEVELNODE *GetWallLevelNodeAndStructOfSameOrientationAtGridNo( INT32 sGridNo, INT8 ubOrientation, STRUCTURE **ppStructure )
{
LEVELNODE *pNode = NULL;
STRUCTURE * pStructure, * pBaseStructure;
(*ppStructure) = NULL;
pStructure = FindStructure( sGridNo, STRUCTURE_WALLSTUFF );
while ( pStructure != NULL )
{
// Check orientation
if ( pStructure->ubWallOrientation == ubOrientation )
{
pBaseStructure = FindBaseStructure( pStructure );
if (pBaseStructure)
{
pNode = FindLevelNodeBasedOnStructure( pBaseStructure->sGridNo, pBaseStructure );
(*ppStructure) = pBaseStructure;
return( pNode );
}
}
pStructure = FindNextStructure( pStructure, STRUCTURE_WALLSTUFF );
}
return( NULL );
}
BOOLEAN IsDoorVisibleAtGridNo( INT32 sGridNo )
{
STRUCTURE * pStructure;
INT32 sNewGridNo;
pStructure = FindStructure( sGridNo, STRUCTURE_ANYDOOR );
if ( pStructure != NULL )
{
// Check around based on orientation
switch( pStructure->ubWallOrientation )
{
case INSIDE_TOP_LEFT:
case OUTSIDE_TOP_LEFT:
// Here, check north direction
sNewGridNo = NewGridNo( sGridNo, DirectionInc( NORTH ) );
if ( IsRoofVisible2( sNewGridNo ) )
{
// OK, now check south, if true, she's not visible
sNewGridNo = NewGridNo( sGridNo, DirectionInc( SOUTH ) );
if ( IsRoofVisible2( sNewGridNo ) )
{
return( FALSE );
}
}
break;
case INSIDE_TOP_RIGHT:
case OUTSIDE_TOP_RIGHT:
// Here, check west direction
sNewGridNo = NewGridNo( sGridNo, DirectionInc( WEST ) );
if ( IsRoofVisible2( sNewGridNo ) )
{
// OK, now check south, if true, she's not visible
sNewGridNo = NewGridNo( sGridNo, DirectionInc( EAST ) );
if ( IsRoofVisible2( sNewGridNo ) )
{
return( FALSE );
}
}
break;
}
}
// Return true here, even if she does not exist
return( TRUE );
}
BOOLEAN DoesGridNoContainHiddenStruct( INT32 sGridNo, BOOLEAN *pfVisible )
{
// ATE: These are ignored now - always return false
//STRUCTURE *pStructure;
//pStructure = FindStructure( sGridNo, STRUCTURE_HIDDEN );
//if ( pStructure != NULL )
//{
// if ( !(gpWorldLevelData[ sGridNo ].uiFlags & MAPELEMENT_REVEALED ) && !(gTacticalStatus.uiFlags&SHOW_ALL_MERCS) )
// {
// *pfVisible = FALSE;
// }
// else
// {
// *pfVisible = TRUE;
// }//
//
// return( TRUE );
//}
return( FALSE );
}
BOOLEAN IsHiddenStructureVisible( INT32 sGridNo, UINT16 usIndex )
{
// Check if it's a hidden struct and we have not revealed anything!
if ( gTileDatabase[ usIndex ].uiFlags & HIDDEN_TILE )
{
if ( !(gpWorldLevelData[ sGridNo ].uiFlags & MAPELEMENT_REVEALED ) && !(gTacticalStatus.uiFlags&SHOW_ALL_MERCS) )
{
// Return false
return( FALSE );
}
}
return( TRUE );
}
BOOLEAN WallExistsOfTopLeftOrientation( INT32 sGridNo )
{
// CJC: changing to search only for normal walls, July 16, 1998
STRUCTURE * pStructure;
pStructure = FindStructure( sGridNo, STRUCTURE_WALL );
while ( pStructure != NULL )
{
// Check orientation
if ( pStructure->ubWallOrientation == INSIDE_TOP_LEFT || pStructure->ubWallOrientation == OUTSIDE_TOP_LEFT )
{
return( TRUE );
}
pStructure = FindNextStructure( pStructure, STRUCTURE_WALL );
}
return( FALSE );
}
BOOLEAN WallExistsOfTopRightOrientation( INT32 sGridNo )
{
// CJC: changing to search only for normal walls, July 16, 1998
STRUCTURE * pStructure;
pStructure = FindStructure( sGridNo, STRUCTURE_WALL );
while ( pStructure != NULL )
{
// Check orientation
if ( pStructure->ubWallOrientation == INSIDE_TOP_RIGHT || pStructure->ubWallOrientation == OUTSIDE_TOP_RIGHT )
{
return( TRUE );
}
pStructure = FindNextStructure( pStructure, STRUCTURE_WALL );
}
return( FALSE );
}
BOOLEAN WallOrClosedDoorExistsOfTopLeftOrientation( INT32 sGridNo )
{
STRUCTURE * pStructure;
pStructure = FindStructure( sGridNo, STRUCTURE_WALLSTUFF );
while ( pStructure != NULL )
{
// skip it if it's an open door
if ( ! ( ( pStructure->fFlags & STRUCTURE_ANYDOOR ) && ( pStructure->fFlags & STRUCTURE_OPEN ) ) )
{
// Check orientation
if ( pStructure->ubWallOrientation == INSIDE_TOP_LEFT || pStructure->ubWallOrientation == OUTSIDE_TOP_LEFT )
{
return( TRUE );
}
}
pStructure = FindNextStructure( pStructure, STRUCTURE_WALLSTUFF );
}
return( FALSE );
}
BOOLEAN WallOrClosedDoorExistsOfTopRightOrientation( INT32 sGridNo )
{
STRUCTURE * pStructure;
pStructure = FindStructure( sGridNo, STRUCTURE_WALLSTUFF );
while ( pStructure != NULL )
{
// skip it if it's an open door
if ( ! ( ( pStructure->fFlags & STRUCTURE_ANYDOOR ) && ( pStructure->fFlags & STRUCTURE_OPEN ) ) )
{
// Check orientation
if ( pStructure->ubWallOrientation == INSIDE_TOP_RIGHT || pStructure->ubWallOrientation == OUTSIDE_TOP_RIGHT )
{
return( TRUE );
}
}
pStructure = FindNextStructure( pStructure, STRUCTURE_WALLSTUFF );
}
return( FALSE );
}
BOOLEAN OpenRightOrientedDoorWithDoorOnRightOfEdgeExists( INT32 sGridNo )
{
STRUCTURE * pStructure;
pStructure = FindStructure( sGridNo, STRUCTURE_ANYDOOR );
while ( pStructure != NULL && (pStructure->fFlags & STRUCTURE_OPEN) )
{
// Check orientation
if ( pStructure->ubWallOrientation == INSIDE_TOP_RIGHT || pStructure->ubWallOrientation == OUTSIDE_TOP_RIGHT )
{
if ( (pStructure->fFlags & STRUCTURE_DOOR) || (pStructure->fFlags & STRUCTURE_DDOOR_RIGHT) )
{
return( TRUE );
}
}
pStructure = FindNextStructure( pStructure, STRUCTURE_ANYDOOR );
}
return( FALSE );
}
BOOLEAN OpenLeftOrientedDoorWithDoorOnLeftOfEdgeExists( INT32 sGridNo )
{
STRUCTURE * pStructure;
pStructure = FindStructure( sGridNo, STRUCTURE_ANYDOOR );
while ( pStructure != NULL && (pStructure->fFlags & STRUCTURE_OPEN) )
{
// Check orientation
if ( pStructure->ubWallOrientation == INSIDE_TOP_LEFT || pStructure->ubWallOrientation == OUTSIDE_TOP_LEFT )
{
if ( (pStructure->fFlags & STRUCTURE_DOOR) || (pStructure->fFlags & STRUCTURE_DDOOR_LEFT) )
{
return( TRUE );
}
}
pStructure = FindNextStructure( pStructure, STRUCTURE_ANYDOOR );
}
return( FALSE );
}
STRUCTURE * FindCuttableWireFenceAtGridNo( INT32 sGridNo )
{
STRUCTURE * pStructure;
pStructure = FindStructure( sGridNo, STRUCTURE_WIREFENCE );
if (pStructure != NULL && pStructure->ubWallOrientation != NO_ORIENTATION && !(pStructure->fFlags & STRUCTURE_OPEN) )
{
return( pStructure );
}
return( NULL );
}
BOOLEAN CutWireFence( INT32 sGridNo )
{
STRUCTURE * pStructure;
pStructure = FindCuttableWireFenceAtGridNo( sGridNo );
if (pStructure)
{
pStructure = SwapStructureForPartnerAndStoreChangeInMap( sGridNo, pStructure );
if (pStructure)
{
RecompileLocalMovementCosts( sGridNo );
SetRenderFlags( RENDER_FLAG_FULL );
return( TRUE );
}
}
return( FALSE );
}
BOOLEAN IsCuttableWireFenceAtGridNo( INT32 sGridNo )
{
return( FindCuttableWireFenceAtGridNo( sGridNo ) != NULL );
}
BOOLEAN IsRepairableStructAtGridNo( INT32 sGridNo, UINT8 *pubID )
{
UINT8 ubMerc;
// OK, first look for a vehicle....
ubMerc = WhoIsThere2( sGridNo, 0 );
if ( pubID != NULL )
{
(*pubID) = ubMerc;
}
if ( ubMerc != NOBODY )
{
if ( MercPtrs[ ubMerc ]->flags.uiStatusFlags & SOLDIER_VEHICLE )
{
return( 2 );
}
}
// Then for over a robot....
// then for SAM site....
if ( DoesSAMExistHere( gWorldSectorX, gWorldSectorY, gbWorldSectorZ, sGridNo ) )
{
return( 3 );
}
return( FALSE );
}
BOOLEAN IsRefuelableStructAtGridNo( INT32 sGridNo, UINT8 *pubID )
{
UINT8 ubMerc;
// OK, first look for a vehicle....
ubMerc = WhoIsThere2( sGridNo, 0 );
if ( pubID != NULL )
{
(*pubID) = ubMerc;
}
if ( ubMerc != NOBODY )
{
if ( MercPtrs[ ubMerc ]->flags.uiStatusFlags & SOLDIER_VEHICLE )
{
return( TRUE );
}
}
return( FALSE );
}
BOOLEAN IsCutWireFenceAtGridNo( INT32 sGridNo )
{
STRUCTURE * pStructure;
pStructure = FindStructure( sGridNo, STRUCTURE_WIREFENCE );
if (pStructure != NULL && (pStructure->ubWallOrientation != NO_ORIENTATION) && (pStructure->fFlags & STRUCTURE_OPEN) )
{
return( TRUE );
}
return( FALSE );
}
INT32 FindDoorAtGridNoOrAdjacent( INT32 sGridNo )
{
STRUCTURE * pStructure;
STRUCTURE * pBaseStructure;
INT32 sTestGridNo;
sTestGridNo = sGridNo;
pStructure = FindStructure( sTestGridNo, STRUCTURE_ANYDOOR );
if (pStructure)
{
pBaseStructure = FindBaseStructure( pStructure );
return( pBaseStructure->sGridNo );
}
sTestGridNo = sGridNo + DirectionInc( NORTH );
pStructure = FindStructure( sTestGridNo, STRUCTURE_ANYDOOR );
if (pStructure)
{
pBaseStructure = FindBaseStructure( pStructure );
return( pBaseStructure->sGridNo );
}
sTestGridNo = sGridNo + DirectionInc( WEST );
pStructure = FindStructure( sTestGridNo, STRUCTURE_ANYDOOR );
if (pStructure)
{
pBaseStructure = FindBaseStructure( pStructure );
return( pBaseStructure->sGridNo );
}
return( NOWHERE );
}
BOOLEAN IsCorpseAtGridNo( INT32 sGridNo, UINT8 ubLevel )
{
if ( GetCorpseAtGridNo( sGridNo , ubLevel ) != NULL )
{
return( TRUE );
}
else
{
return( FALSE );
}
}
BOOLEAN SetOpenableStructureToClosed( INT32 sGridNo, UINT8 ubLevel )
{
STRUCTURE * pStructure;
STRUCTURE * pNewStructure;
pStructure = FindStructure( sGridNo, STRUCTURE_OPENABLE );
if ( !pStructure )
{
return( FALSE );
}
if ( pStructure->fFlags & STRUCTURE_OPEN )
{
pNewStructure = SwapStructureForPartner( sGridNo, pStructure );
if ( pNewStructure != NULL)
{
RecompileLocalMovementCosts( sGridNo );
SetRenderFlags( RENDER_FLAG_FULL );
}
}
// else leave it as is!
return( TRUE );
}