From cc51c13529259debb3eea46799cba0765e00d9a6 Mon Sep 17 00:00:00 2001 From: silversurfer Date: Wed, 2 Oct 2013 12:40:08 +0000 Subject: [PATCH] New modifiers for Item Properties The new Item_Settings.ini is there to host modifiers for item properties in the different XML files. For now it is only used for the Weapon Overheating feature to adjust parameters based on gun class. It uses the new struct gItemSettings which is populated in function void LoadItemSettings() on game start. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@6463 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- GameSettings.cpp | 55 ++++++++++++++++++++++++++++++++- GameSettings.h | 14 +++++++++ Tactical/Interface Enhanced.cpp | 8 +++++ Tactical/Items.cpp | 2 ++ Tactical/Weapons.cpp | 15 +++++++++ gameloop.cpp | 2 ++ 6 files changed, 95 insertions(+), 1 deletion(-) diff --git a/GameSettings.cpp b/GameSettings.cpp index d7ece1a8..00b528bd 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -62,7 +62,10 @@ #define CTH_COEFFICIENTS_FILE "CTHConstants.ini" //DBrot: Settings for a mod that don't really fit in the Options file. This means GridNos for now. -#define MOD_SETTINGS_FILE "Mod_Settings.ini" +#define MOD_SETTINGS_FILE "Mod_Settings.ini" + +// silversurfer: Modifiers for item properties ( thresholds, range, damage, armor etc.) +#define ITEM_SETTINGS_FILE "Item_Settings.ini" #define CD_ROOT_DIR "DATA\\" @@ -74,6 +77,7 @@ SKILL_TRAIT_VALUES gSkillTraitValues; // SANDRO - added this one CTH_CONSTANTS gGameCTHConstants; // HEADROCK HAM 4: CTH constants MOD_SETTINGS gModSettings; //DBrot: mod specific settings +ITEM_SETTINGS gItemSettings; // silversurfer: item property modifiers extern SGPFILENAME gCheckFilenames[]; extern CHAR8 gzErrorMsg[256]; @@ -2395,6 +2399,55 @@ void LoadModSettings(){ gModSettings.ubHospitalSectorY = iniReader.ReadInteger("Cambria", "HOSPITAL_SECTOR_Y", 6); gModSettings.ubHospitalSectorZ = iniReader.ReadInteger("Cambria", "HOSPITAL_SECTOR_Z", 0); } + +// silversurfer: load item property modifiers +void LoadItemSettings() +{ + CIniReader iniReader(ITEM_SETTINGS_FILE); + + // silversurfer: New values to fine-tune weapon overheating for different gun classes + // --------- PISTOLS ---------- + gItemSettings.fOverheatJamThresholdModifier[GUN_PISTOL] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_JAM_THRESHOLD_PISTOL_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatDamageThresholdModifier[GUN_PISTOL] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_DAMAGE_THRESHOLD_PISTOL_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatTemperatureModifier[GUN_PISTOL] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_TEMPERATURE_PISTOL_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatCooldownModifier[GUN_PISTOL] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_COOLDOWN_PISTOL_MODIFIER", 1.0f, 0.1f, 10.0f); + // ----- MACHINE PISTOLS ------ + gItemSettings.fOverheatJamThresholdModifier[GUN_M_PISTOL] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_JAM_THRESHOLD_MP_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatDamageThresholdModifier[GUN_M_PISTOL] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_DAMAGE_THRESHOLD_MP_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatTemperatureModifier[GUN_M_PISTOL] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_TEMPERATURE_MP_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatCooldownModifier[GUN_M_PISTOL] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_COOLDOWN_MP_MODIFIER", 1.0f, 0.1f, 10.0f); + // ---------- SMGS ------------ + gItemSettings.fOverheatJamThresholdModifier[GUN_SMG] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_JAM_THRESHOLD_SMG_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatDamageThresholdModifier[GUN_SMG] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_DAMAGE_THRESHOLD_SMG_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatTemperatureModifier[GUN_SMG] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_TEMPERATURE_SMG_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatCooldownModifier[GUN_SMG] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_COOLDOWN_SMG_MODIFIER", 1.0f, 0.1f, 10.0f); + // --------- RIFLES ----------- + gItemSettings.fOverheatJamThresholdModifier[GUN_RIFLE] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_JAM_THRESHOLD_RIFLE_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatDamageThresholdModifier[GUN_RIFLE] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_DAMAGE_THRESHOLD_RIFLE_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatTemperatureModifier[GUN_RIFLE] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_TEMPERATURE_RIFLE_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatCooldownModifier[GUN_RIFLE] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_COOLDOWN_RIFLE_MODIFIER", 1.0f, 0.1f, 10.0f); + // ------ SNIPER RIFLES ------- + gItemSettings.fOverheatJamThresholdModifier[GUN_SN_RIFLE] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_JAM_THRESHOLD_SNIPER_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatDamageThresholdModifier[GUN_SN_RIFLE] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_DAMAGE_THRESHOLD_SNIPER_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatTemperatureModifier[GUN_SN_RIFLE] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_TEMPERATURE_SNIPER_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatCooldownModifier[GUN_SN_RIFLE] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_COOLDOWN_SNIPER_MODIFIER", 1.0f, 0.1f, 10.0f); + // ------ ASSAULT RIFLES ------ + gItemSettings.fOverheatJamThresholdModifier[GUN_AS_RIFLE] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_JAM_THRESHOLD_AR_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatDamageThresholdModifier[GUN_AS_RIFLE] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_DAMAGE_THRESHOLD_AR_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatTemperatureModifier[GUN_AS_RIFLE] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_TEMPERATURE_AR_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatCooldownModifier[GUN_AS_RIFLE] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_COOLDOWN_AR_MODIFIER", 1.0f, 0.1f, 10.0f); + // ---------- LMGS ------------ + gItemSettings.fOverheatJamThresholdModifier[GUN_LMG] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_JAM_THRESHOLD_LMG_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatDamageThresholdModifier[GUN_LMG] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_DAMAGE_THRESHOLD_LMG_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatTemperatureModifier[GUN_LMG] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_TEMPERATURE_LMG_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatCooldownModifier[GUN_LMG] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_COOLDOWN_LMG_MODIFIER", 1.0f, 0.1f, 10.0f); + // -------- SHOTGUNS ---------- + gItemSettings.fOverheatJamThresholdModifier[GUN_SHOTGUN] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_JAM_THRESHOLD_SHOTGUN_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatDamageThresholdModifier[GUN_SHOTGUN] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_DAMAGE_THRESHOLD_SHOTGUN_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatTemperatureModifier[GUN_SHOTGUN] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_TEMPERATURE_SHOTGUN_MODIFIER", 1.0f, 0.1f, 10.0f); + gItemSettings.fOverheatCooldownModifier[GUN_SHOTGUN] = iniReader.ReadFloat ("Weapon Settings","OVERHEATING_COOLDOWN_SHOTGUN_MODIFIER", 1.0f, 0.1f, 10.0f); +} + INT16 DynamicAdjustAPConstants(INT16 iniReadValue, INT16 iniDefaultValue, BOOLEAN reverse) { //CHRISL: This function will dynamically adjust all the APBPConstant values based on the AP_MAXIMUM value. This way diff --git a/GameSettings.h b/GameSettings.h index 9be468b2..47144db2 100644 --- a/GameSettings.h +++ b/GameSettings.h @@ -1739,8 +1739,21 @@ typedef struct }MOD_SETTINGS; +// silversurfer: item property modifiers +typedef struct +{ + // weapon overheating modifiers for the different gun classes + FLOAT fOverheatJamThresholdModifier[9]; + FLOAT fOverheatDamageThresholdModifier[9]; + FLOAT fOverheatTemperatureModifier[9]; + FLOAT fOverheatCooldownModifier[9]; + +}ITEM_SETTINGS; + extern MOD_SETTINGS gModSettings; +extern ITEM_SETTINGS gItemSettings; + //This structure will contain general Ja2 settings NOT individual game settings. extern GAME_SETTINGS gGameSettings; @@ -1764,6 +1777,7 @@ BOOLEAN LoadGameSettings(); void LoadGameExternalOptions(); void LoadSkillTraitsExternalSettings(); // SANDRO - added this one void LoadModSettings(); +void LoadItemSettings(); // silversurfer: reads item property modifiers void LoadGameAPBPConstants(); // HEADROCK HAM 4: Read CTH/Shooting coefficients from file void LoadCTHConstants(); diff --git a/Tactical/Interface Enhanced.cpp b/Tactical/Interface Enhanced.cpp index c021d28d..01a99a8c 100644 --- a/Tactical/Interface Enhanced.cpp +++ b/Tactical/Interface Enhanced.cpp @@ -11557,6 +11557,8 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject ) sHeight = gItemDescAdvRegions[cnt-sFirstLine][1].sBottom - sTop; iFloatModifier[0] = Weapon[ gpItemDescObject->usItem ].usOverheatingSingleShotTemperature * gGameExternalOptions.iOverheatTemperatureGlobalModfier; + if ( Item[gpItemDescObject->usItem].usItemClass & IC_GUN ) + iFloatModifier[0] *= gItemSettings.fOverheatTemperatureModifier[ Weapon[ gpItemDescObject->usItem ].ubWeaponType ]; iFloatModifier[1] = GetSingleShotTemperature( gpItemDescObject ) - iFloatModifier[0]; iFloatModifier[2] = GetSingleShotTemperature( gpItemDescObject ); @@ -11611,6 +11613,8 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject ) sHeight = gItemDescAdvRegions[cnt-sFirstLine][1].sBottom - sTop; iFloatModifier[0] = Item[gpItemDescObject->usItem].usOverheatingCooldownFactor; + if ( Item[gpItemDescObject->usItem].usItemClass & IC_GUN ) + iFloatModifier[0] *= gItemSettings.fOverheatCooldownModifier[ Weapon[gpItemDescObject->usItem].ubWeaponType ]; iFloatModifier[1] = GetItemCooldownFactor(gpItemDescObject) - iFloatModifier[0]; iFloatModifier[2] = GetItemCooldownFactor(gpItemDescObject); @@ -11664,6 +11668,8 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject ) sHeight = gItemDescAdvRegions[cnt-sFirstLine][1].sBottom - sTop; iFloatModifier[0] = Weapon[ gpItemDescObject->usItem ].usOverheatingJamThreshold; + if ( Item[gpItemDescObject->usItem].usItemClass & IC_GUN ) + iFloatModifier[0] *= gItemSettings.fOverheatJamThresholdModifier[ Weapon[gpItemDescObject->usItem].ubWeaponType ]; iFloatModifier[1] = GetOverheatJamThreshold(gpItemDescObject) - iFloatModifier[0]; iFloatModifier[2] = GetOverheatJamThreshold(gpItemDescObject); @@ -11717,6 +11723,8 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject ) sHeight = gItemDescAdvRegions[cnt-sFirstLine][1].sBottom - sTop; iFloatModifier[0] = Weapon[ gpItemDescObject->usItem ].usOverheatingDamageThreshold; + if ( Item[gpItemDescObject->usItem].usItemClass & IC_GUN ) + iFloatModifier[0] *= gItemSettings.fOverheatDamageThresholdModifier[ Weapon[gpItemDescObject->usItem].ubWeaponType ]; iFloatModifier[1] = GetOverheatDamageThreshold(gpItemDescObject) - iFloatModifier[0]; iFloatModifier[2] = GetOverheatDamageThreshold(gpItemDescObject); diff --git a/Tactical/Items.cpp b/Tactical/Items.cpp index 22f86ff8..e4b6ae7e 100644 --- a/Tactical/Items.cpp +++ b/Tactical/Items.cpp @@ -14097,6 +14097,8 @@ FLOAT GetItemCooldownModificator( OBJECTTYPE * pObj ) FLOAT GetItemCooldownFactor( OBJECTTYPE * pObj ) { FLOAT cooldownfactor = Item[pObj->usItem].usOverheatingCooldownFactor; // ... get item-specific cooldown factor ... + if ( Item[pObj->usItem].usItemClass & IC_GUN ) + cooldownfactor *= gItemSettings.fOverheatCooldownModifier[ Weapon[ pObj->usItem ].ubWeaponType ]; FLOAT modificator = 1.0f + GetItemCooldownModificator( pObj ); diff --git a/Tactical/Weapons.cpp b/Tactical/Weapons.cpp index 7212538d..5f995445 100644 --- a/Tactical/Weapons.cpp +++ b/Tactical/Weapons.cpp @@ -1457,6 +1457,9 @@ FLOAT GetGunOverheatDamagePercentage( FLOAT usTemperature, UINT16 usIndx ) { FLOAT damagethreshold = Weapon[Item[ usIndx ].ubClassIndex].usOverheatingDamageThreshold; + if ( Item[usIndx].usItemClass & IC_GUN ) + damagethreshold *= gItemSettings.fOverheatDamageThresholdModifier[Weapon[Item[ usIndx ].uiIndex].ubWeaponType]; + return usTemperature/ damagethreshold ; } @@ -1465,6 +1468,9 @@ FLOAT GetGunOverheatJamPercentage( FLOAT usTemperature, UINT16 usIndx ) { FLOAT jamthreshold = Weapon[Item[ usIndx ].ubClassIndex].usOverheatingJamThreshold; + if ( Item[usIndx].usItemClass & IC_GUN ) + jamthreshold *= gItemSettings.fOverheatJamThresholdModifier[Weapon[Item[ usIndx ].uiIndex].ubWeaponType]; + return usTemperature/ jamthreshold ; } @@ -12071,6 +12077,9 @@ FLOAT GetSingleShotTemperature( OBJECTTYPE *pObj ) { singleshottemperature = Weapon[ pObj->usItem ].usOverheatingSingleShotTemperature; + if ( Item[pObj->usItem].usItemClass & IC_GUN ) + singleshottemperature *= gItemSettings.fOverheatTemperatureModifier[ Weapon[ pObj->usItem ].ubWeaponType ]; + // determine modificator according to attachments FLOAT modificator = 1.0f + GetTemperatureModifier(pObj); @@ -12137,6 +12146,9 @@ FLOAT GetOverheatJamThreshold( OBJECTTYPE *pObj ) { jamthreshold = Weapon[ pObj->usItem ].usOverheatingJamThreshold; + if ( Item[pObj->usItem].usItemClass & IC_GUN ) + jamthreshold *= gItemSettings.fOverheatJamThresholdModifier[ Weapon[ pObj->usItem ].ubWeaponType ]; + // determine modificator according to attachments FLOAT modificator = 1.0f + GetOverheatJamThresholdModifier(pObj); @@ -12171,6 +12183,9 @@ FLOAT GetOverheatDamageThreshold( OBJECTTYPE *pObj ) { damagethreshold = Weapon[ pObj->usItem ].usOverheatingDamageThreshold; + if ( Item[pObj->usItem].usItemClass & IC_GUN ) + damagethreshold *= gItemSettings.fOverheatDamageThresholdModifier[ Weapon[ pObj->usItem ].ubWeaponType ]; + // determine modificator according to attachments FLOAT modificator = 1.0f + GetOverheatDamageThresholdModifier(pObj); diff --git a/gameloop.cpp b/gameloop.cpp index 8fee341b..492df2a4 100644 --- a/gameloop.cpp +++ b/gameloop.cpp @@ -134,6 +134,8 @@ BOOLEAN InitializeGame(void) LoadCTHConstants(); //DBrot: load mod settings LoadModSettings(); + // silversurfer: load item settings modifiers + LoadItemSettings(); #ifdef JA2UB LoadGameUBOptions(); // JA25 UB