New Trait: SURVIVAL (new minor trait) gets the non-weapon parts of the ranger trait.

Requires GameDir >= r2213.

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7756 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2015-02-27 23:23:03 +00:00
parent 3f615cc68b
commit 8bfb14e90a
48 changed files with 700 additions and 768 deletions
+2 -2
View File
@@ -1456,12 +1456,12 @@ void CalculateTrackerRange( )
if ( gusSelectedSoldier == NOBODY || !GetSoldier( &pSoldier, gusSelectedSoldier ) || !pSoldier->bInSector )
return;
FLOAT trackerskill = (FLOAT)(NUM_SKILL_TRAITS( pSoldier, RANGER_NT ) * gSkillTraitValues.usTrackerAbility + pSoldier->GetBackgroundValue( BG_TRACKER_ABILITY )) / 100.0f;
FLOAT trackerskill = (FLOAT)(NUM_SKILL_TRAITS( pSoldier, SURVIVAL_NT ) * gSkillTraitValues.usSVTrackerAbility + pSoldier->GetBackgroundValue( BG_TRACKER_ABILITY )) / 100.0f;
if ( trackerskill < 0.01f )
return;
UINT16 range = gSkillTraitValues.usTrackerMaxRange * trackerskill;
UINT16 range = gSkillTraitValues.usSVTrackerMaxRange * trackerskill;
const INT32& sSelectedSoldierGridNo = MercPtrs[gusSelectedSoldier]->sGridNo;
+2 -2
View File
@@ -245,7 +245,7 @@ INT32 InternalInitFace( UINT8 usMercProfileID, UINT8 ubSoldierID, UINT32 uiInitF
// SANDRO - old/new traits check (I am not sure if this is used at all)
if ( gGameOptions.fNewTraitSystem )
{
if ( ProfileHasSkillTrait( TEX_UB, RANGER_NT ) > 0 )
if ( ProfileHasSkillTrait( TEX_UB, SURVIVAL_NT ) > 0 )
{
sprintf( VObjectDesc.ImageFile, "FACES\\B%dc.sti", TEX_UB );
}
@@ -668,7 +668,7 @@ void GetFaceRelativeCoordinates( FACETYPE *pFace, UINT16 *pusEyesX, UINT16 *pusE
if ( gGameOptions.fNewTraitSystem )
{
if( usMercProfileID == TEX_UB && ( gMercProfiles[ TEX_UB ].bSkillTraits[0] == RANGER_NT || gMercProfiles[ TEX_UB ].bSkillTraits[1] == RANGER_NT ) )
if( usMercProfileID == TEX_UB && ( gMercProfiles[ TEX_UB ].bSkillTraits[0] == SURVIVAL_NT || gMercProfiles[ TEX_UB ].bSkillTraits[1] == SURVIVAL_NT ) )
{
usEyesX = 13;
usEyesY = 34;
+1
View File
@@ -1880,6 +1880,7 @@ enum
// Flugente: added radio operator
IMP_RADIO_OPERATOR,
IMP_SURVIVAL,
// silversurfer: added sidearm for standard weapons. Special weapons should come from traits.
IMP_SIDEARM,
+8 -50
View File
@@ -9159,24 +9159,15 @@ void WaterDamage( SOLDIERTYPE *pSoldier )
// and 0% //1% for medium water
if ( pSoldier->bCamo > 0 )
{
if ( HAS_SKILL_TRAIT( pSoldier, RANGER_NT ) )
if ( HAS_SKILL_TRAIT( pSoldier, SURVIVAL_NT ) )
{
if ( pSoldier->MercInDeepWater( ) )
{
pSoldier->bCamo -= (Chance(__max(0, 100 - gSkillTraitValues.ubRACamoWornountSpeedReduction * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ))) ? 1 : 0 );
//pSoldier->bCamo -= (Chance(__max(0, 100 - gSkillTraitValues.ubRACamoWornountSpeedReduction * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ))) ? 1 : 0 );
}
/* else
{
pSoldier->bCamo -= (Chance(__max(0, 100 - gSkillTraitValues.ubRACamoWornountSpeedReduction * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ))) ? 1 : 0 );
}*/
pSoldier->bCamo -= (Chance( __max( 0, 100 - gSkillTraitValues.ubSVCamoWornountSpeedReduction * NUM_SKILL_TRAITS( pSoldier, SURVIVAL_NT ) ) ) ? 1 : 0);
}
else
{
if ( pSoldier->MercInDeepWater( ) )
pSoldier->bCamo = __max( 0, pSoldier->bCamo - 1 ); // 2
//else
// pSoldier->bCamo = __max( 0, pSoldier->bCamo - 1 );
}
if ( pSoldier->bCamo <= 0 )
@@ -9189,24 +9180,15 @@ void WaterDamage( SOLDIERTYPE *pSoldier )
}
if ( pSoldier->urbanCamo > 0 )
{
if ( HAS_SKILL_TRAIT( pSoldier, RANGER_NT ) )
if ( HAS_SKILL_TRAIT( pSoldier, SURVIVAL_NT ) )
{
if ( pSoldier->MercInDeepWater( ) )
{
pSoldier->urbanCamo -= (Chance(__max(0, 100 - gSkillTraitValues.ubRACamoWornountSpeedReduction * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ))) ? 1 : 0 );
//pSoldier->urbanCamo -= (Chance(__max(0, 100 - gSkillTraitValues.ubRACamoWornountSpeedReduction * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ))) ? 1 : 0 );
}
/* else
{
pSoldier->urbanCamo -= (Chance(__max(0, 100 - gSkillTraitValues.ubRACamoWornountSpeedReduction * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ))) ? 1 : 0 );
}*/
pSoldier->urbanCamo -= (Chance( __max( 0, 100 - gSkillTraitValues.ubSVCamoWornountSpeedReduction * NUM_SKILL_TRAITS( pSoldier, SURVIVAL_NT ) ) ) ? 1 : 0);
}
else
{
if ( pSoldier->MercInDeepWater( ) )
pSoldier->urbanCamo = __max( 0, pSoldier->urbanCamo - 1); // 2
//else
// pSoldier->urbanCamo = __max( 0, pSoldier->urbanCamo - 1);
}
if ( pSoldier->urbanCamo <= 0 )
@@ -9218,17 +9200,10 @@ void WaterDamage( SOLDIERTYPE *pSoldier )
}
if ( pSoldier->desertCamo > 0 )
{
if ( HAS_SKILL_TRAIT( pSoldier, RANGER_NT ) )
if ( HAS_SKILL_TRAIT( pSoldier, SURVIVAL_NT ) )
{
if ( pSoldier->MercInDeepWater( ) )
{
pSoldier->desertCamo -= (Chance(__max(0, 100 - gSkillTraitValues.ubRACamoWornountSpeedReduction * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ))) ? 1 : 0 );
//pSoldier->desertCamo -= (Chance(__max(0, 100 - gSkillTraitValues.ubRACamoWornountSpeedReduction * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ))) ? 1 : 0 );
}
/* else
{
pSoldier->desertCamo -= (Chance(__max(0, 100 - gSkillTraitValues.ubRACamoWornountSpeedReduction * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ))) ? 1 : 0 );
}*/
pSoldier->desertCamo -= (Chance( __max( 0, 100 - gSkillTraitValues.ubSVCamoWornountSpeedReduction * NUM_SKILL_TRAITS( pSoldier, SURVIVAL_NT ) ) ) ? 1 : 0);
}
else
{
@@ -9247,24 +9222,15 @@ void WaterDamage( SOLDIERTYPE *pSoldier )
}
if ( pSoldier->snowCamo > 0 )
{
if ( HAS_SKILL_TRAIT( pSoldier, RANGER_NT ) )
if ( HAS_SKILL_TRAIT( pSoldier, SURVIVAL_NT ) )
{
if ( pSoldier->MercInDeepWater( ) )
{
pSoldier->snowCamo -= (Chance(__max(0, 100 - gSkillTraitValues.ubRACamoWornountSpeedReduction * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ))) ? 1 : 0 );
//pSoldier->snowCamo -= (Chance(__max(0, 100 - gSkillTraitValues.ubRACamoWornountSpeedReduction * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ))) ? 1 : 0 );
}
/* else
{
pSoldier->snowCamo -= (Chance(__max(0, 100 - gSkillTraitValues.ubRACamoWornountSpeedReduction * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ))) ? 1 : 0 );
}*/
pSoldier->snowCamo -= (Chance( __max( 0, 100 - gSkillTraitValues.ubSVCamoWornountSpeedReduction * NUM_SKILL_TRAITS( pSoldier, SURVIVAL_NT ) ) ) ? 1 : 0);
}
else
{
if ( pSoldier->MercInDeepWater( ) )
pSoldier->snowCamo = __max( 0, pSoldier->snowCamo - 1); // 2
//else
// pSoldier->snowCamo = __max( 0, pSoldier->snowCamo - 1);
}
if ( pSoldier->snowCamo <= 0 )
@@ -9283,8 +9249,6 @@ void WaterDamage( SOLDIERTYPE *pSoldier )
{
if ( pSoldier->MercInDeepWater( ) )
pSoldier->bCamo = __max( 0, pSoldier->bCamo - 1 ); // 2
//else
// pSoldier->bCamo = __max( 0, pSoldier->bCamo - 1 );
if ( (pSoldier->bCamo)== 0)
{
@@ -9297,8 +9261,6 @@ void WaterDamage( SOLDIERTYPE *pSoldier )
{
if ( pSoldier->MercInDeepWater( ) )
pSoldier->urbanCamo = __max( 0, pSoldier->urbanCamo - 1); // 2
//else
// pSoldier->urbanCamo = __max( 0, pSoldier->urbanCamo - 1);
if ( (pSoldier->urbanCamo)== 0)
{
@@ -9310,8 +9272,6 @@ void WaterDamage( SOLDIERTYPE *pSoldier )
{
if ( pSoldier->MercInDeepWater( ) )
pSoldier->desertCamo = __max( 0, pSoldier->desertCamo - 1); // 2
//else
// pSoldier->desertCamo = __max( 0, pSoldier->desertCamo - 1);
if ( (pSoldier->desertCamo)== 0)
{
@@ -9323,8 +9283,6 @@ void WaterDamage( SOLDIERTYPE *pSoldier )
{
if ( pSoldier->MercInDeepWater( ) )
pSoldier->snowCamo = __max( 0, pSoldier->snowCamo - 1); // 2
//else
// pSoldier->snowCamo = __max( 0, pSoldier->snowCamo - 1);
if ( (pSoldier->snowCamo)== 0)
{
+2 -2
View File
@@ -1541,10 +1541,10 @@ INT16 GetBreathPerAP( SOLDIERTYPE *pSoldier, UINT16 usAnimState )
if( sBreathPerAP < 0 && ( pSoldier->pathing.bLevel || !FindStructure( pSoldier->sGridNo, STRUCTURE_ROOF ) ) && pSoldier->bBreath > 1)
{
// Added a feature to reduce rain effect on regaining breath with Ranger trait - SANDRO
if( HAS_SKILL_TRAIT( pSoldier, RANGER_NT ) && ( gGameOptions.fNewTraitSystem ))
if ( HAS_SKILL_TRAIT( pSoldier, SURVIVAL_NT ) && (gGameOptions.fNewTraitSystem) )
{
INT16 sBreathGainPenalty = 0;
sBreathGainPenalty = (INT16)((gGameExternalOptions.ubBreathGainReductionPerRainIntensity * (100 - gSkillTraitValues.ubRAWeatherPenaltiesReduction * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ))) / 100);
sBreathGainPenalty = (INT16)((gGameExternalOptions.ubBreathGainReductionPerRainIntensity * (100 - gSkillTraitValues.ubSVWeatherPenaltiesReduction * NUM_SKILL_TRAITS( pSoldier, SURVIVAL_NT ))) / 100);
sBreathGainPenalty = min( max( 0, sBreathGainPenalty ), 100); // keep it 0-100%
sBreathPerAP -= (INT16)( sBreathPerAP * gbCurrentRainIntensity * sBreathGainPenalty /100 );
}
+73 -58
View File
@@ -21264,7 +21264,7 @@ BOOLEAN DoesSoldierWearGasMask( SOLDIERTYPE *pSoldier )//dnl ch40 200909
BOOLEAN HAS_SKILL_TRAIT( SOLDIERTYPE * pSoldier, UINT8 uiSkillTraitNumber )
{
if ( pSoldier == NULL )
return(FALSE);
return FALSE;
// Flugente: compatibility with skills
if ( uiSkillTraitNumber == VARIOUSSKILLS )
@@ -21284,40 +21284,28 @@ BOOLEAN HAS_SKILL_TRAIT( SOLDIERTYPE * pSoldier, UINT8 uiSkillTraitNumber )
// bMaxMajorTraits++;
//}
for ( INT8 bCnt = 0; bCnt < min( 30, bMaxTraits ); bCnt++ )
for ( INT8 bCnt = 0; bCnt < min( 30, bMaxTraits ); ++bCnt )
{
if ( TwoStagedTrait( uiSkillTraitNumber ) )
{
if ( pSoldier->stats.ubSkillTraits[bCnt] == uiSkillTraitNumber )
{
return(TRUE);
}
else if ( TwoStagedTrait( pSoldier->stats.ubSkillTraits[bCnt] ) )
{
bNumMajorTraitsCounted++;
}
// if we exceeded the allowed number of major traits, ignore the rest of them
if ( bNumMajorTraitsCounted >= min( 20, bMaxMajorTraits ) )
{
break;
}
}
else
{
if ( pSoldier->stats.ubSkillTraits[bCnt] == uiSkillTraitNumber )
{
return(TRUE);
}
}
if ( pSoldier->stats.ubSkillTraits[bCnt] == uiSkillTraitNumber )
return(TRUE);
if ( MajorTrait( pSoldier->stats.ubSkillTraits[bCnt] ) )
++bNumMajorTraitsCounted;
// if we exceeded the allowed number of major traits, ignore the rest of them
if ( bNumMajorTraitsCounted > min( 20, bMaxMajorTraits ) )
break;
}
}
else
{
if ( pSoldier->stats.ubSkillTraits[0] == uiSkillTraitNumber )
return(TRUE);
if ( pSoldier->stats.ubSkillTraits[1] == uiSkillTraitNumber )
return(TRUE);
}
return(FALSE);
}
@@ -21341,53 +21329,40 @@ INT8 NUM_SKILL_TRAITS( SOLDIERTYPE * pSoldier, UINT8 uiSkillTraitNumber )
// bMaxMajorTraits++;
//}
for ( INT8 bCnt = 0; bCnt < min( 30, bMaxTraits ); bCnt++ )
for ( INT8 bCnt = 0; bCnt < min( 30, bMaxTraits ); ++bCnt )
{
if ( TwoStagedTrait( uiSkillTraitNumber ) )
{
if ( pSoldier->stats.ubSkillTraits[bCnt] == uiSkillTraitNumber )
{
bNumberOfTraits++;
bNumMajorTraitsCounted++;
}
else if ( TwoStagedTrait( pSoldier->stats.ubSkillTraits[bCnt] ) )
{
bNumMajorTraitsCounted++;
}
// if we exceeded the allowed number of major traits, ignore the rest of them
if ( bNumMajorTraitsCounted >= min( 20, bMaxMajorTraits ) )
{
break;
}
}
else
{
if ( pSoldier->stats.ubSkillTraits[bCnt] == uiSkillTraitNumber )
{
bNumberOfTraits++;
}
}
if ( pSoldier->stats.ubSkillTraits[bCnt] == uiSkillTraitNumber )
++bNumberOfTraits;
if ( MajorTrait( pSoldier->stats.ubSkillTraits[bCnt] ) )
++bNumMajorTraitsCounted;
// if we exceeded the allowed number of major traits, ignore the rest of them
if ( bNumMajorTraitsCounted > min( 20, bMaxMajorTraits ) )
break;
}
// cannot have more than one same minor trait
if ( !TwoStagedTrait( uiSkillTraitNumber ) )
return (min( 1, bNumberOfTraits ));
else
return (min( 2, bNumberOfTraits ));
return (min( 2, bNumberOfTraits ));
}
else
{
if ( pSoldier->stats.ubSkillTraits[0] == uiSkillTraitNumber )
bNumberOfTraits++;
++bNumberOfTraits;
if ( pSoldier->stats.ubSkillTraits[1] == uiSkillTraitNumber )
bNumberOfTraits++;
++bNumberOfTraits;
// Electronics, Ambidextrous and Camouflaged can only be of one grade
if ( uiSkillTraitNumber == ELECTRONICS_OT ||
uiSkillTraitNumber == AMBIDEXT_OT ||
uiSkillTraitNumber == CAMOUFLAGED_OT )
return (min( 1, bNumberOfTraits ));
else
return (bNumberOfTraits);
return (bNumberOfTraits);
}
}
@@ -22068,7 +22043,47 @@ BOOLEAN DecideAltAnimForBigMerc( SOLDIERTYPE * pSoldier )
BOOLEAN TwoStagedTrait( UINT8 uiSkillTraitNumber )
{
return(uiSkillTraitNumber > 0 && (uiSkillTraitNumber <= NUM_ORIGINAL_MAJOR_TRAITS || uiSkillTraitNumber == COVERT_NT));
if ( gGameOptions.fNewTraitSystem )
{
if ( uiSkillTraitNumber > 0 )
{
// covert ops is a major trait that is in a different location
if ( uiSkillTraitNumber == COVERT_NT )
return TRUE;
// other traits below NUM_ORIGINAL_MAJOR_TRAITS are all major
if ( uiSkillTraitNumber <= NUM_ORIGINAL_MAJOR_TRAITS )
return TRUE;
}
}
else
{
if ( uiSkillTraitNumber == IMP_SKILL_TRAITS__ELECTRONICS ||
uiSkillTraitNumber == IMP_SKILL_TRAITS__AMBIDEXTROUS ||
uiSkillTraitNumber == IMP_SKILL_TRAITS__CAMO )
return(FALSE);
return TRUE;
}
return FALSE;
}
// determine if this is a major trait (no longer all two-staged)
BOOLEAN MajorTrait( UINT8 uiSkillTraitNumber )
{
if ( uiSkillTraitNumber > 0 )
{
// covert ops is a major trait that is in a different location
if ( uiSkillTraitNumber == COVERT_NT )
return TRUE;
// other traits below NUM_ORIGINAL_MAJOR_TRAITS are all major
if ( uiSkillTraitNumber <= NUM_ORIGINAL_MAJOR_TRAITS )
return TRUE;
}
return FALSE;
}
BOOLEAN GetRadioOperatorSignal( UINT8 usOwner, INT32* psTargetGridNo )
@@ -22309,7 +22324,7 @@ UINT16 GridNoSpotterCTHBonus( SOLDIERTYPE* pSniper, INT32 sGridNo, UINT bTeam )
// -> value between 0 and 2000
value = (value * effectivity) / 100;
// longer spotting gives a linear bonus - up to 100% -> value between 0 and 4600
// longer spotting gives a linear bonus - up to 100% -> value between 0 and 4000
value = (value * min( pSoldier->usSkillCounter[SOLDIER_COUNTER_SPOTTER], 2 * gGameExternalOptions.usSpotterPreparationTurns )) / gGameExternalOptions.usSpotterPreparationTurns;
// reasonable values: 0 to gGameExternalOptions.usSpotterMaxCTHBoost
+1
View File
@@ -2009,6 +2009,7 @@ BOOLEAN DecideAltAnimForBigMerc( SOLDIERTYPE * pSoldier );
// added by Flugente
BOOLEAN TwoStagedTrait( UINT8 uiSkillTraitNumber ); // determine if this (new) trait has two stages
BOOLEAN MajorTrait( UINT8 uiSkillTraitNumber ); // determine if this is a major trait
BOOLEAN GetRadioOperatorSignal(UINT8 usOwner, INT32* psTargetGridNo); // retrieve the gridno of a radio operator who (or whose team) ordered an artillery strike
BOOLEAN IsValidArtilleryOrderSector( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT8 bTeam ); // can an artillery strike be ordered FROM this sector
BOOLEAN SectorJammed();
+1 -1
View File
@@ -4349,7 +4349,7 @@ BOOLEAN AssignTraitsToSoldier( SOLDIERTYPE *pSoldier, SOLDIERCREATE_STRUCT *pCre
if ( zSoldierProfile[type][pSoldier->usSoldierProfile].uiTrait[2] > 0 )
{
// we have to make sure that not all 3 traits are major traits - if that happens, we ignore the third one
if ( TwoStagedTrait( pSoldier->stats.ubSkillTraits[0] ) && TwoStagedTrait( pSoldier->stats.ubSkillTraits[1] ) && TwoStagedTrait( zSoldierProfile[type][pSoldier->usSoldierProfile].uiTrait[2] ) )
if ( MajorTrait( pSoldier->stats.ubSkillTraits[0] ) && MajorTrait( pSoldier->stats.ubSkillTraits[1] ) && MajorTrait( zSoldierProfile[type][pSoldier->usSoldierProfile].uiTrait[2] ) )
;
else
{
+17 -36
View File
@@ -2929,48 +2929,29 @@ INT8 ProfileHasSkillTrait( INT32 ubProfileID, INT8 bSkillTrait )
// bMaxMajorTraits++;
//}
for ( INT8 bCnt = 0; bCnt < bMaxTraits; ++bCnt )
{
if ( gMercProfiles[ubProfileID].bSkillTraits[bCnt] == bSkillTrait )
++bNumTraits;
if ( MajorTrait( gMercProfiles[ubProfileID].bSkillTraits[bCnt] ) )
++bNumMajorTraitsCounted;
// if we exceeded the allowed number of major traits, ignore the rest of them
if ( bNumMajorTraitsCounted > bMaxMajorTraits )
break;
}
if ( TwoStagedTrait( bSkillTrait ) )
{
for ( INT8 bCnt = 0; bCnt < bMaxTraits; ++bCnt )
{
if ( gMercProfiles[ubProfileID].bSkillTraits[bCnt] == bSkillTrait )
{
++bNumTraits;
++bNumMajorTraitsCounted;
}
else if ( TwoStagedTrait( gMercProfiles[ubProfileID].bSkillTraits[bCnt] ) )
{
++bNumMajorTraitsCounted;
}
// if we exceeded the allowed number of major traits, ignore the rest of them
if ( bNumMajorTraitsCounted >= bMaxMajorTraits )
{
break;
}
}
// cannot have more than 2 grades of a major traits
return (min( 2, bNumTraits ));
}
else
{
for ( INT8 bCnt = 0; bCnt < bMaxTraits; ++bCnt )
{
if ( gMercProfiles[ubProfileID].bSkillTraits[bCnt] == bSkillTrait )
{
++bNumTraits;
}
}
// cannot have more than 1 grade of minor traits
return (min( 1, bNumTraits ));
}
return (min( 1, bNumTraits ));
}
else
{
if (gMercProfiles[ubProfileID].bSkillTraits[ 0 ] == bSkillTrait)
++bNumTraits;
if (gMercProfiles[ubProfileID].bSkillTraits[ 1 ] == bSkillTrait)
++bNumTraits;
@@ -2979,7 +2960,7 @@ INT8 ProfileHasSkillTrait( INT32 ubProfileID, INT8 bSkillTrait )
bSkillTrait == AMBIDEXT_OT ||
bSkillTrait == CAMOUFLAGED_OT )
return ( min(1, bNumTraits) );
else
return ( bNumTraits );
return ( bNumTraits );
}
}
+2 -2
View File
@@ -349,9 +349,9 @@ INT16 AdjustMaxSightRangeForEnvEffects( SOLDIERTYPE *pSoldier, INT8 bLightLevel,
//Added a feature reducing weather penalty for ranger trait - SANDRO
INT16 sWeatherPenalty = 0; // percent vision reduction 0-100%
sWeatherPenalty = min( (max( 0, (gGameExternalOptions.ubVisDistDecreasePerRainIntensity * gbCurrentRainIntensity))), 100) ;
if( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, RANGER_NT ) )
if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, SURVIVAL_NT ) )
{
sWeatherPenalty = (sWeatherPenalty * ( 100 - (gSkillTraitValues.ubRAWeatherPenaltiesReduction * NUM_SKILL_TRAITS( pSoldier, RANGER_NT ))) ) / 100;
sWeatherPenalty = (sWeatherPenalty * (100 - (gSkillTraitValues.ubSVWeatherPenaltiesReduction * NUM_SKILL_TRAITS( pSoldier, SURVIVAL_NT )))) / 100;
sWeatherPenalty = min( (max( 0, sWeatherPenalty)), 100 ); // keep it in 0-100 range
}
+3 -2
View File
@@ -161,15 +161,16 @@ typedef enum
SCOUTING_NT, // 19
// Flugente: new traits have to go here, even if they are major traits, as otherwise the existing traits in profiles get mixed up
COVERT_NT, // 20
COVERT_NT, // 20 // a major trait
RADIO_OPERATOR_NT, //21 // a minor trait
SNITCH_NT, //22 // a minor trait
SURVIVAL_NT, //23 // a minor trait
NUM_SKILLTRAITS_NT
} SkillTraitNew;
#define NUM_MAJOR_TRAITS 10
#define NUM_MINOR_TRAITS 12
#define NUM_MINOR_TRAITS 13
#define NUM_ORIGINAL_MAJOR_TRAITS 9