Files
source/Laptop/IMP Skill Trait.cpp
T
Wanne e64d5a2fa6 MERGED source code from development trunk revision 4545 up to latest current revision 4882
Development Trunk: https://ja2svn.dyndns.org/source/ja2/branches/Wanne/JA2%201.13%20MP
A detailed list of all the features (changes) is visible in the history log of the development trunk:

INFO: The source code for the official 2011 release (4870) has been branched here:
https://ja2svn.dyndns.org/source/ja2/branches/JA2_rev.4870_2011

This commit contains the following features:

*** Externalized Vehicles ***
o Now with this feature we can add/remove vehicles
o New XML File: TableData\Vehicles.xml
o Added a new function parameter to lua file Scripts\Overhead lua to set up the helicopter in method: SetUpHelicopterForPlayer()
o Added example mini (Docs\Externalized Vehicles Example.zip) mod which adds 2 additional vehicles (hummer and ice-cream truck to sector A9)

*** Up to 255 save slots ***
- There is a "Next" and "Prev" button where you can scroll through the save slots
- It is now possible to load the automatic save (SAVE_EVERY_N_HOURS) from the load screen. This is the first slot after the quickload slot
- Added the 2 alternate players end turn saves (which can be enabled/disabled in option screen) to the save/load game form

*** New Feature: Externalized emails from Emails.edt to XML***
o This feature can be enabled/disabled in the Source:
--> See email.cpp: If "ReadXMLEmail" == FALSE, then normal way (read from Email.edt) otherwise read from XML files
o 2 new XML files: TableData\Email\EmailMercAvailable.xml and EmailMercLevelUp.xml
o Renamed SenderNamesList.xml to EmailSenderNamesList.xml and moved from TableData folder to TableData\Email folder
o Names for mercenaries are get from the file MercProfiles.xml and different names get from the file EmailSenderNamesList.xml

*** Externalized Hidden Towns (Tixa, Orta) ***
o Now it is possible to add new hidden towns (locations)
o See file: TableData/Map/Cities.xml
o New variable in TableData/Map/Cities.xml
- hiddenTown:   0 = show on strategy map, 1 = Hide on strategy map
- townIcon:     1 = on, 0 = off (This is the icon you see on the strategy map)
- szIconFile:   The path to the sti icon file (eg: interface\prison.sti, interface\my_icon.sti)
- iconPosition: The x,y position of the icon on the strategy map

*** Encyclopedia and Briefing Room, reachable from the laptop ***
o 2 new ja2_options.ini properties: BRIEFING_ROOM, ENCYCLOPEDIA
o demonstration video: http://www.youtube.com/watch?v=7CIXdXWLrAo
o Added Example usage of the Briefing Room
- Extract it in your JA2 1.13 folder and use the latest development executable
- The briefing room can be reached from the laptop. Enter SN5631 for the code and then click the "Exit" button
- See "Info_BriefingRoom.txt" and "BriefingRoom_Mission1.png"

*** Improved interrupt system (IIS) ***
o This system changes the way interrupts work. See: http://www.ja-galaxy-forum.com/board/ubbthreads.php?ubb=showflat&Number=290787#Post290787
o Option system (see ja2_options.ini: IMPROVED_INTERRUPT_SYSTEM)
o A few more settings for the interrupt system in ja2_options.ini
o INFO: Multiplayer games always use the "old" interrupt system, not matter what the user selects in the ja2_options.ini

*** Walking and sidestepping with weapon raised ***
o Enable/disable the walking/sidestepping with raised weapon in ja2_options.ini: ALLOW_WALKING_WITH_WEAPON_RAISED
o You can set an AP/BP modifier when walking/sidestepping with weapon raised in APBPConstants.ini: AP_MODIFIER_WEAPON_READY
o The following feature apply when you walk/sidestep with weapon raised:
-> limited angle of view, but you can see more farther when the weapon has a scope
-> better change for interrupts if you see an enemy
-> less APs and BPs when shooting, because the weapon is already raised
-> It should cost more APs when walking. Maybe you can export the additional AP and BP modifier to the APBPConstants.ini

*** Increase squad size to 8 (800x600) and 8 and 10 (1024x768) ***
o Squad sizes (dependend on the screen resolution) can be selected in the start new game screen
o In a multiplayer game, the squad size will always be 6, because it does not work with more soldiers/squad

*** Added UB-1.13 source code ***
o Merged the UB-1.13 source code (Revision: 4721) from svn: http://subversion.assembla.com/svn/ub-source113
o If you want to build UB-EXE or UB-MapEditor, just enable the 2 defines (JA2UB and JA2UBMAPS) in "builddefines.h"
o The UB-Verion reads from "ja2_UB.ini" instead of "ja2.ini"
o There are 2 new XML files
- Layout\LayoutMainMenu.xml
- MapAction\ActionItems.xml
o There are 2 new LUA-Script files
- Scripts\ExplosionControl.lua
- Scripts\InterfaceDialogue.lua

*** Hide enemy health text / enemy hit count ***
o ja2_options.ini: HIDE_ENEMY_HEALTH_TEXT, HIDE_ENEMY_HIT_COUNT
o both new settings only have effect in a singleplayer game
o see: http://www.ja-galaxy-forum.com/board/ubbthreads.php?ubb=showflat&Number=128840&page=1


git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@4885 3b4a5df2-a311-0410-b5c6-a8a6f20db521
2012-01-18 11:19:01 +00:00

2543 lines
82 KiB
C++

