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
This commit is contained in:
steph-pg
2025-10-08 23:01:46 +03:00
committed by Asdow
parent 049981b35f
commit d98de9e793
+43 -42
View File
@@ -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))
{