From 7e5cbd126a6a2c17dc3833a029035f95512843a9 Mon Sep 17 00:00:00 2001 From: Flugente Date: Sun, 10 Nov 2013 19:35:13 +0000 Subject: [PATCH] - New Feature/exploit enhancement: enter hostile sector with helicopter and land mercs anywhere (see http://www.bears-pit.com/board/ubbthreads.php/topics/327879.html#Post327879) - MP entry points are now much more and scale with mapsize git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@6576 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- GameSettings.cpp | 2 +- Strategic/Map Screen Helicopter.cpp | 3 + Tactical/Handle UI.cpp | 3 +- Tactical/Merc Entering.cpp | 67 ++-- Tactical/Soldier Add.cpp | 34 +- Tactical/Soldier Control.h | 4 +- Tactical/merc entering.h | 6 +- TileEngine/Map Edgepoints.cpp | 135 +++++--- TileEngine/Map Edgepoints.h | 9 + TileEngine/Tactical Placement GUI.cpp | 467 +++++++++++++++----------- gamescreen.cpp | 7 +- 11 files changed, 444 insertions(+), 293 deletions(-) diff --git a/GameSettings.cpp b/GameSettings.cpp index a09b352a2..3de72c6bc 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -1688,7 +1688,7 @@ void LoadGameExternalOptions() gGameExternalOptions.ubPrisonerInterrogationPoints[PRISONER_SPECIAL] = iniReader.ReadInteger("Strategic Gameplay Settings","PRISONER_INTERROGATION_POINTS_SPECIAL", 100, gGameExternalOptions.ubPrisonerInterrogationPoints[PRISONER_ELITE], 1000); // CHRISL: Determine how Skyrider should handle landing in enemy occupied sectors - gGameExternalOptions.ubSkyriderHotLZ = iniReader.ReadInteger("Strategic Gameplay Settings", "ALLOW_SKYRIDER_HOT_LZ", 0); + gGameExternalOptions.ubSkyriderHotLZ = iniReader.ReadInteger("Strategic Gameplay Settings", "ALLOW_SKYRIDER_HOT_LZ", 0, 0, 3); // enable all terrorists gGameExternalOptions.fEnableAllTerrorists = iniReader.ReadBoolean("Strategic Gameplay Settings", "ENABLE_ALL_TERRORISTS", TRUE); diff --git a/Strategic/Map Screen Helicopter.cpp b/Strategic/Map Screen Helicopter.cpp index 263b3cbb1..5d2ec648b 100644 --- a/Strategic/Map Screen Helicopter.cpp +++ b/Strategic/Map Screen Helicopter.cpp @@ -1040,6 +1040,9 @@ UINT8 MoveAllInHelicopterToFootMovementGroup( INT8 bNewSquad ) pSoldier->ubStrategicInsertionCode = ubInsertionCode; pSoldier->usStrategicInsertionData = usInsertionData; } + + // Flugente: we are leaving the helicopter and instantly deploy into combat - this must be an airdrop + pSoldier->bSoldierFlagMask |= SOLDIER_AIRDROP; } } diff --git a/Tactical/Handle UI.cpp b/Tactical/Handle UI.cpp index ea0c80ed0..13c123871 100644 --- a/Tactical/Handle UI.cpp +++ b/Tactical/Handle UI.cpp @@ -3197,9 +3197,8 @@ void GetMercClimbDirection( UINT8 ubSoldierID, BOOLEAN *pfGoDown, BOOLEAN *pfGoU *pfGoUp = TRUE; } } - // IF we are higher... - if ( pSoldier->pathing.bLevel > 0 ) + else //if ( pSoldier->pathing.bLevel > 0 ) { if ( FindLowerLevel( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection, &bNewDirection ) ) { diff --git a/Tactical/Merc Entering.cpp b/Tactical/Merc Entering.cpp index 8a3056b9c..0ba37b2ed 100644 --- a/Tactical/Merc Entering.cpp +++ b/Tactical/Merc Entering.cpp @@ -386,10 +386,6 @@ BOOLEAN gfFirstHeliRun; void HandleFirstHeliDropOfGame( ); - - - - void ResetHeliSeats( ) { gbNumHeliSeatsOccupied = 0; @@ -415,13 +411,16 @@ void AddMercToHeli( UINT8 ubID ) } } +// Flugente: we might want to set the helicopter dropoff point without starting it at the same time +void SetHelicopterDroppoint( INT32 sGridNo ) +{ + gsGridNoSweetSpot = sGridNo; +} -void StartHelicopterRun( INT32 sGridNoSweetSpot ) +void StartHelicopterRun() { INT16 sX, sY; - - gsGridNoSweetSpot = sGridNoSweetSpot; - + if ( gbNumHeliSeatsOccupied == 0 ) { return; @@ -431,7 +430,7 @@ void StartHelicopterRun( INT32 sGridNoSweetSpot ) PauseGame(); LockPauseState( 20 ); - ConvertGridNoToCenterCellXY( sGridNoSweetSpot, &sX, &sY ); + ConvertGridNoToCenterCellXY( gsGridNoSweetSpot, &sX, &sY ); gsHeliXPos = sX - ( 2 * CELL_X_SIZE ); gsHeliYPos = sY - ( 10 * CELL_Y_SIZE ); @@ -444,15 +443,14 @@ void StartHelicopterRun( INT32 sGridNoSweetSpot ) gbHeliRound = 1; gubHeliState = HELI_APPROACH; - guiHeliLastUpdate = GetJA2Clock( ); + guiHeliLastUpdate = GetJA2Clock( ); // Start sound uiSoundSample = PlayJA2Sample( HELI_1, RATE_11025, 0, 10000, MIDDLEPAN ); fFadingHeliIn = TRUE; - gfHandleHeli = TRUE; - - gfFirstGuyDown = TRUE; + gfHandleHeli = TRUE; + gfFirstGuyDown = TRUE; guiPendingOverrideEvent = LU_BEGINUILOCK; } @@ -462,12 +460,10 @@ void HandleHeliDrop( ) { UINT8 ubScriptCode; UINT32 uiClock; - //INT16 sWorldX, sWorldY; INT32 iVol; INT32 cnt; ANITILE_PARAMS AniParams; - - + if ( gfHandleHeli ) { if ( gCurrentUIMode != LOCKUI_MODE ) @@ -503,7 +499,7 @@ void HandleHeliDrop( ) // Remove heli DeleteAniTile( gpHeli ); - RebuildCurrentSquad( ); + RebuildCurrentSquad( ); // Remove sound if( uiSoundSample!=NO_SAMPLE ) @@ -559,7 +555,7 @@ void HandleHeliDrop( ) // Remove heli DeleteAniTile( gpHeli ); - RebuildCurrentSquad( ); + RebuildCurrentSquad( ); // Remove sound if( uiSoundSample!=NO_SAMPLE ) @@ -603,7 +599,7 @@ void HandleHeliDrop( ) iVol=__min( HIGHVOLUME, iVol+5); SoundSetVolume(uiSoundSample, iVol); if(iVol==HIGHVOLUME) - fFadingHeliIn=FALSE; + fFadingHeliIn=FALSE; } else { @@ -631,7 +627,7 @@ void HandleHeliDrop( ) UnLockPauseState(); UnPauseGame(); - RebuildCurrentSquad( ); + RebuildCurrentSquad( ); HandleFirstHeliDropOfGame( ); } @@ -646,7 +642,7 @@ void HandleHeliDrop( ) UnLockPauseState(); UnPauseGame(); - RebuildCurrentSquad( ); + RebuildCurrentSquad( ); HandleFirstHeliDropOfGame( ); } @@ -681,15 +677,9 @@ void HandleHeliDrop( ) MercPtrs[ gusHeliSeats[ gbCurDrop ] ]->EVENT_InitNewSoldierAnim( HELIDROP, 0 , FALSE ); // Change insertion code -#ifdef JA2UB - //MercPtrs[ gusHeliSeats[ gbCurDrop ] ]->ubStrategicInsertionCode = INSERTION_CODE_NORTH; MercPtrs[ gusHeliSeats[ gbCurDrop ] ]->ubStrategicInsertionCode = INSERTION_CODE_GRIDNO; - MercPtrs[ gusHeliSeats[ gbCurDrop ] ]->usStrategicInsertionData = gGameUBOptions.LOCATEGRIDNO; -#else - //MercPtrs[ gusHeliSeats[ gbCurDrop ] ]->ubStrategicInsertionCode = INSERTION_CODE_NORTH; - MercPtrs[ gusHeliSeats[ gbCurDrop ] ]->ubStrategicInsertionCode = INSERTION_CODE_GRIDNO; - MercPtrs[ gusHeliSeats[ gbCurDrop ] ]->usStrategicInsertionData = gGameExternalOptions.iInitialMercArrivalLocation; -#endif + MercPtrs[ gusHeliSeats[ gbCurDrop ] ]->usStrategicInsertionData = gsGridNoSweetSpot; + // HEADROCK HAM 3.5: Externalized! UpdateMercInSector( MercPtrs[ gusHeliSeats[ gbCurDrop ] ], gGameExternalOptions.ubDefaultArrivalSectorX, gGameExternalOptions.ubDefaultArrivalSectorY, startingZ ); //EVENT_SetSoldierPosition( MercPtrs[ gusHeliSeats[ gbCurDrop ] ], sWorldX, sWorldY ); @@ -876,9 +866,8 @@ void BeginMercEntering( SOLDIERTYPE *pSoldier, INT32 sGridNo ) ResetHeliSeats( ); AddMercToHeli( pSoldier->ubID ); - - - StartHelicopterRun( sGridNo ); + + StartHelicopterRun(); // Make sure AI does nothing..... PauseAIUntilManuallyUnpaused(); @@ -887,13 +876,19 @@ void BeginMercEntering( SOLDIERTYPE *pSoldier, INT32 sGridNo ) void HandleFirstHeliDropOfGame( ) { + // Flugente: always call people to area + CallAvailableEnemiesTo( gsGridNoSweetSpot ); + // Are we in the first heli drop? if ( gfFirstHeliRun ) { - SyncStrategicTurnTimes(); +#ifdef JA2UB + SetHelicopterDroppoint( gGameUBOptions.LOCATEGRIDNO ); +#else + SetHelicopterDroppoint( gGameExternalOptions.iInitialMercArrivalLocation ); +#endif - // Call people to area - CallAvailableEnemiesTo( gsGridNoSweetSpot ); + SyncStrategicTurnTimes(); // Move to header file... // HEADROCK HAM 3.5: Externalized! @@ -935,12 +930,10 @@ void HandleFirstHeliDropOfGame( ) } gfFirstHeliRun = FALSE; - } // Send message to turn on ai again.... CharacterDialogueWithSpecialEvent( 0, 0, 0, DIALOGUE_TACTICAL_UI , FALSE , FALSE , DIALOGUE_SPECIAL_EVENT_ENABLE_AI ,0, 0 ); - } diff --git a/Tactical/Soldier Add.cpp b/Tactical/Soldier Add.cpp index 5f10a8d03..b56083aa6 100644 --- a/Tactical/Soldier Add.cpp +++ b/Tactical/Soldier Add.cpp @@ -22,6 +22,7 @@ #include "meanwhile.h" #include "Exit Grids.h" #include "Interface.h" // added by Flugente for zBackground + #include "renderworld.h" // added by Flugente #endif #ifdef JA2UB @@ -1194,16 +1195,7 @@ BOOLEAN InternalAddSoldierToSector( UINT8 ubID, BOOLEAN fCalculateDirection, BOO sGridNo = pSoldier->sInsertionGridNo; } } - - // Flugente backgrounds - if ( pSoldier->ubStrategicInsertionCode == INSERTION_CODE_CENTER && pSoldier->GetBackgroundValue(BG_AIRDROP) ) - { - fCalculateDirection = FALSE; - pSoldier->ubInsertionDirection = Random( DIRECTION_IRRELEVANT ); - - pSoldier->bSoldierFlagMask |= SOLDIER_AIRDROP_BONUS; - } - + // add this flag whenever we enter strategically enter a sector (= we attack a sector) pSoldier->bSoldierFlagMask |= SOLDIER_ASSAULT_BONUS; @@ -1500,6 +1492,26 @@ void AddSoldierToSectorGridNo( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT8 ubDir fUpdateFinalPosition = FALSE; } + // Flugente: if we are airdropping, center screen on the action adn remove soldier initially. He will be dropped into the sector by the helicopter + if ( pSoldier->bSoldierFlagMask & SOLDIER_AIRDROP ) + { + pSoldier->bSoldierFlagMask &= ~SOLDIER_AIRDROP; + + if ( gGameExternalOptions.ubSkyriderHotLZ == 3 ) + { + gfIgnoreScrolling = FALSE; + INT16 sNewCenterWorldX, sNewCenterWorldY; + ConvertGridNoToCenterCellXY( sGridNo, &sNewCenterWorldX, &sNewCenterWorldY ); + + SetRenderCenter( sNewCenterWorldX, sNewCenterWorldY ); + gfIgnoreScrolling = TRUE; + + pSoldier->RemoveSoldierFromGridNo( ); + pSoldier->bInSector = FALSE; + + return; + } + } // If this is a special insertion location, get path! if ( ubInsertionCode == INSERTION_CODE_ARRIVING_GAME ) @@ -1524,7 +1536,7 @@ void AddSoldierToSectorGridNo( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT8 ubDir pSoldier->EVENT_SetSoldierDesiredDirection( ubDirection ); } } - + if( !(gTacticalStatus.uiFlags & LOADING_SAVED_GAME ) ) { if ( !( pSoldier->flags.uiStatusFlags & SOLDIER_DEAD ) ) diff --git a/Tactical/Soldier Control.h b/Tactical/Soldier Control.h index 73669db2e..9eb4fe7a1 100644 --- a/Tactical/Soldier Control.h +++ b/Tactical/Soldier Control.h @@ -380,8 +380,8 @@ enum #define SOLDIER_RADIO_OPERATOR_JAMMING 0x00100000 //1048576 // radio operator is jamming frequencies #define SOLDIER_RADIO_OPERATOR_SCANNING 0x00200000 //2097152 // radio operator is scanning for jammers -/*#define PLAYER_NET_3_LVL_2 0x00400000 //4194304 -#define PLAYER_NET_4_LVL_2 0x00800000 //8388608 +#define SOLDIER_AIRDROP 0x00400000 //4194304 // soldier is entering the sector via airdrop from a helicopter +/*#define PLAYER_NET_4_LVL_2 0x00800000 //8388608 #define PLAYER_NET_1_LVL_3 0x01000000 //16777216 #define PLAYER_NET_2_LVL_3 0x02000000 //33554432 diff --git a/Tactical/merc entering.h b/Tactical/merc entering.h index 4bff8df50..3242946cb 100644 --- a/Tactical/merc entering.h +++ b/Tactical/merc entering.h @@ -5,14 +5,14 @@ void ResetHeliSeats( ); void AddMercToHeli( UINT8 ubID ); -void StartHelicopterRun( INT32 sGridNoSweetSpot ); +// Flugente: we might want to set the helicopter dropoff point without starting it at the same time +void SetHelicopterDroppoint( INT32 sGridNo ); +void StartHelicopterRun(); void HandleHeliDrop( ); - extern BOOLEAN gfIngagedInDrop; - #endif diff --git a/TileEngine/Map Edgepoints.cpp b/TileEngine/Map Edgepoints.cpp index 742d9e19b..87c43b232 100644 --- a/TileEngine/Map Edgepoints.cpp +++ b/TileEngine/Map Edgepoints.cpp @@ -74,49 +74,109 @@ BOOLEAN EdgepointsClose( SOLDIERTYPE *pSoldier, INT32 sEdgepoint1, INT32 sEdgepo extern UINT8 gubTacticalDirection; + +BOOLEAN GridNoValidForCenterEntryPoint(INT32 sGridNo) +{ + if ( GridNoOnVisibleWorldTile( sGridNo ) && gpWorldLevelData[gMapInformation.sCenterGridNo].sHeight == gpWorldLevelData[sGridNo].sHeight && !FindStructure( sGridNo, (STRUCTURE_SLANTED_ROOF|STRUCTURE_TALL_ROOF) ) ) + return TRUE; + + return FALSE; +} + +#define CENTER_ENTRY_POINTS_ROW 100 +#define NUM_CENTER_ENTRY_POINTS (CENTER_ENTRY_POINTS_ROW * CENTER_ENTRY_POINTS_ROW) + +static INT32* statCentGrid = NULL; +static INT32 numcentergridnos = 0; +void FillCentreGridnos(BOOLEAN fCenterOnly) +{ + static INT16 sectorX = -1; + static INT16 sectorY = -1; + + // generate points only if current points are for a different map + if ( gWorldSectorX == sectorX && gWorldSectorY == sectorY ) + return; + + sectorX = gWorldSectorX; + sectorY = gWorldSectorY; + + statCentGrid = (INT32*)MemAlloc( NUM_CENTER_ENTRY_POINTS * sizeof( INT32 ) ); + + FLOAT lenx = 0.0f; + if ( fCenterOnly ) + lenx = std::sqrt((float)(CENTERENTRYPTS_TOP_Y*CENTERENTRYPTS_TOP_Y + CENTERENTRYPTS_LEFT_X*CENTERENTRYPTS_LEFT_X)); + + FLOAT lent = std::sqrt((float)((320-3)*(320-3) + 634*634)); + FLOAT xratio = lenx/lent; + + // top row of gridnos isn't accessible, we thus have to shorten the accessible lenghts + INT32 world_cols_adjusted = WORLD_COLS - 3; + INT32 world_rows_adjusted = WORLD_ROWS - 3; + + INT32 x_base = world_cols_adjusted * xratio; + INT32 y_base = world_rows_adjusted/2; + + INT32 totallen = std::sqrt((float)(world_rows_adjusted * world_rows_adjusted + world_cols_adjusted * world_cols_adjusted)); + INT32 droplen = totallen * (1.0f - 2 * xratio); + INT32 steplen = droplen / CENTER_ENTRY_POINTS_ROW; + + UINT16 cnt = 0; + for(UINT16 i = 0; i < CENTER_ENTRY_POINTS_ROW; ++i) + { + INT32 x_start = x_base + i * steplen; + INT32 y_start = y_base + i * steplen; + + for(UINT16 j = 0; j < CENTER_ENTRY_POINTS_ROW; ++j) + { + INT32 x = x_start + j * steplen; + INT32 y = y_start - j * steplen; + + INT32 gridno = y * WORLD_COLS + x; + + // use gridno only if valid and if it does not have an inaccessible roof + if ( GridNoValidForCenterEntryPoint( gridno ) ) + { + statCentGrid[ cnt ] = gridno; + ++cnt; + } + else + { + // test wether neighbour gridnos are ok + for(UINT8 dir = NORTH; dir < NUM_WORLD_DIRECTIONS; ++dir) + { + INT32 newgridno = NewGridNo(gridno, dir); + if ( GridNoValidForCenterEntryPoint( newgridno ) ) + { + statCentGrid[ cnt ] = newgridno; + ++cnt; + + break; + } + } + } + } + } + + numcentergridnos = cnt; +} + // WANNE - MP: Center -void InitCenterEdgepoint() +void InitCenterEdgepoint(BOOLEAN fCenterOnly) { if (gps1stCenterEdgepointArray ) MemFree( gps1stCenterEdgepointArray ); gps1stCenterEdgepointArray = NULL; + FillCentreGridnos(fCenterOnly); + // Set some center points - gus1stCenterEdgepointArraySize = 30; + gus1stCenterEdgepointArraySize = numcentergridnos; gps1stCenterEdgepointArray = (INT32*)MemAlloc( gus1stCenterEdgepointArraySize * sizeof( INT32 ) ); - gps1stCenterEdgepointArray[ 0 ] = 13024; - gps1stCenterEdgepointArray[ 1 ] = 13507; - gps1stCenterEdgepointArray[ 2 ] = 13990; - gps1stCenterEdgepointArray[ 3 ] = 14473; - gps1stCenterEdgepointArray[ 4 ] = 15117; - gps1stCenterEdgepointArray[ 5 ] = 12547; - gps1stCenterEdgepointArray[ 6 ] = 13030; - gps1stCenterEdgepointArray[ 7 ] = 13513; - gps1stCenterEdgepointArray[ 8 ] = 13996; - gps1stCenterEdgepointArray[ 9 ] = 14479; - gps1stCenterEdgepointArray[ 10 ] = 12070; - gps1stCenterEdgepointArray[ 11 ] = 12553; - gps1stCenterEdgepointArray[ 12 ] = 13036; - gps1stCenterEdgepointArray[ 13 ] = 13519; - gps1stCenterEdgepointArray[ 14 ] = 14002; - gps1stCenterEdgepointArray[ 15 ] = 11593; - gps1stCenterEdgepointArray[ 16 ] = 12076; - gps1stCenterEdgepointArray[ 17 ] = 12559; - gps1stCenterEdgepointArray[ 18 ] = 13042; - gps1stCenterEdgepointArray[ 19 ] = 13525; - gps1stCenterEdgepointArray[ 20 ] = 11117; - gps1stCenterEdgepointArray[ 21 ] = 11600; - gps1stCenterEdgepointArray[ 22 ] = 12083; - gps1stCenterEdgepointArray[ 23 ] = 12566; - gps1stCenterEdgepointArray[ 24 ] = 13049; - gps1stCenterEdgepointArray[ 25 ] = 10640; - gps1stCenterEdgepointArray[ 26 ] = 11123; - gps1stCenterEdgepointArray[ 27 ] = 11606; - gps1stCenterEdgepointArray[ 28 ] = 12089; - gps1stCenterEdgepointArray[ 29 ] = 12572; + for(UINT16 i = 0; i < numcentergridnos; ++i) + gps1stCenterEdgepointArray[i] = statCentGrid[i]; } void TrashMapEdgepoints() @@ -149,8 +209,7 @@ void TrashMapEdgepoints() gus1stEastEdgepointMiddleIndex = 0; gus1stSouthEdgepointMiddleIndex = 0; gus1stWestEdgepointMiddleIndex = 0; - - + //Secondary edgepoints if( gps2ndNorthEdgepointArray ) MemFree( gps2ndNorthEdgepointArray ); @@ -1052,9 +1111,9 @@ INT32 ChooseMapEdgepoint( UINT8 *ubStrategicInsertionCode, UINT8 lastValidICode if( *ubStrategicInsertionCode == INSERTION_CODE_GRIDNO) *ubStrategicInsertionCode = lastValidICode; - if (is_networked && *ubStrategicInsertionCode == INSERTION_CODE_CENTER) + if ( (is_networked && *ubStrategicInsertionCode == INSERTION_CODE_CENTER) || *ubStrategicInsertionCode == INSERTION_CODE_CHOPPER ) { - InitCenterEdgepoint(); + InitCenterEdgepoint( *ubStrategicInsertionCode == INSERTION_CODE_CENTER ); psArray = gps1stCenterEdgepointArray; usArraySize = gus1stCenterEdgepointArraySize; @@ -1339,9 +1398,9 @@ INT32 SearchForClosestPrimaryMapEdgepoint(INT32 sGridNo, UINT8 ubInsertionCode, break; } // WANNE - MP: Center - if(is_networked && ubInsertionCode == INSERTION_CODE_CENTER) + if( (is_networked && ubInsertionCode == INSERTION_CODE_CENTER) || ubInsertionCode == INSERTION_CODE_CHOPPER ) { - InitCenterEdgepoint(); + InitCenterEdgepoint( ubInsertionCode == INSERTION_CODE_CENTER ); psArray = gps1stCenterEdgepointArray; usArraySize = gus1stCenterEdgepointArraySize; } diff --git a/TileEngine/Map Edgepoints.h b/TileEngine/Map Edgepoints.h index 2d6e564bc..af8ed123a 100644 --- a/TileEngine/Map Edgepoints.h +++ b/TileEngine/Map Edgepoints.h @@ -86,6 +86,15 @@ void ShowMapEdgepoints(); void HideMapEdgepoints(); #endif +// Flugente: hardcoded values are bad bad BAD +#define CENTERENTRYPTS_LEFT_X 250 +#define CENTERENTRYPTS_RIGHT_X (634 - CENTERENTRYPTS_LEFT_X) +#define CENTERENTRYPTS_TOP_Y 130 +#define CENTERENTRYPTS_BOTTOM_Y (320 - CENTERENTRYPTS_TOP_Y) +#define AIRDROPENTRYPTS_LEFT_X 0 +#define AIRDROPENTRYPTS_RIGHT_X (634 - AIRDROPENTRYPTS_LEFT_X) +#define AIRDROPENTRYPTS_TOP_Y 0 +#define AIRDROPENTRYPTS_BOTTOM_Y (320 - AIRDROPENTRYPTS_TOP_Y) #endif diff --git a/TileEngine/Tactical Placement GUI.cpp b/TileEngine/Tactical Placement GUI.cpp index 8f138da6a..188f3f976 100644 --- a/TileEngine/Tactical Placement GUI.cpp +++ b/TileEngine/Tactical Placement GUI.cpp @@ -49,6 +49,7 @@ #include "saveloadscreen.h" #include "Map Edgepoints.h" #include "renderworld.h"//dnl ch45 051009 +#include "merc entering.h" typedef struct MERCPLACEMENT { @@ -113,8 +114,6 @@ INT8 gbCursorMercID = -1; SOLDIERTYPE *gpTacticalPlacementSelectedSoldier = NULL; SOLDIERTYPE *gpTacticalPlacementHilightedSoldier = NULL; -BOOLEAN gfNorth, gfEast, gfSouth, gfWest; - // WANNE - MP: Center BOOLEAN gfCenter; @@ -129,7 +128,6 @@ void FastHelpRemovedCallback(); void FastHelpRemoved2Callback(); void DialogRemoved( UINT8 ubResult ); - void PutDownMercPiece( INT32 iPlacement ); void PickUpMercPiece( INT32 iPlacement ); void SetCursorMerc( INT8 bPlacementID ); @@ -141,8 +139,6 @@ void SelectNextUnplacedUnit(); BOOLEAN gfNorthValid, gfEastValid, gfSouthValid, gfWestValid; BOOLEAN gfChangedEntrySide = FALSE; - - void FindValidInsertionCode( UINT8 *pubStrategicInsertionCode ) { if( gMapInformation.sNorthGridNo == -1 && @@ -237,6 +233,7 @@ void CheckForValidMapEdge( UINT8 *pubStrategicInsertionCode ) //#endif +extern BOOLEAN gfTacticalDoHeliRun; void InitTacticalPlacementGUI() { @@ -250,7 +247,7 @@ void InitTacticalPlacementGUI() gfTacticalPlacementFirstTime = TRUE; // WANNE - MP: Center - gfNorth = gfEast = gfSouth = gfWest = gfCenter = FALSE; + gfCenter = FALSE; #ifdef JA2BETAVERSION gfNorthValid = gfEastValid = gfSouthValid = gfWestValid = FALSE; gfChangedEntrySide = FALSE; @@ -356,7 +353,7 @@ void InitTacticalPlacementGUI() Assert( gMercPlacement ); //Second pass: Assign the mercs to their respective slots. giPlacements = 0; - for( i = gTacticalStatus.Team[ OUR_TEAM ].bFirstID; i <= gTacticalStatus.Team[ OUR_TEAM ].bLastID; i++ ) + for( i = gTacticalStatus.Team[ OUR_TEAM ].bFirstID; i <= gTacticalStatus.Team[ OUR_TEAM ].bLastID; ++i ) { if( MercPtrs[ i ]->bActive && MercPtrs[ i ]->stats.bLife && !MercPtrs[ i ]->flags.fBetweenSectors && MercPtrs[ i ]->sSectorX == gpBattleGroup->ubSectorX && @@ -366,6 +363,15 @@ void InitTacticalPlacementGUI() !( MercPtrs[ i ]->flags.uiStatusFlags & ( SOLDIER_VEHICLE ) ) && // ATE Ignore vehicles !MercPtrs[ i ]->bSectorZ ) { + // Flugente: if options allow it and we entered this sector - in combat - via helicopter, then allow us free selection of our entry point, and drop us from the helicopter + if ( MercPtrs[ i ]->bTeam == gbPlayerNum && gGameExternalOptions.ubSkyriderHotLZ == 3 && MercPtrs[ i ]->bSoldierFlagMask & SOLDIER_AIRDROP ) + { + AddMercToHeli( MercPtrs[ i ]->ubID ); + + gMercPlacement[ giPlacements ].ubStrategicInsertionCode = INSERTION_CODE_CHOPPER; + MercPtrs[ i ]->ubStrategicInsertionCode = INSERTION_CODE_CHOPPER; + gfCenter = TRUE; + } // WANNE - MP: Check if the desired insertion direction is valid on the map. If not, choose another entry direction! if (is_networked) @@ -389,29 +395,13 @@ void InitTacticalPlacementGUI() // WANNE: We always want to have edgepoints CheckForValidMapEdge( &MercPtrs[ i ]->ubStrategicInsertionCode ); - - switch( MercPtrs[ i ]->ubStrategicInsertionCode ) - { - case INSERTION_CODE_NORTH: - gfNorth = TRUE; - break; - case INSERTION_CODE_EAST: - gfEast = TRUE; - break; - case INSERTION_CODE_SOUTH: - gfSouth = TRUE; - break; - case INSERTION_CODE_WEST: - gfWest = TRUE; - break; - } // WANNE - MP: Center if (is_networked && MercPtrs[ i ]->ubStrategicInsertionCode == INSERTION_CODE_CENTER) { gfCenter = TRUE; - } - + } + giPlacements++; } } @@ -421,35 +411,25 @@ void InitTacticalPlacementGUI() VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE; //Load the faces - { - - ubFaceIndex = gMercProfiles[ gMercPlacement[ i ].pSoldier->ubProfile ].ubFaceIndex; - - /* - if( ubFaceIndex < 100 ) - sprintf( VObjectDesc.ImageFile, "Faces\\65Face\\%02d.sti", ubFaceIndex ); - else - sprintf( VObjectDesc.ImageFile, "Faces\\65Face\\%03d.sti", ubFaceIndex ); - - */ - - if ( ( ubFaceIndex < 100 ) && ( gProfilesIMP[ gMercPlacement[ i ].pSoldier->ubProfile ].ProfilId == gMercPlacement[ i ].pSoldier->ubProfile ) ) - { - sprintf( VObjectDesc.ImageFile, "IMPFaces\\65Face\\%02d.sti", ubFaceIndex ); - } - else if ( ( ubFaceIndex > 99 ) && ( gProfilesIMP[ gMercPlacement[ i ].pSoldier->ubProfile ].ProfilId == gMercPlacement[ i ].pSoldier->ubProfile ) ) - { - sprintf( VObjectDesc.ImageFile, "IMPFaces\\65Face\\%03d.sti", ubFaceIndex ); - } - else if( ubFaceIndex < 100 ) { - sprintf( VObjectDesc.ImageFile, "Faces\\65Face\\%02d.sti", ubFaceIndex ); - } - else if( ubFaceIndex > 99 ) - { - sprintf( VObjectDesc.ImageFile, "Faces\\65Face\\%03d.sti", ubFaceIndex ); - } - + ubFaceIndex = gMercProfiles[ gMercPlacement[ i ].pSoldier->ubProfile ].ubFaceIndex; + + if ( ( ubFaceIndex < 100 ) && ( gProfilesIMP[ gMercPlacement[ i ].pSoldier->ubProfile ].ProfilId == gMercPlacement[ i ].pSoldier->ubProfile ) ) + { + sprintf( VObjectDesc.ImageFile, "IMPFaces\\65Face\\%02d.sti", ubFaceIndex ); + } + else if ( ( ubFaceIndex > 99 ) && ( gProfilesIMP[ gMercPlacement[ i ].pSoldier->ubProfile ].ProfilId == gMercPlacement[ i ].pSoldier->ubProfile ) ) + { + sprintf( VObjectDesc.ImageFile, "IMPFaces\\65Face\\%03d.sti", ubFaceIndex ); + } + else if( ubFaceIndex < 100 ) + { + sprintf( VObjectDesc.ImageFile, "Faces\\65Face\\%02d.sti", ubFaceIndex ); + } + else if( ubFaceIndex > 99 ) + { + sprintf( VObjectDesc.ImageFile, "Faces\\65Face\\%03d.sti", ubFaceIndex ); + } } if( !AddVideoObject( &VObjectDesc, &gMercPlacement[ i ].uiVObjectID ) ) @@ -461,7 +441,6 @@ void InitTacticalPlacementGUI() } } - xp = (xResOffset) + 91 + (i / 2) * 54; if (i % 2) @@ -477,8 +456,8 @@ void InitTacticalPlacementGUI() MSYS_DefineRegion( &gMercPlacement[ i ].region, (UINT16)xp, (UINT16)yp, (UINT16)(xp + 54), (UINT16)(yp + 62), MSYS_PRIORITY_HIGH, 0, MercMoveCallback, MercClickCallback ); } - - if(!is_client)PlaceMercs();//hayden + if(!is_client) + PlaceMercs();//hayden if( gubDefaultButton == GROUP_BUTTON ) { @@ -541,6 +520,11 @@ UINT8 GetValidInsertionDirectionForMP(UINT8 currentInsertionPoint) foundValidDirection = true; validInsertionDirection = INSERTION_CODE_CENTER; break; + + case INSERTION_CODE_CHOPPER: + foundValidDirection = true; + validInsertionDirection = INSERTION_CODE_CHOPPER; + break; } // Find alternate insertion direction by looping through all directions (N, S, E, W) @@ -753,24 +737,26 @@ void RenderTacticalPlacementGUI() gfValidLocationsChanged--; //DBrot bigger map code - if(gfUseBiggerOverview){ + if(gfUseBiggerOverview) + { BlitBufferToBuffer( guiSAVEBUFFER, FRAME_BUFFER, iOffsetHorizontal, iOffsetVertical, 1434, 716 ); InvalidateRegion( iOffsetHorizontal, iOffsetVertical, iOffsetHorizontal + 1434, iOffsetVertical + 716 ); gTPClipRect.iLeft = iOffsetHorizontal + 1; gTPClipRect.iTop = iOffsetVertical + 1; gTPClipRect.iBottom = iOffsetVertical + 716;// 318; - gTPClipRect.iRight = iOffsetHorizontal + 1434; //634; - - }else{ - BlitBufferToBuffer( guiSAVEBUFFER, FRAME_BUFFER, iOffsetHorizontal, iOffsetVertical, 640, 320 ); - InvalidateRegion( iOffsetHorizontal, iOffsetVertical, iOffsetHorizontal + 640, iOffsetVertical + 320 ); - //dnl ch45 051009 - gTPClipRect.iLeft = iOffsetHorizontal + 1; - gTPClipRect.iTop = iOffsetVertical + 1; - gTPClipRect.iBottom = iOffsetVertical + 318; - gTPClipRect.iRight = iOffsetHorizontal + 634; - + gTPClipRect.iRight = iOffsetHorizontal + 1434; //634; } + else + { + BlitBufferToBuffer( guiSAVEBUFFER, FRAME_BUFFER, iOffsetHorizontal, iOffsetVertical, 640, 320 ); + InvalidateRegion( iOffsetHorizontal, iOffsetVertical, iOffsetHorizontal + 640, iOffsetVertical + 320 ); + //dnl ch45 051009 + gTPClipRect.iLeft = iOffsetHorizontal + 1; + gTPClipRect.iTop = iOffsetVertical + 1; + gTPClipRect.iBottom = iOffsetVertical + 318; + gTPClipRect.iRight = iOffsetHorizontal + 634; + } + if( gbCursorMercID == -1 ) { // WANNE - MP: Center @@ -780,23 +766,50 @@ void RenderTacticalPlacementGUI() gTPClipRectCenterLeft.iLeft = iOffsetHorizontal; gTPClipRectCenterLeft.iTop = iOffsetVertical + 3; gTPClipRectCenterLeft.iBottom = iOffsetVertical + 320; - gTPClipRectCenterLeft.iRight = iOffsetHorizontal + 250; + gTPClipRectCenterLeft.iRight = iOffsetHorizontal + CENTERENTRYPTS_LEFT_X; // Top black border gTPClipRectCenterTop.iLeft = iOffsetHorizontal; gTPClipRectCenterTop.iTop = iOffsetVertical + 3; - gTPClipRectCenterTop.iBottom = iOffsetVertical + 130; + gTPClipRectCenterTop.iBottom = iOffsetVertical + CENTERENTRYPTS_TOP_Y; gTPClipRectCenterTop.iRight = iOffsetHorizontal + 634; // Right black border - gTPClipRectCenterRight.iLeft = iOffsetHorizontal + 634 - 250; + gTPClipRectCenterRight.iLeft = iOffsetHorizontal + CENTERENTRYPTS_RIGHT_X; gTPClipRectCenterRight.iTop = iOffsetVertical + 3; gTPClipRectCenterRight.iBottom = iOffsetVertical + 320; gTPClipRectCenterRight.iRight = iOffsetHorizontal + 634; // Bottom black border gTPClipRectCenterBottom.iLeft = iOffsetHorizontal; - gTPClipRectCenterBottom.iTop = iOffsetVertical + 320 - 130; + gTPClipRectCenterBottom.iTop = iOffsetVertical + CENTERENTRYPTS_BOTTOM_Y; + gTPClipRectCenterBottom.iBottom = iOffsetVertical + 320; + gTPClipRectCenterBottom.iRight = iOffsetHorizontal + 634; + } + // Flugente airdrop + else if ( gfCenter && gGameExternalOptions.ubSkyriderHotLZ == 3 ) + { + // Left black border + gTPClipRectCenterLeft.iLeft = iOffsetHorizontal; + gTPClipRectCenterLeft.iTop = iOffsetVertical + 3; + gTPClipRectCenterLeft.iBottom = iOffsetVertical + 320; + gTPClipRectCenterLeft.iRight = iOffsetHorizontal + AIRDROPENTRYPTS_LEFT_X; + + // Top black border + gTPClipRectCenterTop.iLeft = iOffsetHorizontal; + gTPClipRectCenterTop.iTop = iOffsetVertical + 3; + gTPClipRectCenterTop.iBottom = iOffsetVertical + AIRDROPENTRYPTS_TOP_Y; + gTPClipRectCenterTop.iRight = iOffsetHorizontal + 634; + + // Right black border + gTPClipRectCenterRight.iLeft = iOffsetHorizontal + AIRDROPENTRYPTS_RIGHT_X; + gTPClipRectCenterRight.iTop = iOffsetVertical + 3; + gTPClipRectCenterRight.iBottom = iOffsetVertical + 320; + gTPClipRectCenterRight.iRight = iOffsetHorizontal + 634; + + // Bottom black border + gTPClipRectCenterBottom.iLeft = iOffsetHorizontal; + gTPClipRectCenterBottom.iTop = iOffsetVertical + AIRDROPENTRYPTS_BOTTOM_Y; gTPClipRectCenterBottom.iBottom = iOffsetVertical + 320; gTPClipRectCenterBottom.iRight = iOffsetHorizontal + 634; } @@ -848,35 +861,42 @@ void RenderTacticalPlacementGUI() //} break; } - }else{ - switch(gMercPlacement[gbCursorMercID].ubStrategicInsertionCode){ + } + else + { + switch(gMercPlacement[gbCursorMercID].ubStrategicInsertionCode) + { case INSERTION_CODE_NORTH: - if(sWorldScreenY <= PLACEMENT_OFFSET){ - sY = (PLACEMENT_OFFSET - sWorldScreenY) / 5; - gTPClipRect.iTop += sY; + if(sWorldScreenY <= PLACEMENT_OFFSET) + { + sY = (PLACEMENT_OFFSET - sWorldScreenY) / 5; + gTPClipRect.iTop += sY; + } + break; + case INSERTION_CODE_EAST: + if((sWorldScreenX + NORMAL_MAP_SCREEN_WIDTH) >= (MAPWIDTH - PLACEMENT_OFFSET)) + { + sX = ((sWorldScreenX + NORMAL_MAP_SCREEN_WIDTH) - (MAPWIDTH - PLACEMENT_OFFSET)) / 5; + gTPClipRect.iRight -= sX; + } + break; + case INSERTION_CODE_SOUTH: + if((sWorldScreenY + NORMAL_MAP_SCREEN_HEIGHT) >= (MAPHEIGHT - PLACEMENT_OFFSET)) + { + sY = ((sWorldScreenY + NORMAL_MAP_SCREEN_HEIGHT) - (MAPHEIGHT - PLACEMENT_OFFSET)) / 5; + gTPClipRect.iBottom -= sY; + } + break; + case INSERTION_CODE_WEST: + if(sWorldScreenX <= PLACEMENT_OFFSET) + { + sX = (PLACEMENT_OFFSET - sWorldScreenX) / 5; + gTPClipRect.iLeft += sX; + } + break; } - break; - case INSERTION_CODE_EAST: - if((sWorldScreenX + NORMAL_MAP_SCREEN_WIDTH) >= (MAPWIDTH - PLACEMENT_OFFSET)){ - sX = ((sWorldScreenX + NORMAL_MAP_SCREEN_WIDTH) - (MAPWIDTH - PLACEMENT_OFFSET)) / 5; - gTPClipRect.iRight -= sX; - } - break; - case INSERTION_CODE_SOUTH: - if((sWorldScreenY + NORMAL_MAP_SCREEN_HEIGHT) >= (MAPHEIGHT - PLACEMENT_OFFSET)){ - sY = ((sWorldScreenY + NORMAL_MAP_SCREEN_HEIGHT) - (MAPHEIGHT - PLACEMENT_OFFSET)) / 5; - gTPClipRect.iBottom -= sY; - } - break; - case INSERTION_CODE_WEST: - if(sWorldScreenX <= PLACEMENT_OFFSET){ - sX = (PLACEMENT_OFFSET - sWorldScreenX) / 5; - gTPClipRect.iLeft += sX; - } - break; } - } - + // WANNE - MP: Center if (is_networked && gfCenter) { @@ -884,23 +904,50 @@ void RenderTacticalPlacementGUI() gTPClipRectCenterLeft.iLeft = iOffsetHorizontal; gTPClipRectCenterLeft.iTop = iOffsetVertical + 3; gTPClipRectCenterLeft.iBottom = iOffsetVertical + 320; - gTPClipRectCenterLeft.iRight = iOffsetHorizontal + 250; + gTPClipRectCenterLeft.iRight = iOffsetHorizontal + CENTERENTRYPTS_LEFT_X; // Top black border gTPClipRectCenterTop.iLeft = iOffsetHorizontal; gTPClipRectCenterTop.iTop = iOffsetVertical + 3; - gTPClipRectCenterTop.iBottom = iOffsetVertical + 130; + gTPClipRectCenterTop.iBottom = iOffsetVertical + CENTERENTRYPTS_TOP_Y; gTPClipRectCenterTop.iRight = iOffsetHorizontal + 634; // Right black border - gTPClipRectCenterRight.iLeft = iOffsetHorizontal + 634 - 250; + gTPClipRectCenterRight.iLeft = iOffsetHorizontal + CENTERENTRYPTS_RIGHT_X; gTPClipRectCenterRight.iTop = iOffsetVertical + 3; gTPClipRectCenterRight.iBottom = iOffsetVertical + 320; gTPClipRectCenterRight.iRight = iOffsetHorizontal + 634; // Bottom black border gTPClipRectCenterBottom.iLeft = iOffsetHorizontal; - gTPClipRectCenterBottom.iTop = iOffsetVertical + 320 - 130; + gTPClipRectCenterBottom.iTop = iOffsetVertical + CENTERENTRYPTS_BOTTOM_Y; + gTPClipRectCenterBottom.iBottom = iOffsetVertical + 320; + gTPClipRectCenterBottom.iRight = iOffsetHorizontal + 634; + } + // Flugente airdrop + else if ( gfCenter && gGameExternalOptions.ubSkyriderHotLZ == 3 && gbSelectedMercID >= 0 && gMercPlacement[ gbSelectedMercID ].pSoldier->bSoldierFlagMask & SOLDIER_AIRDROP ) + { + // Left black border + gTPClipRectCenterLeft.iLeft = iOffsetHorizontal; + gTPClipRectCenterLeft.iTop = iOffsetVertical + 3; + gTPClipRectCenterLeft.iBottom = iOffsetVertical + 320; + gTPClipRectCenterLeft.iRight = iOffsetHorizontal + AIRDROPENTRYPTS_LEFT_X; + + // Top black border + gTPClipRectCenterTop.iLeft = iOffsetHorizontal; + gTPClipRectCenterTop.iTop = iOffsetVertical + 3; + gTPClipRectCenterTop.iBottom = iOffsetVertical + AIRDROPENTRYPTS_TOP_Y; + gTPClipRectCenterTop.iRight = iOffsetHorizontal + 634; + + // Right black border + gTPClipRectCenterRight.iLeft = iOffsetHorizontal + AIRDROPENTRYPTS_RIGHT_X; + gTPClipRectCenterRight.iTop = iOffsetVertical + 3; + gTPClipRectCenterRight.iBottom = iOffsetVertical + 320; + gTPClipRectCenterRight.iRight = iOffsetHorizontal + 634; + + // Bottom black border + gTPClipRectCenterBottom.iLeft = iOffsetHorizontal; + gTPClipRectCenterBottom.iTop = iOffsetVertical + AIRDROPENTRYPTS_BOTTOM_Y; gTPClipRectCenterBottom.iBottom = iOffsetVertical + 320; gTPClipRectCenterBottom.iRight = iOffsetHorizontal + 634; } @@ -908,7 +955,7 @@ void RenderTacticalPlacementGUI() pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES ); - if (!gfCenter) + if (!gfCenter || (gGameExternalOptions.ubSkyriderHotLZ == 3 && gbSelectedMercID >= 0 && !(gMercPlacement[ gbSelectedMercID ].pSoldier->bSoldierFlagMask & SOLDIER_AIRDROP)) ) Blt16BPPBufferLooseHatchRectWithColor( (UINT16*)pDestBuf, uiDestPitchBYTES, &gTPClipRect, usHatchColor ); // WANNE - MP: Center else @@ -919,10 +966,9 @@ void RenderTacticalPlacementGUI() Blt16BPPBufferLooseHatchRectWithColor( (UINT16*)pDestBuf, uiDestPitchBYTES, &gTPClipRectCenterBottom, usHatchColor ); } - SetClippingRegionAndImageWidth( uiDestPitchBYTES, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT ); - if (!gfCenter) + if (!gfCenter || (gGameExternalOptions.ubSkyriderHotLZ == 3 && gbSelectedMercID >= 0 && !(gMercPlacement[ gbSelectedMercID ].pSoldier->bSoldierFlagMask & SOLDIER_AIRDROP)) ) RectangleDraw( TRUE, gTPClipRect.iLeft, gTPClipRect.iTop, gTPClipRect.iRight, gTPClipRect.iBottom, usHatchColor, pDestBuf ); else { @@ -986,7 +1032,6 @@ void RenderTacticalPlacementGUI() mprintf( xp, yp, pSoldier->name ); InvalidateRegion( xp, yp, xp + width, yp + width ); } - } void EnsureDoneButtonStatus() @@ -1015,35 +1060,34 @@ void EnsureDoneButtonStatus() void lockui (bool unlock) //lock onluck ui for lan //hayden { - if(unlock==0 && islocked==0 && is_client) - { - islocked=1; - DisableButton( iTPButtons[ DONE_BUTTON ] ); - DisableButton( iTPButtons[ SPREAD_BUTTON ] ); - DisableButton( iTPButtons[ GROUP_BUTTON ] ); - DisableButton( iTPButtons[ CLEAR_BUTTON ] ); + if(unlock==0 && islocked==0 && is_client) + { + islocked=1; + DisableButton( iTPButtons[ DONE_BUTTON ] ); + DisableButton( iTPButtons[ SPREAD_BUTTON ] ); + DisableButton( iTPButtons[ GROUP_BUTTON ] ); + DisableButton( iTPButtons[ CLEAR_BUTTON ] ); - SGPRect CenterRect = { 100 + xResOffset, 100, SCREEN_WIDTH - 100 - xResOffset, 300 }; - DoMessageBox( MSG_BOX_BASIC_STYLE, MPServerMessage[8], guiCurrentScreen, MSG_BOX_FLAG_OK | MSG_BOX_FLAG_USE_CENTERING_RECT, DialogRemoved, &CenterRect ); + SGPRect CenterRect = { 100 + xResOffset, 100, SCREEN_WIDTH - 100 - xResOffset, 300 }; + DoMessageBox( MSG_BOX_BASIC_STYLE, MPServerMessage[8], guiCurrentScreen, MSG_BOX_FLAG_OK | MSG_BOX_FLAG_USE_CENTERING_RECT, DialogRemoved, &CenterRect ); - //send loaded - send_loaded(); - } + //send loaded + send_loaded(); + } - if(unlock) //oh yeah ! :) - { - islocked=3; - EnableButton( iTPButtons[ SPREAD_BUTTON ] ); - EnableButton( iTPButtons[ GROUP_BUTTON ] ); - EnableButton( iTPButtons[ CLEAR_BUTTON ] ); + if(unlock) //oh yeah ! :) + { + islocked=3; + EnableButton( iTPButtons[ SPREAD_BUTTON ] ); + EnableButton( iTPButtons[ GROUP_BUTTON ] ); + EnableButton( iTPButtons[ CLEAR_BUTTON ] ); - ButtonList[ iTPButtons[ GROUP_BUTTON ] ]->uiFlags &= ~BUTTON_CLICKED_ON; - ButtonList[ iTPButtons[ GROUP_BUTTON ] ]->uiFlags |= BUTTON_DIRTY; - gubDefaultButton = CLEAR_BUTTON; - PlaceMercs(); - gMsgBox.bHandled = MSG_BOX_RETURN_OK; //close if still open - - } + ButtonList[ iTPButtons[ GROUP_BUTTON ] ]->uiFlags &= ~BUTTON_CLICKED_ON; + ButtonList[ iTPButtons[ GROUP_BUTTON ] ]->uiFlags |= BUTTON_DIRTY; + gubDefaultButton = CLEAR_BUTTON; + PlaceMercs(); + gMsgBox.bHandled = MSG_BOX_RETURN_OK; //close if still open + } } void TacticalPlacementHandle() @@ -1070,34 +1114,34 @@ void TacticalPlacementHandle() { switch( InputEvent.usParam ) { - #ifdef JA2TESTVERSION - case ESC: - //if (!is_networked) - KillTacticalPlacementGUI(); - break; - #endif - case ENTER: - if( ButtonList[ iTPButtons[ DONE_BUTTON ] ]->uiFlags & BUTTON_ENABLED ) - { - if(!is_client)KillTacticalPlacementGUI(); - if(is_client)send_donegui(0); - } - break; - case 'c': - if(islocked!=1)ClearPlacementsCallback( ButtonList[ iTPButtons[ CLEAR_BUTTON ] ], MSYS_CALLBACK_REASON_LBUTTON_UP ); - break; - case 'g': - if(islocked!=1)GroupPlacementsCallback( ButtonList[ iTPButtons[ GROUP_BUTTON ] ], MSYS_CALLBACK_REASON_LBUTTON_UP ); - break; - case 's': - if(islocked!=1)SpreadPlacementsCallback( ButtonList[ iTPButtons[ SPREAD_BUTTON ] ], MSYS_CALLBACK_REASON_LBUTTON_UP ); - break; - case 'x': - if( InputEvent.usKeyState & ALT_DOWN ) - { - HandleShortCutExitState(); - } - break; + #ifdef JA2TESTVERSION + case ESC: + //if (!is_networked) + KillTacticalPlacementGUI(); + break; + #endif + case ENTER: + if( ButtonList[ iTPButtons[ DONE_BUTTON ] ]->uiFlags & BUTTON_ENABLED ) + { + if(!is_client)KillTacticalPlacementGUI(); + if(is_client)send_donegui(0); + } + break; + case 'c': + if(islocked!=1)ClearPlacementsCallback( ButtonList[ iTPButtons[ CLEAR_BUTTON ] ], MSYS_CALLBACK_REASON_LBUTTON_UP ); + break; + case 'g': + if(islocked!=1)GroupPlacementsCallback( ButtonList[ iTPButtons[ GROUP_BUTTON ] ], MSYS_CALLBACK_REASON_LBUTTON_UP ); + break; + case 's': + if(islocked!=1)SpreadPlacementsCallback( ButtonList[ iTPButtons[ SPREAD_BUTTON ] ], MSYS_CALLBACK_REASON_LBUTTON_UP ); + break; + case 'x': + if( InputEvent.usKeyState & ALT_DOWN ) + { + HandleShortCutExitState(); + } + break; } } } @@ -1134,14 +1178,24 @@ void TacticalPlacementHandle() } // WANNE - MP: Center - if (is_networked && gfCenter) + if ( gfCenter && ( is_networked || (gGameExternalOptions.ubSkyriderHotLZ == 3 && gMercPlacement[ gbSelectedMercID ].pSoldier->bSoldierFlagMask & SOLDIER_AIRDROP)) ) { - if (gMercPlacement[ gbCursorMercID ].ubStrategicInsertionCode == INSERTION_CODE_CENTER ) + if ( gMercPlacement[ gbCursorMercID ].ubStrategicInsertionCode == INSERTION_CODE_CENTER ) { - if (gusMouseYPos >= (iOffsetVertical + 130) && // N - gusMouseYPos <= (iOffsetVertical + 320 - 130) && // S - gusMouseXPos >= (iOffsetHorizontal + 250) && // W - gusMouseXPos <= (iOffsetHorizontal + 634 - 250)) // E + if (gusMouseYPos >= (iOffsetVertical + CENTERENTRYPTS_TOP_Y) && // N + gusMouseYPos <= (iOffsetVertical + CENTERENTRYPTS_BOTTOM_Y) && // S + gusMouseXPos >= (iOffsetHorizontal + CENTERENTRYPTS_LEFT_X) && // W + gusMouseXPos <= (iOffsetHorizontal + CENTERENTRYPTS_RIGHT_X)) // E + { + gfValidCursor = TRUE; + } + } + else if ( gMercPlacement[ gbCursorMercID ].ubStrategicInsertionCode == INSERTION_CODE_CHOPPER ) + { + if (gusMouseYPos >= (iOffsetVertical + AIRDROPENTRYPTS_TOP_Y) && // N + gusMouseYPos <= (iOffsetVertical + AIRDROPENTRYPTS_BOTTOM_Y) && // S + gusMouseXPos >= (iOffsetHorizontal + AIRDROPENTRYPTS_LEFT_X) && // W + gusMouseXPos <= (iOffsetHorizontal + AIRDROPENTRYPTS_RIGHT_X)) // E { gfValidCursor = TRUE; } @@ -1285,21 +1339,21 @@ void PlaceMercs() INT32 i; switch( gubDefaultButton ) { - case SPREAD_BUTTON: //Place mercs randomly along their side using map edgepoints. - ChooseRandomEdgepoints(); - break; - case CLEAR_BUTTON: - for( i = 0; i < giPlacements; i++ ) - { - PickUpMercPiece( i ); - } - gubSelectedGroupID = 0; - gbSelectedMercID = 0; - SetCursorMerc( 0 ); - gfEveryonePlaced = FALSE; - break; - default: - return; + case SPREAD_BUTTON: //Place mercs randomly along their side using map edgepoints. + ChooseRandomEdgepoints(); + break; + case CLEAR_BUTTON: + for( i = 0; i < giPlacements; i++ ) + { + PickUpMercPiece( i ); + } + gubSelectedGroupID = 0; + gbSelectedMercID = 0; + SetCursorMerc( 0 ); + gfEveryonePlaced = FALSE; + break; + default: + return; } gfTacticalPlacementGUIDirty = TRUE; } @@ -1386,24 +1440,27 @@ void MercClickCallback( MOUSE_REGION *reg, INT32 reason ) { if(islocked != 1)//hayden { - if( reason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) - { - INT8 i; - for( i = 0; i < giPlacements; i++ ) + if( reason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) { - if( &gMercPlacement[ i ].region == reg ) + INT8 i; + for( i = 0; i < giPlacements; i++ ) { - if( gbSelectedMercID != i ) + if( &gMercPlacement[ i ].region == reg ) { - gbSelectedMercID = i; - gpTacticalPlacementSelectedSoldier = gMercPlacement[ i ].pSoldier; - if( gubDefaultButton == GROUP_BUTTON ) + if( gbSelectedMercID != i ) { - gubSelectedGroupID = gpTacticalPlacementSelectedSoldier->ubGroupID; + if ( gGameExternalOptions.ubSkyriderHotLZ == 3 && gMercPlacement[ i ].pSoldier->bSoldierFlagMask & SOLDIER_AIRDROP ) + gubDefaultButton = GROUP_BUTTON; + + gbSelectedMercID = i; + gpTacticalPlacementSelectedSoldier = gMercPlacement[ i ].pSoldier; + if( gubDefaultButton == GROUP_BUTTON ) + { + gubSelectedGroupID = gpTacticalPlacementSelectedSoldier->ubGroupID; + } } + return; } - return; - } } } } @@ -1414,6 +1471,10 @@ void SelectNextUnplacedUnit() INT32 i; if( gbSelectedMercID == -1 ) return; + + if ( gGameExternalOptions.ubSkyriderHotLZ == 3 && gMercPlacement[ gbSelectedMercID ].pSoldier->bSoldierFlagMask & SOLDIER_AIRDROP ) + gubDefaultButton = GROUP_BUTTON; + for( i = gbSelectedMercID; i < giPlacements; i++ ) { //go from the currently selected soldier to the end if( !gMercPlacement[ i ].fPlaced ) @@ -1465,6 +1526,9 @@ void HandleTacticalPlacementClicksInOverheadMap( MOUSE_REGION *reg, INT32 reason { if( gbSelectedMercID != -1 ) { + if ( gGameExternalOptions.ubSkyriderHotLZ == 3 && gMercPlacement[ gbSelectedMercID ].pSoldier->bSoldierFlagMask & SOLDIER_AIRDROP ) + gubDefaultButton = GROUP_BUTTON; + if( GetOverheadMouseGridNo( &sGridNo ) ) { //we have clicked within a valid part of the map. BeginMapEdgepointSearch(); @@ -1595,6 +1659,9 @@ void PutDownMercPiece( INT32 iPlacement ) case INSERTION_CODE_GRIDNO: pSoldier->sInsertionGridNo = pSoldier->usStrategicInsertionData; break; + case INSERTION_CODE_CHOPPER: + pSoldier->sInsertionGridNo = pSoldier->usStrategicInsertionData; + break; default: Assert( 0 ); break; @@ -1605,6 +1672,21 @@ void PutDownMercPiece( INT32 iPlacement ) if(!TileIsOutOfBounds(sGridNo)) { + // Flugente: initiate airdrop, place merc on roof if necessary + if ( gGameExternalOptions.ubSkyriderHotLZ == 3 && pSoldier->bSoldierFlagMask & SOLDIER_AIRDROP ) + { + // hideous hack + gfTacticalDoHeliRun = TRUE; + SetHelicopterDroppoint(sGridNo); + + pSoldier->usStrategicInsertionData = sGridNo; + + if ( FindStructure( sGridNo, STRUCTURE_NORMAL_ROOF ) != NULL && NewOKDestination( pSoldier, sGridNo, false, 1 ) ) + { + pSoldier->SetSoldierHeight( (FLOAT)58 ); + } + } + ConvertGridNoToCellXY( sGridNo, &sCellX, &sCellY ); FLOAT scX = (FLOAT)sCellX; @@ -1618,7 +1700,6 @@ void PutDownMercPiece( INT32 iPlacement ) pSoldier->EVENT_SetSoldierPosition( (FLOAT)sCellX, (FLOAT)sCellY ); } - pSoldier->EVENT_SetSoldierDirection( ubDirection ); pSoldier->ubInsertionDirection = pSoldier->ubDirection; gMercPlacement[ iPlacement ].fPlaced = TRUE; diff --git a/gamescreen.cpp b/gamescreen.cpp index b4b67d9c8..b2db6790b 100644 --- a/gamescreen.cpp +++ b/gamescreen.cpp @@ -636,12 +636,7 @@ UINT32 MainGameScreenHandle(void) InternalLocateGridNo( gGameExternalOptions.iInitialMercArrivalLocation, TRUE ); #endif // Start heli Run... -#ifdef JA2UB - StartHelicopterRun( gGameUBOptions.LOCATEGRIDNO ); //gMapInformation.sNorthGridNo ); -#else - //StartHelicopterRun( gMapInformation.sNorthGridNo ); - StartHelicopterRun( gGameExternalOptions.iInitialMercArrivalLocation ); -#endif + StartHelicopterRun(); // Update clock by one so that our DidGameJustStatrt() returns now false for things like LAPTOP, etc... SetGameTimeCompressionLevel( TIME_COMPRESS_X1 );