mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
** Merged Source Code from Development trunk, for the Spring 2011 Release ** **************************************************************************** o Development Trunk (Revision: 4444): https://81.169.133.124/source/ja2/branches/Wanne/JA2%201.13%20MP o This trunk (the official 1.13 source trunk) will only be used for fixing bugs. No new features will be added here. New Features are only included in the Development trunk o !!! After we have fixed a bug here in this trunk, we should MANUALLY merge the bugfix in the development trunk !!! git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@4446 3b4a5df2-a311-0410-b5c6-a8a6f20db521
652 lines
14 KiB
C++
652 lines
14 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 IsLegionWallPresentAtGridno( INT32 sGridNo )
|
|
{
|
|
STRUCTURE * pStructure;
|
|
|
|
pStructure = FindStructure( sGridNo, STRUCTURE_FENCE );
|
|
|
|
if ( pStructure )
|
|
{
|
|
|
|
if ( pStructure->fFlags & STRUCTURE_FENCE && pStructure->fFlags & STRUCTURE_SPECIAL && pStructure->fFlags & STRUCTURE_WALL )
|
|
{
|
|
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 );
|
|
} |