diff --git a/GameSettings.cpp b/GameSettings.cpp index 6501dad1..f36a127c 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -1568,6 +1568,7 @@ void LoadGameExternalOptions() // Flugente: advanced repair/dirt system gGameExternalOptions.fAdvRepairSystem = iniReader.ReadBoolean("Strategic Gameplay Settings","ADVANCED_REPAIR", FALSE); gGameExternalOptions.fOnlyRepairGunsArmour = iniReader.ReadBoolean("Strategic Gameplay Settings","ONLY_REPAIR_GUNS_AND_ARMOUR", FALSE); + gGameExternalOptions.fMercsCanDoAdvancedRepairs = iniReader.ReadBoolean("Strategic Gameplay Settings","MERCS_CAN_DO_ADVANCED_REPAIRS", FALSE); gGameExternalOptions.fDirtSystem = iniReader.ReadBoolean("Strategic Gameplay Settings","DIRT_SYSTEM", FALSE); gGameExternalOptions.fFullRepairCleansGun = iniReader.ReadBoolean("Strategic Gameplay Settings","FULL_REPAIR_CLEANS_GUN", FALSE); gGameExternalOptions.usSectorDirtDivider = iniReader.ReadInteger("Strategic Gameplay Settings","SECTOR_DIRT_DIVIDER", 1000, 1, 100000); diff --git a/GameSettings.h b/GameSettings.h index 2cd7aa84..671d85cf 100644 --- a/GameSettings.h +++ b/GameSettings.h @@ -1181,6 +1181,7 @@ typedef struct // Flugente: advanced repair/dirt system BOOLEAN fAdvRepairSystem; // allow thresholds to repairing BOOLEAN fOnlyRepairGunsArmour; // we can only repair guns and armour + BOOLEAN fMercsCanDoAdvancedRepairs; // allow mercs with technician/engineer trait (New Trait System) to raise weapon threshold BOOLEAN fDirtSystem; // allow dirt on items increase the chance for weapon jamming BOOLEAN fFullRepairCleansGun; // repairing a gun up to its current repair threshold also cleans the gun UINT32 usSectorDirtDivider; // divide a guns dirt factor by this to get dirt increase for every turn diff --git a/Strategic/Assignments.cpp b/Strategic/Assignments.cpp index 93653873..452c51fc 100644 --- a/Strategic/Assignments.cpp +++ b/Strategic/Assignments.cpp @@ -3915,11 +3915,22 @@ BOOLEAN RepairObject( SOLDIERTYPE * pSoldier, SOLDIERTYPE * pOwner, OBJECTTYPE * // Flugente: if using the new advanced repair system, we can only repair up to the repair threshold INT16 threshold = 100; - if ( gGameExternalOptions.fAdvRepairSystem && ( (Item[pObj->usItem].usItemClass & IC_WEAPON) || (Item[pObj->usItem].usItemClass & IC_ARMOUR) ) ) - threshold = (*pObj)[ubLoop]->data.sRepairThreshold; + if ( gGameExternalOptions.fAdvRepairSystem && (Item[pObj->usItem].usItemClass & (IC_WEAPON|IC_ARMOUR)) ) + { + if ( !gGameExternalOptions.fMercsCanDoAdvancedRepairs || !HAS_SKILL_TRAIT( pSoldier, TECHNICIAN_NT ) ) + { + threshold = (*pObj)[ubLoop]->data.sRepairThreshold; + } + } // repairable, try to repair it DoActualRepair( pSoldier, pObj->usItem, &((*pObj)[ubLoop]->data.objectStatus), threshold, pubRepairPtsLeft ); + + if ( gGameExternalOptions.fAdvRepairSystem && gGameExternalOptions.fMercsCanDoAdvancedRepairs && ( HAS_SKILL_TRAIT( pSoldier, TECHNICIAN_NT ) ) && ( (Item[pObj->usItem].usItemClass & (IC_WEAPON|IC_ARMOUR)) ) ) + (*pObj)[ubLoop]->data.sRepairThreshold = max((*pObj)[ubLoop]->data.sRepairThreshold, (*pObj)[ubLoop]->data.objectStatus); + + // repairable, try to repair it + DoActualRepair( pSoldier, pObj->usItem, &((*pObj)[ubLoop]->data.objectStatus), threshold, pubRepairPtsLeft ); // if the item was repaired to full status and the repair wa at least 5%, add a point if ( (*pObj)[ubLoop]->data.objectStatus == threshold && (((*pObj)[ubLoop]->data.objectStatus - ubBeforeRepair) > 4 )) diff --git a/Tactical/Weapons.cpp b/Tactical/Weapons.cpp index 4f455d85..384511c3 100644 --- a/Tactical/Weapons.cpp +++ b/Tactical/Weapons.cpp @@ -2941,7 +2941,8 @@ BOOLEAN UseBlade( SOLDIERTYPE *pSoldier , INT32 sTargetGridNo ) (*pObj)[0]->data.objectStatus -= (INT8) Random( bMaxDrop ); // 0 to (maxDrop - 1) - if ( bMaxDrop > 0 ) + // Flugente: reduce repair threshold + if ( bMaxDrop > 0 && Random(100) < Item[pObj->usItem].usDamageChance ) { (*pObj)[0]->data.sRepairThreshold = max((*pObj)[0]->data.objectStatus, (*pObj)[0]->data.sRepairThreshold - 1); }