//EntryPoints can't be placed on the top two gridnos in a map. So all we do in this case //is return the closest gridno. Returns TRUE if the mapindex changes. BOOLEAN ValidateEntryPointGridNo( INT32 *sGridNo ) { INT16 sXMapPos, sYMapPos; INT16 sWorldX, sWorldY; INT32 iNewMapX, iNewMapY; INT32 sTopLimit, sBottomLimit; if ( TileIsOutOfBounds( *sGridNo ) ) return FALSE; //entry point is non-existant ConvertGridNoToXY( *sGridNo, &sXMapPos, &sYMapPos ); sTopLimit = 80; sBottomLimit = gsBRY - gsTLY - 40; //Get screen coordinates for current gridno GetWorldXYAbsoluteScreenXY( sXMapPos, sYMapPos, &sWorldX, &sWorldY); if( sWorldY < sTopLimit ) { GetFromAbsoluteScreenXYWorldXY( &iNewMapX, &iNewMapY, sWorldX, sTopLimit ); } else if( sWorldY > sBottomLimit ) { GetFromAbsoluteScreenXYWorldXY( &iNewMapX, &iNewMapY, sWorldX, sBottomLimit ); } else { return FALSE; //already valid } *sGridNo = MAPROWCOLTOPOS( iNewMapY/10, iNewMapX/10 ); return TRUE; //modified }
// This function changes the graphic of the statue and adds the exit grid... void ChangeO3SectorStatue( BOOLEAN fFromExplosion ) { EXITGRID ExitGrid; UINT16 usTileIndex; INT16 sX, sY; // Remove old graphic ApplyMapChangesToMapTempFile( TRUE ); // Remove it! // Get index for it... GetTileIndexFromTypeSubIndex( EIGHTOSTRUCT, (INT8)( 5 ), &usTileIndex ); RemoveStruct( 13830, usTileIndex ); // Add new one... if ( fFromExplosion ) { // Use damaged peice GetTileIndexFromTypeSubIndex( EIGHTOSTRUCT, (INT8)( 7 ), &usTileIndex ); } else { GetTileIndexFromTypeSubIndex( EIGHTOSTRUCT, (INT8)( 8 ), &usTileIndex ); // Play sound... PlayJA2Sample( OPEN_STATUE, RATE_11025, HIGHVOLUME, 1, MIDDLEPAN ); } AddStructToHead( 13830, usTileIndex ); // Add exit grid ExitGrid.ubGotoSectorX = 3; ExitGrid.ubGotoSectorY = MAP_ROW_O; ExitGrid.ubGotoSectorZ = 1; ExitGrid.usGridNo = 13037; AddExitGridToWorld( 13669, &ExitGrid ); gpWorldLevelData[ 13669 ].uiFlags |= MAPELEMENT_REVEALED; // Turn off permenant changes.... ApplyMapChangesToMapTempFile( FALSE ); // Re-render the world! gTacticalStatus.uiFlags |= NOHIDE_REDUNDENCY; // FOR THE NEXT RENDER LOOP, RE-EVALUATE REDUNDENT TILES InvalidateWorldRedundency( ); SetRenderFlags(RENDER_FLAG_FULL); // Redo movement costs.... ConvertGridNoToXY( 13830, &sX, &sY ); RecompileLocalMovementCostsFromRadius( 13830, 5 ); }
// ubRadius in times of y or x cell sizes BOOLEAN GridNoOnScreenAndAround( const INT32& sGridNo, const UINT8& ubRadius ) { INT16 sNewCenterWorldX, sNewCenterWorldY; INT16 sWorldX; INT16 sWorldY; UINT16 usXDiff = ubRadius*CELL_X_SIZE; UINT16 usYDiff = ubRadius*CELL_Y_SIZE; ConvertGridNoToXY( sGridNo, &sNewCenterWorldX, &sNewCenterWorldY ); // Get screen coordinates for current position of soldier GetWorldXYAbsoluteScreenXY( (INT16)(sNewCenterWorldX), (INT16)(sNewCenterWorldY), &sWorldX, &sWorldY); if ( sWorldX >= ( gsTopLeftWorldX - usXDiff ) && sWorldX <= ( gsBottomRightWorldX + usXDiff ) && sWorldY >= ( gsTopLeftWorldY - usYDiff + gsVIEWPORT_WINDOW_START_Y ) && sWorldY <= ( gsBottomRightWorldY + usYDiff ) ) { return( TRUE ); } return( FALSE ); }
//DBrot: More Rooms void RemoveRoomRoof( INT32 sGridNo, UINT16 usRoomNum, SOLDIERTYPE *pSoldier ) { INT32 cnt; ITEM_POOL *pItemPool; INT16 sX, sY; BOOLEAN fSaidItemSeenQuote = FALSE; // STRUCTURE *pStructure;//, *pBase; // LOOP THORUGH WORLD AND CHECK ROOM INFO for ( cnt = 0; cnt < WORLD_MAX; cnt++ ) { if ( gusWorldRoomInfo[ cnt ] == usRoomNum ) { SetGridNoRevealedFlag( cnt );//dnl ch56 141009 RemoveRoofIndexFlagsFromTypeRange( cnt, FIRSTROOF, SECONDSLANTROOF, LEVELNODE_REVEAL ); // Reveal any items if here! if ( GetItemPoolFromGround( cnt, &pItemPool ) ) { // Set visible! ( only if invisible... ) if ( SetItemPoolVisibilityOn( pItemPool, INVISIBLE, TRUE ) ) { if ( !fSaidItemSeenQuote ) { fSaidItemSeenQuote = TRUE; if ( pSoldier != NULL ) { //ddd //TacticalCharacterDialogue( pSoldier, (UINT16)( QUOTE_SPOTTED_SOMETHING_ONE + Random( 2 ) ) ); if(Chance(gGameExternalOptions.iChanceSayAnnoyingPhrase) ) TacticalCharacterDialogue( pSoldier, (UINT16)( QUOTE_SPOTTED_SOMETHING_ONE + Random( 2 ) ) ); //ddd } } } } // OK, re-set writeframes ( in a radius ) // Get XY ConvertGridNoToXY( cnt, &sX, &sY ); SetRecalculateWireFrameFlagRadius( sX, sY, 2 ); } } //for ( cnt = 0; cnt < WORLD_MAX; cnt++ ) //{ // if ( gubWorldRoomInfo[ cnt ] == bRoomNum ) // { // ExamineGridNoForSlantRoofExtraGraphic( (INT16)cnt ); // } //} // DIRTY THE WORLD! InvalidateWorldRedundency(); SetRenderFlags(RENDER_FLAG_FULL ); CalculateWorldWireFrameTiles( FALSE ); }