mirror of
https://github.com/1dot13/source.git
synced 2026-09-09 14:46:05 +02:00
New feature: mercs with a gun-related trait (New trait system only) can use the 'Focus' skill via the skill menu ([$] in tactical). This skill grants an interrupt modifier bonus in the targeted area, but also a penalty outside of it.
For more info, see http://thepit.ja-galaxy-forum.com/index.php?t=msg&th=20659&goto=350400&#msg_350400 git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8432 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
@@ -2451,6 +2451,8 @@ void LoadSkillTraitsExternalSettings()
|
|||||||
gSkillTraitValues.ubSNDamageBonusFromNumClicks = iniReader.ReadInteger("Sniper","GUN_DAMAGE_BONUS_FROM_NUM_CLICKS", 4, 0, 8);
|
gSkillTraitValues.ubSNDamageBonusFromNumClicks = iniReader.ReadInteger("Sniper","GUN_DAMAGE_BONUS_FROM_NUM_CLICKS", 4, 0, 8);
|
||||||
gSkillTraitValues.ubSNChamberRoundAPsReduction = iniReader.ReadInteger("Sniper","CHAMBER_ROUND_APS_REDUCTION", 25, 0, 45);
|
gSkillTraitValues.ubSNChamberRoundAPsReduction = iniReader.ReadInteger("Sniper","CHAMBER_ROUND_APS_REDUCTION", 25, 0, 45);
|
||||||
gSkillTraitValues.ubSNAimClicksAdded = iniReader.ReadInteger("Sniper","POSSIBLE_AIM_CLICK_ADDED_RIFLES", 1, 0, 3);
|
gSkillTraitValues.ubSNAimClicksAdded = iniReader.ReadInteger("Sniper","POSSIBLE_AIM_CLICK_ADDED_RIFLES", 1, 0, 3);
|
||||||
|
gSkillTraitValues.ubSNFocusRadius = iniReader.ReadInteger( "Sniper", "FOCUS_SKILL_RADIUS", 5, 1, 30 );
|
||||||
|
gSkillTraitValues.sSNFocusInterruptBonus = iniReader.ReadInteger( "Sniper", "FOCUS_SKILL_INTERRUPT_BONUS", 2, 1, 10 );
|
||||||
|
|
||||||
// RANGER
|
// RANGER
|
||||||
gSkillTraitValues.ubRABonusCtHRifles = iniReader.ReadInteger("Ranger","BONUS_CTH_RIFLES", 5, 0, 100);
|
gSkillTraitValues.ubRABonusCtHRifles = iniReader.ReadInteger("Ranger","BONUS_CTH_RIFLES", 5, 0, 100);
|
||||||
|
|||||||
@@ -1730,6 +1730,8 @@ typedef struct
|
|||||||
UINT8 ubSNDamageBonusFromNumClicks;
|
UINT8 ubSNDamageBonusFromNumClicks;
|
||||||
UINT8 ubSNChamberRoundAPsReduction;
|
UINT8 ubSNChamberRoundAPsReduction;
|
||||||
UINT8 ubSNAimClicksAdded;
|
UINT8 ubSNAimClicksAdded;
|
||||||
|
UINT8 ubSNFocusRadius;
|
||||||
|
INT8 sSNFocusInterruptBonus;
|
||||||
|
|
||||||
// RANGER
|
// RANGER
|
||||||
UINT8 ubRABonusCtHRifles;
|
UINT8 ubRABonusCtHRifles;
|
||||||
|
|||||||
@@ -7288,6 +7288,12 @@ void AssignPersonnelSkillTraitHelpText( UINT8 ubTraitNumber, BOOLEAN fExpertLeve
|
|||||||
swprintf( atStr, gzIMPMajorTraitsHelpTextsAutoWeapons[6]);
|
swprintf( atStr, gzIMPMajorTraitsHelpTextsAutoWeapons[6]);
|
||||||
wcscat( apStr, atStr );
|
wcscat( apStr, atStr );
|
||||||
}
|
}
|
||||||
|
// Flugente: focus is a skill that can be used by multiple traits. For simplicity, the ini values are in the sniper trait section
|
||||||
|
if ( gSkillTraitValues.ubSNFocusRadius != 0 && gSkillTraitValues.sSNFocusInterruptBonus != 0 )
|
||||||
|
{
|
||||||
|
swprintf( atStr, gzIMPMajorTraitsHelpTextsSniper[19], gSkillTraitValues.sSNFocusInterruptBonus );
|
||||||
|
wcscat( apStr, atStr );
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case HEAVY_WEAPONS_NT:
|
case HEAVY_WEAPONS_NT:
|
||||||
@@ -7333,6 +7339,12 @@ void AssignPersonnelSkillTraitHelpText( UINT8 ubTraitNumber, BOOLEAN fExpertLeve
|
|||||||
swprintf( atStr, gzIMPMajorTraitsHelpTextsHeavyWeapons[7], ( gSkillTraitValues.ubHWDamageBonusPercentForHW * (fExpertLevel ? 2 : 1)), sSpecialCharacters[0]);
|
swprintf( atStr, gzIMPMajorTraitsHelpTextsHeavyWeapons[7], ( gSkillTraitValues.ubHWDamageBonusPercentForHW * (fExpertLevel ? 2 : 1)), sSpecialCharacters[0]);
|
||||||
wcscat( apStr, atStr );
|
wcscat( apStr, atStr );
|
||||||
}
|
}
|
||||||
|
// Flugente: focus is a skill that can be used by multiple traits. For simplicity, the ini values are in the sniper trait section
|
||||||
|
if ( gSkillTraitValues.ubSNFocusRadius != 0 && gSkillTraitValues.sSNFocusInterruptBonus != 0 )
|
||||||
|
{
|
||||||
|
swprintf( atStr, gzIMPMajorTraitsHelpTextsSniper[19], gSkillTraitValues.sSNFocusInterruptBonus );
|
||||||
|
wcscat( apStr, atStr );
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SNIPER_NT:
|
case SNIPER_NT:
|
||||||
@@ -7401,6 +7413,13 @@ void AssignPersonnelSkillTraitHelpText( UINT8 ubTraitNumber, BOOLEAN fExpertLeve
|
|||||||
}
|
}
|
||||||
wcscat( apStr, atStr );
|
wcscat( apStr, atStr );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( gSkillTraitValues.ubSNFocusRadius != 0 && gSkillTraitValues.sSNFocusInterruptBonus != 0 )
|
||||||
|
{
|
||||||
|
swprintf( atStr, gzIMPMajorTraitsHelpTextsSniper[19], gSkillTraitValues.sSNFocusInterruptBonus );
|
||||||
|
wcscat( apStr, atStr );
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case RANGER_NT:
|
case RANGER_NT:
|
||||||
@@ -7452,6 +7471,12 @@ void AssignPersonnelSkillTraitHelpText( UINT8 ubTraitNumber, BOOLEAN fExpertLeve
|
|||||||
swprintf( atStr, gzIMPMajorTraitsHelpTextsRanger[6], ( gSkillTraitValues.ubRAEffectiveRangeBonusShotguns * (fExpertLevel ? 2 : 1)), sSpecialCharacters[0]);
|
swprintf( atStr, gzIMPMajorTraitsHelpTextsRanger[6], ( gSkillTraitValues.ubRAEffectiveRangeBonusShotguns * (fExpertLevel ? 2 : 1)), sSpecialCharacters[0]);
|
||||||
wcscat( apStr, atStr );
|
wcscat( apStr, atStr );
|
||||||
}
|
}
|
||||||
|
// Flugente: focus is a skill that can be used by multiple traits. For simplicity, the ini values are in the sniper trait section
|
||||||
|
if ( gSkillTraitValues.ubSNFocusRadius != 0 && gSkillTraitValues.sSNFocusInterruptBonus != 0 )
|
||||||
|
{
|
||||||
|
swprintf( atStr, gzIMPMajorTraitsHelpTextsSniper[19], gSkillTraitValues.sSNFocusInterruptBonus );
|
||||||
|
wcscat( apStr, atStr );
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -7505,6 +7530,12 @@ void AssignPersonnelSkillTraitHelpText( UINT8 ubTraitNumber, BOOLEAN fExpertLeve
|
|||||||
|
|
||||||
wcscat( apStr, atStr );
|
wcscat( apStr, atStr );
|
||||||
}
|
}
|
||||||
|
// Flugente: focus is a skill that can be used by multiple traits. For simplicity, the ini values are in the sniper trait section
|
||||||
|
if ( gSkillTraitValues.ubSNFocusRadius != 0 && gSkillTraitValues.sSNFocusInterruptBonus != 0 )
|
||||||
|
{
|
||||||
|
swprintf( atStr, gzIMPMajorTraitsHelpTextsSniper[19], gSkillTraitValues.sSNFocusInterruptBonus );
|
||||||
|
wcscat( apStr, atStr );
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MARTIAL_ARTS_NT:
|
case MARTIAL_ARTS_NT:
|
||||||
|
|||||||
@@ -2321,6 +2321,7 @@ BOOLEAN SOLDIERTYPE::Load(HWFILE hFile)
|
|||||||
numBytesRead = ReadFieldByField( hFile, &this->sDiseasePoints, sizeof(sDiseasePoints), sizeof(INT32), numBytesRead );
|
numBytesRead = ReadFieldByField( hFile, &this->sDiseasePoints, sizeof(sDiseasePoints), sizeof(INT32), numBytesRead );
|
||||||
numBytesRead = ReadFieldByField( hFile, &this->sDiseaseFlag, sizeof(sDiseaseFlag), sizeof(UINT8), numBytesRead );
|
numBytesRead = ReadFieldByField( hFile, &this->sDiseaseFlag, sizeof(sDiseaseFlag), sizeof(UINT8), numBytesRead );
|
||||||
numBytesRead = ReadFieldByField( hFile, &this->ubFiller, sizeof(ubFiller), sizeof(UINT8), numBytesRead );
|
numBytesRead = ReadFieldByField( hFile, &this->ubFiller, sizeof(ubFiller), sizeof(UINT8), numBytesRead );
|
||||||
|
numBytesRead = ReadFieldByField( hFile, &this->sFocusGridNo, sizeof(sFocusGridNo), sizeof(INT32), numBytesRead );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -2335,6 +2336,9 @@ BOOLEAN SOLDIERTYPE::Load(HWFILE hFile)
|
|||||||
this->sDiseaseFlag[i] = 0;
|
this->sDiseaseFlag[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
buffer += sizeof(sFocusGridNo);
|
||||||
|
while ( (buffer % 4) > 0 ) ++buffer;
|
||||||
|
|
||||||
numBytesRead = ReadFieldByField( hFile, &this->ubFiller, sizeof(ubFiller), sizeof(UINT8), numBytesRead );
|
numBytesRead = ReadFieldByField( hFile, &this->ubFiller, sizeof(ubFiller), sizeof(UINT8), numBytesRead );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2376,6 +2380,11 @@ BOOLEAN SOLDIERTYPE::Load(HWFILE hFile)
|
|||||||
while((buffer%4) > 0)
|
while((buffer%4) > 0)
|
||||||
buffer++;
|
buffer++;
|
||||||
|
|
||||||
|
for ( int i = 0; i < sizeof(sFocusGridNo); ++i )
|
||||||
|
buffer++;
|
||||||
|
while ( (buffer % 4) > 0 )
|
||||||
|
buffer++;
|
||||||
|
|
||||||
// we now have to substract the 7 bytes we read from the old ubFiller, but have to account for usAISkillUse
|
// we now have to substract the 7 bytes we read from the old ubFiller, but have to account for usAISkillUse
|
||||||
buffer -= 6;
|
buffer -= 6;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2254,6 +2254,13 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Flugente: focus trait
|
||||||
|
if ( MercPtrs[pFace->ubSoldierID]->usSoldierFlagMask2 & SOLDIER_TRAIT_FOCUS )
|
||||||
|
{
|
||||||
|
DoRightIcon( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons, 17 );
|
||||||
|
bNumRightIcons++;
|
||||||
|
}
|
||||||
|
|
||||||
// Flugente: disease
|
// Flugente: disease
|
||||||
if ( MercPtrs[pFace->ubSoldierID]->HasDisease(TRUE, FALSE, TRUE) )
|
if ( MercPtrs[pFace->ubSoldierID]->HasDisease(TRUE, FALSE, TRUE) )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -230,7 +230,7 @@ SkillSelection::Setup( UINT32 aVal )
|
|||||||
pOption = new POPUP_OPTION(&std::wstring( pStr ), new popupCallbackFunction<void,UINT32>( &Wrapper_Function_SkillSelection, uiCounter ) );
|
pOption = new POPUP_OPTION(&std::wstring( pStr ), new popupCallbackFunction<void,UINT32>( &Wrapper_Function_SkillSelection, uiCounter ) );
|
||||||
|
|
||||||
// if we cannot perform this skill, grey it out
|
// if we cannot perform this skill, grey it out
|
||||||
if ( !(pSoldier->CanUseSkill(uiCounter, TRUE)) )
|
if ( !(pSoldier->CanUseSkill( uiCounter, TRUE, sTraitsMenuTargetGridNo )) )
|
||||||
{
|
{
|
||||||
// Set this option off.
|
// Set this option off.
|
||||||
pOption->setAvail(new popupCallbackFunction<bool,void*>( &Popup_OptionOff, NULL ));
|
pOption->setAvail(new popupCallbackFunction<bool,void*>( &Popup_OptionOff, NULL ));
|
||||||
@@ -262,7 +262,7 @@ SkillSelection::Setup( UINT32 aVal )
|
|||||||
{
|
{
|
||||||
UINT8 cnt = 0;
|
UINT8 cnt = 0;
|
||||||
switch ( aVal )
|
switch ( aVal )
|
||||||
{
|
{
|
||||||
case RADIO_OPERATOR_NT:
|
case RADIO_OPERATOR_NT:
|
||||||
{
|
{
|
||||||
for(UINT32 uiCounter = SKILLS_RADIO_FIRST; uiCounter <= SKILLS_RADIO_LAST; ++uiCounter)
|
for(UINT32 uiCounter = SKILLS_RADIO_FIRST; uiCounter <= SKILLS_RADIO_LAST; ++uiCounter)
|
||||||
@@ -739,4 +739,4 @@ void TraitsMenu( INT32 usMapPos )
|
|||||||
sTraitsMenuTargetGridNo = usMapPos;
|
sTraitsMenuTargetGridNo = usMapPos;
|
||||||
|
|
||||||
gTraitSelection.Setup(0);
|
gTraitSelection.Setup(0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17276,7 +17276,7 @@ void SOLDIERTYPE::SoldierPropertyUpkeep( )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check if Soldier can use the spell skillwise, with fAPCheck = TRUE also check current APs
|
// check if Soldier can use the spell skillwise, with fAPCheck = TRUE also check current APs
|
||||||
BOOLEAN SOLDIERTYPE::CanUseSkill( INT8 iSkill, BOOLEAN fAPCheck )
|
BOOLEAN SOLDIERTYPE::CanUseSkill( INT8 iSkill, BOOLEAN fAPCheck, INT32 sGridNo )
|
||||||
{
|
{
|
||||||
if ( fAPCheck )
|
if ( fAPCheck )
|
||||||
{
|
{
|
||||||
@@ -17287,8 +17287,8 @@ BOOLEAN SOLDIERTYPE::CanUseSkill( INT8 iSkill, BOOLEAN fAPCheck )
|
|||||||
BOOLEAN canuse = FALSE;
|
BOOLEAN canuse = FALSE;
|
||||||
|
|
||||||
switch ( iSkill )
|
switch ( iSkill )
|
||||||
{
|
{
|
||||||
// radio operator
|
// radio operator
|
||||||
case SKILLS_RADIO_ARTILLERY:
|
case SKILLS_RADIO_ARTILLERY:
|
||||||
if ( (!fAPCheck || EnoughPoints( this, APBPConstants[AP_RADIO], APBPConstants[BP_RADIO], FALSE )) && CanUseRadio( ) )
|
if ( (!fAPCheck || EnoughPoints( this, APBPConstants[AP_RADIO], APBPConstants[BP_RADIO], FALSE )) && CanUseRadio( ) )
|
||||||
{
|
{
|
||||||
@@ -17317,6 +17317,16 @@ BOOLEAN SOLDIERTYPE::CanUseSkill( INT8 iSkill, BOOLEAN fAPCheck )
|
|||||||
canuse = TRUE;
|
canuse = TRUE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SKILLS_FOCUS:
|
||||||
|
// requires sniper trait, an aimed gun and only works on gridnos in our direction
|
||||||
|
if ( gGameOptions.fNewTraitSystem &&
|
||||||
|
(HAS_SKILL_TRAIT( this, AUTO_WEAPONS_NT ) || HAS_SKILL_TRAIT( this, HEAVY_WEAPONS_NT ) || HAS_SKILL_TRAIT( this, SNIPER_NT ) ||
|
||||||
|
HAS_SKILL_TRAIT( this, RANGER_NT ) || HAS_SKILL_TRAIT( this, GUNSLINGER_NT ))
|
||||||
|
&& this->inv[HANDPOS].exists( ) && Item[this->inv[HANDPOS].usItem].usItemClass & (IC_GUN | IC_LAUNCHER) && WeaponReady( this )
|
||||||
|
&& sGridNo != NOWHERE && this->ubDirection == GetDirectionFromGridNo( sGridNo, this ) )
|
||||||
|
canuse = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -17327,24 +17337,24 @@ BOOLEAN SOLDIERTYPE::CanUseSkill( INT8 iSkill, BOOLEAN fAPCheck )
|
|||||||
// use a skill. For safety reasons, this calls CanUseSkill again
|
// use a skill. For safety reasons, this calls CanUseSkill again
|
||||||
BOOLEAN SOLDIERTYPE::UseSkill( UINT8 iSkill, INT32 usMapPos, UINT8 ID )
|
BOOLEAN SOLDIERTYPE::UseSkill( UINT8 iSkill, INT32 usMapPos, UINT8 ID )
|
||||||
{
|
{
|
||||||
if ( !CanUseSkill( iSkill, TRUE ) )
|
if ( !CanUseSkill( iSkill, TRUE, usMapPos ) )
|
||||||
{
|
{
|
||||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, New113Message[MSG113_CANNOT_USE_SKILL] );
|
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, New113Message[MSG113_CANNOT_USE_SKILL] );
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ( iSkill )
|
switch ( iSkill )
|
||||||
{
|
{
|
||||||
// radio operator
|
// radio operator
|
||||||
// the call for SKILLS_RADIO_ARTILLERY is only used by the AI
|
// the call for SKILLS_RADIO_ARTILLERY is only used by the AI
|
||||||
case SKILLS_RADIO_ARTILLERY:
|
case SKILLS_RADIO_ARTILLERY:
|
||||||
{
|
{
|
||||||
UINT32 sector = 0;
|
UINT32 sector = 0;
|
||||||
if ( this->CanAnyArtilleryStrikeBeOrdered( §or ) )
|
if ( this->CanAnyArtilleryStrikeBeOrdered( §or ) )
|
||||||
{
|
{
|
||||||
return OrderArtilleryStrike( sector, usMapPos, this->bTeam );
|
return OrderArtilleryStrike( sector, usMapPos, this->bTeam );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SKILLS_RADIO_JAM:
|
case SKILLS_RADIO_JAM:
|
||||||
@@ -17372,6 +17382,20 @@ BOOLEAN SOLDIERTYPE::UseSkill( UINT8 iSkill, INT32 usMapPos, UINT8 ID )
|
|||||||
return BecomeSpotter( usMapPos );
|
return BecomeSpotter( usMapPos );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SKILLS_FOCUS:
|
||||||
|
// activating skill on same gridno again deactivates it
|
||||||
|
if ((usSoldierFlagMask2 & SOLDIER_TRAIT_FOCUS) && sFocusGridNo == usMapPos)
|
||||||
|
{
|
||||||
|
usSoldierFlagMask2 &= ~SOLDIER_TRAIT_FOCUS;
|
||||||
|
sFocusGridNo = NOWHERE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
usSoldierFlagMask2 |= SOLDIER_TRAIT_FOCUS;
|
||||||
|
sFocusGridNo = usMapPos;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -17395,15 +17419,15 @@ static CHAR16 skilldescarray[500];
|
|||||||
// print a small description of the skill if we can use it, or its requirements if we cannot
|
// print a small description of the skill if we can use it, or its requirements if we cannot
|
||||||
STR16 SOLDIERTYPE::PrintSkillDesc( INT8 iSkill )
|
STR16 SOLDIERTYPE::PrintSkillDesc( INT8 iSkill )
|
||||||
{
|
{
|
||||||
CHAR16 atStr[200];
|
|
||||||
swprintf( skilldescarray, pTraitSkillsDenialStrings[TEXT_SKILL_DENIAL_REQ] );
|
|
||||||
|
|
||||||
if ( CanUseSkill( iSkill, TRUE ) )
|
if ( CanUseSkill( iSkill, TRUE ) )
|
||||||
{
|
{
|
||||||
return pTraitSkillsMenuDescStrings[iSkill];
|
return pTraitSkillsMenuDescStrings[iSkill];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
CHAR16 atStr[200];
|
||||||
|
swprintf( skilldescarray, pTraitSkillsDenialStrings[TEXT_SKILL_DENIAL_REQ] );
|
||||||
|
|
||||||
if ( iSkill >= SKILLS_RADIO_FIRST && iSkill <= SKILLS_RADIO_LAST )
|
if ( iSkill >= SKILLS_RADIO_FIRST && iSkill <= SKILLS_RADIO_LAST )
|
||||||
{
|
{
|
||||||
swprintf( atStr, pTraitSkillsDenialStrings[TEXT_SKILL_DENIAL_X_AP], APBPConstants[AP_RADIO] );
|
swprintf( atStr, pTraitSkillsDenialStrings[TEXT_SKILL_DENIAL_X_AP], APBPConstants[AP_RADIO] );
|
||||||
@@ -17412,7 +17436,7 @@ STR16 SOLDIERTYPE::PrintSkillDesc( INT8 iSkill )
|
|||||||
|
|
||||||
switch ( iSkill )
|
switch ( iSkill )
|
||||||
{
|
{
|
||||||
// radio operator
|
// radio operator
|
||||||
case SKILLS_RADIO_ARTILLERY:
|
case SKILLS_RADIO_ARTILLERY:
|
||||||
case SKILLS_RADIO_JAM:
|
case SKILLS_RADIO_JAM:
|
||||||
case SKILLS_RADIO_SCAN_FOR_JAM:
|
case SKILLS_RADIO_SCAN_FOR_JAM:
|
||||||
@@ -17439,6 +17463,16 @@ STR16 SOLDIERTYPE::PrintSkillDesc( INT8 iSkill )
|
|||||||
wcscat( skilldescarray, atStr );
|
wcscat( skilldescarray, atStr );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SKILLS_FOCUS:
|
||||||
|
|
||||||
|
swprintf( atStr, pTraitSkillsDenialStrings[TEXT_SKILL_DENIAL_GUNTRAIT] );
|
||||||
|
wcscat( skilldescarray, atStr );
|
||||||
|
|
||||||
|
swprintf( atStr, pTraitSkillsDenialStrings[TEXT_SKILL_DENIAL_AIMEDGUN] );
|
||||||
|
wcscat(skilldescarray, atStr);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -415,6 +415,7 @@ enum
|
|||||||
#define SOLDIER_TAKEN_LARGE_HIT 0x00000800 // we recently received a lot of damage in a single hit
|
#define SOLDIER_TAKEN_LARGE_HIT 0x00000800 // we recently received a lot of damage in a single hit
|
||||||
|
|
||||||
#define SOLDIER_COVERT_NOREDISGUISE 0x00001000 // this soldier does not want to be redisguised
|
#define SOLDIER_COVERT_NOREDISGUISE 0x00001000 // this soldier does not want to be redisguised
|
||||||
|
#define SOLDIER_TRAIT_FOCUS 0x00002000 // 'focus' skill is active
|
||||||
|
|
||||||
#define SOLDIER_INTERROGATE_ALL 0x000001F8 // all interrogation flags
|
#define SOLDIER_INTERROGATE_ALL 0x000001F8 // all interrogation flags
|
||||||
// ----------------------------------------------------------------
|
// ----------------------------------------------------------------
|
||||||
@@ -574,7 +575,7 @@ enum
|
|||||||
enum{
|
enum{
|
||||||
// first skill
|
// first skill
|
||||||
SKILLS_FIRST = 0,
|
SKILLS_FIRST = 0,
|
||||||
|
|
||||||
// radio operator
|
// radio operator
|
||||||
SKILLS_RADIO_FIRST = SKILLS_FIRST,
|
SKILLS_RADIO_FIRST = SKILLS_FIRST,
|
||||||
SKILLS_RADIO_ARTILLERY = SKILLS_RADIO_FIRST,
|
SKILLS_RADIO_ARTILLERY = SKILLS_RADIO_FIRST,
|
||||||
@@ -588,7 +589,8 @@ enum{
|
|||||||
// various
|
// various
|
||||||
SKILLS_VARIOUS_FIRST,
|
SKILLS_VARIOUS_FIRST,
|
||||||
SKILLS_SPOTTER = SKILLS_VARIOUS_FIRST,
|
SKILLS_SPOTTER = SKILLS_VARIOUS_FIRST,
|
||||||
SKILLS_VARIOUS_LAST = SKILLS_SPOTTER,
|
SKILLS_FOCUS,
|
||||||
|
SKILLS_VARIOUS_LAST = SKILLS_FOCUS,
|
||||||
|
|
||||||
SKILLS_MAX,
|
SKILLS_MAX,
|
||||||
};
|
};
|
||||||
@@ -1525,10 +1527,13 @@ public:
|
|||||||
// Flugente: diseases
|
// Flugente: diseases
|
||||||
INT16 sDiseasePoints[NUM_DISEASES]; // we store the state of our diseases here
|
INT16 sDiseasePoints[NUM_DISEASES]; // we store the state of our diseases here
|
||||||
UINT8 sDiseaseFlag[NUM_DISEASES]; // we need to store some special flags for every disease
|
UINT8 sDiseaseFlag[NUM_DISEASES]; // we need to store some special flags for every disease
|
||||||
|
|
||||||
// Flugente: Decrease this filler by 1 for each new UINT8 / BOOLEAN variable, so we can maintain savegame compatibility!!
|
// Flugente: Decrease this filler by 1 for each new UINT8 / BOOLEAN variable, so we can maintain savegame compatibility!!
|
||||||
// Note that we also have to account for padding, so you might need to substract more than just the size of the new variables
|
// Note that we also have to account for padding, so you might need to substract more than just the size of the new variables
|
||||||
UINT8 ubFiller[20];
|
UINT8 ubFiller[16];
|
||||||
|
|
||||||
|
// Flugente: focus skill gridno
|
||||||
|
INT32 sFocusGridNo;
|
||||||
|
|
||||||
UINT32 usSoldierFlagMask2; // anv: another usSoldierFlagMask
|
UINT32 usSoldierFlagMask2; // anv: another usSoldierFlagMask
|
||||||
|
|
||||||
@@ -1858,7 +1863,7 @@ public:
|
|||||||
// Flugente: functions for skill usage
|
// Flugente: functions for skill usage
|
||||||
// traits can allow use of certain skills
|
// traits can allow use of certain skills
|
||||||
// check if Soldier can use the spell skillwise, with fAPCheck = TRUE also check current APs
|
// check if Soldier can use the spell skillwise, with fAPCheck = TRUE also check current APs
|
||||||
BOOLEAN CanUseSkill( INT8 iSkill, BOOLEAN fAPCheck = TRUE );
|
BOOLEAN CanUseSkill( INT8 iSkill, BOOLEAN fAPCheck = TRUE, INT32 sGridNo = -1 );
|
||||||
|
|
||||||
// use a skill. For safety reasons, this calls CanUseSkill again (it is possible to switch the soldier while the menu is open)
|
// use a skill. For safety reasons, this calls CanUseSkill again (it is possible to switch the soldier while the menu is open)
|
||||||
BOOLEAN UseSkill( UINT8 iSkill, INT32 usMapPos, UINT8 ID );
|
BOOLEAN UseSkill( UINT8 iSkill, INT32 usMapPos, UINT8 ID );
|
||||||
|
|||||||
+25
-1
@@ -1936,6 +1936,30 @@ INT8 CalcInterruptDuelPts( SOLDIERTYPE * pSoldier, UINT8 ubOpponentID, BOOLEAN f
|
|||||||
{
|
{
|
||||||
iPoints -= 1;
|
iPoints -= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Flugente: focus skill
|
||||||
|
if ( (pSoldier->usSoldierFlagMask2 & SOLDIER_TRAIT_FOCUS) )
|
||||||
|
{
|
||||||
|
if ( pSoldier->CanUseSkill( SKILLS_FOCUS, FALSE, pSoldier->sFocusGridNo ) )
|
||||||
|
{
|
||||||
|
// if target is in focus, increase interrupt chance, otherwise lower it
|
||||||
|
// radius depends on range
|
||||||
|
INT16 range = PythSpacesAway( pSoldier->sFocusGridNo, pSoldier->sGridNo );
|
||||||
|
INT16 radius = gSkillTraitValues.ubSNFocusRadius * range / 20;
|
||||||
|
|
||||||
|
INT16 range_opponent = PythSpacesAway( pSoldier->sFocusGridNo, MercPtrs[ubOpponentID]->sGridNo );
|
||||||
|
|
||||||
|
if ( range_opponent <= radius )
|
||||||
|
iPoints += gSkillTraitValues.sSNFocusInterruptBonus;
|
||||||
|
else
|
||||||
|
iPoints -= 2 * gSkillTraitValues.sSNFocusInterruptBonus;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pSoldier->usSoldierFlagMask2 &= ~SOLDIER_TRAIT_FOCUS;
|
||||||
|
pSoldier->sFocusGridNo = NOWHERE;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1949,7 +1973,7 @@ INT8 CalcInterruptDuelPts( SOLDIERTYPE * pSoldier, UINT8 ubOpponentID, BOOLEAN f
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Flugente: interrupt modifier from special stats
|
// Flugente: interrupt modifier from special stats
|
||||||
iPoints += pSoldier->GetInterruptModifier( ubDistance );
|
iPoints += pSoldier->GetInterruptModifier( ubDistance );
|
||||||
|
|
||||||
|
|||||||
@@ -4289,6 +4289,32 @@ void HandleExplosionWarningAnimations( )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// show focus area if skill is active
|
||||||
|
if ( gusSelectedSoldier != NOBODY )
|
||||||
|
{
|
||||||
|
SOLDIERTYPE* pSoldier = MercPtrs[gusSelectedSoldier];
|
||||||
|
|
||||||
|
if ( pSoldier->bActive && pSoldier->bInSector && (pSoldier->usSoldierFlagMask2 & SOLDIER_TRAIT_FOCUS) )
|
||||||
|
{
|
||||||
|
// checking whether this skill is active is relatively cheap. If it fails, deactivate skill properly
|
||||||
|
// we cannot use CanUseSkill(...) again though, as this would fail upon opening the menu
|
||||||
|
if ( pSoldier->CanUseSkill( SKILLS_FOCUS, FALSE, pSoldier->sFocusGridNo ) )
|
||||||
|
{
|
||||||
|
// radius depends on range
|
||||||
|
INT16 range = PythSpacesAway(pSoldier->sFocusGridNo, pSoldier->sGridNo);
|
||||||
|
INT16 radius = gSkillTraitValues.ubSNFocusRadius * range / 20;
|
||||||
|
|
||||||
|
DrawTraitRadius( pSoldier->sFocusGridNo, pSoldier->pathing.bLevel, sqrt( 0.5 ) * (20 + 40 * radius), 8, 0 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// if condition'S don't apply, deactivate skill. This will cause it to update to status changes very fast
|
||||||
|
pSoldier->usSoldierFlagMask2 &= ~SOLDIER_TRAIT_FOCUS;
|
||||||
|
pSoldier->sFocusGridNo = NOWHERE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DecayBombTimers( void )
|
void DecayBombTimers( void )
|
||||||
|
|||||||
@@ -2632,6 +2632,8 @@ enum
|
|||||||
TEXT_SKILL_DENIAL_NOMORTAR,
|
TEXT_SKILL_DENIAL_NOMORTAR,
|
||||||
TEXT_SKILL_DENIAL_ITSCOMPLICATED,
|
TEXT_SKILL_DENIAL_ITSCOMPLICATED,
|
||||||
TEXT_SKILL_DENIAL_NODEMON,
|
TEXT_SKILL_DENIAL_NODEMON,
|
||||||
|
TEXT_SKILL_DENIAL_GUNTRAIT,
|
||||||
|
TEXT_SKILL_DENIAL_AIMEDGUN,
|
||||||
|
|
||||||
TEXT_SKILL_DENIAL_MAX,
|
TEXT_SKILL_DENIAL_MAX,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2825,8 +2825,10 @@ STR16 pTraitSkillsDenialStrings[] =
|
|||||||
L" - %s或更高,或\n", //L" - %s or higher or\n",
|
L" - %s或更高,或\n", //L" - %s or higher or\n",
|
||||||
L" - %d分钟后就绪\n", //L" - %d minutes to be ready\n",
|
L" - %d分钟后就绪\n", //L" - %d minutes to be ready\n",
|
||||||
L" - 临区的迫击炮位置\n", //L" - mortar positions in neighbouring sectors\n",
|
L" - 临区的迫击炮位置\n", //L" - mortar positions in neighbouring sectors\n",
|
||||||
L" - %s|或%s|和%s或%s或更高\n" //L" - %s |o|r %s |a|n|d %s or %s or higher\n"
|
L" - %s|或%s|和%s或%s或更高\n", //L" - %s |o|r %s |a|n|d %s or %s or higher\n"
|
||||||
L" - 恶魔的财产", //L" - posession by a demon"
|
L" - 恶魔的财产\n", //L" - posession by a demon"
|
||||||
|
L" - a gun-related trait\n", // TODO.Translate
|
||||||
|
L" - aimed gun\n",
|
||||||
};
|
};
|
||||||
|
|
||||||
STR16 pSkillMenuStrings[] =
|
STR16 pSkillMenuStrings[] =
|
||||||
|
|||||||
@@ -2824,8 +2824,10 @@ STR16 pTraitSkillsDenialStrings[] =
|
|||||||
L" - %s or higher or\n",
|
L" - %s or higher or\n",
|
||||||
L" - %d minutes to be ready\n",
|
L" - %d minutes to be ready\n",
|
||||||
L" - mortar positions in neighbouring sectors\n",
|
L" - mortar positions in neighbouring sectors\n",
|
||||||
L" - %s |o|r %s |a|n|d %s or %s or higher\n"
|
L" - %s |o|r %s |a|n|d %s or %s or higher\n",
|
||||||
L" - possession by a demon",
|
L" - possession by a demon",
|
||||||
|
L" - a gun-related trait\n", // TODO.Translate
|
||||||
|
L" - aimed gun\n",
|
||||||
};
|
};
|
||||||
|
|
||||||
STR16 pSkillMenuStrings[] = // TODO.Translate
|
STR16 pSkillMenuStrings[] = // TODO.Translate
|
||||||
|
|||||||
@@ -2821,8 +2821,10 @@ STR16 pTraitSkillsDenialStrings[] =
|
|||||||
L" - %s or higher or\n",
|
L" - %s or higher or\n",
|
||||||
L" - %d minutes to be ready\n",
|
L" - %d minutes to be ready\n",
|
||||||
L" - mortar positions in neighbouring sectors\n",
|
L" - mortar positions in neighbouring sectors\n",
|
||||||
L" - %s |o|r %s |a|n|d %s or %s or higher\n"
|
L" - %s |o|r %s |a|n|d %s or %s or higher\n",
|
||||||
L" - possession by a demon",
|
L" - possession by a demon\n",
|
||||||
|
L" - a gun-related trait\n",
|
||||||
|
L" - aimed gun\n",
|
||||||
};
|
};
|
||||||
|
|
||||||
STR16 pSkillMenuStrings[] =
|
STR16 pSkillMenuStrings[] =
|
||||||
|
|||||||
@@ -2833,8 +2833,10 @@ STR16 pTraitSkillsDenialStrings[] =
|
|||||||
L" - %s ou plus ou",
|
L" - %s ou plus ou",
|
||||||
L" - %d minutes pour être prêt\n",
|
L" - %d minutes pour être prêt\n",
|
||||||
L" - positions des mortiers dans les secteurs voisins\n",
|
L" - positions des mortiers dans les secteurs voisins\n",
|
||||||
L" - %s |o|u %s |e|t %s ou %s ou plus\n"
|
L" - %s |o|u %s |e|t %s ou %s ou plus\n",
|
||||||
L" - possession par un démon",
|
L" - possession par un démon",
|
||||||
|
L" - a gun-related trait\n", // TODO.Translate
|
||||||
|
L" - aimed gun\n",
|
||||||
};
|
};
|
||||||
|
|
||||||
STR16 pSkillMenuStrings[] = // TODO.Translate
|
STR16 pSkillMenuStrings[] = // TODO.Translate
|
||||||
|
|||||||
@@ -2828,8 +2828,10 @@ STR16 pTraitSkillsDenialStrings[] =
|
|||||||
L" - %s oder höher oder\n",
|
L" - %s oder höher oder\n",
|
||||||
L" - %d Minuten um fertig zu sein\n",
|
L" - %d Minuten um fertig zu sein\n",
|
||||||
L" - Mörser Positionen in Nachbarsektoren\n",
|
L" - Mörser Positionen in Nachbarsektoren\n",
|
||||||
L" - %s |o|d|e|r %s |u|n|d %s oder %s oder höher\n"
|
L" - %s |o|d|e|r %s |u|n|d %s oder %s oder höher\n",
|
||||||
L" - besessen von einem Dämon",
|
L" - besessen von einem Dämon",
|
||||||
|
L" - a gun-related trait\n", // TODO.Translate
|
||||||
|
L" - aimed gun\n",
|
||||||
};
|
};
|
||||||
|
|
||||||
STR16 pSkillMenuStrings[] = // TODO.Translate
|
STR16 pSkillMenuStrings[] = // TODO.Translate
|
||||||
|
|||||||
@@ -2819,8 +2819,10 @@ STR16 pTraitSkillsDenialStrings[] =
|
|||||||
L" - %s or higher or\n",
|
L" - %s or higher or\n",
|
||||||
L" - %d minutes to be ready\n",
|
L" - %d minutes to be ready\n",
|
||||||
L" - mortar positions in neighbouring sectors\n",
|
L" - mortar positions in neighbouring sectors\n",
|
||||||
L" - %s |o|r %s |a|n|d %s or %s or higher\n"
|
L" - %s |o|r %s |a|n|d %s or %s or higher\n",
|
||||||
L" - possession by a demon",
|
L" - possession by a demon",
|
||||||
|
L" - a gun-related trait\n", // TODO.Translate
|
||||||
|
L" - aimed gun\n",
|
||||||
};
|
};
|
||||||
|
|
||||||
STR16 pSkillMenuStrings[] = // TODO.Translate
|
STR16 pSkillMenuStrings[] = // TODO.Translate
|
||||||
|
|||||||
@@ -140,7 +140,7 @@ STR16 gzIMPMajorTraitsHelpTextsSniper[]=
|
|||||||
L"步枪精确瞄准次数增加 %d次\n",// L"Adds %d more aim clicks for rifle-type guns\n",
|
L"步枪精确瞄准次数增加 %d次\n",// L"Adds %d more aim clicks for rifle-type guns\n",
|
||||||
L"迅速瞄准:步枪精确瞄准次数加快(即减少)1次\n",//L"Makes aiming faster with rifle-type guns by one aim click\n",
|
L"迅速瞄准:步枪精确瞄准次数加快(即减少)1次\n",//L"Makes aiming faster with rifle-type guns by one aim click\n",
|
||||||
L"迅速瞄准:步枪精确瞄准次数加快(即减少)%d次\n",//L"Makes aiming faster with rifle-type guns by %d aim clicks\n",
|
L"迅速瞄准:步枪精确瞄准次数加快(即减少)%d次\n",//L"Makes aiming faster with rifle-type guns by %d aim clicks\n",
|
||||||
L"Focus skill: +%d interrupt modifier in a %d-radius area\n", // TODO.Translate
|
L"Focus skill: +%d interrupt modifier in marked area\n", // TODO.Translate
|
||||||
};
|
};
|
||||||
|
|
||||||
STR16 gzIMPMajorTraitsHelpTextsRanger[]=
|
STR16 gzIMPMajorTraitsHelpTextsRanger[]=
|
||||||
|
|||||||
@@ -140,7 +140,7 @@ STR16 gzIMPMajorTraitsHelpTextsSniper[]=
|
|||||||
L"Adds %d more aim clicks for rifle-type guns\n",
|
L"Adds %d more aim clicks for rifle-type guns\n",
|
||||||
L"Makes aiming faster with rifle-type guns by one aim click\n",
|
L"Makes aiming faster with rifle-type guns by one aim click\n",
|
||||||
L"Makes aiming faster with rifle-type guns by %d aim clicks\n",
|
L"Makes aiming faster with rifle-type guns by %d aim clicks\n",
|
||||||
L"Focus skill: +%d interrupt modifier in a %d-radius area\n", // TODO.Translate
|
L"Focus skill: +%d interrupt modifier in marked area\n", // TODO.Translate
|
||||||
};
|
};
|
||||||
|
|
||||||
STR16 gzIMPMajorTraitsHelpTextsRanger[]=
|
STR16 gzIMPMajorTraitsHelpTextsRanger[]=
|
||||||
|
|||||||
@@ -140,7 +140,7 @@ STR16 gzIMPMajorTraitsHelpTextsSniper[]=
|
|||||||
L"Adds %d more aim clicks for rifle-type guns\n",
|
L"Adds %d more aim clicks for rifle-type guns\n",
|
||||||
L"Makes aiming faster with rifle-type guns by one aim click\n",
|
L"Makes aiming faster with rifle-type guns by one aim click\n",
|
||||||
L"Makes aiming faster with rifle-type guns by %d aim clicks\n",
|
L"Makes aiming faster with rifle-type guns by %d aim clicks\n",
|
||||||
L"Focus skill: +%d interrupt modifier in a %d-radius area\n",
|
L"Focus skill: +%d interrupt modifier in marked area\n",
|
||||||
};
|
};
|
||||||
|
|
||||||
STR16 gzIMPMajorTraitsHelpTextsRanger[]=
|
STR16 gzIMPMajorTraitsHelpTextsRanger[]=
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ STR16 gzIMPMajorTraitsHelpTextsSniper[]=
|
|||||||
|
|
||||||
L"Fait viser plus rapidement avec un : réduit d'un niveau de visée\n",
|
L"Fait viser plus rapidement avec un : réduit d'un niveau de visée\n",
|
||||||
L"Fait viser plus rapidement avec un fusil : réduit de %d niveau(x) de visée\n",
|
L"Fait viser plus rapidement avec un fusil : réduit de %d niveau(x) de visée\n",
|
||||||
L"Focus skill: +%d interrupt modifier in a %d-radius area\n", // TODO.Translate
|
L"Focus skill: +%d interrupt modifier in marked area\n", // TODO.Translate
|
||||||
|
|
||||||
};
|
};
|
||||||
STR16 gzIMPMajorTraitsHelpTextsRanger[]=
|
STR16 gzIMPMajorTraitsHelpTextsRanger[]=
|
||||||
|
|||||||
@@ -140,7 +140,7 @@ STR16 gzIMPMajorTraitsHelpTextsSniper[]=
|
|||||||
L"Gibt weitere %d Ziel-Klicks für gewehrartige Waffen\n",
|
L"Gibt weitere %d Ziel-Klicks für gewehrartige Waffen\n",
|
||||||
L"Schnelleres Zielen mit Gewehren bei genau einem Zielgenauigkeit-Klick\n",
|
L"Schnelleres Zielen mit Gewehren bei genau einem Zielgenauigkeit-Klick\n",
|
||||||
L"Schnelleres Zielen mit Gewehren bei %d Zielgenauigkeit-Klicks\n",
|
L"Schnelleres Zielen mit Gewehren bei %d Zielgenauigkeit-Klicks\n",
|
||||||
L"Focus skill: +%d interrupt modifier in a %d-radius area\n", // TODO.Translate
|
L"Focus skill: +%d interrupt modifier in marked area\n", // TODO.Translate
|
||||||
|
|
||||||
};
|
};
|
||||||
STR16 gzIMPMajorTraitsHelpTextsRanger[]=
|
STR16 gzIMPMajorTraitsHelpTextsRanger[]=
|
||||||
|
|||||||
@@ -138,7 +138,7 @@ STR16 gzIMPMajorTraitsHelpTextsSniper[]=
|
|||||||
L"Adds %d more aim clicks for rifle-type guns\n",
|
L"Adds %d more aim clicks for rifle-type guns\n",
|
||||||
L"Makes aiming faster with rifle-type guns by one aim click\n",
|
L"Makes aiming faster with rifle-type guns by one aim click\n",
|
||||||
L"Makes aiming faster with rifle-type guns by %d aim clicks\n",
|
L"Makes aiming faster with rifle-type guns by %d aim clicks\n",
|
||||||
L"Focus skill: +%d interrupt modifier in a %d-radius area\n", // TODO.Translate
|
L"Focus skill: +%d interrupt modifier in marked area\n", // TODO.Translate
|
||||||
};
|
};
|
||||||
|
|
||||||
STR16 gzIMPMajorTraitsHelpTextsRanger[]=
|
STR16 gzIMPMajorTraitsHelpTextsRanger[]=
|
||||||
|
|||||||
@@ -140,7 +140,7 @@ STR16 gzIMPMajorTraitsHelpTextsSniper[]=
|
|||||||
L"Adds %d more aim clicks for rifle-type guns\n",
|
L"Adds %d more aim clicks for rifle-type guns\n",
|
||||||
L"Makes aiming faster with rifle-type guns by one aim click\n",
|
L"Makes aiming faster with rifle-type guns by one aim click\n",
|
||||||
L"Makes aiming faster with rifle-type guns by %d aim clicks\n",
|
L"Makes aiming faster with rifle-type guns by %d aim clicks\n",
|
||||||
L"Focus skill: +%d interrupt modifier in a %d-radius area\n", // TODO.Translate
|
L"Focus skill: +%d interrupt modifier in marked area\n", // TODO.Translate
|
||||||
};
|
};
|
||||||
|
|
||||||
STR16 gzIMPMajorTraitsHelpTextsRanger[]=
|
STR16 gzIMPMajorTraitsHelpTextsRanger[]=
|
||||||
|
|||||||
@@ -140,7 +140,7 @@ STR16 gzIMPMajorTraitsHelpTextsSniper[]=
|
|||||||
L"+%d кликов прицеливания для оружия типа винтовок\n",
|
L"+%d кликов прицеливания для оружия типа винтовок\n",
|
||||||
L"Прицеливание оружия типа винтовок быстрее на один клик прицеливания\n",
|
L"Прицеливание оружия типа винтовок быстрее на один клик прицеливания\n",
|
||||||
L"Прицеливание оружия типа винтовок быстрее на %d кликов прицеливания\n",
|
L"Прицеливание оружия типа винтовок быстрее на %d кликов прицеливания\n",
|
||||||
L"Focus skill: +%d interrupt modifier in a %d-radius area\n", // TODO.Translate
|
L"Focus skill: +%d interrupt modifier in marked area\n", // TODO.Translate
|
||||||
};
|
};
|
||||||
|
|
||||||
STR16 gzIMPMajorTraitsHelpTextsRanger[]=
|
STR16 gzIMPMajorTraitsHelpTextsRanger[]=
|
||||||
|
|||||||
@@ -2831,8 +2831,10 @@ STR16 pTraitSkillsDenialStrings[] =
|
|||||||
L" - %s or higher or\n",
|
L" - %s or higher or\n",
|
||||||
L" - %d minutes to be ready\n",
|
L" - %d minutes to be ready\n",
|
||||||
L" - mortar positions in neighbouring sectors\n",
|
L" - mortar positions in neighbouring sectors\n",
|
||||||
L" - %s |o|r %s |a|n|d %s or %s or higher\n"
|
L" - %s |o|r %s |a|n|d %s or %s or higher\n",
|
||||||
L" - possession by a demon",
|
L" - possession by a demon",
|
||||||
|
L" - a gun-related trait\n", // TODO.Translate
|
||||||
|
L" - aimed gun\n",
|
||||||
};
|
};
|
||||||
|
|
||||||
STR16 pSkillMenuStrings[] = // TODO.Translate
|
STR16 pSkillMenuStrings[] = // TODO.Translate
|
||||||
|
|||||||
@@ -2825,8 +2825,10 @@ STR16 pTraitSkillsDenialStrings[] =
|
|||||||
L" - %s или выше или\n",
|
L" - %s или выше или\n",
|
||||||
L" - %d минут на подготовку\n",
|
L" - %d минут на подготовку\n",
|
||||||
L" - позиции миномётов в соседних секторах\n",
|
L" - позиции миномётов в соседних секторах\n",
|
||||||
L" - %s |и|л|и %s |и %s или %s или выше\n"
|
L" - %s |и|л|и %s |и %s или %s или выше\n",
|
||||||
L" - одержим бесами",
|
L" - одержим бесами",
|
||||||
|
L" - a gun-related trait\n", // TODO.Translate
|
||||||
|
L" - aimed gun\n",
|
||||||
};
|
};
|
||||||
|
|
||||||
STR16 pSkillMenuStrings[] =
|
STR16 pSkillMenuStrings[] =
|
||||||
|
|||||||
Reference in New Issue
Block a user