From d98de9e793b66d0c51509cabaadfecc14f5f5d94 Mon Sep 17 00:00:00 2001 From: steph-pg Date: Wed, 8 Oct 2025 16:26:18 +0100 Subject: [PATCH] Adjust soldier create traits due to demolitions change Since demolitions no longer affects grenades damage and range grenades check should be moved to throwing. Keep demolitions trait at lower prior because it can still be helpful to detect mines --- Tactical/Soldier Create.cpp | 85 +++++++++++++++++++------------------ 1 file changed, 43 insertions(+), 42 deletions(-) diff --git a/Tactical/Soldier Create.cpp b/Tactical/Soldier Create.cpp index 3048ca298..0001bdf27 100644 --- a/Tactical/Soldier Create.cpp +++ b/Tactical/Soldier Create.cpp @@ -4897,7 +4897,8 @@ BOOLEAN AssignTraitsToSoldier( SOLDIERTYPE *pSoldier, SOLDIERCREATE_STRUCT *pCre } // SNIPER RIFLE - CHANCE FOR SNIPER TRAIT else if ( Item[pCreateStruct->Inv[HANDPOS].usItem].usItemClass == IC_GUN && - Weapon[pCreateStruct->Inv[HANDPOS].usItem].ubWeaponType == GUN_SN_RIFLE ) + ( Weapon[pCreateStruct->Inv[HANDPOS].usItem].ubWeaponType == GUN_SN_RIFLE || + Weapon[pCreateStruct->Inv[HANDPOS].usItem].ubWeaponType == GUN_RIFLE )) { // setup the chances if ( ubSolClass == SOLDIER_CLASS_ELITE || ubSolClass == SOLDIER_CLASS_ELITE_MILITIA ) @@ -5495,7 +5496,7 @@ BOOLEAN AssignTraitsToSoldier( SOLDIERTYPE *pSoldier, SOLDIERCREATE_STRUCT *pCre } // THROWING TRAIT - if ( (foundThrowing) && (!ATraitAssigned || !BTraitAssigned || !CTraitAssigned) ) + if ( (foundThrowing || foundGrenades) && (!ATraitAssigned || !BTraitAssigned || !CTraitAssigned) ) { // setup basic chances based on soldier type if ( ubSolClass == SOLDIER_CLASS_ELITE || ubSolClass == SOLDIER_CLASS_ELITE_MILITIA ) @@ -5557,46 +5558,6 @@ BOOLEAN AssignTraitsToSoldier( SOLDIERTYPE *pSoldier, SOLDIERCREATE_STRUCT *pCre } } - // DEMOLITIONS TRAIT - if ( (foundGrenades) && (gGameOptions.fNewTraitSystem) && (!ATraitAssigned || !BTraitAssigned || !CTraitAssigned) ) - { - // setup basic chances based on soldier type - if ( ubSolClass == SOLDIER_CLASS_ELITE || ubSolClass == SOLDIER_CLASS_ELITE_MILITIA ) - iChance = 20 + ubProgress / 3; // 20-53% chance - else if ( ubSolClass == SOLDIER_CLASS_ARMY || ubSolClass == SOLDIER_CLASS_REG_MILITIA ) - iChance = 10 + ubProgress / 3; // 10-43% chance - else if ( ubSolClass == SOLDIER_CLASS_ADMINISTRATOR || ubSolClass == SOLDIER_CLASS_GREEN_MILITIA || ubSolClass == SOLDIER_CLASS_BANDIT ) - iChance = ubProgress / 3; // 0-33% chance - - // modify the chance by preset ini setting - if ( gGameExternalOptions.bAssignedTraitsRarity != 0 ) - { - iChance += ((iChance * gGameExternalOptions.bAssignedTraitsRarity) / 100); - } - - // assign the trait based on the chance - if ( Chance( iChance ) ) - { - if ( !ATraitAssigned ) - { - pSoldier->stats.ubSkillTraits[0] = DEMOLITIONS_NT; - ATraitAssigned = TRUE; - } - else if ( !BTraitAssigned ) - { - pSoldier->stats.ubSkillTraits[1] = DEMOLITIONS_NT; - BTraitAssigned = TRUE; - } - // allow third only to elites - else if ( !CTraitAssigned && gGameOptions.fNewTraitSystem && (ubSolClass == SOLDIER_CLASS_ELITE || ubSolClass == SOLDIER_CLASS_ELITE_MILITIA) ) - { - pSoldier->stats.ubSkillTraits[2] = DEMOLITIONS_NT; - CTraitAssigned = TRUE; - return(TRUE); - } - } - } - // MELEE / KNIFING TRAIT if ( (foundKnife || (foundMelee && gGameOptions.fNewTraitSystem)) && (!ATraitAssigned || !BTraitAssigned || !CTraitAssigned) ) { @@ -5853,6 +5814,46 @@ BOOLEAN AssignTraitsToSoldier( SOLDIERTYPE *pSoldier, SOLDIERCREATE_STRUCT *pCre } } + // DEMOLITIONS TRAIT + if ( gGameOptions.fNewTraitSystem && (!ATraitAssigned || !BTraitAssigned || !CTraitAssigned) ) + { + // setup basic chances based on soldier type + if ( ubSolClass == SOLDIER_CLASS_ELITE || ubSolClass == SOLDIER_CLASS_ELITE_MILITIA ) + iChance = 20 + ubProgress / 3; // 20-53% chance + else if ( ubSolClass == SOLDIER_CLASS_ARMY || ubSolClass == SOLDIER_CLASS_REG_MILITIA ) + iChance = 10 + ubProgress / 3; // 10-43% chance + else if ( ubSolClass == SOLDIER_CLASS_ADMINISTRATOR || ubSolClass == SOLDIER_CLASS_GREEN_MILITIA || ubSolClass == SOLDIER_CLASS_BANDIT ) + iChance = ubProgress / 3; // 0-33% chance + + // modify the chance by preset ini setting + if ( gGameExternalOptions.bAssignedTraitsRarity != 0 ) + { + iChance += ((iChance * gGameExternalOptions.bAssignedTraitsRarity) / 100); + } + + // assign the trait based on the chance + if ( Chance( iChance ) ) + { + if ( !ATraitAssigned ) + { + pSoldier->stats.ubSkillTraits[0] = DEMOLITIONS_NT; + ATraitAssigned = TRUE; + } + else if ( !BTraitAssigned ) + { + pSoldier->stats.ubSkillTraits[1] = DEMOLITIONS_NT; + BTraitAssigned = TRUE; + } + // allow third only to elites + else if ( !CTraitAssigned && gGameOptions.fNewTraitSystem && (ubSolClass == SOLDIER_CLASS_ELITE || ubSolClass == SOLDIER_CLASS_ELITE_MILITIA) ) + { + pSoldier->stats.ubSkillTraits[2] = DEMOLITIONS_NT; + CTraitAssigned = TRUE; + return(TRUE); + } + } + } + // Flugente: enemy roles: allow medics if ( gGameExternalOptions.fEnemyRoles && gGameExternalOptions.fEnemyMedics && gGameOptions.fNewTraitSystem && (!ATraitAssigned || !BTraitAssigned) && !RebelCommand::NeutraliseRole(pSoldier)) {