mirror of
https://github.com/1dot13/source.git
synced 2026-08-26 14:30:26 +02:00
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:
@@ -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
@@ -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;
|
||||
|
||||
@@ -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
@@ -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
@@ -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 );
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user