Helicopter features (by anv):

- Waldo can now repair the helicopter for money
- alternative fuel system
- damage to helicopter can damage passengers

Appropriate Data in GameDir r1897.

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@6695 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2013-12-19 22:01:44 +00:00
parent 80c1b65494
commit faba9ea713
39 changed files with 1075 additions and 131 deletions
+55
View File
@@ -70,6 +70,9 @@
// anv: externalised taunt settings // anv: externalised taunt settings
#define TAUNTS_SETTINGS_FILE "Taunts_Settings.ini" #define TAUNTS_SETTINGS_FILE "Taunts_Settings.ini"
// anv: helicopter repair settings - enough of these to put them in own file
#define HELICOPTER_SETTINGS_FILE "Helicopter_Settings.ini"
#define CD_ROOT_DIR "DATA\\" #define CD_ROOT_DIR "DATA\\"
GAME_SETTINGS gGameSettings; GAME_SETTINGS gGameSettings;
@@ -78,6 +81,7 @@ GAME_OPTIONS gGameOptions;
GAME_EXTERNAL_OPTIONS gGameExternalOptions; GAME_EXTERNAL_OPTIONS gGameExternalOptions;
SKILL_TRAIT_VALUES gSkillTraitValues; // SANDRO - added this one SKILL_TRAIT_VALUES gSkillTraitValues; // SANDRO - added this one
TAUNTS_SETTINGS gTauntsSettings; TAUNTS_SETTINGS gTauntsSettings;
HELICOPTER_SETTINGS gHelicopterSettings;
CTH_CONSTANTS gGameCTHConstants; // HEADROCK HAM 4: CTH constants CTH_CONSTANTS gGameCTHConstants; // HEADROCK HAM 4: CTH constants
MOD_SETTINGS gModSettings; //DBrot: mod specific settings MOD_SETTINGS gModSettings; //DBrot: mod specific settings
@@ -911,6 +915,16 @@ void LoadGameExternalOptions()
gGameExternalOptions.usHelicopterBaseCostPerGreenTile = iniReader.ReadInteger("Financial Settings","HELICOPTER_BASE_COST_PER_GREEN_TILE", 100, 0, 60000); gGameExternalOptions.usHelicopterBaseCostPerGreenTile = iniReader.ReadInteger("Financial Settings","HELICOPTER_BASE_COST_PER_GREEN_TILE", 100, 0, 60000);
gGameExternalOptions.usHelicopterBaseCostPerRedTile = iniReader.ReadInteger("Financial Settings","HELICOPTER_BASE_COST_PER_RED_TILE", 1000, 0, 60000); gGameExternalOptions.usHelicopterBaseCostPerRedTile = iniReader.ReadInteger("Financial Settings","HELICOPTER_BASE_COST_PER_RED_TILE", 1000, 0, 60000);
// anv: for alternative helicopter fuel system - cost for hovering long enough to burn 1 fuel unit. GREEN = Free airspace, RED = Enemy-controlled airspace.
gGameExternalOptions.usHelicopterHoverCostOnGreenTile = iniReader.ReadInteger("Financial Settings","HELICOPTER_HOVER_COST_ON_GREEN_TILE", 50, 0, 60000);
gGameExternalOptions.usHelicopterHoverCostOnRedTile = iniReader.ReadInteger("Financial Settings","HELICOPTER_HOVER_COST_ON_RED_TILE", 500, 0, 60000);
// anv: if TRUE, player will have to pay Skyrider even if he returns to base automatically - no more hovering until he runs out of fuel to save money
gGameExternalOptions.fHelicopterReturnToBaseIsNotFree = iniReader.ReadBoolean("Financial Settings","HELICOPTER_RETURN_TO_BASE_IS_NOT_FREE", TRUE);
// anv: if TRUE, Skyrider will demand money only after safely landing in base
gGameExternalOptions.fPaySkyriderInBase = iniReader.ReadBoolean("Financial Settings","HELICOPTER_PAY_SKYRIDER_IN_BASE", FALSE );
//tais: percentage that the merc's salary rises when he/she levels up //tais: percentage that the merc's salary rises when he/she levels up
gGameExternalOptions.gMercLevelUpSalaryIncreasePercentage = (FLOAT)iniReader.ReadInteger("Financial Settings","MERC_LEVEL_UP_SALARY_INCREASE_PERCENTAGE",25, 0, 1000); gGameExternalOptions.gMercLevelUpSalaryIncreasePercentage = (FLOAT)iniReader.ReadInteger("Financial Settings","MERC_LEVEL_UP_SALARY_INCREASE_PERCENTAGE",25, 0, 1000);
@@ -1738,6 +1752,15 @@ void LoadGameExternalOptions()
//Madd: override map item appearance chance //Madd: override map item appearance chance
gGameExternalOptions.ubMapItemChanceOverride = iniReader.ReadInteger("Strategic Gameplay Settings","MAP_ITEM_CHANCE_OVERRIDE", 0, 0, 100); gGameExternalOptions.ubMapItemChanceOverride = iniReader.ReadInteger("Strategic Gameplay Settings","MAP_ITEM_CHANCE_OVERRIDE", 0, 0, 100);
// anv: helicopter repairs
gGameExternalOptions.fWaldoCanRepairHelicopter = iniReader.ReadBoolean("Strategic Gameplay Settings","WALDO_CAN_REPAIR_HELICOPTER", TRUE);
gGameExternalOptions.fAllowWaldoToOfferRepairInStrategic = iniReader.ReadBoolean("Strategic Gameplay Settings","WALDO_OFFERS_REPAIR_IN_STRATEGIC", TRUE);
gGameExternalOptions.fWaldoSubsequentRepairsIncreaseCosts = iniReader.ReadBoolean("Strategic Gameplay Settings","WALDO_SUBSEQUENT_REPAIRS_COST_INCREASE", TRUE);
gGameExternalOptions.fSeriouslyDamagedSkyriderWontFly = iniReader.ReadBoolean("Strategic Gameplay Settings","SERIOUSLY_DAMAGED_SKYRIDER_WONT_FLY", TRUE);
gGameExternalOptions.fAlternativeHelicopterFuelSystem = iniReader.ReadBoolean("Strategic Gameplay Settings","ALTERNATIVE_HELICOPTER_FUEL_SYSTEM", TRUE);
gGameExternalOptions.fHelicopterPassengersCanGetHit = iniReader.ReadBoolean("Strategic Gameplay Settings","HELICOPTER_PASSENGERS_CAN_GET_HIT", TRUE);
//################# Morale Settings ################## //################# Morale Settings ##################
gGameExternalOptions.sMoraleModAppearance = iniReader.ReadInteger("Morale Settings","MORALE_MOD_APPEARANCE", 1, 0, 5); gGameExternalOptions.sMoraleModAppearance = iniReader.ReadInteger("Morale Settings","MORALE_MOD_APPEARANCE", 1, 0, 5);
gGameExternalOptions.sMoraleModRefinement = iniReader.ReadInteger("Morale Settings","MORALE_MOD_REFINEMENT", 2, 0, 5); gGameExternalOptions.sMoraleModRefinement = iniReader.ReadInteger("Morale Settings","MORALE_MOD_REFINEMENT", 2, 0, 5);
@@ -3291,6 +3314,38 @@ void LoadTauntsSettings()
} }
void LoadHelicopterRepairRefuelSettings()
{
CIniReader iniReader(HELICOPTER_SETTINGS_FILE);
gHelicopterSettings.usHelicopterBasicRepairCost = iniReader.ReadInteger("Helicopter Repair Settings","HELICOPTER_BASIC_REPAIR_COST", 2500, 0, 100000);
gHelicopterSettings.usHelicopterSeriousRepairCost = iniReader.ReadInteger("Helicopter Repair Settings","HELICOPTER_SERIOUS_REPAIR_COST", 7500, 0, 100000);
gHelicopterSettings.ubHelicopterBasicRepairTime = iniReader.ReadInteger("Helicopter Repair Settings","HELICOPTER_BASIC_REPAIR_TIME", 8, 1, 255);
gHelicopterSettings.ubHelicopterBasicRepairTimeVariation = iniReader.ReadInteger("Helicopter Repair Settings","HELICOPTER_BASIC_REPAIR_TIME_VARIATION", 2, 0, 255);
gHelicopterSettings.ubHelicopterSeriousRepairTime = iniReader.ReadInteger("Helicopter Repair Settings","HELICOPTER_SERIOUS_REPAIR_TIME", 24, 1, 255);
gHelicopterSettings.ubHelicopterSeriousRepairTimeVariation = iniReader.ReadInteger("Helicopter Repair Settings","HELICOPTER_SERIOUS_REPAIR_TIME_VARIATION", 6, 0, 255);
gHelicopterSettings.usHelicopterBasicCostIncreaseAfterBasicRepair = iniReader.ReadInteger("Helicopter Repair Settings","HELICOPTER_BASIC_COST_INCREASE_AFTER_BASIC_REPAIR", 500, 0, 100000);
gHelicopterSettings.usHelicopterBasicCostIncreaseAfterSeriousRepair = iniReader.ReadInteger("Helicopter Repair Settings","HELICOPTER_BASIC_COST_INCREASE_AFTER_SERIOUS_REPAIR", 1000, 0, 100000);
gHelicopterSettings.usHelicopterSeriousCostIncreaseAfterBasicRepair = iniReader.ReadInteger("Helicopter Repair Settings","HELICOPTER_SERIOUS_COST_INCREASE_AFTER_BASIC_REPAIR", 1500, 0, 100000);
gHelicopterSettings.usHelicopterSeriousCostIncreaseAfterSeriousRepair = iniReader.ReadInteger("Helicopter Repair Settings","HELICOPTER_SERIOUS_COST_INCREASE_AFTER_SERIOUS_REPAIR", 3000, 0, 100000);
gHelicopterSettings.usHelicopterBasicRepairCostMax = iniReader.ReadInteger("Helicopter Repair Settings","HELICOPTER_BASIC_REPAIR_COST_MAX", 10000, 0, 100000);
gHelicopterSettings.usHelicopterSeriousRepairCostMax = iniReader.ReadInteger("Helicopter Repair Settings","HELICOPTER_SERIOUS_REPAIR_COST_MAX", 25000, 0, 100000);
gHelicopterSettings.ubHelicopterDistanceWithoutRefuel = iniReader.ReadInteger("Helicopter Refuel Settings","HELICOPTER_DISTANCE_WITHOUT_REFUEL", 25, 0, 255);
gHelicopterSettings.ubHelicopterHoverTimePerFuelUnit = iniReader.ReadInteger("Helicopter Refuel Settings","HELICOPTER_DISTANCE_WITHOUT_REFUEL", 10, 0, 255);
gHelicopterSettings.ubHelicopterRefuelTime = iniReader.ReadInteger("Helicopter Refuel Settings","HELICOPTER_DISTANCE_WITHOUT_REFUEL", 30, 0, 255);
gHelicopterSettings.ubHelicopterTimeDelayForHoverWait = iniReader.ReadInteger("Helicopter Refuel Settings","HELICOPTER_TIME_DELAY_FOR_HOVER_WAIT", 10, 0, 255);
gHelicopterSettings.ubHelicopterTimeDelayForHoverWaitTooLong = iniReader.ReadInteger("Helicopter Refuel Settings","HELICOPTER_TIME_DELAY_FOR_HOVER_WAIT_TOO_LONG", 20, 0, 255);
gHelicopterSettings.fAskBeforeKickingPassengersOut = iniReader.ReadBoolean("Helicopter Refuel Settings","HELICOPTER_ASK_BEFORE_KICKING_PASSENGERS_OUT", FALSE );
gHelicopterSettings.ubHelicopterSAMSiteAccuracy = iniReader.ReadInteger("Helicopter SAM Settings","HELICOPTER_SAM_SITE_ACCURACY", 33, 0, 100);
gHelicopterSettings.ubHelicopterPassengerHitChance = iniReader.ReadInteger("Helicopter SAM Settings","HELICOPTER_PASSENGER_HIT_CHANCE", 25, 0, 100);
gHelicopterSettings.ubHelicopterPassengerHitMaxDamage = iniReader.ReadInteger("Helicopter SAM Settings","HELICOPTER_PASSENGER_HIT_MAX_DAMAGE", 10, 0, 100);
gHelicopterSettings.ubHelicopterPassengerHitMinDamage = iniReader.ReadInteger("Helicopter SAM Settings","HELICOPTER_PASSENGER_HIT_MIN_DAMAGE", 1, 0, 100);
}
void FreeGameExternalOptions() void FreeGameExternalOptions()
{ {
if (gGameExternalOptions.iaIMPSlots != NULL) // OJW - 20081129 - Fix memory leak when calling LoadGameExternalOptions twice if (gGameExternalOptions.iaIMPSlots != NULL) // OJW - 20081129 - Fix memory leak when calling LoadGameExternalOptions twice
+48
View File
@@ -1353,6 +1353,21 @@ typedef struct
BOOLEAN fNoRemoveRandomSectorItems;//dnl ch68 090913 BOOLEAN fNoRemoveRandomSectorItems;//dnl ch68 090913
// anv: helicopter repair settings
BOOLEAN fWaldoCanRepairHelicopter;
BOOLEAN fAllowWaldoToOfferRepairInStrategic;
BOOLEAN fWaldoSubsequentRepairsIncreaseCosts;
BOOLEAN fSeriouslyDamagedSkyriderWontFly;
BOOLEAN fAlternativeHelicopterFuelSystem;
BOOLEAN fHelicopterPassengersCanGetHit;
UINT16 usHelicopterHoverCostOnGreenTile;
UINT16 usHelicopterHoverCostOnRedTile;
BOOLEAN fHelicopterReturnToBaseIsNotFree;
BOOLEAN fPaySkyriderInBase;
} GAME_EXTERNAL_OPTIONS; } GAME_EXTERNAL_OPTIONS;
typedef struct typedef struct
@@ -1400,6 +1415,36 @@ typedef struct
} TAUNTS_SETTINGS; } TAUNTS_SETTINGS;
typedef struct
{
UINT16 usHelicopterBasicRepairCost;
UINT16 usHelicopterSeriousRepairCost;
UINT8 ubHelicopterBasicRepairTime;
UINT8 ubHelicopterBasicRepairTimeVariation;
UINT8 ubHelicopterSeriousRepairTime;
UINT8 ubHelicopterSeriousRepairTimeVariation;
UINT16 usHelicopterBasicCostIncreaseAfterBasicRepair;
UINT16 usHelicopterBasicCostIncreaseAfterSeriousRepair;
UINT16 usHelicopterSeriousCostIncreaseAfterBasicRepair;
UINT16 usHelicopterSeriousCostIncreaseAfterSeriousRepair;
UINT16 usHelicopterBasicRepairCostMax;
UINT16 usHelicopterSeriousRepairCostMax;
UINT8 ubHelicopterDistanceWithoutRefuel;
UINT8 ubHelicopterHoverTimePerFuelUnit;
UINT8 ubHelicopterRefuelTime;
UINT8 ubHelicopterTimeDelayForHoverWait;
UINT8 ubHelicopterTimeDelayForHoverWaitTooLong;
BOOLEAN fAskBeforeKickingPassengersOut;
UINT8 ubHelicopterSAMSiteAccuracy;
UINT8 ubHelicopterPassengerHitChance;
UINT8 ubHelicopterPassengerHitMinDamage;
UINT8 ubHelicopterPassengerHitMaxDamage;
} HELICOPTER_SETTINGS;
typedef struct typedef struct
{ {
UINT8 ubMaxNumberOfTraits; UINT8 ubMaxNumberOfTraits;
@@ -2086,6 +2131,8 @@ extern SKILL_TRAIT_VALUES gSkillTraitValues; // SANDRO - added this one
extern TAUNTS_SETTINGS gTauntsSettings; extern TAUNTS_SETTINGS gTauntsSettings;
extern HELICOPTER_SETTINGS gHelicopterSettings;
// HEADROCK HAM 4: CTH constants read from a separate INI file // HEADROCK HAM 4: CTH constants read from a separate INI file
extern CTH_CONSTANTS gGameCTHConstants; extern CTH_CONSTANTS gGameCTHConstants;
@@ -2103,6 +2150,7 @@ void LoadGameAPBPConstants();
// HEADROCK HAM 4: Read CTH/Shooting coefficients from file // HEADROCK HAM 4: Read CTH/Shooting coefficients from file
void LoadCTHConstants(); void LoadCTHConstants();
void LoadTauntsSettings(); void LoadTauntsSettings();
void LoadHelicopterRepairRefuelSettings();
void FreeGameExternalOptions(); void FreeGameExternalOptions();
void InitGameOptions(); void InitGameOptions();
+2 -1
View File
@@ -21,6 +21,7 @@ extern CHAR16 zTrackingNumber[16];
// Keeps track of the saved game version. Increment the saved game version whenever // Keeps track of the saved game version. Increment the saved game version whenever
// you will invalidate the saved game file // you will invalidate the saved game file
#define WALDO_CAN_REPAIR_HELICOPTER 149 // anv: have to refresh Waldo records
#define ENCYCLOPEDIA_ITEM_VISIBILITY 148 // Moa: Items discovered during compain have to be saved. #define ENCYCLOPEDIA_ITEM_VISIBILITY 148 // Moa: Items discovered during compain have to be saved.
#define TRAIT_RADIO_OPERATOR 147 // Flugente: new trait radio operator #define TRAIT_RADIO_OPERATOR 147 // Flugente: new trait radio operator
#define BACKGROUNDS_FIX_UINT8 146 // Flugente: had to change usBackground-vars from UINT8 to UINT16 #define BACKGROUNDS_FIX_UINT8 146 // Flugente: had to change usBackground-vars from UINT8 to UINT16
@@ -67,7 +68,7 @@ extern CHAR16 zTrackingNumber[16];
#define AP100_SAVEGAME_DATATYPE_CHANGE 105 // Before this, we didn't have the 100AP structure changes #define AP100_SAVEGAME_DATATYPE_CHANGE 105 // Before this, we didn't have the 100AP structure changes
#define NIV_SAVEGAME_DATATYPE_CHANGE 102 // Before this, we used the old structure system #define NIV_SAVEGAME_DATATYPE_CHANGE 102 // Before this, we used the old structure system
#define SAVE_GAME_VERSION ENCYCLOPEDIA_ITEM_VISIBILITY #define SAVE_GAME_VERSION WALDO_CAN_REPAIR_HELICOPTER
//#define RUSSIANGOLD //#define RUSSIANGOLD
#ifdef __cplusplus #ifdef __cplusplus
+4 -1
View File
@@ -1178,8 +1178,11 @@ void ProcessHistoryTransactionString(STR16 pString, HistoryUnitPtr pHistory)
case HISTORY_SLAUGHTEREDBLOODCATS: case HISTORY_SLAUGHTEREDBLOODCATS:
case HISTORY_GAVE_CARMEN_HEAD: case HISTORY_GAVE_CARMEN_HEAD:
case HISTORY_SLAY_MYSTERIOUSLY_LEFT: case HISTORY_SLAY_MYSTERIOUSLY_LEFT:
swprintf( pString, pHistoryStrings[ pHistory->ubCode ] ); case HISTORY_WALDO:
case HISTORY_HELICOPTER_REPAIR_STARTED:
swprintf( pString, pHistoryStrings[ pHistory->ubCode ], pHistory->ubSecondCode );
break; break;
} }
} }
+2
View File
@@ -103,6 +103,8 @@ enum{
HISTORY_GAVE_CARMEN_HEAD, HISTORY_GAVE_CARMEN_HEAD,
HISTORY_SLAY_MYSTERIOUSLY_LEFT, HISTORY_SLAY_MYSTERIOUSLY_LEFT,
HISTORY_MERC_KILLED_CHARACTER, HISTORY_MERC_KILLED_CHARACTER,
HISTORY_WALDO,
HISTORY_HELICOPTER_REPAIR_STARTED,
TEXT_NUM_HISTORY TEXT_NUM_HISTORY
}; };
+2
View File
@@ -385,6 +385,8 @@ void InitDependingGameStyleOptions()
LoadCTHConstants(); LoadCTHConstants();
// Load externalised taunts settings // Load externalised taunts settings
LoadTauntsSettings(); LoadTauntsSettings();
// Load helicopter repair settings
LoadHelicopterRepairRefuelSettings();
#ifdef JA2UB #ifdef JA2UB
LoadGameUBOptions(); // JA25 UB LoadGameUBOptions(); // JA25 UB
+39 -5
View File
@@ -255,7 +255,7 @@ typedef struct
INT32 iHelicopterVehicleId; INT32 iHelicopterVehicleId;
// total distance travelled // total distance travelled
INT32 UNUSEDiTotalHeliDistanceSinceRefuel; INT32 iTotalHeliDistanceSinceRefuel;
// total owed to player // total owed to player
INT32 iTotalAccumulatedCostByPlayer; INT32 iTotalAccumulatedCostByPlayer;
@@ -481,7 +481,14 @@ typedef struct
BOOLEAN HiddenNames[500]; //legion by Jazz BOOLEAN HiddenNames[500]; //legion by Jazz
UINT8 ubFiller[278]; //This structure should be 1588 bytes // anv: amount of hours to repair completion
UINT8 ubHelicopterHoursToRepair;
UINT8 ubHelicopterBasicRepairsSoFar;
UINT8 ubHelicopterSeriousRepairsSoFar;
UINT8 ubHelicopterHoverTime;
UINT8 ubHelicopterTimeToFullRefuel;
UINT8 ubFiller[273]; //This structure should be 1588 bytes
} GENERAL_SAVE_INFO; } GENERAL_SAVE_INFO;
@@ -7912,7 +7919,7 @@ BOOLEAN SaveGeneralInfo( HWFILE hFile )
sGeneralInfo.iHelicopterVehicleId = iHelicopterVehicleId; sGeneralInfo.iHelicopterVehicleId = iHelicopterVehicleId;
// total distance travelled // total distance travelled
// sGeneralInfo.iTotalHeliDistanceSinceRefuel = iTotalHeliDistanceSinceRefuel; sGeneralInfo.iTotalHeliDistanceSinceRefuel = iTotalHeliDistanceSinceRefuel;
// total owed by player // total owed by player
sGeneralInfo.iTotalAccumulatedCostByPlayer = iTotalAccumulatedCostByPlayer; sGeneralInfo.iTotalAccumulatedCostByPlayer = iTotalAccumulatedCostByPlayer;
@@ -7948,6 +7955,17 @@ BOOLEAN SaveGeneralInfo( HWFILE hFile )
sGeneralInfo.fSkyriderEmptyHelpGiven = gfSkyriderEmptyHelpGiven; sGeneralInfo.fSkyriderEmptyHelpGiven = gfSkyriderEmptyHelpGiven;
sGeneralInfo.ubHelicopterHitsTaken = gubHelicopterHitsTaken; sGeneralInfo.ubHelicopterHitsTaken = gubHelicopterHitsTaken;
// anv: amount of hours to repair completion
sGeneralInfo.ubHelicopterHoursToRepair = gubHelicopterHoursToRepair;
// repairs so far (for dynamic cost increase)
sGeneralInfo.ubHelicopterBasicRepairsSoFar = gubHelicopterBasicRepairsSoFar;
sGeneralInfo.ubHelicopterSeriousRepairsSoFar = gubHelicopterSeriousRepairsSoFar;
// hover time
sGeneralInfo.ubHelicopterHoverTime = gubHelicopterHoverTime;
// time to full refuel
sGeneralInfo.ubHelicopterTimeToFullRefuel = gubHelicopterTimeToFullRefuel;
sGeneralInfo.fSkyriderSaidCongratsOnTakingSAM = gfSkyriderSaidCongratsOnTakingSAM; sGeneralInfo.fSkyriderSaidCongratsOnTakingSAM = gfSkyriderSaidCongratsOnTakingSAM;
sGeneralInfo.ubPlayerProgressSkyriderLastCommentedOn = gubPlayerProgressSkyriderLastCommentedOn; sGeneralInfo.ubPlayerProgressSkyriderLastCommentedOn = gubPlayerProgressSkyriderLastCommentedOn;
@@ -8219,7 +8237,7 @@ BOOLEAN LoadGeneralInfo( HWFILE hFile )
numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.fShowMobileRestrictionsFlag, sizeof(sGeneralInfo.fShowMobileRestrictionsFlag), sizeof(BOOLEAN), numBytesRead); numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.fShowMobileRestrictionsFlag, sizeof(sGeneralInfo.fShowMobileRestrictionsFlag), sizeof(BOOLEAN), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.fHelicopterAvailable, sizeof(sGeneralInfo.fHelicopterAvailable), sizeof(BOOLEAN), numBytesRead); numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.fHelicopterAvailable, sizeof(sGeneralInfo.fHelicopterAvailable), sizeof(BOOLEAN), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.iHelicopterVehicleId, sizeof(sGeneralInfo.iHelicopterVehicleId), sizeof(INT32), numBytesRead); numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.iHelicopterVehicleId, sizeof(sGeneralInfo.iHelicopterVehicleId), sizeof(INT32), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.UNUSEDiTotalHeliDistanceSinceRefuel, sizeof(sGeneralInfo.UNUSEDiTotalHeliDistanceSinceRefuel), sizeof(INT32), numBytesRead); numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.iTotalHeliDistanceSinceRefuel, sizeof(sGeneralInfo.iTotalHeliDistanceSinceRefuel), sizeof(INT32), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.iTotalAccumulatedCostByPlayer, sizeof(sGeneralInfo.iTotalAccumulatedCostByPlayer), sizeof(INT32), numBytesRead); numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.iTotalAccumulatedCostByPlayer, sizeof(sGeneralInfo.iTotalAccumulatedCostByPlayer), sizeof(INT32), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.fSkyRiderAvailable, sizeof(sGeneralInfo.fSkyRiderAvailable), sizeof(BOOLEAN), numBytesRead); numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.fSkyRiderAvailable, sizeof(sGeneralInfo.fSkyRiderAvailable), sizeof(BOOLEAN), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.UNUSEDfSkyriderMonologue, sizeof(sGeneralInfo.UNUSEDfSkyriderMonologue), sizeof(BOOLEAN), numBytesRead); numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.UNUSEDfSkyriderMonologue, sizeof(sGeneralInfo.UNUSEDfSkyriderMonologue), sizeof(BOOLEAN), numBytesRead);
@@ -8361,6 +8379,11 @@ BOOLEAN LoadGeneralInfo( HWFILE hFile )
if ( guiCurrentSaveGameVersion >= NEW_GENERAL_SAVE_INFO_DATA ){ if ( guiCurrentSaveGameVersion >= NEW_GENERAL_SAVE_INFO_DATA ){
numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.ubManualRestrictMilitia, sizeof(sGeneralInfo.ubManualRestrictMilitia), sizeof(UINT8), numBytesRead); numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.ubManualRestrictMilitia, sizeof(sGeneralInfo.ubManualRestrictMilitia), sizeof(UINT8), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.HiddenNames, sizeof(sGeneralInfo.HiddenNames), sizeof(BOOLEAN), numBytesRead); numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.HiddenNames, sizeof(sGeneralInfo.HiddenNames), sizeof(BOOLEAN), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.ubHelicopterHoursToRepair, sizeof(sGeneralInfo.ubHelicopterHoursToRepair), sizeof(UINT8), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.ubHelicopterBasicRepairsSoFar, sizeof(sGeneralInfo.ubHelicopterBasicRepairsSoFar), sizeof(UINT8), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.ubHelicopterSeriousRepairsSoFar, sizeof(sGeneralInfo.ubHelicopterSeriousRepairsSoFar), sizeof(UINT8), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.ubHelicopterHoverTime, sizeof(sGeneralInfo.ubHelicopterHoverTime), sizeof(UINT8), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.ubHelicopterTimeToFullRefuel, sizeof(sGeneralInfo.ubHelicopterTimeToFullRefuel), sizeof(UINT8), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.ubFiller, sizeof(sGeneralInfo.ubFiller), sizeof(UINT8), numBytesRead); numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.ubFiller, sizeof(sGeneralInfo.ubFiller), sizeof(UINT8), numBytesRead);
} else { } else {
numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.HiddenNames, sizeof(sGeneralInfo.HiddenNames), sizeof(BOOLEAN), numBytesRead); numBytesRead = ReadFieldByField(hFile, &sGeneralInfo.HiddenNames, sizeof(sGeneralInfo.HiddenNames), sizeof(BOOLEAN), numBytesRead);
@@ -8414,7 +8437,7 @@ BOOLEAN LoadGeneralInfo( HWFILE hFile )
iHelicopterVehicleId = sGeneralInfo.iHelicopterVehicleId; iHelicopterVehicleId = sGeneralInfo.iHelicopterVehicleId;
// total distance travelled // total distance travelled
// iTotalHeliDistanceSinceRefuel = sGeneralInfo.iTotalHeliDistanceSinceRefuel; iTotalHeliDistanceSinceRefuel = sGeneralInfo.iTotalHeliDistanceSinceRefuel;
// total owed to player // total owed to player
iTotalAccumulatedCostByPlayer = sGeneralInfo.iTotalAccumulatedCostByPlayer; iTotalAccumulatedCostByPlayer = sGeneralInfo.iTotalAccumulatedCostByPlayer;
@@ -8458,6 +8481,17 @@ BOOLEAN LoadGeneralInfo( HWFILE hFile )
gfSkyriderEmptyHelpGiven = sGeneralInfo.fSkyriderEmptyHelpGiven; gfSkyriderEmptyHelpGiven = sGeneralInfo.fSkyriderEmptyHelpGiven;
gubHelicopterHitsTaken = sGeneralInfo.ubHelicopterHitsTaken; gubHelicopterHitsTaken = sGeneralInfo.ubHelicopterHitsTaken;
// anv: amount of hours to repair completion
gubHelicopterHoursToRepair = sGeneralInfo.ubHelicopterHoursToRepair;
// repairs so far (for dynamic cost increase)
gubHelicopterBasicRepairsSoFar = sGeneralInfo.ubHelicopterBasicRepairsSoFar;
gubHelicopterSeriousRepairsSoFar = sGeneralInfo.ubHelicopterSeriousRepairsSoFar;
// hover time
gubHelicopterHoverTime = sGeneralInfo.ubHelicopterHoverTime;
// time to full refuel
gubHelicopterTimeToFullRefuel = sGeneralInfo.ubHelicopterTimeToFullRefuel;
gfSkyriderSaidCongratsOnTakingSAM = sGeneralInfo.fSkyriderSaidCongratsOnTakingSAM; gfSkyriderSaidCongratsOnTakingSAM = sGeneralInfo.fSkyriderSaidCongratsOnTakingSAM;
gubPlayerProgressSkyriderLastCommentedOn = sGeneralInfo.ubPlayerProgressSkyriderLastCommentedOn; gubPlayerProgressSkyriderLastCommentedOn = sGeneralInfo.ubPlayerProgressSkyriderLastCommentedOn;
+6
View File
@@ -311,6 +311,12 @@ BOOLEAN ExecuteStrategicEvent( STRATEGICEVENT *pEvent )
case EVENT_HELICOPTER_HOVER_WAY_TOO_LONG: case EVENT_HELICOPTER_HOVER_WAY_TOO_LONG:
HandleHeliHoverTooLong( ); HandleHeliHoverTooLong( );
break; break;
case EVENT_HELICOPTER_HOVER_FOR_A_MINUTE:
HandleHeliHoverForAMinute( );
break;
case EVENT_HELICOPTER_REFUEL_FOR_A_MINUTE:
ReFuelHelicopterForAMinute( );
break;
case EVENT_MERC_LEAVE_EQUIP_IN_DRASSEN: case EVENT_MERC_LEAVE_EQUIP_IN_DRASSEN:
HandleEquipmentLeftInDrassen( pEvent->uiParam ); HandleEquipmentLeftInDrassen( pEvent->uiParam );
break; break;
+3
View File
@@ -109,6 +109,9 @@ enum
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*/ */
EVENT_HELICOPTER_HOVER_FOR_A_MINUTE,
EVENT_HELICOPTER_REFUEL_FOR_A_MINUTE,
NUMBER_OF_EVENT_TYPES_PLUS_ONE, NUMBER_OF_EVENT_TYPES_PLUS_ONE,
NUMBER_OF_EVENT_TYPES = NUMBER_OF_EVENT_TYPES_PLUS_ONE - 1 NUMBER_OF_EVENT_TYPES = NUMBER_OF_EVENT_TYPES_PLUS_ONE - 1
}; };
+2
View File
@@ -107,6 +107,8 @@ CHAR16 gEventName[NUMBER_OF_EVENT_TYPES_PLUS_ONE][40]={
#ifdef CRIPPLED_VERSION #ifdef CRIPPLED_VERSION
L"Crippled version end game check", L"Crippled version end game check",
#endif #endif
L"HelicopterHoverForAMinute",
L"HelicopterRefuelForAMinute",
}; };
#endif #endif
+41
View File
@@ -32,6 +32,9 @@
// HEADROCK HAM 3.5: Add facility code for hourly update of detection levels // HEADROCK HAM 3.5: Add facility code for hourly update of detection levels
#include "Facilities.h" #include "Facilities.h"
#include "Food.h" // added by Flugente #include "Food.h" // added by Flugente
// anv: for hourly heli repair
#include "Vehicles.h"
#include "Map Screen Helicopter.h"
void HourlyQuestUpdate(); void HourlyQuestUpdate();
void HourlyLarryUpdate(); void HourlyLarryUpdate();
@@ -45,6 +48,12 @@ extern void PayOffSkyriderDebtIfAny( );
void HourlyCheckIfSlayAloneSoHeCanLeave(); void HourlyCheckIfSlayAloneSoHeCanLeave();
#endif #endif
#if (defined JA2UB)
//no UB
#else
void HourlyHelicopterRepair();
#endif
void UpdateRegenCounters( void ); void UpdateRegenCounters( void );
void HandleMinuteUpdate() void HandleMinuteUpdate()
@@ -114,6 +123,8 @@ CHAR16 zString[128];
PayOffSkyriderDebtIfAny(); PayOffSkyriderDebtIfAny();
HourlyHelicopterRepair();
if ( GetWorldHour() % 6 == 0 ) // 4 times a day if ( GetWorldHour() % 6 == 0 ) // 4 times a day
{ {
UpdateRegenCounters(); UpdateRegenCounters();
@@ -566,3 +577,33 @@ void HourlyCheckIfSlayAloneSoHeCanLeave()
} }
} }
#endif #endif
#if (defined JA2UB)
// no JA25 UB
#else
void HourlyHelicopterRepair()
{
if( gubHelicopterHoursToRepair == 0 )
{
return;
}
MERCPROFILESTRUCT *pMechanic;
pMechanic = &(gMercProfiles[ WALDO ]);
if( !pMechanic )
{
return;
}
if( !pMechanic->bLife )
{
return;
}
if( pVehicleList[ iHelicopterVehicleId ].sSectorX == gMercProfiles[ WALDO ].sSectorX && pVehicleList[ iHelicopterVehicleId ].sSectorX == gMercProfiles[ WALDO ].sSectorX )
{
gubHelicopterHoursToRepair--;
}
if( gubHelicopterHoursToRepair == 0 )
{
FinishHelicopterRepair();
}
}
#endif
+375 -66
View File
@@ -45,23 +45,33 @@
#endif #endif
#include "Vehicles.h" #include "Vehicles.h"
#include "NPC.h"
#include "history.h"
// the amounts of time to wait for hover stuff // the amounts of time to wait for hover stuff
#define TIME_DELAY_FOR_HOVER_WAIT 10 // minutes // externalised, use gHelicopterSettings.ubHelicopterTimeDelayForHoverWait instead
#define TIME_DELAY_FOR_HOVER_WAIT_TOO_LONG 20 // mintues //#define TIME_DELAY_FOR_HOVER_WAIT 10 // minutes
// externalised, use gHelicopterSettings.ubHelicopterTimeDelayForHoverWaitTooLong instead
//#define TIME_DELAY_FOR_HOVER_WAIT_TOO_LONG 20 // mintues
#define MIN_DAYS_BETWEEN_SKYRIDER_MONOLOGUES 1 #define MIN_DAYS_BETWEEN_SKYRIDER_MONOLOGUES 1
// refuel delay // refuel delay
#define REFUEL_HELICOPTER_DELAY 30 // minutes // externalised, use gHelicopterSettings.ubHelicopterRefuelTime instead
//#define REFUEL_HELICOPTER_DELAY 30 // minutes
// total number of sectors one can go // total number of sectors one can go
//#define MAX_HELICOPTER_DISTANCE 25 // externalised, use gHelicopterSettings.ubHelicopterDistanceWithoutRefuel instead
//#define MAX_HELICOPTER_DISTANCE 25
// maximum chance out of a hundred per unsafe sector that a SAM site in decent working condition will hit Skyrider // maximum chance out of a hundred per unsafe sector that a SAM site in decent working condition will hit Skyrider
#define MAX_SAM_SITE_ACCURACY 33 // externalised, use gHelicopterSettings.ubHelicopterSAMSiteAccuracy instead
//#define MAX_SAM_SITE_ACCURACY 33
#define HELICOPTER_RETURN_REASON_NONE 0
#define HELICOPTER_RETURN_REASON_LOW_FUEL 1
#define HELICOPTER_RETURN_REASON_DAMAGE 2
extern FACETYPE *gpCurrentTalkingFace; extern FACETYPE *gpCurrentTalkingFace;
extern UINT8 gubCurrentTalkingID; extern UINT8 gubCurrentTalkingID;
@@ -97,7 +107,7 @@ INT32 iHelicopterVehicleId = -1;
UINT32 guiHelicopterIcon; UINT32 guiHelicopterIcon;
// total distance travelled // total distance travelled
//INT32 iTotalHeliDistanceSinceRefuel = 0; INT32 iTotalHeliDistanceSinceRefuel = 0;
// total owed to player // total owed to player
INT32 iTotalAccumulatedCostByPlayer = 0; INT32 iTotalAccumulatedCostByPlayer = 0;
@@ -153,6 +163,13 @@ UINT32 guiTimeOfLastSkyriderMonologue = 0;
UINT8 gubHelicopterHitsTaken = 0; UINT8 gubHelicopterHitsTaken = 0;
UINT8 gubHelicopterHoursToRepair = 0;
UINT8 gubHelicopterBasicRepairsSoFar = 0;
UINT8 gubHelicopterSeriousRepairsSoFar = 0;
UINT8 gubHelicopterHoverTime = 0;
UINT8 gubHelicopterTimeToFullRefuel = 0;
BOOLEAN gfSkyriderSaidCongratsOnTakingSAM = FALSE; BOOLEAN gfSkyriderSaidCongratsOnTakingSAM = FALSE;
UINT8 gubPlayerProgressSkyriderLastCommentedOn = 0; UINT8 gubPlayerProgressSkyriderLastCommentedOn = 0;
@@ -173,14 +190,14 @@ BOOLEAN DoesSkyriderNoticeEnemiesInSector( UINT8 ubNumEnemies );
BOOLEAN EndOfHelicoptersPath( void ); BOOLEAN EndOfHelicoptersPath( void );
// find the location sector of closest refuel point for heli..and the criteria if the sector must be under the players control // find the location sector of closest refuel point for heli..and the criteria if the sector must be under the players control
INT32 FindLocationOfClosestRefuelSite( BOOLEAN fMustBeAvailable ); INT32 FindLocationOfClosestRefuelSite( BOOLEAN fMustBeAvailable, INT16 sX, INT16 sY );
// add the tactical heli graphic // add the tactical heli graphic
void AddHelicopterToMaps( BOOLEAN fAdd, UINT8 ubSite ); void AddHelicopterToMaps( BOOLEAN fAdd, UINT8 ubSite );
void PaySkyriderBill( void ); void PaySkyriderBill( void );
void MakeHeliReturnToBase( void ); void MakeHeliReturnToBase( UINT8 ubReturnReason );
void HandleSkyRiderMonologueAboutDrassenSAMSite( UINT32 uiSpecialCode ); void HandleSkyRiderMonologueAboutDrassenSAMSite( UINT32 uiSpecialCode );
void HandleSkyRiderMonologueAboutCambriaHospital( UINT32 uiSpecialCode ); void HandleSkyRiderMonologueAboutCambriaHospital( UINT32 uiSpecialCode );
@@ -558,7 +575,7 @@ void InitializeHelicopter( void )
fPlotForHelicopter = FALSE; fPlotForHelicopter = FALSE;
pTempHelicopterPath = NULL; pTempHelicopterPath = NULL;
// iTotalHeliDistanceSinceRefuel = 0; iTotalHeliDistanceSinceRefuel = 0;
iTotalAccumulatedCostByPlayer = 0; iTotalAccumulatedCostByPlayer = 0;
fHelicopterDestroyed = FALSE; fHelicopterDestroyed = FALSE;
@@ -691,14 +708,14 @@ BOOLEAN HandleHeliEnteringSector( INT16 sX, INT16 sY )
// player pays for travel if Skyrider is NOT returning to base (even if empty while scouting/going for pickup) // player pays for travel if Skyrider is NOT returning to base (even if empty while scouting/going for pickup)
if ( fHeliReturnStraightToBase == FALSE ) if ( fHeliReturnStraightToBase == FALSE || gGameExternalOptions.fHelicopterReturnToBaseIsNotFree )
{ {
// charge cost for flying another sector // charge cost for flying another sector
iTotalAccumulatedCostByPlayer += GetCostOfPassageForHelicopter( sX, sY ); iTotalAccumulatedCostByPlayer += GetCostOfPassageForHelicopter( sX, sY );
} }
// accumulate distance travelled // accumulate distance travelled
// AddSectorToHelicopterDistanceTravelled( ); AddSectorToHelicopterDistanceTravelled( );
// check if heli has any real path left // check if heli has any real path left
@@ -720,7 +737,8 @@ BOOLEAN HandleHeliEnteringSector( INT16 sX, INT16 sY )
} }
// destination reached, payment due. If player can't pay, mercs get kicked off and heli flies to base! // destination reached, payment due. If player can't pay, mercs get kicked off and heli flies to base!
PaySkyriderBill(); if( gGameExternalOptions.fPaySkyriderInBase == FALSE || CheckForArrivalAtRefuelPoint( ) )
PaySkyriderBill();
// WANNE: Fix by Headrock: Always stop time! // WANNE: Fix by Headrock: Always stop time!
StopTimeCompression(); StopTimeCompression();
@@ -735,23 +753,55 @@ BOOLEAN HandleHeliEnteringSector( INT16 sX, INT16 sY )
else else
HeliCharacterDialogue( pSkyRider, HELI_HOT_DROP ); HeliCharacterDialogue( pSkyRider, HELI_HOT_DROP );
PaySkyriderBill(); if( gGameExternalOptions.fPaySkyriderInBase == FALSE || CheckForArrivalAtRefuelPoint( ) )
PaySkyriderBill();
StopTimeCompression(); StopTimeCompression();
} }
if( CheckForArrivalAtRefuelPoint( ) ) if( CheckForArrivalAtRefuelPoint( ) )
{ {
ReFuelHelicopter( ); ReFuelHelicopter( );
OfferHelicopterRepair();
} }
} }
CheckIfHelicopterHasEnoughFuelToReturn( sX, sY );
return( FALSE ); return( FALSE );
} }
/* BOOLEAN CheckIfHelicopterHasEnoughFuelToReturn( INT16 sX, INT16 sY )
{
// anv: check if we didn't come too far
if( !CheckForArrivalAtRefuelPoint() && fHeliReturnStraightToBase == FALSE && gHelicopterSettings.ubHelicopterDistanceWithoutRefuel - iTotalHeliDistanceSinceRefuel < DistanceToNearestRefuelPoint(sX, sY) )
{
// hovered too long, inform player heli is returning to base
HeliCharacterDialogue( pSkyRider, RETURN_TO_BASE );
// If the sector is safe
if ( NumEnemiesInSector( pVehicleList[ iHelicopterVehicleId ].sSectorX, pVehicleList[ iHelicopterVehicleId ].sSectorY ) == 0 )
{
// kick everyone out!
// anv: possibly show prompt, if option is on, and heli has any passengers
if( gHelicopterSettings.fAskBeforeKickingPassengersOut == FALSE || GetNumberInVehicle( iHelicopterVehicleId ) == 0 )
{
MoveAllInHelicopterToFootMovementGroup( );
MakeHeliReturnToBase( HELICOPTER_RETURN_REASON_LOW_FUEL );
}
else
DoMessageBox( MSG_BOX_BASIC_STYLE, pHelicopterEtaStrings[ STR_HELI_ETA_KICK_OUT_PASSENGERS_PROMPT ], guiCurrentScreen, ( UINT8 )MSG_BOX_FLAG_YESNO, KickOutPassengersBoxCallBack, NULL );
}
else
MakeHeliReturnToBase( HELICOPTER_RETURN_REASON_LOW_FUEL );
return ( FALSE );
}
return ( TRUE );
}
INT32 GetTotalDistanceHelicopterCanTravel( void ) INT32 GetTotalDistanceHelicopterCanTravel( void )
{ {
return( MAX_HELICOPTER_DISTANCE ); return( gHelicopterSettings.ubHelicopterDistanceWithoutRefuel );
} }
INT32 HowFarHelicopterhasTravelledSinceRefueling( void ) INT32 HowFarHelicopterhasTravelledSinceRefueling( void )
@@ -763,7 +813,7 @@ INT32 HowFarHelicopterhasTravelledSinceRefueling( void )
INT32 HowFurtherCanHelicopterTravel( void ) INT32 HowFurtherCanHelicopterTravel( void )
{ {
// how many sectors further can we go on remaining fuel? // how many sectors further can we go on remaining fuel?
return( MAX_HELICOPTER_DISTANCE - ( HowFarHelicopterhasTravelledSinceRefueling( ) + DistanceOfIntendedHelicopterPath( ) ) ); return( gHelicopterSettings.ubHelicopterDistanceWithoutRefuel - ( HowFarHelicopterhasTravelledSinceRefueling( ) + DistanceOfIntendedHelicopterPath( ) ) );
} }
void AddSectorToHelicopterDistanceTravelled( void ) void AddSectorToHelicopterDistanceTravelled( void )
@@ -776,26 +826,38 @@ void AddSectorToHelicopterDistanceTravelled( void )
return; return;
} }
*/
INT32 LocationOfNearestRefuelPoint( BOOLEAN fNotifyPlayerIfNoSafeLZ )
INT32 LocationOfNearestRefuelPoint( BOOLEAN fNotifyPlayerIfNoSafeLZ, UINT8 ubReturnReason, INT16 sX, INT16 sY )
{ {
INT32 iClosestLocation = -1; INT32 iClosestLocation = -1;
// anv: update availability before check
UpdateRefuelSiteAvailability();
// try to find one, any one under the players control // try to find one, any one under the players control
iClosestLocation = FindLocationOfClosestRefuelSite( TRUE ); iClosestLocation = FindLocationOfClosestRefuelSite( TRUE, sX, sY );
// no go?...then find // no go?...then find
if( iClosestLocation == -1 ) if( iClosestLocation == -1 )
{ {
if( fNotifyPlayerIfNoSafeLZ ) if( fNotifyPlayerIfNoSafeLZ )
{ {
// no refueling sites available, might wanna warn player about this switch( ubReturnReason )
ScreenMsg( FONT_MCOLOR_DKRED, MSG_INTERFACE, pHelicopterEtaStrings[ 5 ] ); {
case HELICOPTER_RETURN_REASON_LOW_FUEL:
// no refueling sites available, might wanna warn player about this
ScreenMsg( FONT_MCOLOR_DKRED, MSG_INTERFACE, pHelicopterEtaStrings[ STR_HELI_ETA_LOW_ON_FUEL_HOSTILE_TERRITORY ] );
break;
case HELICOPTER_RETURN_REASON_DAMAGE:
// no refueling sites available, might wanna warn player about this
ScreenMsg( FONT_MCOLOR_DKRED, MSG_INTERFACE, pHelicopterEtaStrings[ STR_HELI_ETA_HELI_DAMAGED_HOSTILE_TERRITORY ] );
break;
}
} }
// find the closest location regardless // find the closest location regardless
iClosestLocation = FindLocationOfClosestRefuelSite( FALSE ); iClosestLocation = FindLocationOfClosestRefuelSite( FALSE, sX, sY );
} }
// always returns a valid refuel point, picking a hostile one if unavoidable // always returns a valid refuel point, picking a hostile one if unavoidable
@@ -804,7 +866,7 @@ INT32 LocationOfNearestRefuelPoint( BOOLEAN fNotifyPlayerIfNoSafeLZ )
return( iClosestLocation ); return( iClosestLocation );
} }
INT32 FindLocationOfClosestRefuelSite( BOOLEAN fMustBeAvailable ) INT32 FindLocationOfClosestRefuelSite( BOOLEAN fMustBeAvailable, INT16 sX, INT16 sY )
{ {
INT32 iShortestDistance = 9999; INT32 iShortestDistance = 9999;
INT32 iCounter = 0; INT32 iCounter = 0;
@@ -815,10 +877,10 @@ INT32 FindLocationOfClosestRefuelSite( BOOLEAN fMustBeAvailable )
for( iCounter = 0; iCounter < NUMBER_OF_REFUEL_SITES; iCounter++ ) for( iCounter = 0; iCounter < NUMBER_OF_REFUEL_SITES; iCounter++ )
{ {
// if this refuelling site is available // if this refuelling site is available
if( ( fRefuelingSiteAvailable[ iCounter ] ) || ( fMustBeAvailable == FALSE ) ) if( ( fRefuelingSiteAvailable[ iCounter ] ) || ( fMustBeAvailable == FALSE && !( ( iCounter == ESTONI_REFUELING_SITE ) && ( CheckFact( FACT_ESTONI_REFUELLING_POSSIBLE, 0 ) == FALSE ) ) ) )
{ {
// find if sector is under control, find distance from heli to it // find if sector is under control, find distance from heli to it
iDistance = ( INT32 )FindStratPath( ( INT16 )( CALCULATE_STRATEGIC_INDEX( pVehicleList[ iHelicopterVehicleId ].sSectorX , pVehicleList[ iHelicopterVehicleId ].sSectorY ) ), ( INT16 )( CALCULATE_STRATEGIC_INDEX( sRefuelSectorX[ iCounter ], sRefuelSectorY[ iCounter ] ) ) , pVehicleList[ iHelicopterVehicleId ].ubMovementGroup, FALSE ); iDistance = ( INT32 )FindStratPath( ( INT16 )( CALCULATE_STRATEGIC_INDEX( sX , sY ) ), ( INT16 )( CALCULATE_STRATEGIC_INDEX( sRefuelSectorX[ iCounter ], sRefuelSectorY[ iCounter ] ) ) , pVehicleList[ iHelicopterVehicleId ].ubMovementGroup, FALSE );
if( iDistance < iShortestDistance ) if( iDistance < iShortestDistance )
{ {
@@ -840,14 +902,14 @@ INT32 DistanceToNearestRefuelPoint( INT16 sX, INT16 sY )
INT32 iDistance; INT32 iDistance;
// don't notify player during these checks! // don't notify player during these checks!
iClosestLocation = LocationOfNearestRefuelPoint( FALSE ); iClosestLocation = LocationOfNearestRefuelPoint( FALSE, HELICOPTER_RETURN_REASON_NONE, sX, sY );
iDistance = ( INT32 )FindStratPath( ( INT16 )( CALCULATE_STRATEGIC_INDEX( sX, sY ) ), ( INT16 )( CALCULATE_STRATEGIC_INDEX( sRefuelSectorX[ iClosestLocation ], sRefuelSectorY[ iClosestLocation ] ) ) , pVehicleList[ iHelicopterVehicleId ].ubMovementGroup, FALSE ); iDistance = ( INT32 )FindStratPath( ( INT16 )( CALCULATE_STRATEGIC_INDEX( sX, sY ) ), ( INT16 )( CALCULATE_STRATEGIC_INDEX( sRefuelSectorX[ iClosestLocation ], sRefuelSectorY[ iClosestLocation ] ) ) , pVehicleList[ iHelicopterVehicleId ].ubMovementGroup, FALSE );
return( iDistance ); return( iDistance );
} }
/*
BOOLEAN IsSectorOutOfTheWay( INT16 sX, INT16 sY ) BOOLEAN IsSectorOutOfTheWay( INT16 sX, INT16 sY )
{ {
// check distance to nearest refuel point // check distance to nearest refuel point
@@ -859,7 +921,6 @@ BOOLEAN IsSectorOutOfTheWay( INT16 sX, INT16 sY )
return( FALSE ); return( FALSE );
} }
*/
@@ -869,17 +930,194 @@ void ReFuelHelicopter( void )
LandHelicopter( ); LandHelicopter( );
/* if(gGameExternalOptions.fAlternativeHelicopterFuelSystem)
AddStrategicEvent( EVENT_HELICOPTER_DONE_REFUELING, GetWorldTotalMin() + REFUEL_HELICOPTER_DELAY, 0 ); {
gubHelicopterTimeToFullRefuel = ( gHelicopterSettings.ubHelicopterRefuelTime * ( iTotalHeliDistanceSinceRefuel ) ) / gHelicopterSettings.ubHelicopterDistanceWithoutRefuel;
// reset distance traveled //AddStrategicEvent( EVENT_HELICOPTER_DONE_REFUELING, GetWorldTotalMin() + gHelicopterSettings.ubHelicopterRefuelTime, 0 );
iTotalHeliDistanceSinceRefuel = 0; AddStrategicEvent( EVENT_HELICOPTER_REFUEL_FOR_A_MINUTE, GetWorldTotalMin() + 1, 0 );
*/ // reset distance traveled
//iTotalHeliDistanceSinceRefuel = 0;
// reset hover time
gubHelicopterHoverTime = 0;
}
return; return;
} }
void ReFuelHelicopterForAMinute( void )
{
if( CheckForArrivalAtRefuelPoint() == FALSE )
{
return;
}
if( iTotalHeliDistanceSinceRefuel <= 0 )
{
gubHelicopterTimeToFullRefuel = 0;
iTotalHeliDistanceSinceRefuel = 0;
ScreenMsg( FONT_GRAY2, MSG_INTERFACE, L"%s", pHelicopterRepairRefuelStrings[ STR_HELI_RR_REFUEL_FINISHED ]);
}
else
{
gubHelicopterTimeToFullRefuel--;
iTotalHeliDistanceSinceRefuel = ( gubHelicopterTimeToFullRefuel * gHelicopterSettings.ubHelicopterDistanceWithoutRefuel ) / gHelicopterSettings.ubHelicopterRefuelTime ;
AddStrategicEvent( EVENT_HELICOPTER_REFUEL_FOR_A_MINUTE, GetWorldTotalMin() + 1, 0 );
}
return;
}
void OfferHelicopterRepair( void )
{
CHAR16 sHelicopterRepairPromptText[ 320 ];
if( !gGameExternalOptions.fAllowWaldoToOfferRepairInStrategic )
{
return;
}
if( CheckFact(FACT_HELI_DAMAGED_CAN_START_REPAIR, 0 ) == TRUE )
{
if( gGameSettings.fOptions[ TOPTION_SILENT_SKYRIDER ] == FALSE )
{
CharacterDialogue( WALDO, WALDO_REPAIR_PROPOSITION, uiExternalStaticNPCFaces[ WALDO_EXTERNAL_FACE ], DIALOGUE_EXTERNAL_NPC_UI, FALSE, FALSE );
// popup will be called from HandleDialogueEnd()
}
else
{
// no dialogue, show popup right away
swprintf( sHelicopterRepairPromptText, pHelicopterRepairRefuelStrings[ STR_HELI_RR_REPAIR_PROMPT ], gMercProfiles[ WALDO ].zNickname, CalculateHelicopterRepairCost( FALSE ), gHelicopterSettings.ubHelicopterBasicRepairTime );
DoMessageBox( MSG_BOX_BASIC_STYLE, sHelicopterRepairPromptText, guiCurrentScreen, ( UINT8 )MSG_BOX_FLAG_YESNO, OfferHelicopterRepairBoxCallBack, NULL );
}
}
else if( CheckFact(FACT_HELI_SERIOUSLY_DAMAGED_CAN_START_REPAIR, 0 ) == TRUE )
{
if( gGameSettings.fOptions[ TOPTION_SILENT_SKYRIDER ] == FALSE )
{
CharacterDialogue( WALDO, WALDO_SERIOUS_REPAIR_PROPOSITION, uiExternalStaticNPCFaces[ WALDO_EXTERNAL_FACE ], DIALOGUE_EXTERNAL_NPC_UI, FALSE, FALSE );
}
else
{
swprintf( sHelicopterRepairPromptText, pHelicopterRepairRefuelStrings[ STR_HELI_RR_REPAIR_PROMPT ], gMercProfiles[ WALDO ].zNickname, CalculateHelicopterRepairCost( TRUE ), gHelicopterSettings.ubHelicopterSeriousRepairTime );
DoMessageBox( MSG_BOX_BASIC_STYLE, sHelicopterRepairPromptText, guiCurrentScreen, ( UINT8 )MSG_BOX_FLAG_YESNO, OfferHelicopterRepairBoxCallBack, NULL );
}
}
return;
}
void OfferHelicopterRepairBoxCallBack( UINT8 ubExitValue )
{
if ( ubExitValue == MSG_BOX_RETURN_YES )
{
StartHelicopterRepair( TRUE, FALSE );
}
else
{
if( gGameSettings.fOptions[ TOPTION_SILENT_SKYRIDER ] == FALSE )
CharacterDialogue( WALDO, WALDO_REPAIR_REFUSED, uiExternalStaticNPCFaces[ WALDO_EXTERNAL_FACE ], DIALOGUE_EXTERNAL_NPC_UI, FALSE, FALSE );
}
return;
}
void KickOutPassengersBoxCallBack( UINT8 ubExitValue )
{
if ( ubExitValue == MSG_BOX_RETURN_YES )
{
MoveAllInHelicopterToFootMovementGroup();
}
else
{
}
MakeHeliReturnToBase( HELICOPTER_RETURN_REASON_LOW_FUEL );
return;
}
UINT16 CalculateHelicopterRepairCost( BOOLEAN fSeriousRepair )
{
if( gGameExternalOptions.fWaldoSubsequentRepairsIncreaseCosts )
{
if( fSeriousRepair )
{
return min( gHelicopterSettings.usHelicopterSeriousRepairCost + gHelicopterSettings.usHelicopterSeriousCostIncreaseAfterBasicRepair * gubHelicopterBasicRepairsSoFar +
+ gHelicopterSettings.usHelicopterSeriousCostIncreaseAfterSeriousRepair * gubHelicopterSeriousRepairsSoFar, gHelicopterSettings.usHelicopterSeriousRepairCostMax );
}
else
{
return min( gHelicopterSettings.usHelicopterBasicRepairCost + gHelicopterSettings.usHelicopterBasicCostIncreaseAfterBasicRepair * gubHelicopterBasicRepairsSoFar +
+ gHelicopterSettings.usHelicopterBasicCostIncreaseAfterSeriousRepair * gubHelicopterSeriousRepairsSoFar, gHelicopterSettings.usHelicopterBasicRepairCostMax );
}
}
else
{
if( fSeriousRepair )
{
return min( gHelicopterSettings.usHelicopterSeriousRepairCost, gHelicopterSettings.usHelicopterSeriousRepairCostMax );
}
else
{
return min( gHelicopterSettings.usHelicopterBasicRepairCost, gHelicopterSettings.usHelicopterBasicRepairCostMax );
}
}
}
void StartHelicopterRepair( BOOLEAN fInStrategic, BOOLEAN fCalledByGivingMoney )
{
MoveAllInHelicopterToFootMovementGroup( );
if( CheckFact( FACT_HELI_DAMAGED_CAN_START_REPAIR, 0 ) == TRUE )
{
gubHelicopterHoursToRepair = min( max( 1, ( gHelicopterSettings.ubHelicopterBasicRepairTime - gHelicopterSettings.ubHelicopterBasicRepairTimeVariation + 2*Random(gHelicopterSettings.ubHelicopterBasicRepairTimeVariation) ) ), 255 );
AddTransactionToPlayersBook( PAYMENT_TO_NPC, WALDO, GetWorldTotalMin(), -CalculateHelicopterRepairCost(FALSE) );
AddHistoryToPlayersLog( HISTORY_HELICOPTER_REPAIR_STARTED, gHelicopterSettings.ubHelicopterBasicRepairTime, GetWorldTotalMin(), pVehicleList[ iHelicopterVehicleId ].sSectorX, pVehicleList[ iHelicopterVehicleId ].sSectorY );
gubHelicopterBasicRepairsSoFar++;
}
else if( CheckFact( FACT_HELI_SERIOUSLY_DAMAGED_CAN_START_REPAIR, 0 ) == TRUE )
{
gubHelicopterHoursToRepair = min( max( 1, ( gHelicopterSettings.ubHelicopterSeriousRepairTime - gHelicopterSettings.ubHelicopterSeriousRepairTimeVariation + 2*Random(gHelicopterSettings.ubHelicopterSeriousRepairTimeVariation) ) ), 255 );
AddTransactionToPlayersBook( PAYMENT_TO_NPC, WALDO, GetWorldTotalMin(), -CalculateHelicopterRepairCost(TRUE) );
AddHistoryToPlayersLog( HISTORY_HELICOPTER_REPAIR_STARTED, gHelicopterSettings.ubHelicopterSeriousRepairTime, GetWorldTotalMin(), pVehicleList[ iHelicopterVehicleId ].sSectorX, pVehicleList[ iHelicopterVehicleId ].sSectorY );
gubHelicopterSeriousRepairsSoFar++;
}
if( gubHelicopterHoursToRepair > 18 && gubHelicopterHoursToRepair < 30 )
{
if( fInStrategic == TRUE )
{
if( gGameSettings.fOptions[ TOPTION_SILENT_SKYRIDER ] == FALSE )
CharacterDialogue( WALDO, WALDO_COME_BACK_TOMORROW, uiExternalStaticNPCFaces[ WALDO_EXTERNAL_FACE ], DIALOGUE_EXTERNAL_NPC_UI, FALSE, FALSE );
}
else
{
if( !fCalledByGivingMoney )
TriggerNPCRecord( WALDO, 15 );
}
}
else
{
if( fInStrategic == TRUE )
{
if( gGameSettings.fOptions[ TOPTION_SILENT_SKYRIDER ] == FALSE )
CharacterDialogue( WALDO, WALDO_COME_BACK_IN_SOME_TIME, uiExternalStaticNPCFaces[ WALDO_EXTERNAL_FACE ], DIALOGUE_EXTERNAL_NPC_UI, FALSE, FALSE );
}
else
{
if( !fCalledByGivingMoney )
TriggerNPCRecord( WALDO, 16 );
}
}
return;
}
void FinishHelicopterRepair()
{
gubHelicopterHoursToRepair = 0;
gubHelicopterHitsTaken = 0;
if( gGameSettings.fOptions[ TOPTION_SILENT_SKYRIDER ] == FALSE )
CharacterDialogue( WALDO, WALDO_REPAIR_COMPLETED, uiExternalStaticNPCFaces[ WALDO_EXTERNAL_FACE ], DIALOGUE_EXTERNAL_NPC_UI, FALSE, FALSE );
ScreenMsg( FONT_GRAY2, MSG_INTERFACE, L"%s", pHelicopterRepairRefuelStrings[ STR_HELI_RR_REPAIR_FINISHED ]);
return;
}
INT32 GetCostOfPassageForHelicopter( INT16 sX, INT16 sY ) INT32 GetCostOfPassageForHelicopter( INT16 sX, INT16 sY )
{ {
@@ -928,7 +1166,7 @@ void SkyriderDestroyed( void )
// zero out balance due // zero out balance due
gMercProfiles[ SKYRIDER ].iBalance = 0; gMercProfiles[ SKYRIDER ].iBalance = 0;
// iTotalHeliDistanceSinceRefuel = 0; iTotalHeliDistanceSinceRefuel = 0;
iTotalAccumulatedCostByPlayer = 0; iTotalAccumulatedCostByPlayer = 0;
// remove vehicle and reset // remove vehicle and reset
@@ -954,13 +1192,14 @@ BOOLEAN CanHelicopterFly( void )
return( FALSE ); return( FALSE );
} }
/*
// travelled too far? // travelled too far?
if( iTotalHeliDistanceSinceRefuel > MAX_HELICOPTER_DISTANCE ) if( gGameExternalOptions.fAlternativeHelicopterFuelSystem )
{ {
return( FALSE ); if( iTotalHeliDistanceSinceRefuel > gHelicopterSettings.ubHelicopterDistanceWithoutRefuel )
{
return( FALSE );
}
} }
*/
// is the pilot alive, well, and willing to help us? // is the pilot alive, well, and willing to help us?
if( IsHelicopterPilotAvailable( ) == FALSE ) if( IsHelicopterPilotAvailable( ) == FALSE )
@@ -979,6 +1218,12 @@ BOOLEAN CanHelicopterFly( void )
return ( FALSE ); return ( FALSE );
} }
// repair in progress?
if( gubHelicopterHoursToRepair > 0 )
{
return ( FALSE );
}
// everything A-OK! // everything A-OK!
return( TRUE ); return( TRUE );
} }
@@ -1003,6 +1248,12 @@ BOOLEAN IsHelicopterPilotAvailable( void )
return ( FALSE ); return ( FALSE );
} }
// anv - helicopter too damaged?
if ( gGameExternalOptions.fSeriouslyDamagedSkyriderWontFly == TRUE && gubHelicopterHitsTaken > 1 )
{
return ( FALSE );
}
return( TRUE ); return( TRUE );
} }
@@ -1062,19 +1313,61 @@ void StartHoverTime( void )
// post event for x mins in future, save start time, if event time - delay = start time, then hover has gone on too long // post event for x mins in future, save start time, if event time - delay = start time, then hover has gone on too long
uiStartHoverTime = GetWorldTotalMin( ); uiStartHoverTime = GetWorldTotalMin( );
// post event..to call handle hover if( gGameExternalOptions.fAlternativeHelicopterFuelSystem )
AddStrategicEvent( EVENT_HELICOPTER_HOVER_TOO_LONG, GetWorldTotalMin() + TIME_DELAY_FOR_HOVER_WAIT, 0 ); {
AddStrategicEvent( EVENT_HELICOPTER_HOVER_FOR_A_MINUTE, GetWorldTotalMin() + 1, 0 );
}
else
{
// post event..to call handle hover
AddStrategicEvent( EVENT_HELICOPTER_HOVER_TOO_LONG, GetWorldTotalMin() + gHelicopterSettings.ubHelicopterTimeDelayForHoverWait, 0 );
}
return; return;
} }
void HandleHeliHoverForAMinute( void )
{
INT16 sX = pVehicleList[ iHelicopterVehicleId ].sSectorX;
INT16 sY = pVehicleList[ iHelicopterVehicleId ].sSectorY;
if( fHoveringHelicopter == FALSE )
{
return;
}
gubHelicopterHoverTime++;
if( gubHelicopterHoverTime == 10 )
{
gubHelicopterHoverTime = 0;
iTotalHeliDistanceSinceRefuel++;
if( StrategicMap[ CALCULATE_STRATEGIC_INDEX( sX, sY ) ].fEnemyAirControlled == FALSE )
{
iTotalAccumulatedCostByPlayer += gGameExternalOptions.usHelicopterHoverCostOnGreenTile;
}
else
{
iTotalAccumulatedCostByPlayer += gGameExternalOptions.usHelicopterHoverCostOnRedTile;
}
if( CheckIfHelicopterHasEnoughFuelToReturn( sX, sY ) == TRUE )
{
// since now heli can stay hovering longer, reminder every 10 minutes would get irritating
if( iTotalHeliDistanceSinceRefuel % 3 == 0 && iTotalHeliDistanceSinceRefuel < gHelicopterSettings.ubHelicopterDistanceWithoutRefuel )
// inform player
HeliCharacterDialogue( pSkyRider, HOVERING_A_WHILE );
}
}
AddStrategicEvent( EVENT_HELICOPTER_HOVER_FOR_A_MINUTE, GetWorldTotalMin() + 1, 0 );
}
void HandleHeliHoverLong( void ) void HandleHeliHoverLong( void )
{ {
// post message about hovering too long // post message about hovering too long
if( fHoveringHelicopter ) if( fHoveringHelicopter )
{ {
// proper event, post next one // proper event, post next one
AddStrategicEvent( EVENT_HELICOPTER_HOVER_WAY_TOO_LONG, uiStartHoverTime + TIME_DELAY_FOR_HOVER_WAIT_TOO_LONG, 0 ); AddStrategicEvent( EVENT_HELICOPTER_HOVER_WAY_TOO_LONG, uiStartHoverTime + gHelicopterSettings.ubHelicopterTimeDelayForHoverWaitTooLong, 0 );
// inform player // inform player
HeliCharacterDialogue( pSkyRider, HOVERING_A_WHILE ); HeliCharacterDialogue( pSkyRider, HOVERING_A_WHILE );
@@ -1107,11 +1400,17 @@ void HandleHeliHoverTooLong( void )
// If the sector is safe // If the sector is safe
if ( NumEnemiesInSector( pVehicleList[ iHelicopterVehicleId ].sSectorX, pVehicleList[ iHelicopterVehicleId ].sSectorY ) == 0 ) if ( NumEnemiesInSector( pVehicleList[ iHelicopterVehicleId ].sSectorX, pVehicleList[ iHelicopterVehicleId ].sSectorY ) == 0 )
{ {
// kick everyone out! // anv: possibly show prompt, if option is on, and heli has any passengers
MoveAllInHelicopterToFootMovementGroup( ); if( gHelicopterSettings.fAskBeforeKickingPassengersOut == FALSE || GetNumberInVehicle( iHelicopterVehicleId ) == 0 )
{
MoveAllInHelicopterToFootMovementGroup( );
MakeHeliReturnToBase( HELICOPTER_RETURN_REASON_LOW_FUEL );
}
else
DoMessageBox( MSG_BOX_BASIC_STYLE, pHelicopterEtaStrings[ STR_HELI_ETA_KICK_OUT_PASSENGERS_PROMPT ], guiCurrentScreen, ( UINT8 )MSG_BOX_FLAG_YESNO, KickOutPassengersBoxCallBack, NULL );
} }
else
MakeHeliReturnToBase(); MakeHeliReturnToBase( HELICOPTER_RETURN_REASON_LOW_FUEL );
} }
@@ -1275,12 +1574,14 @@ void UpdateRefuelSiteAvailability( void )
// Generally, only Drassen is initially available for refuelling // Generally, only Drassen is initially available for refuelling
// Estoni must first be captured (although player may already have it when he gets Skyrider!) // Estoni must first be captured (although player may already have it when he gets Skyrider!)
// anv: Estoni should only available after Jake-Shank quest
// site availability should not be dependent on SAM zones, or weird things will happen after controlling Estoni (like inability to land in base if it's in SAM zone)
for( iCounter = 0; iCounter < NUMBER_OF_REFUEL_SITES; iCounter++ ) for( iCounter = 0; iCounter < NUMBER_OF_REFUEL_SITES; iCounter++ )
{ {
// if enemy controlled sector (ground OR air, don't want to fly into enemy air territory) // if enemy controlled sector (ground OR air, don't want to fly into enemy air territory)
if( ( StrategicMap[ CALCULATE_STRATEGIC_INDEX( sRefuelSectorX[ iCounter ], sRefuelSectorY[ iCounter ] ) ].fEnemyControlled == TRUE ) || if( ( StrategicMap[ CALCULATE_STRATEGIC_INDEX( sRefuelSectorX[ iCounter ], sRefuelSectorY[ iCounter ] ) ].fEnemyControlled == TRUE ) ||
( StrategicMap[ CALCULATE_STRATEGIC_INDEX( sRefuelSectorX[ iCounter ], sRefuelSectorY[ iCounter ] ) ].fEnemyAirControlled == TRUE ) || //( StrategicMap[ CALCULATE_STRATEGIC_INDEX( sRefuelSectorX[ iCounter ], sRefuelSectorY[ iCounter ] ) ].fEnemyAirControlled == TRUE ) ||
( ( iCounter == ESTONI_REFUELING_SITE ) && ( CheckFact( FACT_ESTONI_REFUELLING_POSSIBLE, 0 ) == FALSE ) ) ) ( ( iCounter == ESTONI_REFUELING_SITE ) && ( CheckFact( FACT_ESTONI_REFUELLING_POSSIBLE, 0 ) == FALSE ) ) )
{ {
// mark refueling site as unavailable // mark refueling site as unavailable
@@ -2123,9 +2424,9 @@ BOOLEAN WillAirRaidBeStopped( INT16 sSectorX, INT16 sSectorY )
ubChance = bSAMCondition; ubChance = bSAMCondition;
// there's a fair chance of a miss even if the SAM site is in perfect working order // there's a fair chance of a miss even if the SAM site is in perfect working order
if (ubChance > MAX_SAM_SITE_ACCURACY * 3) // Madd - since this is only used for enemy air raids, we'll say that good guy SAMs can have a max of 99% to hit instead of 33% if (ubChance > gHelicopterSettings.ubHelicopterSAMSiteAccuracy * 3) // Madd - since this is only used for enemy air raids, we'll say that good guy SAMs can have a max of 99% to hit instead of 33%
{ {
ubChance = MAX_SAM_SITE_ACCURACY * 3; ubChance = gHelicopterSettings.ubHelicopterSAMSiteAccuracy * 3;
} }
if( PreRandom( 100 ) < ubChance) if( PreRandom( 100 ) < ubChance)
@@ -2189,9 +2490,9 @@ BOOLEAN HandleSAMSiteAttackOfHelicopterInSector( INT16 sSectorX, INT16 sSectorY
ubChance = bSAMCondition; ubChance = bSAMCondition;
// there's a fair chance of a miss even if the SAM site is in perfect working order // there's a fair chance of a miss even if the SAM site is in perfect working order
if (ubChance > MAX_SAM_SITE_ACCURACY) if (ubChance > gHelicopterSettings.ubHelicopterSAMSiteAccuracy)
{ {
ubChance = MAX_SAM_SITE_ACCURACY; ubChance = gHelicopterSettings.ubHelicopterSAMSiteAccuracy;
} }
if( PreRandom( 100 ) < ubChance) if( PreRandom( 100 ) < ubChance)
@@ -2206,13 +2507,17 @@ BOOLEAN HandleSAMSiteAttackOfHelicopterInSector( INT16 sSectorX, INT16 sSectorY
if ( gubHelicopterHitsTaken == 1 ) if ( gubHelicopterHitsTaken == 1 )
{ {
HeliCharacterDialogue( pSkyRider, HELI_TOOK_MINOR_DAMAGE ); HeliCharacterDialogue( pSkyRider, HELI_TOOK_MINOR_DAMAGE );
if( gGameExternalOptions.fHelicopterPassengersCanGetHit == TRUE )
HurtPassengersInHelicopter( iHelicopterVehicleId );
} }
// second hit? // second hit?
else if ( gubHelicopterHitsTaken == 2 ) else if ( gubHelicopterHitsTaken == 2 )
{ {
// going back to base (no choice, dialogue says so) // going back to base (no choice, dialogue says so)
HeliCharacterDialogue( pSkyRider, HELI_TOOK_MAJOR_DAMAGE ); HeliCharacterDialogue( pSkyRider, HELI_TOOK_MAJOR_DAMAGE );
MakeHeliReturnToBase(); MakeHeliReturnToBase( HELICOPTER_RETURN_REASON_DAMAGE );
if( gGameExternalOptions.fHelicopterPassengersCanGetHit == TRUE )
HurtPassengersInHelicopter( iHelicopterVehicleId );
} }
// third hit! // third hit!
else else
@@ -2222,17 +2527,21 @@ BOOLEAN HandleSAMSiteAttackOfHelicopterInSector( INT16 sSectorX, INT16 sSectorY
// everyone die die die // everyone die die die
// play sound // play sound
if ( PlayJA2StreamingSampleFromFile( "stsounds\\blah2.wav", RATE_11025, HIGHVOLUME, 1, MIDDLEPAN, HeliCrashSoundStopCallback ) == SOUND_ERROR ) // if ( PlayJA2StreamingSampleFromFile( "stsounds\\blah2.wav", RATE_11025, HIGHVOLUME, 1, MIDDLEPAN, HeliCrashSoundStopCallback ) == SOUND_ERROR )
{ //{
// Destroy here if we cannot play streamed sound sample.... //// Destroy here if we cannot play streamed sound sample....
SkyriderDestroyed( ); // SkyriderDestroyed( );
} //}
else //else
{ //{
// otherwise it's handled in the callback //// otherwise it's handled in the callback
// remove any arrival events for the helicopter's group //// remove any arrival events for the helicopter's group
DeleteStrategicEvent( EVENT_GROUP_ARRIVAL, pVehicleList[ iHelicopterVehicleId ].ubMovementGroup ); //DeleteStrategicEvent( EVENT_GROUP_ARRIVAL, pVehicleList[ iHelicopterVehicleId ].ubMovementGroup );
} //}
// anv - calling SkyriderDestroyed() in callback from playing sound causes sound system to crash, as SkyriderDestroyed causes new sounds (hit battlesnds) to play while blah2 is not removed yet
// + if there's a pause while falling heli sound is played, it's possible to cheat by changing passengers assignments
PlayJA2StreamingSampleFromFile( "stsounds\\blah2.wav", RATE_11025, HIGHVOLUME, 1, MIDDLEPAN, HeliCrashSoundStopCallback );
SkyriderDestroyed( );
// special return code indicating heli was destroyed // special return code indicating heli was destroyed
return( TRUE ); return( TRUE );
@@ -2593,7 +2902,7 @@ void PaySkyriderBill( void)
//CHRISL: This may no longer be the case but I'm not sure of a better way to handle things. //CHRISL: This may no longer be the case but I'm not sure of a better way to handle things.
MoveAllInHelicopterToFootMovementGroup( ); MoveAllInHelicopterToFootMovementGroup( );
MakeHeliReturnToBase(); MakeHeliReturnToBase( HELICOPTER_RETURN_REASON_NONE );
} }
iTotalAccumulatedCostByPlayer = 0; iTotalAccumulatedCostByPlayer = 0;
@@ -2635,7 +2944,7 @@ void PayOffSkyriderDebtIfAny( )
void MakeHeliReturnToBase( void ) void MakeHeliReturnToBase( UINT8 ubReturnReason )
{ {
INT32 iLocation = 0; INT32 iLocation = 0;
@@ -2648,7 +2957,7 @@ void MakeHeliReturnToBase( void )
else else
{ {
// choose destination (closest refueling sector) // choose destination (closest refueling sector)
iLocation = LocationOfNearestRefuelPoint( TRUE ); iLocation = LocationOfNearestRefuelPoint( TRUE, ubReturnReason, pVehicleList[ iHelicopterVehicleId ].sSectorX, pVehicleList[ iHelicopterVehicleId ].sSectorY );
// null out path // null out path
pVehicleList[ iHelicopterVehicleId ].pMercPath = ClearStrategicPathList( pVehicleList[ iHelicopterVehicleId ].pMercPath, pVehicleList[ iHelicopterVehicleId ].ubMovementGroup ); pVehicleList[ iHelicopterVehicleId ].pMercPath = ClearStrategicPathList( pVehicleList[ iHelicopterVehicleId ].pMercPath, pVehicleList[ iHelicopterVehicleId ].ubMovementGroup );
+36 -6
View File
@@ -23,7 +23,7 @@
#define SPIEL_ABOUT_ESTONI_AIRSPACE 26 #define SPIEL_ABOUT_ESTONI_AIRSPACE 26
#define CONFIRM_DESTINATION 27 #define CONFIRM_DESTINATION 27
//#define DESTINATION_TOO_FAR 28 // unused #define DESTINATION_TOO_FAR 28 // unused // anv: used now
#define ALTERNATE_FUEL_SITE 26 #define ALTERNATE_FUEL_SITE 26
#define ARRIVED_IN_HOSTILE_SECTOR 29 #define ARRIVED_IN_HOSTILE_SECTOR 29
#define BELIEVED_ENEMY_SECTOR 30 // may become unused #define BELIEVED_ENEMY_SECTOR 30 // may become unused
@@ -42,6 +42,15 @@
#define HELI_GOING_DOWN 54 #define HELI_GOING_DOWN 54
#define HELI_PATH_THROUGH_ENEMEY_AIRSPACE 55 #define HELI_PATH_THROUGH_ENEMEY_AIRSPACE 55
#define HELI_HOT_DROP 56 #define HELI_HOT_DROP 56
#define HELI_TOO_DAMAGED_TO_FLY 57
// anv: Waldo quotes
#define WALDO_REPAIR_PROPOSITION 22
#define WALDO_SERIOUS_REPAIR_PROPOSITION 23
#define WALDO_COME_BACK_TOMORROW 24
#define WALDO_COME_BACK_IN_SOME_TIME 25
#define WALDO_REPAIR_REFUSED 26
#define WALDO_REPAIR_COMPLETED 27
// drassen airport sector // drassen airport sector
#define AIRPORT_X gModSettings.ubAirportX //13 #define AIRPORT_X gModSettings.ubAirportX //13
@@ -102,10 +111,10 @@ extern BOOLEAN fHelicopterIsAirBorne;
// total distance travelled // total distance travelled
//extern INT32 iTotalHeliDistanceSinceRefuel; extern INT32 iTotalHeliDistanceSinceRefuel;
// total owed to player // total owed to player
//extern INT32 iTotalAccumlatedCostByPlayer; extern INT32 iTotalAccumlatedCostByPlayer;
// whether or not skyrider is alive and well? and on our side yet? // whether or not skyrider is alive and well? and on our side yet?
extern BOOLEAN fSkyRiderAvailable; extern BOOLEAN fSkyRiderAvailable;
@@ -133,6 +142,13 @@ extern BOOLEAN fRefuelingSiteAvailable[ MAX_NUMBER_OF_REFUEL_SITES ];
extern BOOLEAN fRefuelingSiteHidden[ MAX_NUMBER_OF_REFUEL_SITES ]; extern BOOLEAN fRefuelingSiteHidden[ MAX_NUMBER_OF_REFUEL_SITES ];
extern UINT8 gubHelicopterHitsTaken; extern UINT8 gubHelicopterHitsTaken;
extern UINT8 gubHelicopterHoursToRepair;
extern UINT8 gubHelicopterBasicRepairsSoFar;
extern UINT8 gubHelicopterSeriousRepairsSoFar;
extern UINT8 gubHelicopterHoverTime;
extern UINT8 gubHelicopterTimeToFullRefuel;
extern BOOLEAN gfSkyriderSaidCongratsOnTakingSAM; extern BOOLEAN gfSkyriderSaidCongratsOnTakingSAM;
extern UINT8 gubPlayerProgressSkyriderLastCommentedOn; extern UINT8 gubPlayerProgressSkyriderLastCommentedOn;
@@ -145,7 +161,7 @@ extern BOOLEAN fSAMSitesDisabledFromAttackingPlayer;
#endif #endif
/* ARM: Max. fuel range system removed // ARM: Max. fuel range system removed
// add another sector to how far helictoper has travelled // add another sector to how far helictoper has travelled
void AddSectorToHelicopterDistanceTravelled( void ); void AddSectorToHelicopterDistanceTravelled( void );
@@ -161,16 +177,25 @@ INT32 HowFurtherCanHelicopterTravel( void );
// check if this sector is out of the way // check if this sector is out of the way
BOOLEAN IsSectorOutOfTheWay( INT16 sX, INT16 sY ); BOOLEAN IsSectorOutOfTheWay( INT16 sX, INT16 sY );
*/
// how far to nearest refuel point from this sector? // how far to nearest refuel point from this sector?
INT32 DistanceToNearestRefuelPoint( INT16 sX, INT16 sY ); INT32 DistanceToNearestRefuelPoint( INT16 sX, INT16 sY );
// location of closest // location of closest
INT32 LocationOfNearestRefuelPoint( BOOLEAN fNotifyPlayerIfNoSafeLZ ); INT32 LocationOfNearestRefuelPoint( BOOLEAN fNotifyPlayerIfNoSafeLZ, UINT8 ubReturnReason, INT16 sX, INT16 sY );
// refuel helicopter // refuel helicopter
void ReFuelHelicopter( void ); void ReFuelHelicopter( void );
void ReFuelHelicopterForAMinute( void );
void OfferHelicopterRepair( void );
void OfferHelicopterRepairBoxCallBack( UINT8 ubExitValue );
void KickOutPassengersBoxCallBack( UINT8 ubExitValue );
UINT16 CalculateHelicopterRepairCost( BOOLEAN fSeriousRepair );
void StartHelicopterRepair( BOOLEAN fInStrategic, BOOLEAN fCalledByGivingMoney );
void FinishHelicopterRepair();
// how much will it cost for helicopter to travel through this sector? // how much will it cost for helicopter to travel through this sector?
INT32 GetCostOfPassageForHelicopter( INT16 sX, INT16 sY ); INT32 GetCostOfPassageForHelicopter( INT16 sX, INT16 sY );
@@ -211,6 +236,9 @@ void HandleHeliHoverLong( void );
// handle a LONG wait in hover mode // handle a LONG wait in hover mode
void HandleHeliHoverTooLong( void ); void HandleHeliHoverTooLong( void );
// anv: for alternative fuel system
void HandleHeliHoverForAMinute( void );
// start the heli hover time // start the heli hover time
void StartHoverTime( void ); void StartHoverTime( void );
@@ -220,6 +248,8 @@ void DropOffEveryOneInHelicopter( void );
// handle heli entering this sector // handle heli entering this sector
BOOLEAN HandleHeliEnteringSector( INT16 sX, INT16 sY ); BOOLEAN HandleHeliEnteringSector( INT16 sX, INT16 sY );
BOOLEAN CheckIfHelicopterHasEnoughFuelToReturn( INT16 sX, INT16 sY );
// check for arrival at refuel // check for arrival at refuel
BOOLEAN CheckForArrivalAtRefuelPoint( void ); BOOLEAN CheckForArrivalAtRefuelPoint( void );
+55 -14
View File
@@ -53,6 +53,8 @@
#include "Facilities.h" #include "Facilities.h"
#include "MilitiaSquads.h" #include "MilitiaSquads.h"
#include "LaptopSave.h"
UINT16 MAP_GRID_X; UINT16 MAP_GRID_X;
UINT16 MAP_GRID_Y; UINT16 MAP_GRID_Y;
@@ -88,6 +90,7 @@ UINT16 MAP_HELICOPTER_ETA_POPUP_Y;
UINT16 MAP_HELICOPTER_UPPER_ETA_POPUP_Y; UINT16 MAP_HELICOPTER_UPPER_ETA_POPUP_Y;
UINT16 MAP_HELICOPTER_ETA_POPUP_WIDTH; UINT16 MAP_HELICOPTER_ETA_POPUP_WIDTH;
UINT16 MAP_HELICOPTER_ETA_POPUP_HEIGHT; UINT16 MAP_HELICOPTER_ETA_POPUP_HEIGHT;
UINT16 MAP_HELICOPTER_ETA_POPUP_ALTERNATE_HEIGHT;
// sublevel text string position // sublevel text string position
UINT16 MAP_LEVEL_STRING_X; UINT16 MAP_LEVEL_STRING_X;
@@ -413,6 +416,9 @@ UINT32 guiMapBorderEtaPopUp;
// heli pop up // heli pop up
UINT32 guiMapBorderHeliSectors; UINT32 guiMapBorderHeliSectors;
// anv: alternate heli pop up for alternative fuel system
UINT32 guiMapBorderHeliSectorsAlternate;
// list of map sectors that player isn't allowed to even highlight // list of map sectors that player isn't allowed to even highlight
BOOLEAN sBadSectorsList[ WORLD_MAP_X ][ WORLD_MAP_X ]; BOOLEAN sBadSectorsList[ WORLD_MAP_X ][ WORLD_MAP_X ];
@@ -4577,7 +4583,8 @@ void DisplayDistancesForHelicopter( void )
{ {
// calculate the distance travelled, the proposed distance, and total distance one can go // calculate the distance travelled, the proposed distance, and total distance one can go
// display these on screen // display these on screen
INT16 sDistanceToGo = 0;//, sDistanceSoFar = 0, sTotalCanTravel = 0; INT16 sDistanceToGo = 0, sDistanceSoFar = 0, sTotalCanTravel = 0;
INT16 sRemainingFuel = 0, sDistToRefuelSite = 0;
INT16 sX = 0, sY = 0; INT16 sX = 0, sY = 0;
CHAR16 sString[ 32 ]; CHAR16 sString[ 32 ];
HVOBJECT hHandle; HVOBJECT hHandle;
@@ -4591,6 +4598,7 @@ void DisplayDistancesForHelicopter( void )
UINT32 uiTripCost; UINT32 uiTripCost;
if ( GetMouseMapXY( &sMapX, &sMapY ) && !fZoomFlag && ( sMapY >= 13 ) ) if ( GetMouseMapXY( &sMapX, &sMapY ) && !fZoomFlag && ( sMapY >= 13 ) )
{ {
sYPosition = MAP_HELICOPTER_UPPER_ETA_POPUP_Y; sYPosition = MAP_HELICOPTER_UPPER_ETA_POPUP_Y;
@@ -4602,14 +4610,20 @@ void DisplayDistancesForHelicopter( void )
if( ( sOldYPosition != 0 ) && ( sOldYPosition != sYPosition ) ) if( ( sOldYPosition != 0 ) && ( sOldYPosition != sYPosition ) )
{ {
RestoreExternBackgroundRect( MAP_HELICOPTER_ETA_POPUP_X, sOldYPosition, MAP_HELICOPTER_ETA_POPUP_WIDTH + 20, MAP_HELICOPTER_ETA_POPUP_HEIGHT ); if( !gGameExternalOptions.fAlternativeHelicopterFuelSystem )
RestoreExternBackgroundRect( MAP_HELICOPTER_ETA_POPUP_X, sOldYPosition, MAP_HELICOPTER_ETA_POPUP_WIDTH + 20, MAP_HELICOPTER_ETA_POPUP_HEIGHT );
else
RestoreExternBackgroundRect( MAP_HELICOPTER_ETA_POPUP_X, sOldYPosition, MAP_HELICOPTER_ETA_POPUP_WIDTH + 20, MAP_HELICOPTER_ETA_POPUP_ALTERNATE_HEIGHT );
} }
sOldYPosition = sYPosition; sOldYPosition = sYPosition;
// blit in background // blit in background
UINT8 imageIndex = 0; UINT8 imageIndex = 0;
GetVideoObject( &hHandle, guiMapBorderHeliSectors ); if( gGameExternalOptions.fAlternativeHelicopterFuelSystem )
GetVideoObject( &hHandle, guiMapBorderHeliSectorsAlternate );
else
GetVideoObject( &hHandle, guiMapBorderHeliSectors );
if (iResolution >= _640x480 && iResolution < _800x600) if (iResolution >= _640x480 && iResolution < _800x600)
imageIndex = 0; imageIndex = 0;
@@ -4620,14 +4634,16 @@ void DisplayDistancesForHelicopter( void )
BltVideoObject( FRAME_BUFFER, hHandle, imageIndex, MAP_HELICOPTER_ETA_POPUP_X, sYPosition, VO_BLT_SRCTRANSPARENCY, NULL ); BltVideoObject( FRAME_BUFFER, hHandle, imageIndex, MAP_HELICOPTER_ETA_POPUP_X, sYPosition, VO_BLT_SRCTRANSPARENCY, NULL );
// sTotalCanTravel = ( INT16 )GetTotalDistanceHelicopterCanTravel( ); sTotalCanTravel = ( INT16 )GetTotalDistanceHelicopterCanTravel( );
sDistanceToGo = ( INT16 )DistanceOfIntendedHelicopterPath( ); sDistanceToGo = ( INT16 )DistanceOfIntendedHelicopterPath( );
sTotalOfTrip = sDistanceToGo; // + ( INT16 ) ( DistanceToNearestRefuelPoint( ( INT16 )( LastSectorInHelicoptersPath() % MAP_WORLD_X ), ( INT16 ) ( LastSectorInHelicoptersPath() / MAP_WORLD_X ) ) ); sTotalOfTrip = sDistanceToGo; // + ( INT16 ) ( DistanceToNearestRefuelPoint( ( INT16 )( LastSectorInHelicoptersPath() % MAP_WORLD_X ), ( INT16 ) ( LastSectorInHelicoptersPath() / MAP_WORLD_X ) ) );
sNumSafeSectors = GetNumSafeSectorsInPath( ); sNumSafeSectors = GetNumSafeSectorsInPath( );
sNumUnSafeSectors = GetNumUnSafeSectorsInPath( ); sNumUnSafeSectors = GetNumUnSafeSectorsInPath( );
// sDistanceSoFar = ( INT16 )HowFarHelicopterhasTravelledSinceRefueling( ); //sDistanceSoFar = ( INT16 )HowFarHelicopterhasTravelledSinceRefueling( );
// sTotalDistanceOfTrip = ( INT16 )DistanceToNearestRefuelPoint( ) //sTotalDistanceOfTrip = ( INT16 )DistanceToNearestRefuelPoint( );
sRemainingFuel = ( INT16 )(gHelicopterSettings.ubHelicopterDistanceWithoutRefuel - iTotalHeliDistanceSinceRefuel - sDistanceToGo);
sDistToRefuelSite = ( INT16 )DistanceToNearestRefuelPoint( sMapX, sMapY );
if( sDistanceToGo == 9999) if( sDistanceToGo == 9999)
{ {
@@ -4639,7 +4655,7 @@ void DisplayDistancesForHelicopter( void )
SetFontForeground( FONT_LTGREEN ); SetFontForeground( FONT_LTGREEN );
SetFontBackground( FONT_BLACK ); SetFontBackground( FONT_BLACK );
swprintf( sString, L"%s", pHelicopterEtaStrings[ 0 ] ); swprintf( sString, L"%s", pHelicopterEtaStrings[ STR_HELI_ETA_TOTAL_DISTANCE ] );
mprintf( MAP_HELICOPTER_ETA_POPUP_X + 5, sYPosition + 5, sString ); mprintf( MAP_HELICOPTER_ETA_POPUP_X + 5, sYPosition + 5, sString );
/* /*
@@ -4659,21 +4675,21 @@ void DisplayDistancesForHelicopter( void )
SetFontForeground( FONT_LTGREEN ); SetFontForeground( FONT_LTGREEN );
swprintf( sString, L"%s", pHelicopterEtaStrings[ 1 ] ); swprintf( sString, L"%s", pHelicopterEtaStrings[ STR_HELI_ETA_SAFE ] );
mprintf( MAP_HELICOPTER_ETA_POPUP_X + 5, sYPosition + 5 + GetFontHeight( MAP_FONT ), sString ); mprintf( MAP_HELICOPTER_ETA_POPUP_X + 5, sYPosition + 5 + GetFontHeight( MAP_FONT ), sString );
swprintf( sString, L"%d", sNumSafeSectors ); swprintf( sString, L"%d", sNumSafeSectors );
FindFontRightCoordinates( MAP_HELICOPTER_ETA_POPUP_X + 5, ( INT16 ) ( MAP_HELICOPTER_ETA_POPUP_Y + 5 + 2 * GetFontHeight( MAP_FONT ) ), MAP_HELICOPTER_ETA_POPUP_WIDTH, 0, sString, MAP_FONT, &sX, &sY ); FindFontRightCoordinates( MAP_HELICOPTER_ETA_POPUP_X + 5, ( INT16 ) ( MAP_HELICOPTER_ETA_POPUP_Y + 5 + 2 * GetFontHeight( MAP_FONT ) ), MAP_HELICOPTER_ETA_POPUP_WIDTH, 0, sString, MAP_FONT, &sX, &sY );
mprintf( sX, ( INT16 ) ( sYPosition + 5 + GetFontHeight( MAP_FONT ) ), sString ); mprintf( sX, ( INT16 ) ( sYPosition + 5 + GetFontHeight( MAP_FONT ) ), sString );
swprintf( sString, L"%s", pHelicopterEtaStrings[ 2 ] ); swprintf( sString, L"%s", pHelicopterEtaStrings[ STR_HELI_ETA_UNSAFE ] );
mprintf( MAP_HELICOPTER_ETA_POPUP_X + 5, sYPosition + 5 + 2 * GetFontHeight( MAP_FONT ), sString ); mprintf( MAP_HELICOPTER_ETA_POPUP_X + 5, sYPosition + 5 + 2 * GetFontHeight( MAP_FONT ), sString );
swprintf( sString, L"%d", sNumUnSafeSectors ); swprintf( sString, L"%d", sNumUnSafeSectors );
FindFontRightCoordinates( MAP_HELICOPTER_ETA_POPUP_X + 5, ( INT16 ) ( MAP_HELICOPTER_ETA_POPUP_Y + 5 + 2 * GetFontHeight( MAP_FONT ) ), MAP_HELICOPTER_ETA_POPUP_WIDTH, 0, sString, MAP_FONT, &sX, &sY ); FindFontRightCoordinates( MAP_HELICOPTER_ETA_POPUP_X + 5, ( INT16 ) ( MAP_HELICOPTER_ETA_POPUP_Y + 5 + 2 * GetFontHeight( MAP_FONT ) ), MAP_HELICOPTER_ETA_POPUP_WIDTH, 0, sString, MAP_FONT, &sX, &sY );
mprintf( sX, ( INT16 ) ( sYPosition + 5 + 2 * GetFontHeight( MAP_FONT ) ), sString ); mprintf( sX, ( INT16 ) ( sYPosition + 5 + 2 * GetFontHeight( MAP_FONT ) ), sString );
swprintf( sString, L"%s", pHelicopterEtaStrings[ 3 ] ); swprintf( sString, L"%s", pHelicopterEtaStrings[ STR_HELI_ETA_TOTAL_COST ] );
mprintf( MAP_HELICOPTER_ETA_POPUP_X + 5, sYPosition + 5 + 3 * GetFontHeight( MAP_FONT ), sString ); mprintf( MAP_HELICOPTER_ETA_POPUP_X + 5, sYPosition + 5 + 3 * GetFontHeight( MAP_FONT ), sString );
@@ -4683,15 +4699,19 @@ void DisplayDistancesForHelicopter( void )
UINT32 uiCostRed = __max(0,gGameExternalOptions.usHelicopterBaseCostPerRedTile + gsSkyriderCostModifier); UINT32 uiCostRed = __max(0,gGameExternalOptions.usHelicopterBaseCostPerRedTile + gsSkyriderCostModifier);
uiTripCost = ( sNumSafeSectors * uiCostGreen ) + ( sNumUnSafeSectors * uiCostRed ); uiTripCost = ( sNumSafeSectors * uiCostGreen ) + ( sNumUnSafeSectors * uiCostRed );
if( uiTripCost > LaptopSaveInfo.iCurrentBalance )
SetFontForeground( FONT_LTRED );
swprintf( sString, L"%d", uiTripCost ); swprintf( sString, L"%d", uiTripCost );
InsertCommasForDollarFigure( sString ); InsertCommasForDollarFigure( sString );
InsertDollarSignInToString( sString ); InsertDollarSignInToString( sString );
FindFontRightCoordinates( MAP_HELICOPTER_ETA_POPUP_X + 5, ( INT16 ) ( MAP_HELICOPTER_ETA_POPUP_Y + 5 + 3 * GetFontHeight( MAP_FONT ) ), MAP_HELICOPTER_ETA_POPUP_WIDTH, 0, sString, MAP_FONT, &sX, &sY ); FindFontRightCoordinates( MAP_HELICOPTER_ETA_POPUP_X + 5, ( INT16 ) ( MAP_HELICOPTER_ETA_POPUP_Y + 5 + 3 * GetFontHeight( MAP_FONT ) ), MAP_HELICOPTER_ETA_POPUP_WIDTH, 0, sString, MAP_FONT, &sX, &sY );
mprintf( sX, ( INT16 ) ( sYPosition + 5 + 3 * GetFontHeight( MAP_FONT ) ), sString ); mprintf( sX, ( INT16 ) ( sYPosition + 5 + 3 * GetFontHeight( MAP_FONT ) ), sString );
swprintf( sString, L"%s", pHelicopterEtaStrings[ 4 ] ); SetFontForeground( FONT_LTGREEN );
mprintf( MAP_HELICOPTER_ETA_POPUP_X + 5, sYPosition + 5 + 4 * GetFontHeight( MAP_FONT ), sString );
swprintf( sString, L"%s", pHelicopterEtaStrings[ STR_HELI_ETA_ETA ] );
mprintf( MAP_HELICOPTER_ETA_POPUP_X + 5, sYPosition + 5 + 4 * GetFontHeight( MAP_FONT ), sString );
// get travel time for the last path segment // get travel time for the last path segment
iTime = GetPathTravelTimeDuringPlotting( pTempHelicopterPath ); iTime = GetPathTravelTimeDuringPlotting( pTempHelicopterPath );
@@ -4705,13 +4725,34 @@ void DisplayDistancesForHelicopter( void )
// show # of passengers aboard the chopper // show # of passengers aboard the chopper
mprintf( MAP_HELICOPTER_ETA_POPUP_X + 5, sYPosition + 5 + 5 * GetFontHeight( MAP_FONT ), pHelicopterEtaStrings[ 6 ] ); mprintf( MAP_HELICOPTER_ETA_POPUP_X + 5, sYPosition + 5 + 5 * GetFontHeight( MAP_FONT ), pHelicopterEtaStrings[ STR_HELI_ETA_PASSENGERS ] );
swprintf( sString, L"%d", GetNumberOfPassengersInHelicopter() ); swprintf( sString, L"%d", GetNumberOfPassengersInHelicopter() );
FindFontRightCoordinates( MAP_HELICOPTER_ETA_POPUP_X + 5, ( INT16 ) ( MAP_HELICOPTER_ETA_POPUP_Y + 5 + 5 * GetFontHeight( MAP_FONT ) ), MAP_HELICOPTER_ETA_POPUP_WIDTH, 0, sString, MAP_FONT, &sX, &sY ); FindFontRightCoordinates( MAP_HELICOPTER_ETA_POPUP_X + 5, ( INT16 ) ( MAP_HELICOPTER_ETA_POPUP_Y + 5 + 5 * GetFontHeight( MAP_FONT ) ), MAP_HELICOPTER_ETA_POPUP_WIDTH, 0, sString, MAP_FONT, &sX, &sY );
mprintf( sX, ( INT16 ) ( sYPosition + 5 + 5 * GetFontHeight( MAP_FONT ) ), sString ); mprintf( sX, ( INT16 ) ( sYPosition + 5 + 5 * GetFontHeight( MAP_FONT ) ), sString );
// show remaining fuel
mprintf( MAP_HELICOPTER_ETA_POPUP_X + 5, sYPosition + 5 + 6 * GetFontHeight( MAP_FONT ), pHelicopterEtaStrings[ STR_HELI_ETA_REMAINING_FUEL ] );
swprintf( sString, L"%d", sRemainingFuel );
FindFontRightCoordinates( MAP_HELICOPTER_ETA_POPUP_X + 5, ( INT16 ) ( MAP_HELICOPTER_ETA_POPUP_Y + 5 + 6 * GetFontHeight( MAP_FONT ) ), MAP_HELICOPTER_ETA_POPUP_WIDTH, 0, sString, MAP_FONT, &sX, &sY );
if( sRemainingFuel < sDistToRefuelSite )
SetFontForeground( FONT_LTRED );
mprintf( sX, ( INT16 ) ( sYPosition + 5 + 6 * GetFontHeight( MAP_FONT ) ), sString );
SetFontForeground( FONT_LTGREEN );
// show distance to the nearest refuel site
mprintf( MAP_HELICOPTER_ETA_POPUP_X + 5, sYPosition + 5 + 7 * GetFontHeight( MAP_FONT ), pHelicopterEtaStrings[ STR_HELI_ETA_DISTANCE_TO_REFUEL_SITE ] );
swprintf( sString, L"%d", sDistToRefuelSite );
FindFontRightCoordinates( MAP_HELICOPTER_ETA_POPUP_X + 5, ( INT16 ) ( MAP_HELICOPTER_ETA_POPUP_Y + 5 + 7 * GetFontHeight( MAP_FONT ) ), MAP_HELICOPTER_ETA_POPUP_WIDTH, 0, sString, MAP_FONT, &sX, &sY );
if( sRemainingFuel < sDistToRefuelSite )
SetFontForeground( FONT_LTRED );
mprintf( sX, ( INT16 ) ( sYPosition + 5 + 7 * GetFontHeight( MAP_FONT ) ), sString );
SetFontForeground( FONT_LTGREEN );
if( !gGameExternalOptions.fAlternativeHelicopterFuelSystem )
InvalidateRegion( MAP_HELICOPTER_ETA_POPUP_X, sOldYPosition, MAP_HELICOPTER_ETA_POPUP_X + MAP_HELICOPTER_ETA_POPUP_WIDTH + 20, sOldYPosition + MAP_HELICOPTER_ETA_POPUP_HEIGHT );
else
InvalidateRegion( MAP_HELICOPTER_ETA_POPUP_X, sOldYPosition, MAP_HELICOPTER_ETA_POPUP_X + MAP_HELICOPTER_ETA_POPUP_WIDTH + 20, sOldYPosition + MAP_HELICOPTER_ETA_POPUP_ALTERNATE_HEIGHT );
InvalidateRegion( MAP_HELICOPTER_ETA_POPUP_X, sOldYPosition, MAP_HELICOPTER_ETA_POPUP_X + MAP_HELICOPTER_ETA_POPUP_WIDTH + 20, sOldYPosition + MAP_HELICOPTER_ETA_POPUP_HEIGHT );
return; return;
} }
+4
View File
@@ -218,6 +218,7 @@ extern UINT16 MAP_HELICOPTER_ETA_POPUP_Y;
extern UINT16 MAP_HELICOPTER_UPPER_ETA_POPUP_Y; extern UINT16 MAP_HELICOPTER_UPPER_ETA_POPUP_Y;
extern UINT16 MAP_HELICOPTER_ETA_POPUP_WIDTH; extern UINT16 MAP_HELICOPTER_ETA_POPUP_WIDTH;
extern UINT16 MAP_HELICOPTER_ETA_POPUP_HEIGHT; extern UINT16 MAP_HELICOPTER_ETA_POPUP_HEIGHT;
extern UINT16 MAP_HELICOPTER_ETA_POPUP_ALTERNATE_HEIGHT;
// sublevel text string position // sublevel text string position
extern UINT16 MAP_LEVEL_STRING_X; extern UINT16 MAP_LEVEL_STRING_X;
@@ -326,6 +327,9 @@ extern UINT32 guiMapBorderEtaPopUp;
// heli pop up // heli pop up
extern UINT32 guiMapBorderHeliSectors; extern UINT32 guiMapBorderHeliSectors;
// anv: alternate heli pop up for alternative fuel system
extern UINT32 guiMapBorderHeliSectorsAlternate;
// the currently selected town militia // the currently selected town militia
extern INT16 sSelectedMilitiaTown; extern INT16 sSelectedMilitiaTown;
+40
View File
@@ -49,6 +49,9 @@
#include "Luaglobal.h" #include "Luaglobal.h"
// anv: Waldo The Mechanic - for fact checking with helicopter
#include "Vehicles.h"
#define TESTQUESTS #define TESTQUESTS
extern SOLDIERTYPE * gpSrcSoldier; extern SOLDIERTYPE * gpSrcSoldier;
@@ -1307,6 +1310,43 @@ BOOLEAN CheckFact( UINT16 usFact, UINT8 ubProfileID )
gubFact[usFact] = ; gubFact[usFact] = ;
break; break;
*/ */
// anv: facts for checking if Waldo can repair helicopter
case FACT_HELI_DAMAGED_CAN_START_REPAIR:
gubFact[usFact] = ( gGameExternalOptions.fWaldoCanRepairHelicopter &&
!fHelicopterDestroyed && !fHelicopterIsAirBorne && gubHelicopterHitsTaken == 1 &&
pVehicleList[ iHelicopterVehicleId ].sSectorX == gMercProfiles[ WALDO ].sSectorX && pVehicleList[ iHelicopterVehicleId ].sSectorY == gMercProfiles[ WALDO ].sSectorY &&
LaptopSaveInfo.iCurrentBalance >= CalculateHelicopterRepairCost( FALSE ) &&
gubHelicopterHoursToRepair == 0 && CheckFact( FACT_WALDO_MET, 0 ) );
break;
case FACT_HELI_SERIOUSLY_DAMAGED_CAN_START_REPAIR:
gubFact[usFact] = ( gGameExternalOptions.fWaldoCanRepairHelicopter &&
!fHelicopterDestroyed && !fHelicopterIsAirBorne && gubHelicopterHitsTaken == 2 &&
pVehicleList[ iHelicopterVehicleId ].sSectorX == gMercProfiles[ WALDO ].sSectorX && pVehicleList[ iHelicopterVehicleId ].sSectorY == gMercProfiles[ WALDO ].sSectorY &&
LaptopSaveInfo.iCurrentBalance >= CalculateHelicopterRepairCost( TRUE ) &&
gubHelicopterHoursToRepair == 0 && CheckFact( FACT_WALDO_MET, 0 ) );
break;
case FACT_HELI_GIVEN_MONEY_CAN_START_REPAIR:
gubFact[usFact] = ( ( gGameExternalOptions.fWaldoCanRepairHelicopter &&
!fHelicopterDestroyed && !fHelicopterIsAirBorne && gubHelicopterHitsTaken > 0 &&
pVehicleList[ iHelicopterVehicleId ].sSectorX == gMercProfiles[ WALDO ].sSectorX && pVehicleList[ iHelicopterVehicleId ].sSectorY == gMercProfiles[ WALDO ].sSectorY &&
gubHelicopterHoursToRepair == 0 ) &&
( CheckFact(FACT_GIVEN_ENOUGH_TO_REPAIR_HELI, 0) || CheckFact(FACT_GIVEN_ENOUGH_TO_SERIOUSLY_REPAIR_HELI, 0) ) && CheckFact( FACT_WALDO_MET, 0 ) );
break;
case FACT_HELI_CANT_START_REPAIR:
gubFact[usFact] = ( !CheckFact(FACT_HELI_GIVEN_MONEY_CAN_START_REPAIR, 0) && !CheckFact(FACT_HELICOPTER_IN_PERFECT_CONDITION, 0));
break;
case FACT_HELICOPTER_IN_PERFECT_CONDITION:
gubFact[usFact] = ( gubHelicopterHitsTaken == 0 );
break;
case FACT_HELICOPTER_LOST:
gubFact[usFact] = fHelicopterDestroyed;
break;
default: default:
break; break;
+20
View File
@@ -331,9 +331,15 @@ enum Facts
FACT_PABLO_WONT_STEAL = 124, FACT_PABLO_WONT_STEAL = 124,
FACT_AGENTS_PREVENTED_SHIPMENT,// 125 FACT_AGENTS_PREVENTED_SHIPMENT,// 125
// anv: it was 126 in Waldo script
FACT_HELICOPTER_IN_PERFECT_CONDITION = 126,
FACT_LARGE_AMOUNT_OF_MONEY = 127, FACT_LARGE_AMOUNT_OF_MONEY = 127,
FACT_SMALL_AMOUNT_OF_MONEY,// 128 FACT_SMALL_AMOUNT_OF_MONEY,// 128
// anv: it was 130 in Waldo script
FACT_HELICOPTER_LOST = 130,
FACT_LOYALTY_OKAY = 135, FACT_LOYALTY_OKAY = 135,
FACT_LOYALTY_LOW,// 136 FACT_LOYALTY_LOW,// 136
FACT_LOYALTY_HIGH,// 137 FACT_LOYALTY_HIGH,// 137
@@ -530,6 +536,20 @@ enum Facts
FACT_PLAYER_KILLED_BOXERS = 368, FACT_PLAYER_KILLED_BOXERS = 368,
// HEADROCK HAM 4: Seen Mobile Militia screen after having at least one mobile unit? // HEADROCK HAM 4: Seen Mobile Militia screen after having at least one mobile unit?
FACT_MOBILE_RESTRICTIONS_VIEWED = 369, FACT_MOBILE_RESTRICTIONS_VIEWED = 369,
// anv: Waldo The Mechanic, facts for his dialogue
FACT_HELI_DAMAGED_CAN_START_REPAIR,
FACT_HELI_SERIOUSLY_DAMAGED_CAN_START_REPAIR,
FACT_GIVEN_ENOUGH_TO_REPAIR_HELI,
FACT_GIVEN_ENOUGH_TO_SERIOUSLY_REPAIR_HELI,
FACT_HELI_GIVEN_MONEY_CAN_START_REPAIR,
FACT_HELI_CANT_START_REPAIR,
FACT_WALDO_MET,
#ifdef JA2UB #ifdef JA2UB
//Ja25 UB //Ja25 UB
FACT_IMPORTED_SAVE_AND_MARY_WAS_DEAD = 400, FACT_IMPORTED_SAVE_AND_MARY_WAS_DEAD = 400,
+27 -5
View File
@@ -4617,6 +4617,7 @@ UINT32 MapScreenHandle(void)
MAP_HELICOPTER_UPPER_ETA_POPUP_Y = (50 + iScreenHeightOffset) - yResOffset; MAP_HELICOPTER_UPPER_ETA_POPUP_Y = (50 + iScreenHeightOffset) - yResOffset;
MAP_HELICOPTER_ETA_POPUP_WIDTH = 120; MAP_HELICOPTER_ETA_POPUP_WIDTH = 120;
MAP_HELICOPTER_ETA_POPUP_HEIGHT = 68; MAP_HELICOPTER_ETA_POPUP_HEIGHT = 68;
MAP_HELICOPTER_ETA_POPUP_ALTERNATE_HEIGHT = 74;
// Map Level string // Map Level string
MAP_LEVEL_STRING_X = (SCREEN_WIDTH - 208); MAP_LEVEL_STRING_X = (SCREEN_WIDTH - 208);
@@ -4669,6 +4670,7 @@ UINT32 MapScreenHandle(void)
MAP_HELICOPTER_UPPER_ETA_POPUP_Y = (50 + iScreenHeightOffset - 40) - yResOffset; MAP_HELICOPTER_UPPER_ETA_POPUP_Y = (50 + iScreenHeightOffset - 40) - yResOffset;
MAP_HELICOPTER_ETA_POPUP_WIDTH = 120; MAP_HELICOPTER_ETA_POPUP_WIDTH = 120;
MAP_HELICOPTER_ETA_POPUP_HEIGHT = 68; MAP_HELICOPTER_ETA_POPUP_HEIGHT = 68;
MAP_HELICOPTER_ETA_POPUP_ALTERNATE_HEIGHT = 74;
// Map Level string // Map Level string
MAP_LEVEL_STRING_X = (SCREEN_WIDTH - 800)/ 2 + (800 - 208 - 80); MAP_LEVEL_STRING_X = (SCREEN_WIDTH - 800)/ 2 + (800 - 208 - 80);
@@ -4720,6 +4722,7 @@ UINT32 MapScreenHandle(void)
MAP_HELICOPTER_UPPER_ETA_POPUP_Y = (50 + iScreenHeightOffset - 100) - yResOffset; MAP_HELICOPTER_UPPER_ETA_POPUP_Y = (50 + iScreenHeightOffset - 100) - yResOffset;
MAP_HELICOPTER_ETA_POPUP_WIDTH = 120; MAP_HELICOPTER_ETA_POPUP_WIDTH = 120;
MAP_HELICOPTER_ETA_POPUP_HEIGHT = 76; MAP_HELICOPTER_ETA_POPUP_HEIGHT = 76;
MAP_HELICOPTER_ETA_POPUP_ALTERNATE_HEIGHT = 97;
// Map Level string // Map Level string
MAP_LEVEL_STRING_X = (SCREEN_WIDTH - 1024)/ 2 + (1024 - 208 - 187); MAP_LEVEL_STRING_X = (SCREEN_WIDTH - 1024)/ 2 + (1024 - 208 - 187);
@@ -4958,6 +4961,9 @@ UINT32 MapScreenHandle(void)
FilenameForBPP("INTERFACE\\pos2.sti", VObjectDesc.ImageFile); FilenameForBPP("INTERFACE\\pos2.sti", VObjectDesc.ImageFile);
CHECKF(AddVideoObject(&VObjectDesc, &guiMapBorderHeliSectors)); CHECKF(AddVideoObject(&VObjectDesc, &guiMapBorderHeliSectors));
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
FilenameForBPP("INTERFACE\\pos2_alternate.sti", VObjectDesc.ImageFile);
CHECKF(AddVideoObject(&VObjectDesc, &guiMapBorderHeliSectorsAlternate));
VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE; VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE;
FilenameForBPP("INTERFACE\\secondary_gun_hidden.sti", VObjectDesc.ImageFile); FilenameForBPP("INTERFACE\\secondary_gun_hidden.sti", VObjectDesc.ImageFile);
@@ -6407,7 +6413,7 @@ UINT32 HandleMapUI( )
// plotting for the chopper? // plotting for the chopper?
if( fPlotForHelicopter == TRUE ) if( fPlotForHelicopter == TRUE )
{ {
/*
if( IsSectorOutOfTheWay( sMapX, sMapY ) == TRUE ) if( IsSectorOutOfTheWay( sMapX, sMapY ) == TRUE )
{ {
if( gfAllowSkyriderTooFarQuote == TRUE ) if( gfAllowSkyriderTooFarQuote == TRUE )
@@ -6417,7 +6423,7 @@ UINT32 HandleMapUI( )
return( MAP_SCREEN ); return( MAP_SCREEN );
} }
*/
PlotPathForHelicopter( sMapX, sMapY ); PlotPathForHelicopter( sMapX, sMapY );
fTeamPanelDirty = TRUE; fTeamPanelDirty = TRUE;
@@ -8546,6 +8552,7 @@ INT32 iCounter2 = 0;
DeleteVideoObjectFromIndex( guiSecItemHiddenVO ); DeleteVideoObjectFromIndex( guiSecItemHiddenVO );
DeleteVideoObjectFromIndex( guiSelectedCharArrow ); DeleteVideoObjectFromIndex( guiSelectedCharArrow );
DeleteVideoObjectFromIndex( guiMapBorderHeliSectors ); DeleteVideoObjectFromIndex( guiMapBorderHeliSectors );
DeleteVideoObjectFromIndex( guiMapBorderHeliSectorsAlternate );
DeleteVideoObjectFromIndex( guiHelicopterIcon ); DeleteVideoObjectFromIndex( guiHelicopterIcon );
DeleteVideoObjectFromIndex( guiMINEICON ); DeleteVideoObjectFromIndex( guiMINEICON );
DeleteVideoObjectFromIndex( guiSectorLocatorGraphicID ); DeleteVideoObjectFromIndex( guiSectorLocatorGraphicID );
@@ -13322,6 +13329,7 @@ INT32 iCounter2 = 0;
DeleteVideoObjectFromIndex( guiSecItemHiddenVO ); DeleteVideoObjectFromIndex( guiSecItemHiddenVO );
DeleteVideoObjectFromIndex( guiSelectedCharArrow ); DeleteVideoObjectFromIndex( guiSelectedCharArrow );
DeleteVideoObjectFromIndex( guiMapBorderHeliSectors ); DeleteVideoObjectFromIndex( guiMapBorderHeliSectors );
DeleteVideoObjectFromIndex( guiMapBorderHeliSectorsAlternate );
DeleteVideoObjectFromIndex( guiHelicopterIcon ); DeleteVideoObjectFromIndex( guiHelicopterIcon );
DeleteVideoObjectFromIndex( guiMINEICON ); DeleteVideoObjectFromIndex( guiMINEICON );
DeleteVideoObjectFromIndex( guiSectorLocatorGraphicID ); DeleteVideoObjectFromIndex( guiSectorLocatorGraphicID );
@@ -15217,6 +15225,20 @@ void ExplainWhySkyriderCantFly( void )
return; return;
} }
// repairs in progress
if ( gubHelicopterHoursToRepair > 0 )
{
DoMapMessageBox( MSG_BOX_BASIC_STYLE, pHelicopterRepairRefuelStrings[ STR_HELI_RR_REPAIR_IN_PROGRESS ], MAP_SCREEN, MSG_BOX_FLAG_OK, MapScreenDefaultOkBoxCallback );
return;
}
// anv - helicopter too damaged?
if ( gGameExternalOptions.fSeriouslyDamagedSkyriderWontFly == TRUE && gubHelicopterHitsTaken > 1 )
{
SkyRiderTalk( HELI_TOO_DAMAGED_TO_FLY );
return;
}
// no explainable reason // no explainable reason
} }
@@ -15511,11 +15533,11 @@ BOOLEAN CanMoveBullseyeAndClickedOnIt( INT16 sMapX, INT16 sMapY )
void CreateBullsEyeOrChopperSelectionPopup( void ) void CreateBullsEyeOrChopperSelectionPopup( void )
{ {
wcscpy( gzUserDefinedButton1, pHelicopterEtaStrings[ 8 ] ); wcscpy( gzUserDefinedButton1, pHelicopterEtaStrings[ STR_HELI_ETA_SKYRIDER ] );
wcscpy( gzUserDefinedButton2, pHelicopterEtaStrings[ 9 ] ); wcscpy( gzUserDefinedButton2, pHelicopterEtaStrings[ STR_HELI_ETA_ARRIVALS ] );
// do a BULLSEYE/CHOPPER message box // do a BULLSEYE/CHOPPER message box
DoScreenIndependantMessageBox( pHelicopterEtaStrings[ 7 ], MSG_BOX_FLAG_GENERIC_TWO_BUTTONS, BullsEyeOrChopperSelectionPopupCallback ); DoScreenIndependantMessageBox( pHelicopterEtaStrings[ STR_HELI_ETA_SELECT_SKYRIDER_OR_ARRIVALS ], MSG_BOX_FLAG_GENERIC_TWO_BUTTONS, BullsEyeOrChopperSelectionPopupCallback );
} }
+3 -2
View File
@@ -1716,14 +1716,15 @@ void StartEnemyTaunt( SOLDIERTYPE *pCiv, TAUNTTYPE iTauntType, SOLDIERTYPE *pTar
if( pTarget != NULL ) if( pTarget != NULL )
{ {
#ifdef ENABLE_ZOMBIES
// target should be zombie // target should be zombie
if( zTaunt[ i ].uiFlags2 & TAUNT_T_ZOMBIE ) if( zTaunt[ i ].uiFlags2 & TAUNT_T_ZOMBIE )
{ {
// anv: moved ifdef - if zombies are off, we want to skip any taunts with TAUNT_T_ZOMBIE flag
#ifdef ENABLE_ZOMBIES
if( pTarget->IsZombie() == FALSE ) if( pTarget->IsZombie() == FALSE )
#endif
continue; continue;
} }
#endif
// target merc profile // target merc profile
if( zTaunt[ i ].value[TAUNT_TARGET_MERC_PROFILE] != -1 ) if( zTaunt[ i ].value[TAUNT_TARGET_MERC_PROFILE] != -1 )
+25
View File
@@ -70,6 +70,8 @@
#include "ub_config.h" #include "ub_config.h"
#include "history.h"
//forward declarations of common classes to eliminate includes //forward declarations of common classes to eliminate includes
class OBJECTTYPE; class OBJECTTYPE;
class SOLDIERTYPE; class SOLDIERTYPE;
@@ -354,6 +356,8 @@ void InitalizeStaticExternalNPCFaces( void )
//} //}
// ... put Skyrider's face at index 0 // ... put Skyrider's face at index 0
uiExternalStaticNPCFaces.push_back(( UINT32 )InitFace( ( UINT8 )( SKYRIDER ), NOBODY, FACE_FORCE_SMALL )); uiExternalStaticNPCFaces.push_back(( UINT32 )InitFace( ( UINT8 )( SKYRIDER ), NOBODY, FACE_FORCE_SMALL ));
// anv: and put Waldo too
uiExternalStaticNPCFaces.push_back(( UINT32 )InitFace( ( UINT8 )( WALDO ), NOBODY, FACE_FORCE_SMALL ));
return; return;
} }
@@ -2682,6 +2686,21 @@ void HandleDialogueEnd( FACETYPE *pFace )
MSYS_RemoveRegion( &gTextBoxMouseRegion ); MSYS_RemoveRegion( &gTextBoxMouseRegion );
fTextBoxMouseRegionCreated = FALSE; fTextBoxMouseRegionCreated = FALSE;
} }
// anv: show repair prompt afer Waldo offered repairs
if ( gbUIHandlerID == DIALOGUE_EXTERNAL_NPC_UI && gTacticalStatus.ubLastQuoteProfileNUm == WALDO &&
( gTacticalStatus.ubLastQuoteSaid == WALDO_REPAIR_PROPOSITION || gTacticalStatus.ubLastQuoteSaid == WALDO_SERIOUS_REPAIR_PROPOSITION ) )
{
CHAR16 sHelicopterRepairPromptText[ 320 ];
if( CheckFact(FACT_HELI_DAMAGED_CAN_START_REPAIR, 0) == TRUE )
{
swprintf( sHelicopterRepairPromptText, pHelicopterRepairRefuelStrings[ STR_HELI_RR_REPAIR_PROMPT ], gMercProfiles[ WALDO ].zNickname, CalculateHelicopterRepairCost( FALSE ), gHelicopterSettings.ubHelicopterBasicRepairTime );
}
else
{
swprintf( sHelicopterRepairPromptText, pHelicopterRepairRefuelStrings[ STR_HELI_RR_REPAIR_PROMPT ], gMercProfiles[ WALDO ].zNickname, CalculateHelicopterRepairCost( TRUE ), gHelicopterSettings.ubHelicopterSeriousRepairTime );
}
DoMessageBox( MSG_BOX_BASIC_STYLE, sHelicopterRepairPromptText, guiCurrentScreen, ( UINT8 )MSG_BOX_FLAG_YESNO, OfferHelicopterRepairBoxCallBack, NULL );
}
// anv: after merc finishes his quote, we want enemy to answer // anv: after merc finishes his quote, we want enemy to answer
if ( gbUIHandlerID == DIALOGUE_TACTICAL_UI ) if ( gbUIHandlerID == DIALOGUE_TACTICAL_UI )
@@ -2720,6 +2739,12 @@ void HandleDialogueEnd( FACETYPE *pFace )
case DIALOGUE_NPC_UI: case DIALOGUE_NPC_UI:
// anv: "meet" Waldo when speaking with him first time
if ( gTacticalStatus.ubLastQuoteProfileNUm == WALDO && CheckFact( FACT_WALDO_MET, 0 ) == FALSE && gTacticalStatus.ubLastQuoteSaid == 0 )
{
AddHistoryToPlayersLog( HISTORY_WALDO, 0, GetWorldTotalMin(), gWorldSectorX, gWorldSectorY );
SetFactTrue( FACT_WALDO_MET );
}
// Remove region // Remove region
if ( gTalkPanel.fTextRegionOn ) if ( gTalkPanel.fTextRegionOn )
+1
View File
@@ -287,6 +287,7 @@ enum{
enum{ enum{
SKYRIDER_EXTERNAL_FACE =0, SKYRIDER_EXTERNAL_FACE =0,
WALDO_EXTERNAL_FACE,
//MINER_FRED_EXTERNAL_FACE, //MINER_FRED_EXTERNAL_FACE,
//MINER_MATT_EXTERNAL_FACE, //MINER_MATT_EXTERNAL_FACE,
//MINER_OSWALD_EXTERNAL_FACE, //MINER_OSWALD_EXTERNAL_FACE,
+29
View File
@@ -2402,6 +2402,7 @@ void HandleNPCDoAction( UINT8 ubTargetNPC, UINT16 usActionCode, UINT8 ubQuoteNum
case NPC_ACTION_MEDICAL_REQUESTOR_2: // at hospital case NPC_ACTION_MEDICAL_REQUESTOR_2: // at hospital
case NPC_ACTION_BUY_VEHICLE_REQUESTOR: // from Dave case NPC_ACTION_BUY_VEHICLE_REQUESTOR: // from Dave
case NPC_ACTION_KROTT_REQUESTOR: case NPC_ACTION_KROTT_REQUESTOR:
case NPC_ACTION_WALDO_REPAIR_REQUESTOR:
// Vince or Willis asks about payment? for medical attention // Vince or Willis asks about payment? for medical attention
if (ubTargetNPC != gpDestSoldier->ubProfile) if (ubTargetNPC != gpDestSoldier->ubProfile)
{ {
@@ -4478,6 +4479,11 @@ void HandleNPCDoAction( UINT8 ubTargetNPC, UINT16 usActionCode, UINT8 ubQuoteNum
// } // }
break; break;
case NPC_ACTION_WALDO_START_REPAIRS:
// it's called after giving him money
StartHelicopterRepair( FALSE, TRUE );
break;
default: default:
ScreenMsg( FONT_MCOLOR_RED, MSG_TESTVERSION, L"No code support for NPC action %d", usActionCode ); ScreenMsg( FONT_MCOLOR_RED, MSG_TESTVERSION, L"No code support for NPC action %d", usActionCode );
break; break;
@@ -4670,6 +4676,19 @@ void StartDialogueMessageBox( UINT8 ubProfileID, UINT16 usMessageBoxType )
swprintf( zTemp, TacticalStr[ SPARE_KROTT_PROMPT ], gMercProfiles[ubProfileID].zNickname ); swprintf( zTemp, TacticalStr[ SPARE_KROTT_PROMPT ], gMercProfiles[ubProfileID].zNickname );
DoMessageBox( MSG_BOX_BASIC_STYLE, zTemp, GAME_SCREEN, ( UINT8 )MSG_BOX_FLAG_YESNO, DialogueMessageBoxCallBack, NULL ); DoMessageBox( MSG_BOX_BASIC_STYLE, zTemp, GAME_SCREEN, ( UINT8 )MSG_BOX_FLAG_YESNO, DialogueMessageBoxCallBack, NULL );
break; break;
// anv: Waldo The Mechanic
case NPC_ACTION_WALDO_REPAIR_REQUESTOR:
swprintf( zTemp, TacticalStr[ STR_HELI_RR_REPAIR_PROMPT ], gMercProfiles[ubProfileID].zNickname );
if( CheckFact(FACT_HELI_DAMAGED_CAN_START_REPAIR, 0) == TRUE )
{
swprintf( zTemp, pHelicopterRepairRefuelStrings[ STR_HELI_RR_REPAIR_PROMPT ], gMercProfiles[ WALDO ].zNickname, CalculateHelicopterRepairCost( FALSE ), gHelicopterSettings.ubHelicopterBasicRepairTime);
}
else
{
swprintf( zTemp, pHelicopterRepairRefuelStrings[ STR_HELI_RR_REPAIR_PROMPT ], gMercProfiles[ WALDO ].zNickname, CalculateHelicopterRepairCost( TRUE ), gHelicopterSettings.ubHelicopterSeriousRepairTime );
}
DoMessageBox( MSG_BOX_BASIC_STYLE, zTemp, GAME_SCREEN, ( UINT8 )MSG_BOX_FLAG_YESNO, DialogueMessageBoxCallBack, NULL );
break;
default: default:
break; break;
} }
@@ -4953,6 +4972,16 @@ void DialogueMessageBoxCallBack( UINT8 ubExitValue )
TriggerNPCRecord( SERGEANT, 6 ); TriggerNPCRecord( SERGEANT, 6 );
} }
break; break;
case NPC_ACTION_WALDO_REPAIR_REQUESTOR:
if ( ubExitValue == MSG_BOX_RETURN_YES )
{
StartHelicopterRepair( FALSE, FALSE );
}
else
{
TriggerNPCRecord( WALDO, 17 );
}
break;
case NPC_ACTION_TRIGGER_MARRY_DARYL_PROMPT: case NPC_ACTION_TRIGGER_MARRY_DARYL_PROMPT:
gMercProfiles[ gpSrcSoldier->ubProfile ].ubMiscFlags2 |= PROFILE_MISC_FLAG2_ASKED_BY_HICKS; gMercProfiles[ gpSrcSoldier->ubProfile ].ubMiscFlags2 |= PROFILE_MISC_FLAG2_ASKED_BY_HICKS;
if ( ubExitValue == MSG_BOX_RETURN_YES ) if ( ubExitValue == MSG_BOX_RETURN_YES )
+4 -4
View File
@@ -1055,10 +1055,10 @@ void HourlyMoraleUpdate( void )
{ {
// skip past ourselves and all inactive mercs // skip past ourselves and all inactive mercs
if (bOtherID != bMercID && pOtherSoldier->bActive && pOtherSoldier->ubProfile != NO_PROFILE && if (bOtherID != bMercID && pOtherSoldier->bActive && pOtherSoldier->ubProfile != NO_PROFILE &&
!(pOtherSoldier->bAssignment == IN_TRANSIT || !(pOtherSoldier->bAssignment == IN_TRANSIT ||
pOtherSoldier->flags.fMercAsleep == TRUE || pOtherSoldier->flags.fMercAsleep == TRUE ||
pOtherSoldier->bAssignment == ASSIGNMENT_DEAD || pOtherSoldier->bAssignment == ASSIGNMENT_DEAD ||
pOtherSoldier->bAssignment == ASSIGNMENT_POW)) pOtherSoldier->bAssignment == ASSIGNMENT_POW))
{ {
if (fSameGroupOnly) if (fSameGroupOnly)
{ {
+27
View File
@@ -1380,7 +1380,34 @@ BOOLEAN KillAllInVehicle( INT32 iId )
} }
} }
} }
return ( TRUE );
}
// anv: for hurting heli passengers on SAM attack
BOOLEAN HurtPassengersInHelicopter( INT32 iId )
{
INT32 iCounter = 0;
// find if vehicle is valid
if( VehicleIdIsValid( iId ) == FALSE )
{
return ( FALSE );
}
// go through list of occupants and hurt them
for( iCounter = 0; iCounter < gNewVehicle[ pVehicleList[ iId ].ubVehicleType ].iNewSeatingCapacities; iCounter++ )
{
if( pVehicleList[ iId ].pPassengers[ iCounter ] != NULL )
{
if( PreRandom(100) < gHelicopterSettings.ubHelicopterPassengerHitChance )
{
if( InjurePersonInVehicle( iId , pVehicleList[ iId ].pPassengers[ iCounter ],
gHelicopterSettings.ubHelicopterPassengerHitMinDamage + PreRandom( gHelicopterSettings.ubHelicopterPassengerHitMaxDamage - gHelicopterSettings.ubHelicopterPassengerHitMinDamage ) ) == FALSE )
{
return( FALSE );
}
}
}
}
return ( TRUE ); return ( TRUE );
} }
+3
View File
@@ -355,6 +355,9 @@ BOOLEAN KillPersonInVehicle( INT32 iId, SOLDIERTYPE *pSoldier );
// kill everyone in vehicle // kill everyone in vehicle
BOOLEAN KillAllInVehicle( INT32 iId ); BOOLEAN KillAllInVehicle( INT32 iId );
// anv: for hurting heli passengers on SAM attack
BOOLEAN HurtPassengersInHelicopter( INT32 iId );
#ifdef JA2TESTVERSION #ifdef JA2TESTVERSION
// test vehicle stuff // test vehicle stuff
void VehicleTest( void ); void VehicleTest( void );
+4
View File
@@ -205,6 +205,7 @@ enum
NPC_ACTION_REMOVE_DOREEN, NPC_ACTION_REMOVE_DOREEN,
NPC_ACTION_RESET_SHIPMENT_ARRIVAL_STUFF, NPC_ACTION_RESET_SHIPMENT_ARRIVAL_STUFF,
// 153 Fix helicopter by next morning? // 153 Fix helicopter by next morning?
NPC_ACTION_WALDO_START_REPAIRS = 153,// anv: added this
NPC_ACTION_DECIDE_ACTIVE_TERRORISTS = 154, NPC_ACTION_DECIDE_ACTIVE_TERRORISTS = 154,
NPC_ACTION_TRIGGER_FATHER_18_20_OR_15, NPC_ACTION_TRIGGER_FATHER_18_20_OR_15,
NPC_ACTION_CHECK_LAST_TERRORIST_HEAD, NPC_ACTION_CHECK_LAST_TERRORIST_HEAD,
@@ -369,6 +370,9 @@ enum
NPC_ACTION_SEND_WEIGHTED_ASSAULT_TO_LOCATION, // 1st optional parm is "direness: rating NPC_ACTION_SEND_WEIGHTED_ASSAULT_TO_LOCATION, // 1st optional parm is "direness: rating
NPC_ACTION_SEND_SPECIFIC_ASSAULT_TO_LOCATION, // 1st option parm is # of soldiers to send, 2nd is composition NPC_ACTION_SEND_SPECIFIC_ASSAULT_TO_LOCATION, // 1st option parm is # of soldiers to send, 2nd is composition
// anv: Waldo The Mechanic
NPC_ACTION_WALDO_REPAIR_REQUESTOR,
NPC_ACTION_TURN_TO_FACE_NEAREST_MERC = 500, NPC_ACTION_TURN_TO_FACE_NEAREST_MERC = 500,
NPC_ACTION_TURN_TO_FACE_PROFILE_ID_0, NPC_ACTION_TURN_TO_FACE_PROFILE_ID_0,
+26 -1
View File
@@ -52,6 +52,8 @@
#include "Soldier Profile.h" #include "Soldier Profile.h"
#include "BriefingRoom_Data.h" #include "BriefingRoom_Data.h"
#include "Map Screen Helicopter.h"
#ifdef JA2UB #ifdef JA2UB
#include "Ja25_Tactical.h" #include "Ja25_Tactical.h"
@@ -1194,7 +1196,16 @@ UINT8 NPCConsiderReceivingItemFromMerc( UINT8 ubNPC, UINT8 ubMerc, OBJECTTYPE *
{ {
SetFactTrue( FACT_LARGE_AMOUNT_OF_MONEY ); SetFactTrue( FACT_LARGE_AMOUNT_OF_MONEY );
} }
usItemToConsider = MONEY;
// anv: Waldo!
if ((*pObj)[0]->data.money.uiMoneyAmount >= CalculateHelicopterRepairCost( FALSE ) )
{
SetFactTrue( FACT_GIVEN_ENOUGH_TO_REPAIR_HELI );
}
if ((*pObj)[0]->data.money.uiMoneyAmount >= CalculateHelicopterRepairCost( TRUE ) )
{
SetFactTrue( FACT_GIVEN_ENOUGH_TO_SERIOUSLY_REPAIR_HELI );
}
break; break;
case WINE: case WINE:
case BEER: case BEER:
@@ -3461,6 +3472,20 @@ BOOLEAN LoadNPCInfoFromSavedGameFile( HWFILE hFile, UINT32 uiSaveGameVersion )
RefreshNPCScriptRecord( SKYRIDER, 22 ); RefreshNPCScriptRecord( SKYRIDER, 22 );
} }
// anv:
if ( uiSaveGameVersion < WALDO_CAN_REPAIR_HELICOPTER )
{
RefreshNPCScriptRecord( WALDO, 5 );
RefreshNPCScriptRecord( WALDO, 6 );
RefreshNPCScriptRecord( WALDO, 7 );
RefreshNPCScriptRecord( WALDO, 13 );
RefreshNPCScriptRecord( WALDO, 14 );
RefreshNPCScriptRecord( WALDO, 15 );
RefreshNPCScriptRecord( WALDO, 16 );
RefreshNPCScriptRecord( WALDO, 17 );
RefreshNPCScriptRecord( WALDO, 18 );
}
return( TRUE ); return( TRUE );
} }
+2 -1
View File
@@ -173,7 +173,8 @@ bool Loc::ExportStrings()
ExportSection(props, L"Repair", Loc::pRepairStrings, 0, 4); ExportSection(props, L"Repair", Loc::pRepairStrings, 0, 4);
ExportSection(props, L"PreStatBuild", Loc::sPreStatBuildString, 0, 6); ExportSection(props, L"PreStatBuild", Loc::sPreStatBuildString, 0, 6);
ExportSection(props, L"StatGain", Loc::sStatGainStrings, 0, 11); ExportSection(props, L"StatGain", Loc::sStatGainStrings, 0, 11);
ExportSection(props, L"HelicopterEta", Loc::pHelicopterEtaStrings, 0, 10); ExportSection(props, L"HelicopterEta", Loc::pHelicopterEtaStrings, 0, TEXT_NUM_STR_HELI_ETA);
ExportSection(props, L"HelicopterRepair", Loc::pHelicopterRepairRefuelStrings, 0, TEXT_NUM_STR_HELI_REPAIRS);
ExportSection(props, L"MapLevel", Loc::sMapLevelString, 0, 1); ExportSection(props, L"MapLevel", Loc::sMapLevelString, 0, 1);
ExportSection(props, L"Loyal", Loc::gsLoyalString, 0, 1); ExportSection(props, L"Loyal", Loc::gsLoyalString, 0, 1);
ExportSection(props, L"Underground", Loc::gsUndergroundString, 0, 1); ExportSection(props, L"Underground", Loc::gsUndergroundString, 0, 1);
+51 -17
View File
@@ -195,6 +195,7 @@ extern STR16 pRepairStrings[];
extern STR16 sPreStatBuildString[]; extern STR16 sPreStatBuildString[];
extern STR16 sStatGainStrings[]; extern STR16 sStatGainStrings[];
extern STR16 pHelicopterEtaStrings[]; extern STR16 pHelicopterEtaStrings[];
extern STR16 pHelicopterRepairRefuelStrings[];
extern STR16 sMapLevelString[]; extern STR16 sMapLevelString[];
extern STR16 gsLoyalString[]; extern STR16 gsLoyalString[];
extern STR16 pMapHeliErrorString[]; extern STR16 pMapHeliErrorString[];
@@ -617,6 +618,39 @@ enum
TEXT_NUM_STR_TT TEXT_NUM_STR_TT
}; };
enum
{
STR_HELI_ETA_TOTAL_DISTANCE,
STR_HELI_ETA_SAFE,
STR_HELI_ETA_UNSAFE,
STR_HELI_ETA_TOTAL_COST,
STR_HELI_ETA_ETA,
STR_HELI_ETA_LOW_ON_FUEL_HOSTILE_TERRITORY,
STR_HELI_ETA_PASSENGERS,
STR_HELI_ETA_SELECT_SKYRIDER_OR_ARRIVALS,
STR_HELI_ETA_SKYRIDER,
STR_HELI_ETA_ARRIVALS,
STR_HELI_ETA_HELI_DAMAGED_HOSTILE_TERRITORY,
STR_HELI_ETA_KICK_OUT_PASSENGERS_PROMPT,
STR_HELI_ETA_REMAINING_FUEL,
STR_HELI_ETA_DISTANCE_TO_REFUEL_SITE,
TEXT_NUM_STR_HELI_ETA,
};
// anv: helicopter repairs
enum
{
STR_HELI_RR_REPAIR_PROMPT,
STR_HELI_RR_REPAIR_IN_PROGRESS,
STR_HELI_RR_REPAIR_FINISHED,
STR_HELI_RR_REFUEL_FINISHED,
TEXT_NUM_STR_HELI_REPAIRS,
};
#define LARGE_STRING_LENGTH 200 #define LARGE_STRING_LENGTH 200
#define MED_STRING_LENGTH 80 #define MED_STRING_LENGTH 80
#define SMALL_STRING_LENGTH 20 #define SMALL_STRING_LENGTH 20
@@ -1018,23 +1052,23 @@ enum
PRISONER_OFFER_SURRENDER_STR, PRISONER_OFFER_SURRENDER_STR,
PRISONER_TALK_STR, PRISONER_TALK_STR,
// sevenfm: new disarm trap dialog, new messages for wrong mines when arming // sevenfm: new disarm trap dialog, new messages for wrong mines when arming
DISARM_DIALOG_DISARM, DISARM_DIALOG_DISARM,
DISARM_DIALOG_INSPECT, DISARM_DIALOG_INSPECT,
DISARM_DIALOG_REMOVE_BLUEFLAG, DISARM_DIALOG_REMOVE_BLUEFLAG,
DISARM_DIALOG_BLOWUP, DISARM_DIALOG_BLOWUP,
DISARM_DIALOG_ACTIVATE_TRIPWIRE, DISARM_DIALOG_ACTIVATE_TRIPWIRE,
DISARM_DIALOG_DEACTIVATE_TRIPWIRE, DISARM_DIALOG_DEACTIVATE_TRIPWIRE,
DISARM_DIALOG_REVEAL_TRIPWIRE, DISARM_DIALOG_REVEAL_TRIPWIRE,
ARM_MESSAGE_NO_DETONATOR, ARM_MESSAGE_NO_DETONATOR,
ARM_MESSAGE_ALREADY_ARMED, ARM_MESSAGE_ALREADY_ARMED,
INSPECT_RESULT_SAFE, INSPECT_RESULT_SAFE,
INSPECT_RESULT_MOSTLY_SAFE, INSPECT_RESULT_MOSTLY_SAFE,
INSPECT_RESULT_RISKY, INSPECT_RESULT_RISKY,
INSPECT_RESULT_DANGEROUS, INSPECT_RESULT_DANGEROUS,
INSPECT_RESULT_HIGH_DANGER, INSPECT_RESULT_HIGH_DANGER,
TEXT_NUM_TACTICAL_STR, TEXT_NUM_TACTICAL_STR
}; };
enum{ enum{
+14
View File
@@ -3304,6 +3304,17 @@ STR16 pHelicopterEtaStrings[] =
L"选择Skyrider还是“着陆点”?", L"选择Skyrider还是“着陆点”?",
L"Skyrider", L"Skyrider",
L"着陆点", L"着陆点",
L"Helicopter is seriously damaged and must land in hostile territory!", // warning that the sector the helicopter is going to use for refueling is under enemy control ->
L"Helicopter will now return straight to base, do you want to drop down passengers before?"
};
STR16 pHelicopterRepairRefuelStrings[]=
{
// anv: Waldo The Mechanic - prompt and notifications
L"Do you want %s to start repairs? It will cost $%d, and helicopter will be unavailable for around %d hour(s).",
L"Helicopter is currently disassembled. Wait until repairs are finished.",
L"Repairs completed. Helicopter is available again.",
L"Helicopter is fully refueled.",
}; };
STR16 sMapLevelString[] = STR16 sMapLevelString[] =
@@ -4105,8 +4116,11 @@ STR16 pHistoryStrings[] =
L"宰掉了血猫", L"宰掉了血猫",
L"%s被干掉了", L"%s被干掉了",
L"把一个恐怖分子的头颅给了Carmen。", L"把一个恐怖分子的头颅给了Carmen。",
//76-80
L"Slay走了", L"Slay走了",
L"干掉了%s", L"干掉了%s",
L"Met Waldo - aircraft mechanic.",
L"Helicopter repairs started. Estimated time: %d hour(s).",
}; };
STR16 pHistoryLocations[] = STR16 pHistoryLocations[] =
+14
View File
@@ -3299,6 +3299,17 @@ STR16 pHelicopterEtaStrings[] =
L"Selecteer Skyrider of Aanvoer Drop-plaats?", // L"Select Skyrider or the Arrivals Drop-off?", L"Selecteer Skyrider of Aanvoer Drop-plaats?", // L"Select Skyrider or the Arrivals Drop-off?",
L"Skyrider", L"Skyrider",
L"Aanvoer", // L"Arrivals", L"Aanvoer", // L"Arrivals",
L"Helicopter is seriously damaged and must land in hostile territory!", // warning that the sector the helicopter is going to use for refueling is under enemy control ->
L"Helicopter will now return straight to base, do you want to drop down passengers before?"
};
STR16 pHelicopterRepairRefuelStrings[]=
{
// anv: Waldo The Mechanic - prompt and notifications
L"Do you want %s to start repairs? It will cost $%d, and helicopter will be unavailable for around %d hour(s).",
L"Helicopter is currently disassembled. Wait until repairs are finished.",
L"Repairs completed. Helicopter is available again.",
L"Helicopter is fully refueled.",
}; };
STR16 sMapLevelString[] = STR16 sMapLevelString[] =
@@ -4104,8 +4115,11 @@ STR16 pHistoryStrings[] =
L"Afgeslacht door bloodcats", // ("Slaughtered bloodcats") L"Afgeslacht door bloodcats", // ("Slaughtered bloodcats")
L"%s was gedood", // ("%s was killed") L"%s was gedood", // ("%s was killed")
L"Carmen kop v.e. terrorist gegeven", // ("Gave Carmen a terrorist's head") L"Carmen kop v.e. terrorist gegeven", // ("Gave Carmen a terrorist's head")
//76-80
L"Slay vertrok", // ("Slay left") L"Slay vertrok", // ("Slay left")
L"%s vermoord", // ("Killed %s") L"%s vermoord", // ("Killed %s")
L"Met Waldo - aircraft mechanic.",
L"Helicopter repairs started. Estimated time: %d hour(s).",
}; };
STR16 pHistoryLocations[] = STR16 pHistoryLocations[] =
+20 -4
View File
@@ -3299,10 +3299,23 @@ STR16 pHelicopterEtaStrings[] =
L"Total Cost: ", // total cost of trip by helicopter L"Total Cost: ", // total cost of trip by helicopter
L"ETA: ", // ETA is an acronym for "estimated time of arrival" L"ETA: ", // ETA is an acronym for "estimated time of arrival"
L"Helicopter is low on fuel and must land in hostile territory!", // warning that the sector the helicopter is going to use for refueling is under enemy control -> L"Helicopter is low on fuel and must land in hostile territory!", // warning that the sector the helicopter is going to use for refueling is under enemy control ->
L"Passengers: ", L"Passengers: ",
L"Select Skyrider or the Arrivals Drop-off?", L"Select Skyrider or the Arrivals Drop-off?",
L"Skyrider", L"Skyrider",
L"Arrivals", L"Arrivals",
L"Helicopter is seriously damaged and must land in hostile territory!", // warning that the sector the helicopter is going to use for refueling is under enemy control ->
L"Helicopter will now return straight to base, do you want to drop down passengers before?",
L"Remaining Fuel:",
L"Dist. To Refuel Site:",
};
STR16 pHelicopterRepairRefuelStrings[]=
{
// anv: Waldo The Mechanic - prompt and notifications
L"Do you want %s to start repairs? It will cost $%d, and helicopter will be unavailable for around %d hour(s).",
L"Helicopter is currently disassembled. Wait until repairs are finished.",
L"Repairs completed. Helicopter is available again.",
L"Helicopter is fully refueled.",
}; };
STR16 sMapLevelString[] = STR16 sMapLevelString[] =
@@ -4104,8 +4117,11 @@ STR16 pHistoryStrings[] =
L"Slaughtered bloodcats", L"Slaughtered bloodcats",
L"%s was killed", L"%s was killed",
L"Gave Carmen a terrorist's head", L"Gave Carmen a terrorist's head",
//76-80
L"Slay left", L"Slay left",
L"Killed %s", L"Killed %s",
L"Met Waldo - aircraft mechanic.",
L"Helicopter repairs started. Estimated time: %d hour(s).",
}; };
STR16 pHistoryLocations[] = STR16 pHistoryLocations[] =
+14
View File
@@ -3308,6 +3308,17 @@ STR16 pHelicopterEtaStrings[] =
L"Sélectionner Skyrider ou l'aire d'atterrissage ?", L"Sélectionner Skyrider ou l'aire d'atterrissage ?",
L"Skyrider", L"Skyrider",
L"Arrivée", L"Arrivée",
L"Helicopter is seriously damaged and must land in hostile territory!", // warning that the sector the helicopter is going to use for refueling is under enemy control ->
L"Helicopter will now return straight to base, do you want to drop down passengers before?"
};
STR16 pHelicopterRepairRefuelStrings[]=
{
// anv: Waldo The Mechanic - prompt and notifications
L"Do you want %s to start repairs? It will cost $%d, and helicopter will be unavailable for around %d hour(s).",
L"Helicopter is currently disassembled. Wait until repairs are finished.",
L"Repairs completed. Helicopter is available again.",
L"Helicopter is fully refueled.",
}; };
STR16 sMapLevelString[] = STR16 sMapLevelString[] =
@@ -4112,8 +4123,11 @@ STR16 pHistoryStrings[] =
L"Élimination des chats sauvages", L"Élimination des chats sauvages",
L"%s a été tué(e)", L"%s a été tué(e)",
L"Tête de terroriste donnée à Carmen", L"Tête de terroriste donnée à Carmen",
//76-80
L"Reste Slay", L"Reste Slay",
L"%s a été tué(e)", L"%s a été tué(e)",
L"Met Waldo - aircraft mechanic.",
L"Helicopter repairs started. Estimated time: %d hour(s).",
}; };
STR16 pHistoryLocations[] = STR16 pHistoryLocations[] =
+14
View File
@@ -3300,6 +3300,17 @@ STR16 pHelicopterEtaStrings[] =
L"Skyrider oder Absprungsort auswählen?", L"Skyrider oder Absprungsort auswählen?",
L"Skyrider", L"Skyrider",
L"Absprung", //make sure length doesn't exceed 8 characters (used to be "Absprungsort") L"Absprung", //make sure length doesn't exceed 8 characters (used to be "Absprungsort")
L"Helicopter is seriously damaged and must land in hostile territory!", // warning that the sector the helicopter is going to use for refueling is under enemy control ->
L"Helicopter will now return straight to base, do you want to drop down passengers before?"
};
STR16 pHelicopterRepairRefuelStrings[]=
{
// anv: Waldo The Mechanic - prompt and notifications
L"Do you want %s to start repairs? It will cost $%d, and helicopter will be unavailable for around %d hour(s).",
L"Helicopter is currently disassembled. Wait until repairs are finished.",
L"Repairs completed. Helicopter is available again.",
L"Helicopter is fully refueled.",
}; };
STR16 sMapLevelString[] = STR16 sMapLevelString[] =
@@ -4054,8 +4065,11 @@ STR16 pHistoryStrings[] =
L"Bloodcats getötet", L"Bloodcats getötet",
L"%s wurde getötet", L"%s wurde getötet",
L"Carmen den Kopf eines Terroristen gegeben", L"Carmen den Kopf eines Terroristen gegeben",
//76-80
L"Slay ist gegangen", //Slay is a merc and has left the team L"Slay ist gegangen", //Slay is a merc and has left the team
L"%s getötet", //History log for when a merc kills an NPC or PC L"%s getötet", //History log for when a merc kills an NPC or PC
L"Met Waldo - aircraft mechanic.",
L"Helicopter repairs started. Estimated time: %d hour(s).",
}; };
STR16 pHistoryLocations[] = STR16 pHistoryLocations[] =
+14
View File
@@ -3294,6 +3294,17 @@ STR16 pHelicopterEtaStrings[] =
L"Seleziona Skyrider o gli Arrivi Drop-off?", L"Seleziona Skyrider o gli Arrivi Drop-off?",
L"Skyrider", L"Skyrider",
L"Arrivi", L"Arrivi",
L"Helicopter is seriously damaged and must land in hostile territory!", // warning that the sector the helicopter is going to use for refueling is under enemy control ->
L"Helicopter will now return straight to base, do you want to drop down passengers before?"
};
STR16 pHelicopterRepairRefuelStrings[]=
{
// anv: Waldo The Mechanic - prompt and notifications
L"Do you want %s to start repairs? It will cost $%d, and helicopter will be unavailable for around %d hour(s).",
L"Helicopter is currently disassembled. Wait until repairs are finished.",
L"Repairs completed. Helicopter is available again.",
L"Helicopter is fully refueled.",
}; };
STR16 sMapLevelString[] = STR16 sMapLevelString[] =
@@ -4094,8 +4105,11 @@ STR16 pHistoryStrings[] =
L"Massacrati dai Bloodcat", L"Massacrati dai Bloodcat",
L"%s è stato ucciso", L"%s è stato ucciso",
L"Data a Carmen la testa di un terrorista", L"Data a Carmen la testa di un terrorista",
//76-80
L"Massacro sinistro", L"Massacro sinistro",
L"Ucciso %s", L"Ucciso %s",
L"Met Waldo - aircraft mechanic.",
L"Helicopter repairs started. Estimated time: %d hour(s).",
}; };
STR16 pHistoryLocations[] = STR16 pHistoryLocations[] =
+19 -4
View File
@@ -3306,10 +3306,22 @@ STR16 pHelicopterEtaStrings[] =
L"Całkowity koszt: ", // total cost of trip by helicopter L"Całkowity koszt: ", // total cost of trip by helicopter
L"PCP: ", // ETA is an acronym for "estimated time of arrival" L"PCP: ", // ETA is an acronym for "estimated time of arrival"
L"Helikopter ma mało paliwa i musi wylądować na terenie wroga.", // warning that the sector the helicopter is going to use for refueling is under enemy control -> L"Helikopter ma mało paliwa i musi wylądować na terenie wroga.", // warning that the sector the helicopter is going to use for refueling is under enemy control ->
L"Pasażerowie: ", L"Pasażerowie: ",
L"Wybór Skyridera lub pasażerów?", L"Wybór Skyridera lub pasażerów?",
L"Skyrider", L"Skyrider",
L"Pasażerowie", L"Pasażerowie",
L"Helikopter został poważnie uszkodzony i musi wylądować na terenie wroga!", // warning that the sector the helicopter is going to use for refueling is under enemy control ->
L"Helikopter powróci teraz wprost do bazy, czy chcesz najpierw wysadzić pasażerów?"
};
STR16 pHelicopterRepairRefuelStrings[]=
{
// anv: Waldo The Mechanic - prompt and notifications
L"Czy chcesz aby %s rozpoczął naprawę? Będzie to kosztować %d$, a helikopter pozostanie niedostępny przez około %d godzin(y).",
L"Helikopter jest obecnie rozmontowany. Zaczekaj aż naprawa zostanie ukończona.",
L"Helikopter jest znów dostępny do lotu.",
L"Helicopter jest zatankowany do pełna.",
}; };
STR16 sMapLevelString[] = STR16 sMapLevelString[] =
@@ -4113,8 +4125,11 @@ STR16 pHistoryStrings[] =
L"Wyrżnięto dzikie koty", L"Wyrżnięto dzikie koty",
L"%s zabity(ta)", L"%s zabity(ta)",
L"Przekazano Carmenowi głowę terrorysty", L"Przekazano Carmenowi głowę terrorysty",
//76-80
L"Slay odszedł", L"Slay odszedł",
L"Zabito: %s", L"Zabito: %s",
L"Spotkanie z Waldo - mechanikiem lotniczym.",
L"Rozpoczęto naprawę helikoptera. Szacowany czas: %d godzin(y).",
}; };
STR16 pHistoryLocations[] = STR16 pHistoryLocations[] =
+14
View File
@@ -3301,6 +3301,17 @@ STR16 pHelicopterEtaStrings[] =
L"Выбрать вертолет или точку высадки?", L"Выбрать вертолет или точку высадки?",
L"Вертолёт", L"Вертолёт",
L"Высадка", L"Высадка",
L"Helicopter is seriously damaged and must land in hostile territory!", // warning that the sector the helicopter is going to use for refueling is under enemy control ->
L"Helicopter will now return straight to base, do you want to drop down passengers before?"
};
STR16 pHelicopterRepairRefuelStrings[]=
{
// anv: Waldo The Mechanic - prompt and notifications
L"Do you want %s to start repairs? It will cost $%d, and helicopter will be unavailable for around %d hour(s).",
L"Helicopter is currently disassembled. Wait until repairs are finished.",
L"Repairs completed. Helicopter is available again.",
L"Helicopter is fully refueled.",
}; };
STR16 sMapLevelString[] = STR16 sMapLevelString[] =
@@ -4102,8 +4113,11 @@ STR16 pHistoryStrings[] =
L"Все кошки-убийцы убиты", L"Все кошки-убийцы убиты",
L"%s был убит(а).", L"%s был убит(а).",
L"Отдали Кармену голову террориста.", L"Отдали Кармену голову террориста.",
//76-80
L"Убийца ушёл.", L"Убийца ушёл.",
L"%s убит(а) вашим отрядом.", L"%s убит(а) вашим отрядом.",
L"Met Waldo - aircraft mechanic.",
L"Helicopter repairs started. Estimated time: %d hour(s).",
}; };
STR16 pHistoryLocations[] = STR16 pHistoryLocations[] =
+14
View File
@@ -3305,6 +3305,17 @@ STR16 pHelicopterEtaStrings[] =
L"Select Skyrider or the Arrivals Drop-off?", L"Select Skyrider or the Arrivals Drop-off?",
L"Skyrider", L"Skyrider",
L"Arrivals", L"Arrivals",
L"Helicopter is seriously damaged and must land in hostile territory!", // warning that the sector the helicopter is going to use for refueling is under enemy control ->
L"Helicopter will now return straight to base, do you want to drop down passengers before?"
};
STR16 pHelicopterRepairRefuelStrings[]=
{
// anv: Waldo The Mechanic - prompt and notifications
L"Do you want %s to start repairs? It will cost $%d, and helicopter will be unavailable for around %d hour(s).",
L"Helicopter is currently disassembled. Wait until repairs are finished.",
L"Repairs completed. Helicopter is available again.",
L"Helicopter is fully refueled.",
}; };
STR16 sMapLevelString[] = STR16 sMapLevelString[] =
@@ -4108,8 +4119,11 @@ STR16 pHistoryStrings[] =
L"Slaughtered bloodcats", L"Slaughtered bloodcats",
L"%s was killed", L"%s was killed",
L"Gave Carmen a terrorist's head", L"Gave Carmen a terrorist's head",
//76-80
L"Slay left", L"Slay left",
L"Killed %s", L"Killed %s",
L"Met Waldo - aircraft mechanic.",
L"Helicopter repairs started. Estimated time: %d hour(s).",
}; };
STR16 pHistoryLocations[] = STR16 pHistoryLocations[] =
+2
View File
@@ -139,6 +139,8 @@ BOOLEAN InitializeGame(void)
LoadItemSettings(); LoadItemSettings();
// Load externalised taunts settings // Load externalised taunts settings
LoadTauntsSettings(); LoadTauntsSettings();
// Load helicopter repair settings
LoadHelicopterRepairRefuelSettings();
#ifdef JA2UB #ifdef JA2UB
LoadGameUBOptions(); // JA25 UB LoadGameUBOptions(); // JA25 UB