#ifdef PRECOMPILEDHEADERS
#include "Laptop All.h"
#include "IMP Skill Trait.h"
#include "_Ja25Englishtext.h"
#else
#include "IMP Skill Trait.h"
#include "Button System.h"
#include "utilities.h"
#include "Debug.h"
#include "Text.h"
#include "Font Control.h"
#include "font.h"
#include "laptop.h"
#include "cursors.h"
#include "IMP MainPage.h"
#include "IMPVideoObjects.h"
#include "_Ja25EnglishText.h"
#include "wordwrap.h"
#include "CharProfile.h"
#include "soldier profile type.h"
#include "IMP Compile Character.h"
#include "GameSettings.h" // added by SANDRO
#include "IMP Color Choosing.h" // added by SANDRO
#include "IMP Minor Trait.h"
#include "Soldier Profile.h"
#endif
//*******************************************************************
//
// Local Defines
//
//*******************************************************************
#define IMP_SKILL_TRAIT__TITLE_FONT FONT14ARIAL
#define IMP_SKILL_TRAIT__FONT FONT12ARIAL
#define IMP_SKILL_TRAIT__COLOR FONT_MCOLOR_WHITE
#define IMP_SKILL_TRAIT__LEFT_COLUMN_START_X ( LAPTOP_SCREEN_UL_X + 15 )
#define IMP_SKILL_TRAIT__LEFT_COLUMN_START_Y ( LAPTOP_SCREEN_WEB_UL_Y + 40 )
#define IMP_SKILL_TRAIT__RIGHT_COLUMN_START_X ( IMP_SKILL_TRAIT__LEFT_COLUMN_START_X + 241 )
#define IMP_SKILL_TRAIT__RIGHT_COLUMN_START_Y IMP_SKILL_TRAIT__LEFT_COLUMN_START_Y
#define IMP_SKILL_TRAIT__SPACE_BTN_BUTTONS 38
//#define IMP_SKILL_TRAIT__SKILL_TRAIT_TO_START_RIGHT_COL 6
#define IMP_SKILL_TRAIT__NONE_BTN_LOC_X ( LAPTOP_SCREEN_UL_X + 136 )
#define IMP_SKILL_TRAIT__NONE_BTN_LOC_Y ( LAPTOP_SCREEN_WEB_UL_Y + 306 ) // added this one - SANDRO
#define IMP_SKILL_TRAIT__TEXT_OFFSET_X 65
#define IMP_SKILL_TRAIT__TEXT_OFFSET_Y 12
#define IMP_SKILL_TRAIT__TITLE_X LAPTOP_SCREEN_UL_X - 111
#define IMP_SKILL_TRAIT__TITLE_Y iScreenHeightOffset + 53
#define IMP_SKILL_TRAIT__TITLE_WIDTH ( LAPTOP_SCREEN_LR_X - LAPTOP_SCREEN_UL_X )
#define IMP_SKILL_TRAIT__GREY_BOX_OFFSET_X 5
#define IMP_SKILL_TRAIT__GREY_BOX_OFFSET_Y 7
//*******************************************************************
//
// Global Variables
//
//*******************************************************************
BOOLEAN gfSkillTraitQuestions[ 20 ];
BOOLEAN gfSkillTraitQuestions2[ 20 ];
BOOLEAN gfIST_Redraw=FALSE;
// these are the buttons for the questions
INT32 giIMPSkillTraitAnswerButton[ 20 ];
INT32 giIMPSkillTraitAnswerButton2[ 20 ];
INT32 giIMPSkillTraitAnswerButtonImage[ 20 ];
INT32 giIMPSkillTraitAnswerButtonImage2[ 20 ];
// this is the Done buttons
INT32 giIMPSkillTraitFinsihButton;
INT32 giIMPSkillTraitFinsihButtonImage;
//BOOLEAN gfSkillTraitButtonChanged=FALSE;
INT8 gbLastSelectedTraits[ 10 ];
//image handle
UINT32 guiIST_GreyGoldBox;
//*******************************************************************
//
// Function Prototypes
//
//*******************************************************************
void BtnIMPSkillTraitAnswerCallback(GUI_BUTTON *btn,INT32 reason);
void BtnIMPSkillTraitAnswerCallback2(GUI_BUTTON *btn,INT32 reason);
void BtnIMPSkillTraitFinishCallback(GUI_BUTTON *btn,INT32 reason);
void AddImpSkillTraitButtons();
void HandleSkillTraitButtonStates( );
void HandleIMPSkillTraitAnswers( UINT32 uiSkillPressed, BOOLEAN fSecondTrait );
void IMPSkillTraitDisplaySkills();
BOOLEAN ShouldTraitBeSkipped( UINT32 uiTrait );
//void AddSelectedSkillsToSkillsList(); // SANDRO - second declaration not needed
void HandleLastSelectedTraits( INT8 bNewTrait );
INT8 GetLastSelectedSkill( void );
BOOLEAN CameBackToSpecialtiesPageButNotFinished();
BOOLEAN DoesSkillHaveExpertLevel( UINT32 uiSkillTrait );
MOUSE_REGION gMR_SkillTraitHelpTextRegions[IMP_SKILL_TRAITS_NEW_NUMBER_MAJOR_SKILLS];
void AssignSkillTraitHelpText( UINT8 ubTraitNumber, BOOLEAN fExpertLevel );
//ppp
//*******************************************************************
//
// Functions
//
//*******************************************************************
void EnterIMPSkillTrait( void )
{
// UINT32 uiCnt;
VOBJECT_DESC VObjectDesc;
//add the skill trait buttons
AddImpSkillTraitButtons();
// load the stats graphic and add it
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
FilenameForBPP("LAPTOP\\SkillTraitSmallGreyIdent.sti", VObjectDesc.ImageFile);
if( !AddVideoObject(&VObjectDesc, &guiIST_GreyGoldBox ) )
{
Assert( 0 );
return;
}
giIMPSkillTraitFinsihButtonImage = LoadButtonImage( "LAPTOP\\button_5.sti" ,-1,0,-1,1,-1 );
giIMPSkillTraitFinsihButton = CreateIconAndTextButton( giIMPSkillTraitFinsihButtonImage, pImpButtonText[ 24 ], FONT12ARIAL,
FONT_WHITE, DEFAULT_SHADOW,
FONT_WHITE, DEFAULT_SHADOW,
TEXT_CJUSTIFIED,
LAPTOP_SCREEN_UL_X + ( 350 ), LAPTOP_SCREEN_WEB_UL_Y + ( 340 ), BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnIMPSkillTraitFinishCallback );
SetButtonCursor( giIMPSkillTraitFinsihButton, CURSOR_WWW);
//if we are not DONE and are just reviewing
if( iCurrentProfileMode != IMP__FINISH )
{
//Have the NONE trait initially selected
if( gGameOptions.fNewTraitSystem )
{
gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_MAJOR_NONE ] = TRUE;
gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_MAJOR_NONE ] = TRUE;
}
else
{
gfSkillTraitQuestions[ IMP_SKILL_TRAITS__NONE ] = TRUE;
gfSkillTraitQuestions2[ IMP_SKILL_TRAITS__NONE ] = TRUE;
}
}
HandleSkillTraitButtonStates( );
// add regions for help texts
UINT16 usPosX = IMP_SKILL_TRAIT__LEFT_COLUMN_START_X + 62;
UINT16 usPosY = IMP_SKILL_TRAIT__LEFT_COLUMN_START_Y + 8;
for( UINT32 uiCnt=0; uiCnt < (UINT8)( gGameOptions.fNewTraitSystem ? IMP_SKILL_TRAITS_NEW_NUMBER_MAJOR_SKILLS : IMP_SKILL_TRAITS__NUMBER_SKILLS ); uiCnt++ )
{
if( ShouldTraitBeSkipped( uiCnt ) )
{
//if its the none button
if( uiCnt == ( gGameOptions.fNewTraitSystem ? (IMP_SKILL_TRAITS_NEW_MAJOR_NONE-1) : (IMP_SKILL_TRAITS__NONE-1) ) )
{
usPosX = IMP_SKILL_TRAIT__NONE_BTN_LOC_X + 62;
usPosY = IMP_SKILL_TRAIT__NONE_BTN_LOC_Y + 8;
}
continue;
}
MSYS_DefineRegion( &gMR_SkillTraitHelpTextRegions[uiCnt], ( usPosX ), ( usPosY ),
(usPosX + 156), ( usPosY + 17), MSYS_PRIORITY_HIGH,
MSYS_NO_CURSOR, MSYS_NO_CALLBACK, NULL );
MSYS_AddRegion( &gMR_SkillTraitHelpTextRegions[uiCnt] );
//Determine the next x location
if( uiCnt < (UINT8)(gGameOptions.fNewTraitSystem ? 4 : 6) )
usPosX = IMP_SKILL_TRAIT__LEFT_COLUMN_START_X + 62;
else
usPosX = IMP_SKILL_TRAIT__RIGHT_COLUMN_START_X + 62;
//Determine the next Y location
if( uiCnt == (gGameOptions.fNewTraitSystem ? 4 : 6) )
usPosY = IMP_SKILL_TRAIT__RIGHT_COLUMN_START_Y + 8;
else
{
if( gGameOptions.fNewTraitSystem )
usPosY += IMP_SKILL_TRAIT__SPACE_BTN_BUTTONS + 5;
else
usPosY += IMP_SKILL_TRAIT__SPACE_BTN_BUTTONS;
}
//if its the none button
if( uiCnt == (gGameOptions.fNewTraitSystem ? (IMP_SKILL_TRAITS_NEW_MAJOR_NONE-1) : (IMP_SKILL_TRAITS__NONE-1) ) )
{
usPosX = IMP_SKILL_TRAIT__NONE_BTN_LOC_X + 62;
usPosY = IMP_SKILL_TRAIT__NONE_BTN_LOC_Y + 8;
}
}
//reset last selecterd trait
memset( gbLastSelectedTraits, -1, 10 );
}
void RenderIMPSkillTrait( void )
{
//render the metal background graphic
RenderProfileBackGround();
IMPSkillTraitDisplaySkills();
}
void ExitIMPSkillTrait( void )
{
INT32 iCnt;
DeleteVideoObjectFromIndex( guiIST_GreyGoldBox );
//remove the skill buttons
for(iCnt = 0; iCnt < ( gGameOptions.fNewTraitSystem ? IMP_SKILL_TRAITS_NEW_NUMBER_MAJOR_SKILLS : IMP_SKILL_TRAITS__NUMBER_SKILLS ); iCnt++)
{
//if there is a button allocated
if( giIMPSkillTraitAnswerButton[iCnt] != -1 )
{
RemoveButton(giIMPSkillTraitAnswerButton[ iCnt ] );
UnloadButtonImage(giIMPSkillTraitAnswerButtonImage[ iCnt ] );
}
}
//remove the skill buttons
for(iCnt = 0; iCnt < ( gGameOptions.fNewTraitSystem ? IMP_SKILL_TRAITS_NEW_NUMBER_MAJOR_SKILLS : IMP_SKILL_TRAITS__NUMBER_SKILLS ); iCnt++)
{
//if there is a button allocated
if( giIMPSkillTraitAnswerButton2[iCnt] != -1 )
{
RemoveButton(giIMPSkillTraitAnswerButton2[ iCnt ] );
UnloadButtonImage(giIMPSkillTraitAnswerButtonImage2[ iCnt ] );
}
}
RemoveButton( giIMPSkillTraitFinsihButton );
UnloadButtonImage( giIMPSkillTraitFinsihButtonImage );
// SANDRO - remove regions
for( iCnt=0; iCnt < ( gGameOptions.fNewTraitSystem ? IMP_SKILL_TRAITS_NEW_NUMBER_MAJOR_SKILLS : IMP_SKILL_TRAITS__NUMBER_SKILLS); iCnt++ )
{
if( ShouldTraitBeSkipped( iCnt ) )
continue;
MSYS_RemoveRegion( &gMR_SkillTraitHelpTextRegions[iCnt] );
}
}
void HandleIMPSkillTrait( void )
{
if( gfIST_Redraw )
{
RenderIMPSkillTrait( );
gfIST_Redraw = FALSE;
}
InvalidateRegion(LAPTOP_SCREEN_UL_X,LAPTOP_SCREEN_WEB_UL_Y,LAPTOP_SCREEN_LR_X,LAPTOP_SCREEN_WEB_LR_Y);
}
void AddImpSkillTraitButtons()
{
INT32 iCnt = 0;
INT32 iCntMax = 0;
INT8 iNumSkillsToStartRightColumn = 0;
UINT16 usPosX, usPosY, usSpaceBetweenButtons;
if ( gGameOptions.fNewTraitSystem )
{
iCntMax = IMP_SKILL_TRAITS_NEW_NUMBER_MAJOR_SKILLS;
iNumSkillsToStartRightColumn = 4;
usSpaceBetweenButtons = IMP_SKILL_TRAIT__SPACE_BTN_BUTTONS + 5;
}
else
{
iCntMax = IMP_SKILL_TRAITS__NUMBER_SKILLS;
iNumSkillsToStartRightColumn = 6;
usSpaceBetweenButtons = IMP_SKILL_TRAIT__SPACE_BTN_BUTTONS;
}
///////////////////////////////////////////////////////////////////////////////////////////////
// FIRST COLUMN OF BUTTONS
usPosX = IMP_SKILL_TRAIT__LEFT_COLUMN_START_X;
usPosY = IMP_SKILL_TRAIT__LEFT_COLUMN_START_Y;
for(iCnt = 0; iCnt < (iCntMax); iCnt++)
{
//reset
giIMPSkillTraitAnswerButton[iCnt] = -1;
//if we are not DONE and are just reviewing
if( iCurrentProfileMode != IMP__FINISH )
{
gfSkillTraitQuestions[ iCnt ] = FALSE;
}
//if the merc is a FEMALE, skip this skill cause there isnt any fenmal martial artists
if( ShouldTraitBeSkipped( iCnt ) )
{
//if its the none button
if( iCnt == iCntMax-2 )
{
usPosX = IMP_SKILL_TRAIT__NONE_BTN_LOC_X;
usPosY = IMP_SKILL_TRAIT__NONE_BTN_LOC_Y;
}
continue;
}
if( iCnt == 0 )
giIMPSkillTraitAnswerButtonImage[ iCnt ] = LoadButtonImage( "LAPTOP\\button_9a.sti", -1,0,-1,1,-1 );
else
giIMPSkillTraitAnswerButtonImage[ iCnt ] = UseLoadedButtonImage( giIMPSkillTraitAnswerButtonImage[ 0 ], -1,0,-1,1,-1 );
giIMPSkillTraitAnswerButton[iCnt] = QuickCreateButton( giIMPSkillTraitAnswerButtonImage[ iCnt ], usPosX, usPosY,
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 3,
MSYS_NO_CALLBACK, (GUI_CALLBACK)BtnIMPSkillTraitAnswerCallback);
//Set the button data
MSYS_SetBtnUserData( giIMPSkillTraitAnswerButton[iCnt], 0, iCnt );
SetButtonCursor( giIMPSkillTraitAnswerButton[iCnt], CURSOR_WWW);
//Get rid of playing the button sound, it will be handled here
//ButtonList[ giIMPSkillTraitAnswerButton[ iCnt ] ]->ubSoundSchemeID = 0; // - This would disable the sounds totally resulted to play no sound - SANDRO
//Determine the next x location
if( iCnt < iNumSkillsToStartRightColumn )
usPosX = IMP_SKILL_TRAIT__LEFT_COLUMN_START_X;
else
usPosX = IMP_SKILL_TRAIT__RIGHT_COLUMN_START_X;
//Determine the next Y location
if( iCnt == iNumSkillsToStartRightColumn )
usPosY = IMP_SKILL_TRAIT__RIGHT_COLUMN_START_Y;
else
usPosY += usSpaceBetweenButtons;
//if its the none button
if( iCnt == iCntMax-2 )
{
usPosX = IMP_SKILL_TRAIT__NONE_BTN_LOC_X;
usPosY = IMP_SKILL_TRAIT__NONE_BTN_LOC_Y;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
// SECOND COLUMN OF BUTTONS
usPosX = IMP_SKILL_TRAIT__LEFT_COLUMN_START_X + 26;
usPosY = IMP_SKILL_TRAIT__LEFT_COLUMN_START_Y;
for(iCnt = 0; iCnt < (iCntMax); iCnt++)
{
//reset
giIMPSkillTraitAnswerButton2[iCnt] = -1;
//if we are not DONE and are just reviewing
if( iCurrentProfileMode != IMP__FINISH )
{
gfSkillTraitQuestions2[ iCnt ] = FALSE;
}
//if the merc is a FEMALE, skip this skill cause there isnt any fenmal martial artists
if( ShouldTraitBeSkipped( iCnt ) )
{
//if its the none button
if( iCnt == iCntMax-2 )
{
usPosX = IMP_SKILL_TRAIT__NONE_BTN_LOC_X + 26;
usPosY = IMP_SKILL_TRAIT__NONE_BTN_LOC_Y;
}
continue;
}
if( iCnt == 0 )
giIMPSkillTraitAnswerButtonImage2[ iCnt ] = LoadButtonImage( "LAPTOP\\button_9b.sti", -1,0,-1,1,-1 );
else
giIMPSkillTraitAnswerButtonImage2[ iCnt ] = UseLoadedButtonImage( giIMPSkillTraitAnswerButtonImage2[ 0 ], -1,0,-1,1,-1 );
giIMPSkillTraitAnswerButton2[iCnt] = QuickCreateButton( giIMPSkillTraitAnswerButtonImage2[ iCnt ], usPosX, usPosY,
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 3,
MSYS_NO_CALLBACK, (GUI_CALLBACK)BtnIMPSkillTraitAnswerCallback2);
//Set the button data
MSYS_SetBtnUserData( giIMPSkillTraitAnswerButton2[iCnt], 0, iCnt );
SetButtonCursor( giIMPSkillTraitAnswerButton2[iCnt], CURSOR_WWW);
//Get rid of playing the button sound, it will be handled here
//ButtonList[ giIMPSkillTraitAnswerButton[ iCnt ] ]->ubSoundSchemeID = 0; // - This would disable the sounds totally resulted to play no sound - SANDRO
//Determine the next x location
if( iCnt < iNumSkillsToStartRightColumn )
usPosX = IMP_SKILL_TRAIT__LEFT_COLUMN_START_X + 26;
else
usPosX = IMP_SKILL_TRAIT__RIGHT_COLUMN_START_X + 26;
//Determine the next Y location
if( iCnt == iNumSkillsToStartRightColumn )
usPosY = IMP_SKILL_TRAIT__RIGHT_COLUMN_START_Y;
else
usPosY += usSpaceBetweenButtons;
//if its the none button
if( iCnt == iCntMax-2 )
{
usPosX = IMP_SKILL_TRAIT__NONE_BTN_LOC_X + 26;
usPosY = IMP_SKILL_TRAIT__NONE_BTN_LOC_Y;
}
}
}
void BtnIMPSkillTraitAnswerCallback(GUI_BUTTON *btn,INT32 reason)
{
// btn callback for IMP personality quiz answer button
if (!(btn->uiFlags & BUTTON_ENABLED))
return;
if( reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
{
// btn->uiFlags|=(BUTTON_CLICKED_ON);
INT32 iSkillTrait = MSYS_GetBtnUserData( btn, 0 );
HandleIMPSkillTraitAnswers( iSkillTrait, FALSE );
}
}
void BtnIMPSkillTraitAnswerCallback2(GUI_BUTTON *btn,INT32 reason)
{
// btn callback for IMP personality quiz answer button
if (!(btn->uiFlags & BUTTON_ENABLED))
return;
if( reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
{
// btn->uiFlags|=(BUTTON_CLICKED_ON);
INT32 iSkillTrait = MSYS_GetBtnUserData( btn, 0 );
HandleIMPSkillTraitAnswers( iSkillTrait, TRUE );
}
}
void HandleIMPSkillTraitAnswers( UINT32 uiSkillPressed, BOOLEAN fSecondTrait )
{
UINT32 uiCnt, uiCntMax;
if ( gGameOptions.fNewTraitSystem )
uiCntMax = IMP_SKILL_TRAITS_NEW_NUMBER_MAJOR_SKILLS;
else
uiCntMax = IMP_SKILL_TRAITS__NUMBER_SKILLS;
//if we are DONE and are just reviewing
if( iCurrentProfileMode == IMP__FINISH )
{
return;
}
//make sure its a valid skill
if( uiSkillPressed > uiCntMax )
{
Assert( 0 );
return;
}
if( !fSecondTrait )
{
//if its allready set
if( gfSkillTraitQuestions[ uiSkillPressed ] )
{
gfSkillTraitQuestions[ uiSkillPressed ] = FALSE;
BOOLEAN fNoSkillSelected = TRUE;
for ( uiCnt=0; uiCnt<(uiCntMax-1); uiCnt++ )
{
if ( gfSkillTraitQuestions[ uiCnt ] == TRUE )
fNoSkillSelected = FALSE;
}
if ( fNoSkillSelected )
{
// select NONE button
gfSkillTraitQuestions[ uiCntMax-1 ] = TRUE;
}
}
// if cannot have expert level of skill, don't continue
else if ( gfSkillTraitQuestions2[ uiSkillPressed ] && !DoesSkillHaveExpertLevel( uiSkillPressed ) )
{
//dont need to do anything
return;
}
else
{
// if the other trait has not been set yet, we rather set it now,
// instead of deselecting the already set one
if( gfSkillTraitQuestions2[ uiCntMax-1 ] == TRUE && gfSkillTraitQuestions[ uiCntMax-1 ] == FALSE && (uiSkillPressed != (uiCntMax-1)) )
{
// Unselect NONE button
gfSkillTraitQuestions2[ uiCntMax-1 ] = FALSE;
//Set the skill
gfSkillTraitQuestions2[ uiSkillPressed ] = TRUE;
}
else
{
if ( CountNumSkillTraitsSelected( FALSE ) < gSkillTraitValues.ubNumberOfMajorTraitsAllowed && CountNumSkillTraitsSelected( FALSE ) < gSkillTraitValues.ubMaxNumberOfTraits )
{
// we can select next one, simply do so
gfSkillTraitQuestions[ uiSkillPressed ] = TRUE;
// Unselect NONE button if necessary
gfSkillTraitQuestions[ uiCntMax-1 ] = FALSE;
HandleLastSelectedTraits( (INT8)uiSkillPressed );
}
else
{
if ( gSkillTraitValues.ubNumberOfMajorTraitsAllowed == 2 )
{
//loop through all the skill and reset them
for( uiCnt=0; uiCnt<uiCntMax; uiCnt++ )
{
gfSkillTraitQuestions[ uiCnt ] = FALSE;
}
}
else
{
// we have to deselect last selected skill
if ( gfSkillTraitQuestions[ GetLastSelectedSkill() ] || gfSkillTraitQuestions2[ GetLastSelectedSkill() ] )
{
if ( gfSkillTraitQuestions[ GetLastSelectedSkill() ] )
{
gfSkillTraitQuestions[ GetLastSelectedSkill() ] = FALSE;
}
else
{
gfSkillTraitQuestions2[ GetLastSelectedSkill() ] = FALSE;
}
HandleLastSelectedTraits( -1 );
}
else
{
// something gone wrong, deselect the first one we can find
for( uiCnt=0; uiCnt<(uiCntMax-1); uiCnt++ )
{
if ( gfSkillTraitQuestions[ uiCnt ] == TRUE )
{
gfSkillTraitQuestions[ uiCnt ] = FALSE;
break;
}
if ( uiCnt >= (uiCntMax-2) )
{
for( uiCnt=0; uiCnt<(uiCntMax-1); uiCnt++ )
{
if ( gfSkillTraitQuestions2[ uiCnt ] == TRUE )
{
gfSkillTraitQuestions2[ uiCnt ] = FALSE;
break;
}
}
}
}
}
}
//Set the skill
gfSkillTraitQuestions[ uiSkillPressed ] = TRUE;
HandleLastSelectedTraits( (INT8)uiSkillPressed );
}
}
}
//Play the button sound
if( gfSkillTraitQuestions[ uiSkillPressed ] )
{
PlayButtonSound( giIMPSkillTraitAnswerButton[ uiSkillPressed ], BUTTON_SOUND_CLICKED_ON );
}
else
{
PlayButtonSound( giIMPSkillTraitAnswerButton[ uiSkillPressed ], BUTTON_SOUND_CLICKED_OFF );
}
}
else
{
//if its allready set
if( gfSkillTraitQuestions2[ uiSkillPressed ] )
{
gfSkillTraitQuestions2[ uiSkillPressed ] = FALSE;
BOOLEAN fNoSkillSelected = TRUE;
for ( uiCnt=0; uiCnt<(uiCntMax-1); uiCnt++ )
{
if ( gfSkillTraitQuestions2[ uiCnt ] == TRUE )
fNoSkillSelected = FALSE;
}
if ( fNoSkillSelected )
{
// select NONE button
gfSkillTraitQuestions2[ uiCntMax-1 ] = TRUE;
}
}
// if cannot have expert level of skill, don't continue
else if ( gfSkillTraitQuestions[ uiSkillPressed ] && !DoesSkillHaveExpertLevel( uiSkillPressed ) )
{
//dont need to do anything
return;
}
else
{
// if the other trait has not been set yet, we rather set it now,
// instead of deselecting the already set one
if( gfSkillTraitQuestions[ uiCntMax-1 ] == TRUE && gfSkillTraitQuestions2[ uiCntMax-1 ] == FALSE && (uiSkillPressed != (uiCntMax-1)) )
{
// Unselect NONE button
gfSkillTraitQuestions[ uiCntMax-1 ] = FALSE;
//Set the skill
gfSkillTraitQuestions[ uiSkillPressed ] = TRUE;
}
else
{
if ( CountNumSkillTraitsSelected( FALSE ) < gSkillTraitValues.ubNumberOfMajorTraitsAllowed && CountNumSkillTraitsSelected( FALSE ) < gSkillTraitValues.ubMaxNumberOfTraits )
{
// we can select next one, simply do so
gfSkillTraitQuestions2[ uiSkillPressed ] = TRUE;
// Unselect NONE button if necessary
gfSkillTraitQuestions2[ uiCntMax-1 ] = FALSE;
HandleLastSelectedTraits( (INT8)uiSkillPressed );
}
else
{
if ( gSkillTraitValues.ubNumberOfMajorTraitsAllowed == 2 )
{
//loop through all the skill and reset them
for( uiCnt=0; uiCnt<uiCntMax; uiCnt++ )
{
gfSkillTraitQuestions2[ uiCnt ] = FALSE;
}
}
else
{
// we have to deselect last selected skill
if ( gfSkillTraitQuestions[ GetLastSelectedSkill() ] || gfSkillTraitQuestions2[ GetLastSelectedSkill() ] )
{
if ( gfSkillTraitQuestions2[ GetLastSelectedSkill() ] )
{
gfSkillTraitQuestions2[ GetLastSelectedSkill() ] = FALSE;
}
else
{
gfSkillTraitQuestions[ GetLastSelectedSkill() ] = FALSE;
}
HandleLastSelectedTraits( -1 );
}
else
{
// something gone wrong, deselect the first one we can find
for( uiCnt=0; uiCnt<(uiCntMax-1); uiCnt++ )
{
if ( gfSkillTraitQuestions2[ uiCnt ] == TRUE )
{
gfSkillTraitQuestions2[ uiCnt ] = FALSE;
break;
}
if ( uiCnt >= (uiCntMax-2) )
{
for( uiCnt=0; uiCnt<(uiCntMax-1); uiCnt++ )
{
if ( gfSkillTraitQuestions[ uiCnt ] == TRUE )
{
gfSkillTraitQuestions[ uiCnt ] = FALSE;
break;
}
}
}
}
}
}
//Set the skill
gfSkillTraitQuestions2[ uiSkillPressed ] = TRUE;
HandleLastSelectedTraits( (INT8)uiSkillPressed );
}
}
}
//Play the button sound
if( gfSkillTraitQuestions2[ uiSkillPressed ] )
{
PlayButtonSound( giIMPSkillTraitAnswerButton2[ uiSkillPressed ], BUTTON_SOUND_CLICKED_ON );
}
else
{
PlayButtonSound( giIMPSkillTraitAnswerButton2[ uiSkillPressed ], BUTTON_SOUND_CLICKED_OFF );
}
}
//update buttons
HandleSkillTraitButtonStates( );
//redraw the screen
gfIST_Redraw = TRUE;
}
INT8 CountNumSkillTraitsSelected( BOOLEAN fIncludeNoneSkill )
{
UINT32 uiCnt, uiCntMax;
INT8 iNumberSkills=0;
if ( gGameOptions.fNewTraitSystem )
uiCntMax = IMP_SKILL_TRAITS_NEW_NUMBER_MAJOR_SKILLS;
else
uiCntMax = IMP_SKILL_TRAITS__NUMBER_SKILLS;
for( uiCnt=0; uiCnt < uiCntMax; uiCnt++ )
{
if( !fIncludeNoneSkill && (uiCnt == (uiCntMax-1)) )
continue;
//if the skill is selected ( ie depressed )
if( gfSkillTraitQuestions[ uiCnt ] )
{
iNumberSkills++;
}
if( gfSkillTraitQuestions2[ uiCnt ] )
{
iNumberSkills++;
}
}
return( iNumberSkills );
}
void HandleSkillTraitButtonStates( )
{
INT32 uiCnt;
for( uiCnt=0; uiCnt<(gGameOptions.fNewTraitSystem ? IMP_SKILL_TRAITS_NEW_NUMBER_MAJOR_SKILLS : IMP_SKILL_TRAITS__NUMBER_SKILLS); uiCnt++ )
{
//if the merc is a FEMALE, skip this skill cause there isnt any fenmal martial artists
if( ShouldTraitBeSkipped( uiCnt ) )
{
continue;
}
//if the skill is selected ( ie depressed )
if( gfSkillTraitQuestions[ uiCnt ] )
{
ButtonList[ giIMPSkillTraitAnswerButton[ uiCnt ] ]->uiFlags |= BUTTON_CLICKED_ON;
}
else
{
ButtonList[ giIMPSkillTraitAnswerButton[ uiCnt ] ]->uiFlags &= ~BUTTON_CLICKED_ON;
}
if( gfSkillTraitQuestions2[ uiCnt ] )
{
ButtonList[ giIMPSkillTraitAnswerButton2[ uiCnt ] ]->uiFlags |= BUTTON_CLICKED_ON;
}
else
{
ButtonList[ giIMPSkillTraitAnswerButton2[ uiCnt ] ]->uiFlags &= ~BUTTON_CLICKED_ON;
}
}
}
void IMPSkillTraitDisplaySkills()
{
UINT32 uiCnt, uiCntMax;
UINT16 usPosX, usPosY;
UINT16 usBoxPosX, usBoxPosY;
INT16 usSpaceBetweenButtons;
UINT8 uiNumSkillsToStartRightColumn;
HVOBJECT hImageHandle;
if ( gGameOptions.fNewTraitSystem )
{
uiCntMax = IMP_SKILL_TRAITS_NEW_NUMBER_MAJOR_SKILLS;
uiNumSkillsToStartRightColumn = 4;
usSpaceBetweenButtons = IMP_SKILL_TRAIT__SPACE_BTN_BUTTONS + 5;
//Display the title
DrawTextToScreen( gzIMPSkillTraitsTextNewMajor[ IMP_SKILL_TRAITS_NEW_NUMBER_MAJOR_SKILLS ], IMP_SKILL_TRAIT__TITLE_X, IMP_SKILL_TRAIT__TITLE_Y, IMP_SKILL_TRAIT__TITLE_WIDTH, IMP_SKILL_TRAIT__TITLE_FONT, IMP_SKILL_TRAIT__COLOR, FONT_MCOLOR_BLACK, FALSE, CENTER_JUSTIFIED );
}
else
{
uiCntMax = IMP_SKILL_TRAITS__NUMBER_SKILLS;
uiNumSkillsToStartRightColumn = 6;
usSpaceBetweenButtons = IMP_SKILL_TRAIT__SPACE_BTN_BUTTONS;
//Display the title
DrawTextToScreen( gzIMPSkillTraitsText[ IMP_SKILL_TRAITS__NUMBER_SKILLS ], IMP_SKILL_TRAIT__TITLE_X, IMP_SKILL_TRAIT__TITLE_Y, IMP_SKILL_TRAIT__TITLE_WIDTH, IMP_SKILL_TRAIT__TITLE_FONT, IMP_SKILL_TRAIT__COLOR, FONT_MCOLOR_BLACK, FALSE, CENTER_JUSTIFIED );
}
// Stats
GetVideoObject(&hImageHandle, guiIST_GreyGoldBox );
usPosX = IMP_SKILL_TRAIT__LEFT_COLUMN_START_X + IMP_SKILL_TRAIT__TEXT_OFFSET_X;
usPosY = IMP_SKILL_TRAIT__LEFT_COLUMN_START_Y + IMP_SKILL_TRAIT__TEXT_OFFSET_Y;
for( uiCnt=0; uiCnt<uiCntMax; uiCnt++ )
{
usBoxPosX = usPosX - IMP_SKILL_TRAIT__GREY_BOX_OFFSET_X;
usBoxPosY = usPosY - IMP_SKILL_TRAIT__GREY_BOX_OFFSET_Y;
//if the merc is a FEMALE, skip this skill cause there isnt any fenmal martial artists
if( ShouldTraitBeSkipped( uiCnt ) )
{
//if its the none button
if( uiCnt == uiCntMax-2 )
{
usPosX = IMP_SKILL_TRAIT__NONE_BTN_LOC_X + IMP_SKILL_TRAIT__TEXT_OFFSET_X;
usPosY = IMP_SKILL_TRAIT__NONE_BTN_LOC_Y + IMP_SKILL_TRAIT__TEXT_OFFSET_Y;
}
continue;
}
//if the trait is selected
if( gfSkillTraitQuestions[ uiCnt ] || gfSkillTraitQuestions2[ uiCnt ] )
{
//Display the gold background box
BltVideoObject(FRAME_BUFFER, hImageHandle, 1, usBoxPosX, usBoxPosY, VO_BLT_SRCTRANSPARENCY,NULL);
}
else
{
//Display the grey background box
BltVideoObject(FRAME_BUFFER, hImageHandle, 0,usBoxPosX, usBoxPosY, VO_BLT_SRCTRANSPARENCY,NULL);
}
//draw the text to the screenx
if( gGameOptions.fNewTraitSystem )
{
if ( gfSkillTraitQuestions[ uiCnt ] && gfSkillTraitQuestions2[ uiCnt ] && uiCnt != IMP_SKILL_TRAITS_NEW_MAJOR_NONE )
DrawTextToScreen( gzIMPSkillTraitsTextNewMajor[ uiCnt+11 ], usPosX, usPosY, 0, IMP_SKILL_TRAIT__FONT, IMP_SKILL_TRAIT__COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
else
DrawTextToScreen( gzIMPSkillTraitsTextNewMajor[ uiCnt ], usPosX, usPosY, 0, IMP_SKILL_TRAIT__FONT, IMP_SKILL_TRAIT__COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
}
else
{
if ( gfSkillTraitQuestions[ uiCnt ] && gfSkillTraitQuestions2[ uiCnt ] && uiCnt != IMP_SKILL_TRAITS__NONE )
{
CHAR16 sSkillTraitString[50];
swprintf(sSkillTraitString, L"%s %s", gzIMPSkillTraitsText[ uiCnt ], gzIMPSkillTraitsText[ IMP_SKILL_TRAITS__NUMBER_SKILLS+1 ]);
DrawTextToScreen( sSkillTraitString, usPosX, usPosY, 0, IMP_SKILL_TRAIT__FONT, IMP_SKILL_TRAIT__COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
}
else
DrawTextToScreen( gzIMPSkillTraitsText[ uiCnt ], usPosX, usPosY, 0, IMP_SKILL_TRAIT__FONT, IMP_SKILL_TRAIT__COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
}
// assign help texts
AssignSkillTraitHelpText( uiCnt, ((gfSkillTraitQuestions[uiCnt] && gfSkillTraitQuestions2[uiCnt]) ? TRUE : FALSE) );
//Determine the next x location
if( uiCnt < uiNumSkillsToStartRightColumn )
usPosX = IMP_SKILL_TRAIT__LEFT_COLUMN_START_X + IMP_SKILL_TRAIT__TEXT_OFFSET_X;
else
usPosX = IMP_SKILL_TRAIT__RIGHT_COLUMN_START_X + IMP_SKILL_TRAIT__TEXT_OFFSET_X;
//Determine the next Y location
if( uiCnt == uiNumSkillsToStartRightColumn )
usPosY = IMP_SKILL_TRAIT__RIGHT_COLUMN_START_Y + IMP_SKILL_TRAIT__TEXT_OFFSET_Y;
else
usPosY += usSpaceBetweenButtons;
//if its the none button
if( uiCnt == uiCntMax-2 )
{
usPosX = IMP_SKILL_TRAIT__NONE_BTN_LOC_X + IMP_SKILL_TRAIT__TEXT_OFFSET_X;
usPosY = IMP_SKILL_TRAIT__NONE_BTN_LOC_Y + IMP_SKILL_TRAIT__TEXT_OFFSET_Y;
}
}
}
void BtnIMPSkillTraitFinishCallback(GUI_BUTTON *btn,INT32 reason)
{
// btn callback for IMP personality quiz answer button
if (!(btn->uiFlags & BUTTON_ENABLED))
return;
if( reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
{
btn->uiFlags|=(BUTTON_CLICKED_ON);
if( gGameOptions.fNewTraitSystem )
{
iCurrentImpPage = IMP_MINOR_TRAITS_PAGE;
fButtonPendingFlag = TRUE;
}
else
{
//if we are just reviewing the page
if( iCurrentProfileMode == IMP__FINISH )
{
//go back tot he done screen
iCurrentImpPage = IMP_FINISH;
}
else
{
iCurrentImpPage = IMP_MAIN_PAGE;
if( CameBackToSpecialtiesPageButNotFinished() )
{
}
else
{
//We are finished on this page
iCurrentProfileMode = IMP__ATTRIBUTES;
}
}
}
}
}
BOOLEAN CameBackToSpecialtiesPageButNotFinished()
{
//if we are in a page that comes after this one
if( iCurrentProfileMode == IMP__ATTRIBUTES )
{
return( TRUE );
}
else
{
return( FALSE );
}
}
INT32 DoesPlayerHaveExtraAttibutePointsToDistributeBasedOnSkillSelection()
{
INT32 iExtraPoints=0; // set to zero - SANDRO
INT32 bNumSkills=0;
//Count the number of skills selected
bNumSkills = CountNumSkillTraitsSelected( FALSE );
// Externilized bonus for not taking skills - SANDRO
if( gGameOptions.fNewTraitSystem )
{
// add selected minor traits
bNumSkills += CountNumMinorTraitsSelected( FALSE );
iExtraPoints = (max( 0, 3 - bNumSkills)) * (gGameExternalOptions.iBonusPointsPerSkillNotTaken);
}
else
{
iExtraPoints = (max( 0, 2 - bNumSkills)) * (gGameExternalOptions.iBonusPointsPerSkillNotTaken);
}
return( iExtraPoints );
}
BOOLEAN ShouldTraitBeSkipped( UINT32 uiTrait )
{
// there are no traits discriminating any gender in new trait system
if( gGameOptions.fNewTraitSystem )
{
return( FALSE );
}
else
{
// WANNE: No material arts selection allowed for big body types and females, because we don't have a material art animation on big body types!
if( uiTrait == IMP_SKILL_TRAITS__MARTIAL_ARTS && (!fCharacterIsMale || bBigBodySelected()) )
return( TRUE );
else
return( FALSE );
}
}
BOOLEAN DoesSkillHaveExpertLevel( UINT32 uiSkillTrait )
{
if( gGameOptions.fNewTraitSystem )
{
// WANNE: Yes we have no animation, but the Trait bonus also works with the missing animations.
/*
// WANNE: No material arts allowed for big body types and females, because we don't have a material art animation on big body types!
if (uiSkillTrait == IMP_SKILL_TRAITS_NEW_MARTIAL_ARTS && (!fCharacterIsMale || bBigBodySelected()))
return (FALSE);
*/
return( TRUE );
}
else
{
if (uiSkillTrait == IMP_SKILL_TRAITS__ELECTRONICS ||
uiSkillTrait == IMP_SKILL_TRAITS__AMBIDEXTROUS ||
uiSkillTrait == IMP_SKILL_TRAITS__CAMO )
{
return( FALSE );
}
return( TRUE );
}
return( TRUE );
}
void AddSelectedSkillsToSkillsList()
{
INT32 uiCnt;
//loop through all the buttons and reset them
for( uiCnt=0; uiCnt<(gGameOptions.fNewTraitSystem ? IMP_SKILL_TRAITS_NEW_MAJOR_NONE : IMP_SKILL_TRAITS__NONE); uiCnt++ )
{
//if the trait is selected
if( gfSkillTraitQuestions[ uiCnt ] )
{
// ugly check for old/new traits - SANDRO
if( gGameOptions.fNewTraitSystem )
{
//switch on the trait, and add it to the list
switch( uiCnt )
{
case IMP_SKILL_TRAITS_NEW_AUTO_WEAPONS:
AddSkillToSkillList( AUTO_WEAPONS_NT );
break;
case IMP_SKILL_TRAITS_NEW_HEAVY_WEAPONS:
AddSkillToSkillList( HEAVY_WEAPONS_NT );
break;
case IMP_SKILL_TRAITS_NEW_PROF_SNIPER:
AddSkillToSkillList( SNIPER_NT );
break;
case IMP_SKILL_TRAITS_NEW_RANGER:
AddSkillToSkillList( RANGER_NT );
break;
case IMP_SKILL_TRAITS_NEW_GUNSLINGER:
AddSkillToSkillList( GUNSLINGER_NT );
break;
case IMP_SKILL_TRAITS_NEW_MARTIAL_ARTS:
AddSkillToSkillList( MARTIAL_ARTS_NT );
break;
case IMP_SKILL_TRAITS_NEW_SQUADLEADER:
AddSkillToSkillList( SQUADLEADER_NT );
break;
case IMP_SKILL_TRAITS_NEW_TECHNICIAN:
AddSkillToSkillList( TECHNICIAN_NT );
break;
case IMP_SKILL_TRAITS_NEW_DOCTOR:
AddSkillToSkillList( DOCTOR_NT );
break;
default:
break;
}
}
else
{
//switch on the trait, and add it to the list
switch( uiCnt )
{
case IMP_SKILL_TRAITS__LOCKPICK:
AddSkillToSkillList( LOCKPICKING_OT );
break;
case IMP_SKILL_TRAITS__HAND_2_HAND:
AddSkillToSkillList( HANDTOHAND_OT );
break;
case IMP_SKILL_TRAITS__ELECTRONICS:
AddSkillToSkillList( ELECTRONICS_OT );
break;
case IMP_SKILL_TRAITS__NIGHT_OPS:
AddSkillToSkillList( NIGHTOPS_OT );
break;
case IMP_SKILL_TRAITS__THROWING:
AddSkillToSkillList( THROWING_OT );
break;
case IMP_SKILL_TRAITS__TEACHING:
AddSkillToSkillList( TEACHING_OT );
break;
case IMP_SKILL_TRAITS__HEAVY_WEAPONS:
AddSkillToSkillList( HEAVY_WEAPS_OT );
break;
case IMP_SKILL_TRAITS__AUTO_WEAPONS:
AddSkillToSkillList( AUTO_WEAPS_OT );
break;
case IMP_SKILL_TRAITS__STEALTHY:
AddSkillToSkillList( STEALTHY_OT );
break;
case IMP_SKILL_TRAITS__AMBIDEXTROUS:
AddSkillToSkillList( AMBIDEXT_OT );
break;
case IMP_SKILL_TRAITS__KNIFING:
AddSkillToSkillList( KNIFING_OT );
break;
case IMP_SKILL_TRAITS__PROF_SNIPER:
AddSkillToSkillList( PROF_SNIPER_OT );
break;
case IMP_SKILL_TRAITS__CAMO:
AddSkillToSkillList( CAMOUFLAGED_OT );
break;
case IMP_SKILL_TRAITS__MARTIAL_ARTS:
AddSkillToSkillList( MARTIALARTS_OT );
break;
default:
break;
}
}
}
//if the trait is selected
if( gfSkillTraitQuestions2[ uiCnt ] )
{
// ugly check for old/new traits - SANDRO
if( gGameOptions.fNewTraitSystem )
{
//switch on the trait, and add it to the list
switch( uiCnt )
{
case IMP_SKILL_TRAITS_NEW_AUTO_WEAPONS:
AddSkillToSkillList( AUTO_WEAPONS_NT );
break;
case IMP_SKILL_TRAITS_NEW_HEAVY_WEAPONS:
AddSkillToSkillList( HEAVY_WEAPONS_NT );
break;
case IMP_SKILL_TRAITS_NEW_PROF_SNIPER:
AddSkillToSkillList( SNIPER_NT );
break;
case IMP_SKILL_TRAITS_NEW_RANGER:
AddSkillToSkillList( RANGER_NT );
break;
case IMP_SKILL_TRAITS_NEW_GUNSLINGER:
AddSkillToSkillList( GUNSLINGER_NT );
break;
case IMP_SKILL_TRAITS_NEW_MARTIAL_ARTS:
AddSkillToSkillList( MARTIAL_ARTS_NT );
break;
case IMP_SKILL_TRAITS_NEW_SQUADLEADER:
AddSkillToSkillList( SQUADLEADER_NT );
break;
case IMP_SKILL_TRAITS_NEW_TECHNICIAN:
AddSkillToSkillList( TECHNICIAN_NT );
break;
case IMP_SKILL_TRAITS_NEW_DOCTOR:
AddSkillToSkillList( DOCTOR_NT );
break;
default:
break;
}
}
else
{
//switch on the trait, and add it to the list
switch( uiCnt )
{
case IMP_SKILL_TRAITS__LOCKPICK:
AddSkillToSkillList( LOCKPICKING_OT );
break;
case IMP_SKILL_TRAITS__HAND_2_HAND:
AddSkillToSkillList( HANDTOHAND_OT );
break;
case IMP_SKILL_TRAITS__ELECTRONICS:
if (gfSkillTraitQuestions[ uiCnt ] != gfSkillTraitQuestions2[ uiCnt ] )
AddSkillToSkillList( ELECTRONICS_OT );
break;
case IMP_SKILL_TRAITS__NIGHT_OPS:
AddSkillToSkillList( NIGHTOPS_OT );
break;
case IMP_SKILL_TRAITS__THROWING:
AddSkillToSkillList( THROWING_OT );
break;
case IMP_SKILL_TRAITS__TEACHING:
AddSkillToSkillList( TEACHING_OT );
break;
case IMP_SKILL_TRAITS__HEAVY_WEAPONS:
AddSkillToSkillList( HEAVY_WEAPS_OT );
break;
case IMP_SKILL_TRAITS__AUTO_WEAPONS:
AddSkillToSkillList( AUTO_WEAPS_OT );
break;
case IMP_SKILL_TRAITS__STEALTHY:
AddSkillToSkillList( STEALTHY_OT );
break;
case IMP_SKILL_TRAITS__AMBIDEXTROUS:
if (gfSkillTraitQuestions[ uiCnt ] != gfSkillTraitQuestions2[ uiCnt ] )
AddSkillToSkillList( AMBIDEXT_OT );
break;
case IMP_SKILL_TRAITS__KNIFING:
AddSkillToSkillList( KNIFING_OT );
break;
case IMP_SKILL_TRAITS__PROF_SNIPER:
AddSkillToSkillList( PROF_SNIPER_OT );
break;
case IMP_SKILL_TRAITS__CAMO:
if (gfSkillTraitQuestions[ uiCnt ] != gfSkillTraitQuestions2[ uiCnt ] )
AddSkillToSkillList( CAMOUFLAGED_OT );
break;
case IMP_SKILL_TRAITS__MARTIAL_ARTS:
AddSkillToSkillList( MARTIALARTS_OT );
break;
default:
break;
}
}
}
}
}
void HandleLastSelectedTraits( INT8 bNewTrait )
{
INT16 iCnt;
if (bNewTrait == -1)
{
// we only want to delete the last selected trait from list
for( iCnt=9; iCnt>=0; iCnt-- )
{
if ( gbLastSelectedTraits[ iCnt ] > 0 )
{
gbLastSelectedTraits[ iCnt ] = 0;
break;
}
}
}
else
{
for( iCnt=0; iCnt<9; iCnt++ )
{
gbLastSelectedTraits[ (iCnt + 1) ] = gbLastSelectedTraits[ iCnt ];
}
gbLastSelectedTraits[ 0 ] = bNewTrait;
}
}
INT8 GetLastSelectedSkill( void )
{
INT16 iCnt;
for( iCnt=9; iCnt>=0; iCnt-- )
{
if ( gbLastSelectedTraits[ iCnt ] > 0 )
{
return ( gbLastSelectedTraits[ iCnt ] );
break;
}
}
return ( 0 );
}
INT32 StrengthRequiredDueToMajorSkills( void )
{
// Only for new trait system
if (!gGameOptions.fNewTraitSystem || !gSkillTraitValues.fAllowAttributePrereq)
{
return 0;
}
// Check first skill trait (plus second for double trait)
if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_MARTIAL_ARTS ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_MARTIAL_ARTS ])
return (70);
else
return (55);
}
else if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_HEAVY_WEAPONS ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_HEAVY_WEAPONS ])
return (60);
else
return (45);
}
else if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_AUTO_WEAPONS ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_AUTO_WEAPONS ])
return (55);
else
return (40);
}
// Check the second skill trait
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_MARTIAL_ARTS ])
{
return (55);
}
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_HEAVY_WEAPONS ])
{
return (45);
}
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_AUTO_WEAPONS ])
{
return (40);
}
return(0);
}
INT32 AgilityRequiredDueToMajorSkills( void )
{
// Only for new trait system
if (!gGameOptions.fNewTraitSystem || !gSkillTraitValues.fAllowAttributePrereq)
{
return 0;
}
// Check first skill trait (plus second for double trait)
if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_MARTIAL_ARTS ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_MARTIAL_ARTS ])
return (70);
else
return (55);
}
else if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_GUNSLINGER ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_GUNSLINGER ])
return (65);
else
return (50);
}
else if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_RANGER ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_RANGER ])
return (60);
else
return (45);
}
// Check the second skill trait
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_MARTIAL_ARTS ])
{
return (55);
}
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_GUNSLINGER ])
{
return (50);
}
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_RANGER ])
{
return (45);
}
return(0);
}
INT32 DexterityRequiredDueToMajorSkills( void )
{
// Only for new trait system
if (!gGameOptions.fNewTraitSystem || !gSkillTraitValues.fAllowAttributePrereq)
{
return 0;
}
// Check first skill trait (plus second for double trait)
if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_MARTIAL_ARTS ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_MARTIAL_ARTS ])
return (70);
else
return (55);
}
else if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_PROF_SNIPER ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_PROF_SNIPER ])
return (70);
else
return (55);
}
else if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_AUTO_WEAPONS ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_AUTO_WEAPONS ])
return (65);
else
return (50);
}
else if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_GUNSLINGER ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_GUNSLINGER ])
return (65);
else
return (50);
}
else if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_TECHNICIAN ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_TECHNICIAN ])
return (65);
else
return (50);
}
else if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_DOCTOR ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_DOCTOR ])
return (65);
else
return (50);
}
else if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_HEAVY_WEAPONS ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_HEAVY_WEAPONS ])
return (60);
else
return (45);
}
// Check the second skill trait
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_MARTIAL_ARTS ])
{
return (55);
}
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_PROF_SNIPER ])
{
return (55);
}
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_AUTO_WEAPONS ])
{
return (50);
}
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_GUNSLINGER ])
{
return (50);
}
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_TECHNICIAN ])
{
return (50);
}
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_DOCTOR ])
{
return (50);
}
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_HEAVY_WEAPONS ])
{
return (45);
}
return(0);
}
INT32 HealthRequiredDueToMajorSkills( void )
{
// Only for new trait system
if (!gGameOptions.fNewTraitSystem || !gSkillTraitValues.fAllowAttributePrereq)
{
return 0;
}
// Check first skill trait (plus second for double trait)
if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_RANGER ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_RANGER ])
return (70);
else
return (55);
}
else if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_AUTO_WEAPONS ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_AUTO_WEAPONS ])
return (60);
else
return (45);
}
else if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_MARTIAL_ARTS ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_MARTIAL_ARTS ])
return (60);
else
return (45);
}
// Check the second skill trait
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_RANGER ])
{
return (55);
}
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_AUTO_WEAPONS ])
{
return (45);
}
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_MARTIAL_ARTS ])
{
return (45);
}
return(0);
}
INT32 LeadershipRequiredDueToMajorSkills( void )
{
// Only for new trait system
if (!gGameOptions.fNewTraitSystem || !gSkillTraitValues.fAllowAttributePrereq)
{
return 0;
}
// Check first skill trait (plus second for double trait)
if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_SQUADLEADER ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_SQUADLEADER ])
return (65);
else
return (50);
}
else if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_RANGER ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_RANGER ])
return (50);
else
return (35);
}
// Check the second skill trait
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_SQUADLEADER ])
{
return (50);
}
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_RANGER ])
{
return (35);
}
return(0);
}
INT32 WisdomRequiredDueToMajorSkills( void )
{
// Only for new trait system
if (!gGameOptions.fNewTraitSystem || !gSkillTraitValues.fAllowAttributePrereq)
{
return 0;
}
// Check first skill trait (plus second for double trait)
if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_SQUADLEADER ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_SQUADLEADER ])
return (75);
else
return (60);
}
else if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_HEAVY_WEAPONS ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_HEAVY_WEAPONS ])
return (70);
else
return (55);
}
else if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_DOCTOR ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_DOCTOR ])
return (70);
else
return (55);
}
else if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_PROF_SNIPER ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_PROF_SNIPER ])
return (65);
else
return (50);
}
else if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_TECHNICIAN ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_TECHNICIAN ])
return (60);
else
return (45);
}
// Check the second skill trait
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_SQUADLEADER ])
{
return (60);
}
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_HEAVY_WEAPONS ])
{
return (55);
}
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_DOCTOR ])
{
return (55);
}
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_PROF_SNIPER ])
{
return (50);
}
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_TECHNICIAN ])
{
return (45);
}
return(0);
}
INT32 MarksmanshipRequiredDueToMajorSkills( void )
{
// Only for new trait system
if (!gGameOptions.fNewTraitSystem || !gSkillTraitValues.fAllowAttributePrereq)
{
return 0;
}
// Check first skill trait (plus second for double trait)
if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_PROF_SNIPER ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_PROF_SNIPER ])
return (80);
else
return (65);
}
else if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_RANGER ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_RANGER ])
return (70);
else
return (55);
}
else if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_GUNSLINGER ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_GUNSLINGER ])
return (70);
else
return (55);
}
else if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_AUTO_WEAPONS ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_AUTO_WEAPONS ])
return (60);
else
return (45);
}
// Check the second skill trait
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_PROF_SNIPER ])
{
return (65);
}
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_RANGER ])
{
return (55);
}
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_GUNSLINGER ])
{
return (55);
}
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_AUTO_WEAPONS ])
{
return (45);
}
return(0);
}
INT32 MechanicalRequiredDueToMajorSkills( void )
{
// Only for new trait system
if (!gGameOptions.fNewTraitSystem || !gSkillTraitValues.fAllowAttributePrereq)
{
return 0;
}
// Check first skill trait (plus second for double trait)
if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_TECHNICIAN ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_TECHNICIAN ])
return (60);
else
return (45);
}
// Check the second skill trait
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_TECHNICIAN ])
{
return (45);
}
return(0);
}
INT32 MedicalRequiredDueToMajorSkills( void )
{
// Only for new trait system
if (!gGameOptions.fNewTraitSystem || !gSkillTraitValues.fAllowAttributePrereq)
{
return 0;
}
// Check first skill trait (plus second for double trait)
if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_DOCTOR ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_DOCTOR ])
return (60);
else
return (45);
}
// Check the second skill trait
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_DOCTOR ])
{
return (45);
}
return(0);
}
INT32 ExplosivesRequiredDueToMajorSkills( void )
{
// Only for new trait system
if (!gGameOptions.fNewTraitSystem || !gSkillTraitValues.fAllowAttributePrereq)
{
return 0;
}
// Check first skill trait (plus second for double trait)
if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_HEAVY_WEAPONS ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_HEAVY_WEAPONS ])
return (60);
else
return (45);
}
else if (gfSkillTraitQuestions[ IMP_SKILL_TRAITS_NEW_TECHNICIAN ])
{
if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_TECHNICIAN ])
return (60);
else
return (45);
}
// Check the second skill trait
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_HEAVY_WEAPONS ])
{
return (45);
}
else if (gfSkillTraitQuestions2[ IMP_SKILL_TRAITS_NEW_TECHNICIAN ])
{
return (45);
}
return(0);
}
void AssignSkillTraitHelpText( UINT8 ubTraitNumber, BOOLEAN fExpertLevel )
{
CHAR16 apStr[ 5000 ];
CHAR16 atStr[ 1500 ];
if( gGameOptions.fNewTraitSystem )
{
switch( ubTraitNumber )
{
case IMP_SKILL_TRAITS_NEW_AUTO_WEAPONS:
{
swprintf( apStr, L"" );
if( gSkillTraitValues.ubAWBonusCtHAssaultRifles != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsAutoWeapons[0], ( gSkillTraitValues.ubAWBonusCtHAssaultRifles * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubAWBonusCtHSMGs != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsAutoWeapons[1], ( gSkillTraitValues.ubAWBonusCtHSMGs * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubAWBonusCtHLMGs != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsAutoWeapons[2], ( gSkillTraitValues.ubAWBonusCtHLMGs * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubAWFiringSpeedBonusLMGs != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsAutoWeapons[3], ( gSkillTraitValues.ubAWFiringSpeedBonusLMGs * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubAWPercentReadyLMGReduction != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsAutoWeapons[4], ( gSkillTraitValues.ubAWPercentReadyLMGReduction * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubAWAutoFirePenaltyReduction != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsAutoWeapons[5], ( gSkillTraitValues.ubAWAutoFirePenaltyReduction * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubAWUnwantedBulletsReduction > 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsAutoWeapons[6]);
wcscat( apStr, atStr );
}
break;
}
case IMP_SKILL_TRAITS_NEW_HEAVY_WEAPONS:
{
swprintf( apStr, L"" );
if( gSkillTraitValues.ubHWGrenadeLaunchersAPsReduction != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsHeavyWeapons[0], ( gSkillTraitValues.ubHWGrenadeLaunchersAPsReduction * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubHWRocketLaunchersAPsReduction != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsHeavyWeapons[1], ( gSkillTraitValues.ubHWRocketLaunchersAPsReduction * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubHWBonusCtHGrenadeLaunchers != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsHeavyWeapons[2], ( gSkillTraitValues.ubHWBonusCtHGrenadeLaunchers * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubHWBonusCtHRocketLaunchers != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsHeavyWeapons[3], ( gSkillTraitValues.ubHWBonusCtHRocketLaunchers * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubHWMortarAPsReduction != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsHeavyWeapons[4], ( gSkillTraitValues.ubHWMortarAPsReduction * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubHWMortarCtHPenaltyReduction != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsHeavyWeapons[5], ( gSkillTraitValues.ubHWMortarCtHPenaltyReduction * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubHWDamageTanksBonusPercent != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsHeavyWeapons[6], ( gSkillTraitValues.ubHWDamageTanksBonusPercent * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubHWDamageBonusPercentForHW != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsHeavyWeapons[7], ( gSkillTraitValues.ubHWDamageBonusPercentForHW * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
break;
}
case IMP_SKILL_TRAITS_NEW_PROF_SNIPER:
{
swprintf( apStr, L"" );
if( gSkillTraitValues.ubSNBonusCtHRifles != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsSniper[0], ( gSkillTraitValues.ubSNBonusCtHRifles * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubSNBonusCtHSniperRifles != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsSniper[1], ( gSkillTraitValues.ubSNBonusCtHSniperRifles * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubSNEffRangeToTargetReduction != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsSniper[2], ( gSkillTraitValues.ubSNEffRangeToTargetReduction * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubSNAimingBonusPerClick != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsSniper[3], ( gSkillTraitValues.ubSNAimingBonusPerClick * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubSNDamageBonusPerClick != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsSniper[4], ( gSkillTraitValues.ubSNDamageBonusPerClick * (fExpertLevel ? 2 : 1)), L"%");
if( gSkillTraitValues.ubSNDamageBonusFromNumClicks == 0)
{
wcscat( apStr, gzIMPMajorTraitsHelpTextsSniper[5] );
wcscat( apStr, gzIMPMajorTraitsHelpTextsSniper[6] );
}
else if( gSkillTraitValues.ubSNDamageBonusFromNumClicks == 1 )
{
wcscat( atStr, gzIMPMajorTraitsHelpTextsSniper[6] );
}
else
{
wcscat( atStr, gzIMPMajorTraitsHelpTextsSniper[6] );
wcscat( atStr, gzIMPMajorTraitsHelpTextsSniper[gSkillTraitValues.ubSNDamageBonusFromNumClicks + 4] );
}
wcscat( atStr, L"\n" );
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubSNChamberRoundAPsReduction != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsSniper[14], ( gSkillTraitValues.ubSNChamberRoundAPsReduction * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubSNAimClicksAdded != 0 )
{
if( gSkillTraitValues.ubSNAimClicksAdded == 1 && !fExpertLevel)
swprintf( atStr, gzIMPMajorTraitsHelpTextsSniper[15]);
else
swprintf( atStr, gzIMPMajorTraitsHelpTextsSniper[16], ( gSkillTraitValues.ubSNAimClicksAdded * (fExpertLevel ? 2 : 1)));
wcscat( apStr, atStr );
}
break;
}
case IMP_SKILL_TRAITS_NEW_RANGER:
{
swprintf( apStr, L"" );
if( gSkillTraitValues.ubRABonusCtHRifles != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsRanger[0], ( gSkillTraitValues.ubRABonusCtHRifles * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubRABonusCtHShotguns != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsRanger[1], ( gSkillTraitValues.ubRABonusCtHShotguns * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubRAPumpShotgunsAPsReduction != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsRanger[2], ( gSkillTraitValues.ubRAPumpShotgunsAPsReduction * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubRAGroupTimeSpentForTravellingFoot != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsRanger[3], ( gSkillTraitValues.ubRAGroupTimeSpentForTravellingFoot * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubRAGroupTimeSpentForTravellingVehicle != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsRanger[4], ( gSkillTraitValues.ubRAGroupTimeSpentForTravellingVehicle * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubRABreathForTravellingReduction != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsRanger[5], ( gSkillTraitValues.ubRABreathForTravellingReduction * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubRAWeatherPenaltiesReduction != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsRanger[6], ( gSkillTraitValues.ubRAWeatherPenaltiesReduction * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
// if( gSkillTraitValues.ubRACamoEffectivenessBonus != 0 )
// {
// swprintf( atStr, gzIMPMajorTraitsHelpTextsRanger[7], ( gSkillTraitValues.ubRACamoEffectivenessBonus * (fExpertLevel ? 2 : 1)), L"%");
// wcscat( apStr, atStr );
// }
if( gSkillTraitValues.ubRACamoWornountSpeedReduction != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsRanger[8], ( gSkillTraitValues.ubRACamoWornountSpeedReduction * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
break;
}
case IMP_SKILL_TRAITS_NEW_GUNSLINGER:
{
swprintf( apStr, L"" );
if( gSkillTraitValues.ubGSFiringSpeedBonusPistols != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsGunslinger[0], ( gSkillTraitValues.ubGSFiringSpeedBonusPistols * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubGSEffectiveRangeBonusPistols != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsGunslinger[1], ( gSkillTraitValues.ubGSEffectiveRangeBonusPistols * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubGSBonusCtHPistols != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsGunslinger[2], ( gSkillTraitValues.ubGSBonusCtHPistols * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubGSBonusCtHMachinePistols != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsGunslinger[3], ( gSkillTraitValues.ubGSBonusCtHMachinePistols * (fExpertLevel ? 2 : 1)), L"%");
if( gSkillTraitValues.ubGSCtHMPExcludeAuto )
wcscat( atStr, gzIMPMajorTraitsHelpTextsGunslinger[4] );
wcscat( atStr, L"\n");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubGSAimingBonusPerClick != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsGunslinger[5], ( gSkillTraitValues.ubGSAimingBonusPerClick * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubGSPercentReadyPistolsReduction != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsGunslinger[6], ( gSkillTraitValues.ubGSPercentReadyPistolsReduction * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubGSRealoadSpeedHandgunsBonus != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsGunslinger[7], ( gSkillTraitValues.ubGSRealoadSpeedHandgunsBonus * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubGSAimClicksAdded != 0 )
{
if( gSkillTraitValues.ubGSAimClicksAdded == 1 && !fExpertLevel )
swprintf( atStr, gzIMPMajorTraitsHelpTextsGunslinger[8], ( gSkillTraitValues.ubGSAimClicksAdded * (fExpertLevel ? 2 : 1)));
else
swprintf( atStr, gzIMPMajorTraitsHelpTextsGunslinger[9], ( gSkillTraitValues.ubGSAimClicksAdded * (fExpertLevel ? 2 : 1)));
wcscat( apStr, atStr );
}
break;
}
case IMP_SKILL_TRAITS_NEW_MARTIAL_ARTS:
{
swprintf( apStr, L"" );
if( gSkillTraitValues.ubMAPunchAPsReduction != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[0], ( gSkillTraitValues.ubMAPunchAPsReduction * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubMABonusCtHBareHands != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[1], ( gSkillTraitValues.ubMABonusCtHBareHands * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubMABonusCtHBrassKnuckles != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[2], ( gSkillTraitValues.ubMABonusCtHBrassKnuckles * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubMABonusDamageHandToHand != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[3], ( gSkillTraitValues.ubMABonusDamageHandToHand * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubMABonusBreathDamageHandToHand != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[4], ( gSkillTraitValues.ubMABonusBreathDamageHandToHand * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.usMALostBreathRegainPenalty != 0 )
{
if( (gSkillTraitValues.usMALostBreathRegainPenalty * (fExpertLevel ? 2 : 1)) <= 25)
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[5]);
else if( (gSkillTraitValues.usMALostBreathRegainPenalty * (fExpertLevel ? 2 : 1)) <= 50)
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[6]);
else if( (gSkillTraitValues.usMALostBreathRegainPenalty * (fExpertLevel ? 2 : 1)) <= 100)
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[7]);
else if( (gSkillTraitValues.usMALostBreathRegainPenalty * (fExpertLevel ? 2 : 1)) <= 200)
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[8]);
else if( (gSkillTraitValues.usMALostBreathRegainPenalty * (fExpertLevel ? 2 : 1)) <= 400)
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[9]);
else if( (gSkillTraitValues.usMALostBreathRegainPenalty * (fExpertLevel ? 2 : 1)) <= 700)
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[10]);
else
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[11]);
wcscat( apStr, atStr );
}
if( gSkillTraitValues.usMAAimedPunchDamageBonus != 0 )
{
if (!fCharacterIsMale || bBigBodySelected() || (gSkillTraitValues.fPermitExtraAnimationsOnlyToMA && (!gfSkillTraitQuestions[ubTraitNumber] || !gfSkillTraitQuestions2[ubTraitNumber])))
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[12], ( gSkillTraitValues.usMAAimedPunchDamageBonus * (fExpertLevel ? 2 : 1)), L"%");
else
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[13], ( gSkillTraitValues.usMAAimedPunchDamageBonus * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubMAChanceToDodgeHtH != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[14], ( gSkillTraitValues.ubMAChanceToDodgeHtH * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubMAOnTopCTDHtHBareHanded != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[15], ( gSkillTraitValues.ubMAOnTopCTDHtHBareHanded * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
if( gSkillTraitValues.ubMAOnTopCTDHtHBrassKnuckles == gSkillTraitValues.ubMAOnTopCTDHtHBareHanded )
wcscat( apStr, gzIMPMajorTraitsHelpTextsMartialArts[16] );
else if( gSkillTraitValues.ubMAOnTopCTDHtHBrassKnuckles > 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[17], ( gSkillTraitValues.ubMAOnTopCTDHtHBrassKnuckles * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
wcscat( apStr, L"\n" );
}
else if( gSkillTraitValues.ubMAOnTopCTDHtHBrassKnuckles != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[18], ( gSkillTraitValues.ubMAOnTopCTDHtHBrassKnuckles * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubMAChanceToDodgeMelee != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[19], ( gSkillTraitValues.ubMAChanceToDodgeMelee * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubMAReducedAPsToSteal != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[20], ( gSkillTraitValues.ubMAReducedAPsToSteal * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubMAAPsChangeStanceReduction != 0 && ( gSkillTraitValues.ubMAAPsChangeStanceReduction == gSkillTraitValues.ubMAApsTurnAroundReduction == gSkillTraitValues.ubMAAPsClimbOrJumpReduction ))
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[21], ( gSkillTraitValues.ubMAAPsChangeStanceReduction * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
else
{
if( gSkillTraitValues.ubMAAPsChangeStanceReduction != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[22], ( gSkillTraitValues.ubMAAPsChangeStanceReduction * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubMAApsTurnAroundReduction != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[23], ( gSkillTraitValues.ubMAApsTurnAroundReduction * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubMAAPsClimbOrJumpReduction != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[24], ( gSkillTraitValues.ubMAAPsClimbOrJumpReduction * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
}
if( gSkillTraitValues.ubMAReducedAPsRegisteredWhenMoving != 0 && gGameExternalOptions.fImprovedInterruptSystem )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[27], ( gSkillTraitValues.ubMAReducedAPsRegisteredWhenMoving * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubMAChanceToCkickDoors != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[25], ( gSkillTraitValues.ubMAChanceToCkickDoors * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if (fCharacterIsMale && !bBigBodySelected() &&
((gSkillTraitValues.fPermitExtraAnimationsOnlyToMA && fExpertLevel) ||
!gSkillTraitValues.fPermitExtraAnimationsOnlyToMA ))
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsMartialArts[26]);
wcscat( apStr, atStr );
}
break;
}
case IMP_SKILL_TRAITS_NEW_SQUADLEADER:
{
swprintf( apStr, L"" );
if( gSkillTraitValues.ubSLBonusAPsPercent != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsSquadleader[0], ( gSkillTraitValues.ubSLBonusAPsPercent * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubSLEffectiveLevelInRadius != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsSquadleader[1], ( gSkillTraitValues.ubSLEffectiveLevelInRadius * (fExpertLevel ? 2 : 1)), (fExpertLevel ? gzIMPSkillTraitsTextNewMajor[ubTraitNumber + 11] : gzIMPSkillTraitsTextNewMajor[ubTraitNumber]));
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubSLEffectiveLevelAsStandby != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsSquadleader[2], ( gSkillTraitValues.ubSLEffectiveLevelAsStandby * (fExpertLevel ? 2 : 1)));
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubSLCollectiveInterruptsBonus != 0 && gGameExternalOptions.fImprovedInterruptSystem )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsSquadleader[11], ( gSkillTraitValues.ubSLCollectiveInterruptsBonus * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubSLOverallSuppresionBonusPercent != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsSquadleader[3], ( gSkillTraitValues.ubSLOverallSuppresionBonusPercent * (fExpertLevel ? 2 : 1)), L"%", (fExpertLevel ? gzIMPSkillTraitsTextNewMajor[ubTraitNumber + 11] : gzIMPSkillTraitsTextNewMajor[ubTraitNumber]));
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubSLMoraleGainBonus != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsSquadleader[4], ( gSkillTraitValues.ubSLMoraleGainBonus * (fExpertLevel ? 2 : 1)));
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubSLMoraleLossReduction != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsSquadleader[5], ( gSkillTraitValues.ubSLMoraleLossReduction * (fExpertLevel ? 2 : 1)));
wcscat( apStr, atStr );
}
swprintf( atStr, gzIMPMajorTraitsHelpTextsSquadleader[6], gSkillTraitValues.usSLRadiusNormal);
wcscat( apStr, atStr );
if( gSkillTraitValues.usSLRadiusExtendedEar > gSkillTraitValues.usSLRadiusNormal )
swprintf( atStr, gzIMPMajorTraitsHelpTextsSquadleader[7], gSkillTraitValues.usSLRadiusExtendedEar);
wcscat( apStr, atStr );
wcscat( apStr, L"\n" );
if( gSkillTraitValues.ubSLMaxBonuses > 1 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsSquadleader[8], gSkillTraitValues.ubSLMaxBonuses ) ;
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubSLFearResistance != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsSquadleader[9], ( gSkillTraitValues.ubSLFearResistance * (fExpertLevel ? 2 : 1)), L"%", (fExpertLevel ? gzIMPSkillTraitsTextNewMajor[ubTraitNumber + 11] : gzIMPSkillTraitsTextNewMajor[ubTraitNumber]));
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubSLDeathMoralelossMultiplier != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsSquadleader[10], (1 + ( gSkillTraitValues.ubSLDeathMoralelossMultiplier * (fExpertLevel ? 2 : 1))), (fExpertLevel ? gzIMPSkillTraitsTextNewMajor[ubTraitNumber + 11] : gzIMPSkillTraitsTextNewMajor[ubTraitNumber]));
wcscat( apStr, atStr );
}
break;
}
case IMP_SKILL_TRAITS_NEW_TECHNICIAN:
{
swprintf( apStr, L"" );
if( gSkillTraitValues.usTERepairSpeedBonus != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsTechnician[0], ( gSkillTraitValues.usTERepairSpeedBonus * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.usTELockpickingBonus != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsTechnician[1], ( gSkillTraitValues.usTELockpickingBonus * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.usTEDisarmElTrapBonus != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsTechnician[2], ( gSkillTraitValues.usTEDisarmElTrapBonus * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.usTEAttachingItemsBonus != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsTechnician[3], ( gSkillTraitValues.usTEAttachingItemsBonus * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubTEUnjamGunBonus != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsTechnician[4], ( gSkillTraitValues.ubTEUnjamGunBonus * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubTERepairElectronicsPenaltyReduction != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsTechnician[5], ( gSkillTraitValues.ubTERepairElectronicsPenaltyReduction * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubTEChanceToDetectTrapsBonus != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsTechnician[6], ( gSkillTraitValues.ubTEChanceToDetectTrapsBonus * (fExpertLevel ? 2 : 1)));
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubTECtHControlledRobotBonus != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsTechnician[7], ( gSkillTraitValues.ubTECtHControlledRobotBonus * (fExpertLevel ? 2 : 1)), L"%", (fExpertLevel ? gzIMPSkillTraitsTextNewMajor[ubTraitNumber + 11] : gzIMPSkillTraitsTextNewMajor[ubTraitNumber]));
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubTETraitsNumToRepairRobot == 2 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsTechnician[8], (fExpertLevel ? gzIMPSkillTraitsTextNewMajor[ubTraitNumber + 11] : gzIMPSkillTraitsTextNewMajor[ubTraitNumber]));
wcscat( apStr, atStr );
}
else if( gSkillTraitValues.ubTETraitsNumToRepairRobot == 1 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsTechnician[8], (fExpertLevel ? gzIMPSkillTraitsTextNewMajor[ubTraitNumber + 11] : gzIMPSkillTraitsTextNewMajor[ubTraitNumber]));
wcscat( apStr, atStr );
if( gSkillTraitValues.ubTERepairRobotPenaltyReduction != 0 && fExpertLevel)
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsTechnician[9], ( gSkillTraitValues.ubTERepairRobotPenaltyReduction * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
}
break;
}
case IMP_SKILL_TRAITS_NEW_DOCTOR:
{
BOOLEAN fCanSurgery = FALSE;
swprintf( apStr, L"" );
if( gSkillTraitValues.ubDONumberTraitsNeededForSurgery != 0 && ((gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentOnTop) > 0))
{
if( gSkillTraitValues.ubDONumberTraitsNeededForSurgery <= (fExpertLevel ? 2 : 1))
{
fCanSurgery = TRUE;
swprintf( atStr, gzIMPMajorTraitsHelpTextsDoctor[0]);
wcscat( apStr, atStr );
swprintf( atStr, gzIMPMajorTraitsHelpTextsDoctor[1], (gSkillTraitValues.ubDOSurgeryHealPercentBase + ( gSkillTraitValues.ubDOSurgeryHealPercentOnTop * (fExpertLevel ? 2 : 1))), L"%");
wcscat( apStr, atStr );
if( gSkillTraitValues.usDOSurgeryMedBagConsumption >= 60 )
wcscat( apStr, gzIMPMajorTraitsHelpTextsDoctor[2] );
wcscat( apStr, L"\n" );
}
}
if( (gSkillTraitValues.usDORepairStatsRateBasic + gSkillTraitValues.usDORepairStatsRateOnTop) > 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsDoctor[3]);
wcscat( apStr, atStr );
if( fCanSurgery )
wcscat( apStr, gzIMPMajorTraitsHelpTextsDoctor[4] );
wcscat( apStr, gzIMPMajorTraitsHelpTextsDoctor[5] );
}
if( gSkillTraitValues.usDODoctorAssignmentBonus != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsDoctor[6], ( gSkillTraitValues.usDODoctorAssignmentBonus * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubDOBandagingSpeedPercent != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsDoctor[7], ( gSkillTraitValues.ubDOBandagingSpeedPercent * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( gSkillTraitValues.ubDONaturalRegenBonus != 0 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsDoctor[8], ( gSkillTraitValues.ubDONaturalRegenBonus * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
if( gSkillTraitValues.ubDOMaxRegenBonuses > 1 )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsDoctor[9], gSkillTraitValues.ubDOMaxRegenBonuses ) ;
wcscat( apStr, atStr );
}
wcscat( apStr, L"\n" );
}
break;
}
case IMP_SKILL_TRAITS_NEW_MAJOR_NONE:
{
swprintf( apStr, gzIMPMajorTraitsHelpTextsNone[0] );
break;
}
}
}
else
{
switch( ubTraitNumber )
{
case IMP_SKILL_TRAITS__LOCKPICK:
{
swprintf( apStr, L"" );
if( gbSkillTraitBonus[LOCKPICKING_OT] != 0 )
{
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[0], ( gbSkillTraitBonus[LOCKPICKING_OT] * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
break;
}
case IMP_SKILL_TRAITS__HAND_2_HAND:
{
swprintf( apStr, L"" );
if( gbSkillTraitBonus[HANDTOHAND_OT] != 0 )
{
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[1], ( gbSkillTraitBonus[HANDTOHAND_OT] * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[2], ( 3 * gbSkillTraitBonus[HANDTOHAND_OT] * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[3], ( gbSkillTraitBonus[HANDTOHAND_OT] * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
break;
}
case IMP_SKILL_TRAITS__ELECTRONICS:
{
swprintf( apStr, L"" );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[4] );
wcscat( apStr, atStr );
break;
}
case IMP_SKILL_TRAITS__NIGHT_OPS:
{
swprintf( apStr, L"" );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[5], (fExpertLevel ? 2 : 1));
wcscat( apStr, atStr );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[6], (fExpertLevel ? 2 : 1));
wcscat( apStr, atStr );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[7], (fExpertLevel ? 2 : 1));
wcscat( apStr, atStr );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[8], (fExpertLevel ? 2 : 1));
wcscat( apStr, atStr );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[9], (fExpertLevel ? 2 : 1));
wcscat( apStr, atStr );
break;
}
case IMP_SKILL_TRAITS__THROWING:
{
swprintf( apStr, L"" );
if( gbSkillTraitBonus[THROWING_OT] != 0 )
{
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[10], ( gbSkillTraitBonus[THROWING_OT] * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[11], ( gbSkillTraitBonus[THROWING_OT] * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[12], ( 10 * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
break;
}
case IMP_SKILL_TRAITS__TEACHING:
{
swprintf( apStr, L"" );
if( gGameExternalOptions.ubTeachBonusToTrain != 0 )
{
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[13], ( gGameExternalOptions.ubTeachBonusToTrain * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
if( (gGameExternalOptions.usTeacherTraitEffectOnLeadership - 100) > 0 )
{
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[14], ( (gGameExternalOptions.usTeacherTraitEffectOnLeadership - 100) * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
break;
}
case IMP_SKILL_TRAITS__HEAVY_WEAPONS:
{
swprintf( apStr, L"" );
if( gbSkillTraitBonus[HEAVY_WEAPS_OT] != 0 )
{
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[15], ( gbSkillTraitBonus[HEAVY_WEAPS_OT] * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
break;
}
case IMP_SKILL_TRAITS__AUTO_WEAPONS:
{
swprintf( apStr, L"" );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[16], ( 2 * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[17] );
wcscat( apStr, atStr );
break;
}
case IMP_SKILL_TRAITS__STEALTHY:
{
swprintf( apStr, L"" );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[18], ( 25 * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
if( gGameExternalOptions.ubStealthTraitCoverValue != 0 )
{
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[19], ( gGameExternalOptions.ubStealthTraitCoverValue * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
break;
}
case IMP_SKILL_TRAITS__AMBIDEXTROUS:
{
swprintf( apStr, L"" );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[20] );
wcscat( apStr, atStr );
break;
}
case IMP_SKILL_TRAITS__KNIFING:
{
swprintf( apStr, L"" );
if( gbSkillTraitBonus[KNIFING_OT] != 0 )
{
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[21], ( gbSkillTraitBonus[KNIFING_OT] * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[22], ( gbSkillTraitBonus[KNIFING_OT] * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[23], ( gbSkillTraitBonus[KNIFING_OT] / 3 * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[24], ( gbSkillTraitBonus[KNIFING_OT] / 2 * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
break;
}
case IMP_SKILL_TRAITS__PROF_SNIPER:
{
swprintf( apStr, L"" );
if( gbSkillTraitBonus[PROF_SNIPER_OT] != 0 )
{
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[25], ( gbSkillTraitBonus[PROF_SNIPER_OT] * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[26], ( 10 * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
break;
}
case IMP_SKILL_TRAITS__CAMO:
{
swprintf( apStr, L"" );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[27] );
wcscat( apStr, atStr );
break;
}
case IMP_SKILL_TRAITS__MARTIAL_ARTS:
{
swprintf( apStr, L"" );
if( gbSkillTraitBonus[MARTIALARTS_OT] != 0 )
{
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[28], ( gbSkillTraitBonus[MARTIALARTS_OT] * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[29], ( gbSkillTraitBonus[MARTIALARTS_OT] * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[30], ( gbSkillTraitBonus[MARTIALARTS_OT] * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[31], ( gbSkillTraitBonus[MARTIALARTS_OT] * 2 / 3 * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[32], ( gbSkillTraitBonus[MARTIALARTS_OT] / 2 * (fExpertLevel ? 2 : 1)), L"%");
wcscat( apStr, atStr );
}
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[33]);
wcscat( apStr, atStr );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[34]);
wcscat( apStr, atStr );
break;
}
case IMP_SKILL_TRAITS__NONE:
{
swprintf( apStr, L"" );
swprintf( atStr, gzIMPOldSkillTraitsHelpTexts[35] );
wcscat( apStr, atStr );
break;
}
}
}
// Set region help text
SetRegionFastHelpText( &(gMR_SkillTraitHelpTextRegions[ubTraitNumber]), apStr );
SetRegionHelpEndCallback( &gMR_SkillTraitHelpTextRegions[ubTraitNumber], MSYS_NO_CALLBACK );
return;
}