diff --git a/GameSettings.cpp b/GameSettings.cpp index 16cc6d29..fcda4f75 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -1977,8 +1977,6 @@ void LoadGameExternalOptions() gGameExternalOptions.fASDActive = iniReader.ReadBoolean( "Strategic Additional Enemy AI Settings", "ASD_ACTIVE", FALSE ); - gGameExternalOptions.usASDSupplyArrivalSector = iniReader.ReadInteger( "Strategic Additional Enemy AI Settings", "ASD_SUPPLY_ARRIVAL_SECTOR", 210, 0, 255 ); - gGameExternalOptions.gASDResource_Cost[ASD_MONEY] = 1; gGameExternalOptions.gASDResource_Cost[ASD_FUEL] = iniReader.ReadInteger( "Strategic Additional Enemy AI Settings", "ASD_COST_FUEL", 10, 1, 100 ); gGameExternalOptions.gASDResource_Cost[ASD_HELI] = iniReader.ReadInteger( "Strategic Additional Enemy AI Settings", "ASD_COST_HELI", 100000, 10000, 1000000 ); @@ -1995,6 +1993,7 @@ void LoadGameExternalOptions() //################# Enemy Helicopter Settings ################## gGameExternalOptions.fEnemyHeliActive = iniReader.ReadBoolean( "Enemy Helicopter Settings", "ENEMYHELI_ACTIVE", TRUE ); + gGameExternalOptions.usEnemyHeliMinimumProgress = iniReader.ReadInteger( "Enemy Helicopter Settings", "ENEMYHELI_DEFINITE_UNLOCK_AT_PROGRESS", 30, 0, 100 ); gGameExternalOptions.gEnemyHeliMaxHP = iniReader.ReadInteger( "Enemy Helicopter Settings", "ENEMYHELI_HP", 100, 1, 500 ); gGameExternalOptions.gEnemyHeliTimePerHPRepair = iniReader.ReadInteger( "Enemy Helicopter Settings", "ENEMYHELI_HP_REPAIRTIME", 6, 1, 20 ); @@ -2008,14 +2007,7 @@ void LoadGameExternalOptions() gGameExternalOptions.gEnemyHeliSAMDamage_Var = iniReader.ReadInteger( "Enemy Helicopter Settings", "ENEMYHELI_SAM_DAMAGE_VAR", 30, 10, 100 ); gGameExternalOptions.gEnemyHeliMANPADSDamage_Base = iniReader.ReadInteger( "Enemy Helicopter Settings", "ENEMYHELI_MANPADS_DAMAGE_BASE", 40, 10, 100 ); gGameExternalOptions.gEnemyHeliMANPADSDamage_Var = iniReader.ReadInteger( "Enemy Helicopter Settings", "ENEMYHELI_MANPADS_DAMAGE_VAR", 80, 10, 100 ); - - gGameExternalOptions.usEnemyHeliBaseSector = iniReader.ReadInteger( "Enemy Helicopter Settings", "ENEMYHELI_BASE", 210, 0, 255 ); - - gGameExternalOptions.sEnemyHeliBaseParkGridno[0] = iniReader.ReadInteger( "Enemy Helicopter Settings", "ENEMYHELI_BASE_PARKPOSITION_1", 18475, -1, 2147483647 ); - gGameExternalOptions.sEnemyHeliBaseParkGridno[1] = iniReader.ReadInteger( "Enemy Helicopter Settings", "ENEMYHELI_BASE_PARKPOSITION_2", 18469, -1, 2147483647 ); - gGameExternalOptions.sEnemyHeliBaseParkTileIndex = iniReader.ReadInteger( "Enemy Helicopter Settings", "ENEMYHELI_BASE_PARK_TILEINDEX", 1689, -1, 50000 ); - - + //################# Militia Training Settings ################## gGameExternalOptions.iMaxMilitiaPerSector = iniReader.ReadInteger("Militia Training Settings","MAX_MILITIA_PER_SECTOR",20, 1, CODE_MAXIMUM_NUMBER_OF_REBELS); @@ -2811,6 +2803,17 @@ void LoadModSettings(){ gModSettings.ubEndGameVictorySectorY = iniReader.ReadInteger("End Game", "VICTORY_SECTOR_Y", 16); gModSettings.iEndGameVictoryGridNo = iniReader.ReadInteger("End Game", "VICTORY_POSITION", 5687); + // [ASD] + gModSettings.usASDSupplyArrivalSectorX = iniReader.ReadInteger( "ASD", "ASD_SUPPLY_ARRIVAL_SECTOR_X", 3, 1, 16 ); + gModSettings.usASDSupplyArrivalSectorY = iniReader.ReadInteger( "ASD", "ASD_SUPPLY_ARRIVAL_SECTOR_Y", 14, 1, 16 ); + + // [Enemy Heli] + gModSettings.usEnemyHeliBaseSectorX = iniReader.ReadInteger( "Enemy Heli", "ENEMYHELI_BASE_X", 3, 1, 16 ); + gModSettings.usEnemyHeliBaseSectorY = iniReader.ReadInteger( "Enemy Heli", "ENEMYHELI_BASE_Y", 14, 1, 16 ); + + gModSettings.sEnemyHeliBaseParkGridno[0] = iniReader.ReadInteger( "Enemy Heli", "ENEMYHELI_BASE_PARKPOSITION_1", 18475, -1, 2147483647 ); + gModSettings.sEnemyHeliBaseParkGridno[1] = iniReader.ReadInteger( "Enemy Heli", "ENEMYHELI_BASE_PARKPOSITION_2", 18469, -1, 2147483647 ); + gModSettings.sEnemyHeliBaseParkTileIndex = iniReader.ReadInteger( "Enemy Heli", "ENEMYHELI_BASE_PARK_TILEINDEX", 1689, -1, 50000 ); } // silversurfer: load item property modifiers diff --git a/GameSettings.h b/GameSettings.h index 7786bc04..6efc8aa4 100644 --- a/GameSettings.h +++ b/GameSettings.h @@ -614,12 +614,13 @@ typedef struct // Flugente: ASD BOOLEAN fASDActive; - UINT8 usASDSupplyArrivalSector; + INT32 gASDResource_Cost[ASD_RESOURCE_MAX]; INT32 gASDResource_BuyTime[ASD_RESOURCE_MAX]; // Flugente: enemy heli BOOLEAN fEnemyHeliActive; + UINT8 usEnemyHeliMinimumProgress; UINT16 gEnemyHeliMaxHP; UINT16 gEnemyHeliTimePerHPRepair; @@ -632,13 +633,7 @@ typedef struct UINT16 gEnemyHeliSAMDamage_Var; UINT16 gEnemyHeliMANPADSDamage_Base; UINT16 gEnemyHeliMANPADSDamage_Var; - - UINT8 usEnemyHeliBaseSector; - INT32 sEnemyHeliBaseParkGridno[2]; - INT32 sEnemyHeliBaseParkTileIndex; - - - + INT32 ubEnemiesItemDrop; BOOLEAN gfUseExternalLoadscreens; @@ -2212,6 +2207,16 @@ typedef struct BOOLEAN AllMeanwhileCutscene; BOOLEAN CreatureMeanwhileCutscene; + // [ASD] + UINT8 usASDSupplyArrivalSectorX; + UINT8 usASDSupplyArrivalSectorY; + + // [Enemy Heli] + UINT8 usEnemyHeliBaseSectorX; + UINT8 usEnemyHeliBaseSectorY; + INT32 sEnemyHeliBaseParkGridno[2]; + INT32 sEnemyHeliBaseParkTileIndex; + }MOD_SETTINGS; // silversurfer: item property modifiers diff --git a/Strategic/ASD.cpp b/Strategic/ASD.cpp index 63f76dc8..46d60c45 100644 --- a/Strategic/ASD.cpp +++ b/Strategic/ASD.cpp @@ -190,6 +190,10 @@ void UpdateASD( ) if ( DidGameJustStart( ) ) return; + // enemy helis are unlocked either by a cutscene OR if a minimum progress threshold has been reached + if ( !(gASD_Flags & ASDFACT_HELI_UNLOCKED) && HighestPlayerProgressPercentage( ) >= gGameExternalOptions.usEnemyHeliMinimumProgress ) + SetASDFlag( ASDFACT_HELI_UNLOCKED ); + // determine whether we need to buy new toys ASDDecideOnPurchases(); @@ -518,11 +522,9 @@ void AddStrategicAIResources( UINT8 aType, INT32 aAmount ) AddNewHeli( ); } -void ASDReceiveOrderedStrategicAIResources(UINT8 aType, INT32 aAmount) +void ASDReduceOrderedStrategicResources( UINT8 aType, INT32 aAmount ) { gASDResource_Ordered[aType] = max( 0, gASDResource_Ordered[aType] - aAmount ); - - AddStrategicAIResources( aType, aAmount ); } //////////////////////////////////////////// enemy helis ///////////////////////////////////////////////////////// @@ -654,7 +656,7 @@ void AddNewHeli( ) if ( (*it).flagmask & ENEMYHELI_DESTROYED ) { (*it).flagmask = 0; - (*it).sector_home = gGameExternalOptions.usEnemyHeliBaseSector; + (*it).sector_home = SECTOR( gModSettings.usEnemyHeliBaseSectorX, gModSettings.usEnemyHeliBaseSectorY ); (*it).sector_destination = 0; (*it).sector_waypoint = 0; (*it).sector_current = (*it).sector_home; @@ -676,7 +678,7 @@ void AddNewHeli( ) ENEMY_HELI data; data.flagmask = 0; - data.sector_home = gGameExternalOptions.usEnemyHeliBaseSector; + data.sector_home = SECTOR( gModSettings.usEnemyHeliBaseSectorX, gModSettings.usEnemyHeliBaseSectorY ); data.sector_destination = 0; data.sector_waypoint = 0; data.sector_current = data.sector_home; @@ -1316,7 +1318,7 @@ void HandleEnemyHelicopterOnGroundGraphic( ) UINT8 currentsector = SECTOR( gWorldSectorX, gWorldSectorY ); // only relevant if this is the enemies' heli hub - if ( currentsector != gGameExternalOptions.usEnemyHeliBaseSector ) + if ( currentsector != SECTOR( gModSettings.usEnemyHeliBaseSectorX, gModSettings.usEnemyHeliBaseSectorY ) ) return; INT16 id = -1; @@ -1330,7 +1332,7 @@ void HandleEnemyHelicopterOnGroundGraphic( ) if ( id >= ENEMYHELI_MAX ) break; - AddEnemyHelicopterToMaps( ((*it).sector_current == currentsector), ((*it).flagmask & ENEMYHELI_DESTROYED), gGameExternalOptions.sEnemyHeliBaseParkGridno[id], gGameExternalOptions.sEnemyHeliBaseParkTileIndex ); + AddEnemyHelicopterToMaps( ((*it).sector_current == currentsector), ((*it).flagmask & ENEMYHELI_DESTROYED), gModSettings.sEnemyHeliBaseParkGridno[id], gModSettings.sEnemyHeliBaseParkTileIndex ); } // Invalidate rendering (if we have any helis at all) @@ -1347,7 +1349,7 @@ void UpdateAndDamageEnemyHeliIfFound( INT16 sSectorX, INT16 sSectorY, INT16 sSec UINT8 currentsector = SECTOR( gWorldSectorX, gWorldSectorY ); // only relevant if this is the enemies' heli hub - if ( currentsector != gGameExternalOptions.usEnemyHeliBaseSector ) + if ( currentsector != SECTOR( gModSettings.usEnemyHeliBaseSectorX, gModSettings.usEnemyHeliBaseSectorY ) ) return; // helicopter tiles are multi-tiled. Search for the base gridno @@ -1390,7 +1392,7 @@ void UpdateAndDamageEnemyHeliIfFound( INT16 sSectorX, INT16 sSectorY, INT16 sSec if ( (*it).sector_current == currentsector ) { - if ( gGameExternalOptions.sEnemyHeliBaseParkGridno[id] == sBaseGridNo ) + if ( gModSettings.sEnemyHeliBaseParkGridno[id] == sBaseGridNo ) { if ( aDestroyed ) { diff --git a/Strategic/ASD.h b/Strategic/ASD.h index 83002ae3..20309729 100644 --- a/Strategic/ASD.h +++ b/Strategic/ASD.h @@ -57,7 +57,9 @@ UINT32 ASDResourceCostMoney( UINT8 aType ); // add resources to the AIs resource pool void AddStrategicAIResources( UINT8 aType, INT32 aAmount ); -void ASDReceiveOrderedStrategicAIResources( UINT8 aType, INT32 aAmount ); + +// when we receive an ordered shipment, reduce our backlog +void ASDReduceOrderedStrategicResources( UINT8 aType, INT32 aAmount ); // enemy helis class ENEMY_HELI diff --git a/Strategic/Game Event Hook.cpp b/Strategic/Game Event Hook.cpp index 85e251da..341a211e 100644 --- a/Strategic/Game Event Hook.cpp +++ b/Strategic/Game Event Hook.cpp @@ -582,23 +582,31 @@ BOOLEAN ExecuteStrategicEvent( STRATEGICEVENT *pEvent ) break; case EVENT_ASD_PURCHASE_FUEL: - if ( IsSectorEnemyControlled( SECTORX( gGameExternalOptions.usASDSupplyArrivalSector ), SECTORY( gGameExternalOptions.usASDSupplyArrivalSector ), 0 ) ) - ASDReceiveOrderedStrategicAIResources( ASD_FUEL, pEvent->uiParam ); + ASDReduceOrderedStrategicResources( ASD_FUEL, pEvent->uiParam ); + + if ( IsSectorEnemyControlled( gModSettings.usASDSupplyArrivalSectorX, gModSettings.usASDSupplyArrivalSectorY, 0 ) ) + AddStrategicAIResources( ASD_FUEL, pEvent->uiParam ); break; case EVENT_ASD_PURCHASE_JEEP: - if ( IsSectorEnemyControlled( SECTORX( gGameExternalOptions.usASDSupplyArrivalSector ), SECTORY( gGameExternalOptions.usASDSupplyArrivalSector ), 0 ) ) - ASDReceiveOrderedStrategicAIResources( ASD_JEEP, pEvent->uiParam ); + ASDReduceOrderedStrategicResources( ASD_JEEP, pEvent->uiParam ); + + if ( IsSectorEnemyControlled( gModSettings.usASDSupplyArrivalSectorX, gModSettings.usASDSupplyArrivalSectorY, 0 ) ) + AddStrategicAIResources( ASD_JEEP, pEvent->uiParam ); break; case EVENT_ASD_PURCHASE_TANK: - if ( IsSectorEnemyControlled( SECTORX( gGameExternalOptions.usASDSupplyArrivalSector ), SECTORY( gGameExternalOptions.usASDSupplyArrivalSector ), 0 ) ) - ASDReceiveOrderedStrategicAIResources( ASD_TANK, pEvent->uiParam ); + ASDReduceOrderedStrategicResources( ASD_TANK, pEvent->uiParam ); + + if ( IsSectorEnemyControlled( gModSettings.usASDSupplyArrivalSectorX, gModSettings.usASDSupplyArrivalSectorY, 0 ) ) + AddStrategicAIResources( ASD_TANK, pEvent->uiParam ); break; case EVENT_ASD_PURCHASE_HELI: - if ( IsSectorEnemyControlled( SECTORX( gGameExternalOptions.usEnemyHeliBaseSector ), SECTORY( gGameExternalOptions.usEnemyHeliBaseSector ), 0 ) ) - ASDReceiveOrderedStrategicAIResources( ASD_HELI, pEvent->uiParam ); + ASDReduceOrderedStrategicResources( ASD_HELI, pEvent->uiParam ); + + if ( IsSectorEnemyControlled( gModSettings.usEnemyHeliBaseSectorX, gModSettings.usEnemyHeliBaseSectorY, 0 ) ) + AddStrategicAIResources( ASD_HELI, pEvent->uiParam ); break; case EVENT_ENEMY_HELI_UPDATE: