dded new character trait "Coward" (charrcter trait #13)

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8362 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2017-01-12 23:24:41 +00:00
parent 556ce68586
commit 3419fd1c5d
27 changed files with 86 additions and 91 deletions
+2
View File
@@ -3656,6 +3656,8 @@ void LoadMoraleSettings()
gMoraleSettings.bValues[MORALE_BAD_FOOD] = iniReader.ReadInteger("Tactical Morale Settings","MORALE_BAD_FOOD", -1, -100, 100); gMoraleSettings.bValues[MORALE_BAD_FOOD] = iniReader.ReadInteger("Tactical Morale Settings","MORALE_BAD_FOOD", -1, -100, 100);
gMoraleSettings.bValues[MORALE_LOATHSOME_FOOD] = iniReader.ReadInteger("Tactical Morale Settings","MORALE_LOATHSOME_FOOD", -5, -100, 100); gMoraleSettings.bValues[MORALE_LOATHSOME_FOOD] = iniReader.ReadInteger("Tactical Morale Settings","MORALE_LOATHSOME_FOOD", -5, -100, 100);
gMoraleSettings.bValues[MORALE_FEAR_OF_HEIGHTS] = iniReader.ReadInteger( "Tactical Morale Settings", "MORALE_FEAR_OF_HEIGHTS", -8, -100, 100 ); gMoraleSettings.bValues[MORALE_FEAR_OF_HEIGHTS] = iniReader.ReadInteger( "Tactical Morale Settings", "MORALE_FEAR_OF_HEIGHTS", -8, -100, 100 );
gMoraleSettings.bValues[MORALE_RAN_AWAY_COWARD] = iniReader.ReadInteger( "Tactical Morale Settings", "MORALE_RAN_AWAY_COWARD", 5, -100, 100 );
gMoraleSettings.bValues[MORALE_ENEMYGROUP_COWARD] = iniReader.ReadInteger( "Tactical Morale Settings", "MORALE_ENEMYGROUP_COWARD", -3, -100, 100 );
gMoraleSettings.bValues[MORALE_KILLED_CIVILIAN] = iniReader.ReadInteger("Strategic Morale Settings","MORALE_KILLED_CIVILIAN", -5, -100, 100); gMoraleSettings.bValues[MORALE_KILLED_CIVILIAN] = iniReader.ReadInteger("Strategic Morale Settings","MORALE_KILLED_CIVILIAN", -5, -100, 100);
gMoraleSettings.bValues[MORALE_BATTLE_WON] = iniReader.ReadInteger("Strategic Morale Settings","MORALE_BATTLE_WON", 4, -100, 100); gMoraleSettings.bValues[MORALE_BATTLE_WON] = iniReader.ReadInteger("Strategic Morale Settings","MORALE_BATTLE_WON", 4, -100, 100);
-12
View File
@@ -712,7 +712,6 @@ BOOLEAN IsBackGroundAllowed( UINT16 ubNumber )
break; break;
} }
switch ( iAttitude ) switch ( iAttitude )
{ {
case CHAR_TRAIT_SOCIABLE: case CHAR_TRAIT_SOCIABLE:
@@ -723,17 +722,6 @@ BOOLEAN IsBackGroundAllowed( UINT16 ubNumber )
if ( zBackground[ ubNumber ].value[BG_LEADERSHIP] > 0 ) if ( zBackground[ ubNumber ].value[BG_LEADERSHIP] > 0 )
return FALSE; return FALSE;
break; break;
case CHAR_TRAIT_OPTIMIST:
case CHAR_TRAIT_ASSERTIVE:
case CHAR_TRAIT_INTELLECTUAL:
case CHAR_TRAIT_PRIMITIVE:
case CHAR_TRAIT_AGGRESSIVE:
case CHAR_TRAIT_PHLEGMATIC:
case CHAR_TRAIT_DAUNTLESS:
case CHAR_TRAIT_PACIFIST:
case CHAR_TRAIT_MALICIOUS:
case CHAR_TRAIT_SHOWOFF:
break;
default: default:
break; break;
} }
+14 -38
View File
@@ -70,7 +70,7 @@ INT32 giIMPCharacterTraitFinsihButtonImage;
//image handle //image handle
UINT32 guiIST_GreyGoldBox2; UINT32 guiIST_GreyGoldBox2;
MOUSE_REGION gMR_CharacterTraitHelpTextRegions[IMP_NUMBER_CHARACTER_TRAITS]; MOUSE_REGION gMR_CharacterTraitHelpTextRegions[NUM_CHAR_TRAITS];
//******************************************************************* //*******************************************************************
// //
@@ -102,7 +102,6 @@ void AssignCharacterTraitHelpText( UINT8 ubNumber );
void EnterIMPCharacterTrait( void ) void EnterIMPCharacterTrait( void )
{ {
// UINT32 ubCnt;
VOBJECT_DESC VObjectDesc; VOBJECT_DESC VObjectDesc;
//add the skill trait buttons //add the skill trait buttons
@@ -117,8 +116,6 @@ void EnterIMPCharacterTrait( void )
return; return;
} }
giIMPCharacterTraitFinsihButtonImage = LoadButtonImage( "LAPTOP\\button_5.sti" ,-1,0,-1,1,-1 ); giIMPCharacterTraitFinsihButtonImage = LoadButtonImage( "LAPTOP\\button_5.sti" ,-1,0,-1,1,-1 );
giIMPCharacterTraitFinsihButton = CreateIconAndTextButton( giIMPCharacterTraitFinsihButtonImage, pImpButtonText[ 13 ], FONT12ARIAL, giIMPCharacterTraitFinsihButton = CreateIconAndTextButton( giIMPCharacterTraitFinsihButtonImage, pImpButtonText[ 13 ], FONT12ARIAL,
FONT_WHITE, DEFAULT_SHADOW, FONT_WHITE, DEFAULT_SHADOW,
@@ -127,8 +124,6 @@ void EnterIMPCharacterTrait( void )
LAPTOP_SCREEN_UL_X + ( 350 ), LAPTOP_SCREEN_WEB_UL_Y + ( 340 ), BUTTON_TOGGLE, MSYS_PRIORITY_HIGH, LAPTOP_SCREEN_UL_X + ( 350 ), LAPTOP_SCREEN_WEB_UL_Y + ( 340 ), BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnIMPCharacterTraitFinishCallback ); BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnIMPCharacterTraitFinishCallback );
SetButtonCursor( giIMPCharacterTraitFinsihButton, CURSOR_WWW); SetButtonCursor( giIMPCharacterTraitFinsihButton, CURSOR_WWW);
//if we are not DONE and are just reviewing //if we are not DONE and are just reviewing
@@ -145,7 +140,7 @@ void EnterIMPCharacterTrait( void )
// add regions for help texts // add regions for help texts
UINT16 usPosX = IMP_CHARACTER_1ST_COLUMN_START_X + 62; UINT16 usPosX = IMP_CHARACTER_1ST_COLUMN_START_X + 62;
UINT16 usPosY = IMP_CHARACTER_1ST_COLUMN_START_Y + 8; UINT16 usPosY = IMP_CHARACTER_1ST_COLUMN_START_Y + 8;
for( UINT8 ubCnt=0; ubCnt<(gGameOptions.fNewTraitSystem ? IMP_NUMBER_CHARACTER_TRAITS : IMP_NUMBER_ATTITUDES); ubCnt++ ) for ( UINT8 ubCnt = 0; ubCnt<(gGameOptions.fNewTraitSystem ? NUM_CHAR_TRAITS : NUM_ATTITUDES); ++ubCnt )
{ {
MSYS_DefineRegion( &gMR_CharacterTraitHelpTextRegions[ubCnt], ( usPosX ), ( usPosY ), MSYS_DefineRegion( &gMR_CharacterTraitHelpTextRegions[ubCnt], ( usPosX ), ( usPosY ),
(usPosX + 156), ( usPosY + 17), MSYS_PRIORITY_HIGH, (usPosX + 156), ( usPosY + 17), MSYS_PRIORITY_HIGH,
@@ -167,7 +162,6 @@ void EnterIMPCharacterTrait( void )
} }
} }
void RenderIMPCharacterTrait( void ) void RenderIMPCharacterTrait( void )
{ {
//render the metal background graphic //render the metal background graphic
@@ -175,22 +169,19 @@ void RenderIMPCharacterTrait( void )
//Display the title //Display the title
if ( gGameOptions.fNewTraitSystem ) if ( gGameOptions.fNewTraitSystem )
DrawTextToScreen( gzIMPCharacterTraitText[IMP_NUMBER_CHARACTER_TRAITS], LAPTOP_SCREEN_UL_X - 111, LAPTOP_TITLE_Y, LAPTOP_TEXT_WIDTH, FONT14ARIAL, FONT_MCOLOR_WHITE, FONT_MCOLOR_BLACK, FALSE, CENTER_JUSTIFIED ); DrawTextToScreen( gzIMPCharacterTraitText[NUM_CHAR_TRAITS], LAPTOP_SCREEN_UL_X - 111, LAPTOP_TITLE_Y, LAPTOP_TEXT_WIDTH, FONT14ARIAL, FONT_MCOLOR_WHITE, FONT_MCOLOR_BLACK, FALSE, CENTER_JUSTIFIED );
else else
DrawTextToScreen( gzIMPAttitudesText[IMP_NUMBER_ATTITUDES], LAPTOP_SCREEN_UL_X - 111, LAPTOP_TITLE_Y, LAPTOP_TEXT_WIDTH, FONT14ARIAL, FONT_MCOLOR_WHITE, FONT_MCOLOR_BLACK, FALSE, CENTER_JUSTIFIED ); DrawTextToScreen( gzIMPAttitudesText[NUM_ATTITUDES], LAPTOP_SCREEN_UL_X - 111, LAPTOP_TITLE_Y, LAPTOP_TEXT_WIDTH, FONT14ARIAL, FONT_MCOLOR_WHITE, FONT_MCOLOR_BLACK, FALSE, CENTER_JUSTIFIED );
IMPCharacterTraitDisplayCharacterTraits(); IMPCharacterTraitDisplayCharacterTraits();
} }
void ExitIMPCharacterTrait( void ) void ExitIMPCharacterTrait( void )
{ {
INT32 iCnt;
DeleteVideoObjectFromIndex( guiIST_GreyGoldBox2 ); DeleteVideoObjectFromIndex( guiIST_GreyGoldBox2 );
//remove the skill buttons //remove the skill buttons
for(iCnt = 0; iCnt < (gGameOptions.fNewTraitSystem ? IMP_NUMBER_CHARACTER_TRAITS : IMP_NUMBER_ATTITUDES); iCnt++) for ( INT32 iCnt = 0; iCnt < (gGameOptions.fNewTraitSystem ? NUM_CHAR_TRAITS : NUM_ATTITUDES); ++iCnt )
{ {
//if there is a button allocated //if there is a button allocated
if( giIMPCharacterTraitAnswerButton[iCnt] != -1 ) if( giIMPCharacterTraitAnswerButton[iCnt] != -1 )
@@ -207,7 +198,6 @@ void ExitIMPCharacterTrait( void )
UnloadButtonImage( giIMPCharacterTraitFinsihButtonImage ); UnloadButtonImage( giIMPCharacterTraitFinsihButtonImage );
} }
void HandleIMPCharacterTrait( void ) void HandleIMPCharacterTrait( void )
{ {
if( gfIST_Redraw2 ) if( gfIST_Redraw2 )
@@ -221,13 +211,12 @@ void HandleIMPCharacterTrait( void )
void AddImpCharacterTraitButtons() void AddImpCharacterTraitButtons()
{ {
INT32 iCnt = 0;
UINT16 usPosX, usPosY; UINT16 usPosX, usPosY;
usPosX = IMP_CHARACTER_1ST_COLUMN_START_X; usPosX = IMP_CHARACTER_1ST_COLUMN_START_X;
usPosY = IMP_CHARACTER_1ST_COLUMN_START_Y; usPosY = IMP_CHARACTER_1ST_COLUMN_START_Y;
for(iCnt = 0; iCnt < (gGameOptions.fNewTraitSystem ? IMP_NUMBER_CHARACTER_TRAITS : IMP_NUMBER_ATTITUDES) ; iCnt++) for ( INT32 iCnt = 0; iCnt < (gGameOptions.fNewTraitSystem ? NUM_CHAR_TRAITS : NUM_ATTITUDES); ++iCnt )
{ {
//reset //reset
giIMPCharacterTraitAnswerButton[iCnt] = -1; giIMPCharacterTraitAnswerButton[iCnt] = -1;
@@ -287,8 +276,6 @@ void BtnIMPCharacterTraitAnswerCallback(GUI_BUTTON *btn,INT32 reason)
void HandleIMPCharacterTraitAnswers( UINT32 uiSkillPressed ) void HandleIMPCharacterTraitAnswers( UINT32 uiSkillPressed )
{ {
INT8 bCnt;
//if we are DONE and are just reviewing //if we are DONE and are just reviewing
if( iCurrentProfileMode == IMP__FINISH ) if( iCurrentProfileMode == IMP__FINISH )
{ {
@@ -296,13 +283,13 @@ void HandleIMPCharacterTraitAnswers( UINT32 uiSkillPressed )
} }
//reset all other buttons //reset all other buttons
for( bCnt=0; bCnt < (gGameOptions.fNewTraitSystem ? IMP_NUMBER_CHARACTER_TRAITS : IMP_NUMBER_ATTITUDES); bCnt++ ) for ( INT8 bCnt = 0; bCnt < (gGameOptions.fNewTraitSystem ? NUM_CHAR_TRAITS : NUM_ATTITUDES); ++bCnt )
{ {
gfCharacterTraitQuestions[ bCnt ] = FALSE; gfCharacterTraitQuestions[ bCnt ] = FALSE;
} }
//make sure its a valid character trait //make sure its a valid character trait
if( uiSkillPressed > (UINT32)(gGameOptions.fNewTraitSystem ? IMP_NUMBER_CHARACTER_TRAITS : IMP_NUMBER_ATTITUDES) ) if ( uiSkillPressed >( UINT32 )(gGameOptions.fNewTraitSystem ? NUM_CHAR_TRAITS : NUM_ATTITUDES) )
{ {
Assert( 0 ); Assert( 0 );
return; return;
@@ -337,11 +324,8 @@ void HandleIMPCharacterTraitAnswers( UINT32 uiSkillPressed )
void HandleCharacterTraitButtonStates( ) void HandleCharacterTraitButtonStates( )
{ {
INT8 bCnt; for ( INT8 bCnt = 0; bCnt < (gGameOptions.fNewTraitSystem ? NUM_CHAR_TRAITS : NUM_ATTITUDES); ++bCnt )
for( bCnt=0; bCnt < (gGameOptions.fNewTraitSystem ? IMP_NUMBER_CHARACTER_TRAITS : IMP_NUMBER_ATTITUDES); bCnt++ )
{ {
//if the skill is selected ( ie depressed ) //if the skill is selected ( ie depressed )
if( gfCharacterTraitQuestions[ bCnt ] ) if( gfCharacterTraitQuestions[ bCnt ] )
{ {
@@ -356,7 +340,6 @@ void HandleCharacterTraitButtonStates( )
void IMPCharacterTraitDisplayCharacterTraits() void IMPCharacterTraitDisplayCharacterTraits()
{ {
INT8 bCnt;
UINT16 usPosX, usPosY; UINT16 usPosX, usPosY;
UINT16 usBoxPosX, usBoxPosY; UINT16 usBoxPosX, usBoxPosY;
HVOBJECT hImageHandle; HVOBJECT hImageHandle;
@@ -367,7 +350,7 @@ void IMPCharacterTraitDisplayCharacterTraits()
usPosX = IMP_CHARACTER_1ST_COLUMN_START_X + IMP_CHARACTER_TRAIT__TEXT_OFFSET_X; usPosX = IMP_CHARACTER_1ST_COLUMN_START_X + IMP_CHARACTER_TRAIT__TEXT_OFFSET_X;
usPosY = IMP_CHARACTER_1ST_COLUMN_START_Y + IMP_CHARACTER_TRAIT__TEXT_OFFSET_Y; usPosY = IMP_CHARACTER_1ST_COLUMN_START_Y + IMP_CHARACTER_TRAIT__TEXT_OFFSET_Y;
for( bCnt=0; bCnt<(gGameOptions.fNewTraitSystem ? IMP_NUMBER_CHARACTER_TRAITS : IMP_NUMBER_ATTITUDES); bCnt++ ) for ( INT8 bCnt = 0; bCnt<(gGameOptions.fNewTraitSystem ? NUM_CHAR_TRAITS : NUM_ATTITUDES); ++bCnt )
{ {
usBoxPosX = usPosX - IMP_CHARACTER_TRAIT__GREY_BOX_OFFSET_X; usBoxPosX = usPosX - IMP_CHARACTER_TRAIT__GREY_BOX_OFFSET_X;
usBoxPosY = usPosY - IMP_CHARACTER_TRAIT__GREY_BOX_OFFSET_Y; usBoxPosY = usPosY - IMP_CHARACTER_TRAIT__GREY_BOX_OFFSET_Y;
@@ -409,7 +392,6 @@ void IMPCharacterTraitDisplayCharacterTraits()
} }
} }
void BtnIMPCharacterTraitFinishCallback(GUI_BUTTON *btn,INT32 reason) void BtnIMPCharacterTraitFinishCallback(GUI_BUTTON *btn,INT32 reason)
{ {
// btn callback for IMP personality quiz answer button // btn callback for IMP personality quiz answer button
@@ -443,7 +425,6 @@ void BtnIMPCharacterTraitFinishCallback(GUI_BUTTON *btn,INT32 reason)
} }
} }
BOOLEAN CameBackToCharacterTraitPageButNotFinished() BOOLEAN CameBackToCharacterTraitPageButNotFinished()
{ {
//if we are in a page that comes after this one //if we are in a page that comes after this one
@@ -459,21 +440,18 @@ BOOLEAN CameBackToCharacterTraitPageButNotFinished()
INT8 iChosenCharacterTrait() INT8 iChosenCharacterTrait()
{ {
INT8 bCnt;
INT8 iCharacterTraitNumber = 0;
//loop through all the buttons and reset them //loop through all the buttons and reset them
for( bCnt=0; bCnt<(gGameOptions.fNewTraitSystem ? IMP_NUMBER_CHARACTER_TRAITS : IMP_NUMBER_ATTITUDES); bCnt++ ) for ( INT8 bCnt = 0; bCnt<(gGameOptions.fNewTraitSystem ? NUM_CHAR_TRAITS : NUM_ATTITUDES); ++bCnt )
{ {
//if the trait is selected //if the trait is selected
if( gfCharacterTraitQuestions[ bCnt ] ) if( gfCharacterTraitQuestions[ bCnt ] )
{ {
iCharacterTraitNumber = bCnt; return bCnt;
} }
} }
return( iCharacterTraitNumber );
}
return 0;
}
void AssignCharacterTraitHelpText( UINT8 ubNumber ) void AssignCharacterTraitHelpText( UINT8 ubNumber )
{ {
@@ -484,6 +462,4 @@ void AssignCharacterTraitHelpText( UINT8 ubNumber )
// Set region help text // Set region help text
SetRegionFastHelpText( &(gMR_CharacterTraitHelpTextRegions[ubNumber]), apStr ); SetRegionFastHelpText( &(gMR_CharacterTraitHelpTextRegions[ubNumber]), apStr );
SetRegionHelpEndCallback( &gMR_CharacterTraitHelpTextRegions[ubNumber], MSYS_NO_CALLBACK ); SetRegionHelpEndCallback( &gMR_CharacterTraitHelpTextRegions[ubNumber], MSYS_NO_CALLBACK );
return;
} }
-35
View File
@@ -8,41 +8,6 @@ void RenderIMPCharacterTrait( void );
void ExitIMPCharacterTrait( void ); void ExitIMPCharacterTrait( void );
void HandleIMPCharacterTrait( void ); void HandleIMPCharacterTrait( void );
//enum
//{
typedef enum
{
IMP_ATTITUDE_NORMAL = 0,
IMP_ATTITUDE_FRIENDLY,
IMP_ATTITUDE_LONER,
IMP_ATTITUDE_OPTIMIST,
IMP_ATTITUDE_PESSIMIST,
IMP_ATTITUDE_AGGRESSIVE,
IMP_ATTITUDE_ARROGANT,
IMP_ATTITUDE_BIGSHOT,
IMP_ATTITUDE_ASSHOLE,
IMP_ATTITUDE_COWARD,
IMP_NUMBER_ATTITUDES,
};
typedef enum
{
IMP_CHARACTER_TRAIT_NORMAL = 0,
IMP_CHARACTER_TRAIT_SOCIABLE,
IMP_CHARACTER_TRAIT_LONER,
IMP_CHARACTER_TRAIT_OPTIMIST,
IMP_CHARACTER_TRAIT_ASSERTIVE,
IMP_CHARACTER_TRAIT_INTELLECTUAL,
IMP_CHARACTER_TRAIT_PRIMITIVE,
IMP_CHARACTER_TRAIT_AGGRESSIVE,
IMP_CHARACTER_TRAIT_PHLEGMATIC,
IMP_CHARACTER_TRAIT_DAUNTLESS,
IMP_CHARACTER_TRAIT_PACIFIST,
IMP_CHARACTER_TRAIT_MALICIOUS,
IMP_CHARACTER_TRAIT_SHOWOFF,
IMP_NUMBER_CHARACTER_TRAITS,
};
INT8 iChosenCharacterTrait(); INT8 iChosenCharacterTrait();
STR16 gzIMPCharacterTraitText[]; STR16 gzIMPCharacterTraitText[];
+4
View File
@@ -4287,6 +4287,10 @@ void HandleIMPCharProfileResultsMessage( void)
wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_SHOWOFF]); wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_SHOWOFF]);
iOffSet = IMP_ATTITUDE_ARROGANT; iOffSet = IMP_ATTITUDE_ARROGANT;
break; break;
case CHAR_TRAIT_COWARD:
wcscpy( pString, gzIMPCharacterTraitText[CHAR_TRAIT_COWARD] );
iOffSet = IMP_ATTITUDE_COWARD;
break;
} }
wcscat(pString, L". ±"); wcscat(pString, L". ±");
+13
View File
@@ -1075,6 +1075,19 @@ void PrepareForPreBattleInterface( GROUP *pPlayerDialogGroup, GROUP *pInitiating
#endif #endif
SetMusicMode( MUSIC_TACTICAL_ENEMYPRESENT ); SetMusicMode( MUSIC_TACTICAL_ENEMYPRESENT );
// Flugente: for cowards, check our teamsize and that of the enemy...
if ( gGameOptions.fNewTraitSystem )
{
UINT16 enemyteamsize = NumNonPlayerTeamMembersInSector( pPlayerDialogGroup->ubSectorX, pPlayerDialogGroup->ubSectorY, ENEMY_TEAM );
UINT16 militiateamsize = NumNonPlayerTeamMembersInSector( pPlayerDialogGroup->ubSectorX, pPlayerDialogGroup->ubSectorY, MILITIA_TEAM );
UINT16 mercsteamsize = PlayerMercsInSector( pPlayerDialogGroup->ubSectorX, pPlayerDialogGroup->ubSectorY, pPlayerDialogGroup->ubSectorZ );
if ( enemyteamsize >= 2 * (militiateamsize + mercsteamsize) && mercsteamsize )
{
HandleMoraleEvent( NULL, MORALE_ENEMYGROUP_COWARD, pPlayerDialogGroup->ubSectorX, pPlayerDialogGroup->ubSectorY, pPlayerDialogGroup->ubSectorZ );
}
}
if( gfTacticalTraversal && pInitiatingBattleGroup == gpTacticalTraversalGroup || if( gfTacticalTraversal && pInitiatingBattleGroup == gpTacticalTraversalGroup ||
pInitiatingBattleGroup && pInitiatingBattleGroup->usGroupTeam != OUR_TEAM && pInitiatingBattleGroup && pInitiatingBattleGroup->usGroupTeam != OUR_TEAM &&
pInitiatingBattleGroup->ubSectorX == gWorldSectorX && pInitiatingBattleGroup->ubSectorX == gWorldSectorX &&
+1 -1
View File
@@ -187,7 +187,7 @@ BOOLEAN MercIsOwedTooMuchMoney( UINT8 ubProfileID )
BOOLEAN MercThinksPlayerIsInactiveTooLong( UINT8 ubProfileID ) BOOLEAN MercThinksPlayerIsInactiveTooLong( UINT8 ubProfileID )
{ {
UINT8 ubTolerance = gMoraleSettings.bValues[MORALE_PLAYER_INACTIVE_DAYS]; UINT8 ubTolerance = gMoraleSettings.bValues[MORALE_PLAYER_INACTIVE_DAYS];
if( gMercProfiles[ubProfileID].bCharacterTrait == CHAR_TRAIT_PACIFIST ) if ( gMercProfiles[ubProfileID].bCharacterTrait == CHAR_TRAIT_PACIFIST || gMercProfiles[ubProfileID].bCharacterTrait == CHAR_TRAIT_COWARD )
{ {
ubTolerance = max(0, ubTolerance + gMoraleSettings.bValues[MORALE_PLAYER_INACTIVE_DAYS_PACIFIST_BONUS]); ubTolerance = max(0, ubTolerance + gMoraleSettings.bValues[MORALE_PLAYER_INACTIVE_DAYS_PACIFIST_BONUS]);
} }
+8
View File
@@ -432,6 +432,7 @@ void CreateSpeechEventsFromDynamicOpinionEvent( DynamicOpinionSpeechEvent aEvent
case(CHAR_TRAIT_PACIFIST) : agreemodifier_personal += 20; break; case(CHAR_TRAIT_PACIFIST) : agreemodifier_personal += 20; break;
case(CHAR_TRAIT_MALICIOUS) : agreemodifier_personal += -8; break; case(CHAR_TRAIT_MALICIOUS) : agreemodifier_personal += -8; break;
case(CHAR_TRAIT_SHOWOFF) : agreemodifier_personal += -3; break; case(CHAR_TRAIT_SHOWOFF) : agreemodifier_personal += -3; break;
case CHAR_TRAIT_COWARD: agreemodifier_personal += 5; break;
} }
// if the event is positive, then we are much more likely to agree // if the event is positive, then we are much more likely to agree
@@ -566,6 +567,10 @@ void CreateSpeechEventsFromDynamicOpinionEvent( DynamicOpinionSpeechEvent aEvent
chance_to_reason += -2; chance_to_reason += -2;
chance_to_agression += 2; chance_to_agression += 2;
break; break;
case CHAR_TRAIT_COWARD:
chance_to_reason += 20;
chance_to_agression += -20;
break;
} }
if ( Chance( chance_to_reason ) ) if ( Chance( chance_to_reason ) )
@@ -2189,6 +2194,9 @@ void HandleDynamicOpinionChange( SOLDIERTYPE* pSoldier, UINT8 usEvent, BOOLEAN f
break; break;
case OPINIONEVENT_ORDEREDRETREAT: case OPINIONEVENT_ORDEREDRETREAT:
// cowards obviously won't complain about a retreat, pacifists are also okay with it
if ( DoesMercHavePersonality( pTeamSoldier, CHAR_TRAIT_COWARD ) || DoesMercHavePersonality( pTeamSoldier, CHAR_TRAIT_PACIFIST ) )
continue;
break; break;
case OPINIONEVENT_CIVKILLER: case OPINIONEVENT_CIVKILLER:
+23 -3
View File
@@ -103,7 +103,9 @@ MoraleEvent gbMoraleEvent[NUM_MORALE_EVENTS] =
{ TACTICAL_MORALE_EVENT, 5}, //MORALE_GOOD_FOOD, { TACTICAL_MORALE_EVENT, 5}, //MORALE_GOOD_FOOD,
{ TACTICAL_MORALE_EVENT, -1}, //MORALE_BAD_FOOD, { TACTICAL_MORALE_EVENT, -1}, //MORALE_BAD_FOOD,
{ TACTICAL_MORALE_EVENT, -5}, //MORALE_LOATHSOME_FOOD, { TACTICAL_MORALE_EVENT, -5}, //MORALE_LOATHSOME_FOOD,
{TACTICAL_MORALE_EVENT, -8}, //MORALE_FEAR_OF_HEIGHTS, { TACTICAL_MORALE_EVENT, -8}, //MORALE_FEAR_OF_HEIGHTS,
{ TACTICAL_MORALE_EVENT, +5}, //MORALE_RAN_AWAY_COWARD,
{ TACTICAL_MORALE_EVENT, +5}, //MORALE_ENEMYGROUP_COWARD,
// added by anv // added by anv
{ STRATEGIC_MORALE_EVENT, -5}, //MORALE_BUDDY_FIRED, { STRATEGIC_MORALE_EVENT, -5}, //MORALE_BUDDY_FIRED,
{ STRATEGIC_MORALE_EVENT, -8}, //MORALE_BUDDY_FIRED_ON_BAD_TERMS, { STRATEGIC_MORALE_EVENT, -8}, //MORALE_BUDDY_FIRED_ON_BAD_TERMS,
@@ -789,12 +791,16 @@ void HandleMoraleEvent( SOLDIERTYPE *pSoldier, INT8 bMoraleEvent, INT16 sMapX, I
if ( !HAS_SKILL_TRAIT( pTeamSoldier, COVERT_NT ) || ( (pTeamSoldier->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER)) == 0) ) if ( !HAS_SKILL_TRAIT( pTeamSoldier, COVERT_NT ) || ( (pTeamSoldier->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER)) == 0) )
{ {
// SANDRO - no penalty for pacifists to run away // SANDRO - no penalty for pacifists to run away
if ( !DoesMercHavePersonality( pTeamSoldier, CHAR_TRAIT_PACIFIST ) ) if ( !DoesMercHavePersonality( pTeamSoldier, CHAR_TRAIT_PACIFIST ) && !DoesMercHavePersonality( pTeamSoldier, CHAR_TRAIT_COWARD ) )
HandleMoraleEventForSoldier( pTeamSoldier, MORALE_RAN_AWAY ); HandleMoraleEventForSoldier( pTeamSoldier, MORALE_RAN_AWAY );
// Double morale drop for aggressive people // Double morale drop for aggressive people
if ( DoesMercHavePersonality( pTeamSoldier, CHAR_TRAIT_AGGRESSIVE ) ) if ( DoesMercHavePersonality( pTeamSoldier, CHAR_TRAIT_AGGRESSIVE ) )
HandleMoraleEventForSoldier( pTeamSoldier, MORALE_RAN_AWAY ); HandleMoraleEventForSoldier( pTeamSoldier, MORALE_RAN_AWAY );
// Flugente: cowards actually gain morale this way
if ( DoesMercHavePersonality( pTeamSoldier, CHAR_TRAIT_COWARD ) )
HandleMoraleEventForSoldier( pTeamSoldier, MORALE_RAN_AWAY_COWARD );
} }
} }
else else
@@ -807,7 +813,8 @@ void HandleMoraleEvent( SOLDIERTYPE *pSoldier, INT8 bMoraleEvent, INT16 sMapX, I
HandleMoraleEventForSoldier( pTeamSoldier, MORALE_RAN_AWAY ); HandleMoraleEventForSoldier( pTeamSoldier, MORALE_RAN_AWAY );
break; break;
case ATT_COWARD: case ATT_COWARD:
// no penalty - cowards are perfectly happy to avoid fights! // Flugente: cowards actually gain morale this way
HandleMoraleEventForSoldier( pTeamSoldier, MORALE_RAN_AWAY_COWARD );
break; break;
default: default:
HandleMoraleEventForSoldier( pTeamSoldier, MORALE_RAN_AWAY ); HandleMoraleEventForSoldier( pTeamSoldier, MORALE_RAN_AWAY );
@@ -1010,6 +1017,19 @@ void HandleMoraleEvent( SOLDIERTYPE *pSoldier, INT8 bMoraleEvent, INT16 sMapX, I
HandleMoraleEventForSoldier( pSoldier, bMoraleEvent ); HandleMoraleEventForSoldier( pSoldier, bMoraleEvent );
break; break;
case MORALE_ENEMYGROUP_COWARD:
// affects coward in sector
ubLoop = gTacticalStatus.Team[gbPlayerNum].bFirstID;
for ( pTeamSoldier = MercPtrs[ubLoop]; ubLoop <= gTacticalStatus.Team[gbPlayerNum].bLastID; ubLoop++, pTeamSoldier++ )
{
if ( pTeamSoldier->bActive && (pTeamSoldier->sSectorX == sMapX) && (pTeamSoldier->sSectorY == sMapY) && (pTeamSoldier->bSectorZ == bMapZ) )
{
if ( DoesMercHavePersonality( pTeamSoldier, CHAR_TRAIT_COWARD ) )
HandleMoraleEventForSoldier( pTeamSoldier, bMoraleEvent );
}
}
break;
case MORALE_BUDDY_FIRED: case MORALE_BUDDY_FIRED:
case MORALE_BUDDY_FIRED_EARLY: case MORALE_BUDDY_FIRED_EARLY:
case MORALE_BUDDY_FIRED_ON_BAD_TERMS: case MORALE_BUDDY_FIRED_ON_BAD_TERMS:
+2
View File
@@ -55,6 +55,8 @@ typedef enum
MORALE_BAD_FOOD, MORALE_BAD_FOOD,
MORALE_LOATHSOME_FOOD, MORALE_LOATHSOME_FOOD,
MORALE_FEAR_OF_HEIGHTS, MORALE_FEAR_OF_HEIGHTS,
MORALE_RAN_AWAY_COWARD,
MORALE_ENEMYGROUP_COWARD,
// added by anv // added by anv
MORALE_BUDDY_FIRED, MORALE_BUDDY_FIRED,
+1
View File
@@ -198,6 +198,7 @@ typedef enum
CHAR_TRAIT_PACIFIST, CHAR_TRAIT_PACIFIST,
CHAR_TRAIT_MALICIOUS, CHAR_TRAIT_MALICIOUS,
CHAR_TRAIT_SHOWOFF, CHAR_TRAIT_SHOWOFF,
CHAR_TRAIT_COWARD,
NUM_CHAR_TRAITS NUM_CHAR_TRAITS
} CharacterTraits; } CharacterTraits;
+1
View File
@@ -7797,6 +7797,7 @@ STR16 gzIMPCharacterTraitText[]=
L"和平主义者", L"和平主义者",
L"恶毒", L"恶毒",
L"爱炫耀", L"爱炫耀",
L"Coward", // TODO.Translate
L"I.M.P. 性格特征", L"I.M.P. 性格特征",
}; };
+1
View File
@@ -7810,6 +7810,7 @@ STR16 gzIMPCharacterTraitText[]=
L"Pacifist", L"Pacifist",
L"Malicious", L"Malicious",
L"Show-off", L"Show-off",
L"Coward", // TODO.Translate
L"I.M.P. Character Traits", L"I.M.P. Character Traits",
}; };
+1
View File
@@ -7798,6 +7798,7 @@ STR16 gzIMPCharacterTraitText[]=
L"Pacifist", L"Pacifist",
L"Malicious", L"Malicious",
L"Show-off", L"Show-off",
L"Coward",
L"I.M.P. Character Traits", L"I.M.P. Character Traits",
}; };
+1
View File
@@ -7804,6 +7804,7 @@ STR16 gzIMPCharacterTraitText[]=
L"Pacifiste", L"Pacifiste",
L"Malicieux", L"Malicieux",
L"Frimeur", L"Frimeur",
L"Coward", // TODO.Translate
L"IMP : Traits de caractère", L"IMP : Traits de caractère",
}; };
+1
View File
@@ -7631,6 +7631,7 @@ STR16 gzIMPCharacterTraitText[]=
L"Pazifistisch", L"Pazifistisch",
L"Sadistisch", L"Sadistisch",
L"Machohaft", //LOOTF - alt. "Angeberisch" L"Machohaft", //LOOTF - alt. "Angeberisch"
L"Feigling",
L"B.S.E. - Charakterzüge", L"B.S.E. - Charakterzüge",
}; };
+1
View File
@@ -7800,6 +7800,7 @@ STR16 gzIMPCharacterTraitText[]=
L"Pacifist", L"Pacifist",
L"Malicious", L"Malicious",
L"Show-off", L"Show-off",
L"Coward", // TODO.Translate
L"I.M.P. Character Traits", L"I.M.P. Character Traits",
}; };
+1
View File
@@ -463,6 +463,7 @@ STR16 gzIMPNewCharacterTraitsHelpTexts[]=
L"优点:进行非战斗任务时士气会提升(除了训练民兵)。\n缺点:杀人不增加士气。",// L"A: He gains morale when on non-combat assignments (except training militia).\nD: Gains no morale for killing.", L"优点:进行非战斗任务时士气会提升(除了训练民兵)。\n缺点:杀人不增加士气。",// L"A: He gains morale when on non-combat assignments (except training militia).\nD: Gains no morale for killing.",
L"优点:攻击有更高的几率能造成受害者属性值降低,和更严重的创伤,同时提高自己的士气。\n缺点:与其他人交流是个问题,脱离战斗后士气也会快速下沉。",// L"A: Has bigger chance for inflicting stat loss and can inflict special painful wounds when able to\n Gains bonus morale for inflicting stat loss.\nD: Has penalty for communication with people and his morale sinks faster if not fighting.", L"优点:攻击有更高的几率能造成受害者属性值降低,和更严重的创伤,同时提高自己的士气。\n缺点:与其他人交流是个问题,脱离战斗后士气也会快速下沉。",// L"A: Has bigger chance for inflicting stat loss and can inflict special painful wounds when able to\n Gains bonus morale for inflicting stat loss.\nD: Has penalty for communication with people and his morale sinks faster if not fighting.",
L"优点:附近有异性雇佣兵时表现更佳。\n缺点:附近所有同性雇佣兵士气提升得慢。",// L"A: Has better performance when there are some mercs of opposite gender nearby.\nD: Morale of other mercs of the same gender grows slower if nearby.", L"优点:附近有异性雇佣兵时表现更佳。\n缺点:附近所有同性雇佣兵士气提升得慢。",// L"A: Has better performance when there are some mercs of opposite gender nearby.\nD: Morale of other mercs of the same gender grows slower if nearby.",
L"A: Gains morale when retreating.\nD: Loses morale when encountering numerically superior enemy forces.", // TODO.Translate
}; };
STR16 gzIMPDisabilitiesHelpTexts[]= STR16 gzIMPDisabilitiesHelpTexts[]=
+1
View File
@@ -462,6 +462,7 @@ STR16 gzIMPNewCharacterTraitsHelpTexts[]=
L"A: Gains morale on non-combat assignments (except training militia).\nD: Gains no morale for killing.", L"A: Gains morale on non-combat assignments (except training militia).\nD: Gains no morale for killing.",
L"A: Higher chance for inflicting stat loss, which may also inflict special painful wounds.\n Gains bonus morale for inflicting stat loss.\nD: Penalty in communicating with people and morale sinks faster while not in battle.", L"A: Higher chance for inflicting stat loss, which may also inflict special painful wounds.\n Gains bonus morale for inflicting stat loss.\nD: Penalty in communicating with people and morale sinks faster while not in battle.",
L"A: Better performance when mercs of opposite gender are nearby.\nD: Morale for mercs of the same gender grows slower when nearby.", L"A: Better performance when mercs of opposite gender are nearby.\nD: Morale for mercs of the same gender grows slower when nearby.",
L"A: Gains morale when retreating.\nD: Loses morale when encountering numerically superior enemy forces.", // TODO.Translate
}; };
STR16 gzIMPDisabilitiesHelpTexts[]= STR16 gzIMPDisabilitiesHelpTexts[]=
+1
View File
@@ -463,6 +463,7 @@ STR16 gzIMPNewCharacterTraitsHelpTexts[]=
L"A: Gains morale on non-combat assignments (except training militia).\nD: Gains no morale for killing.", L"A: Gains morale on non-combat assignments (except training militia).\nD: Gains no morale for killing.",
L"A: Higher chance for inflicting stat loss, which may also inflict special painful wounds.\n Gains bonus morale for inflicting stat loss.\nD: Penalty in communicating with people and morale sinks faster while not in battle.", L"A: Higher chance for inflicting stat loss, which may also inflict special painful wounds.\n Gains bonus morale for inflicting stat loss.\nD: Penalty in communicating with people and morale sinks faster while not in battle.",
L"A: Better performance when mercs of opposite gender are nearby.\nD: Morale for mercs of the same gender grows slower when nearby.", L"A: Better performance when mercs of opposite gender are nearby.\nD: Morale for mercs of the same gender grows slower when nearby.",
L"A: Gains morale when retreating.\nD: Loses morale when encountering numerically superior enemy forces.",
}; };
STR16 gzIMPDisabilitiesHelpTexts[]= STR16 gzIMPDisabilitiesHelpTexts[]=
+1
View File
@@ -461,6 +461,7 @@ STR16 gzIMPNewCharacterTraitsHelpTexts[]=
L"+ : Gagne du moral lorsque vous faites une mission qui n'est pas liée au combat (excepté l'entraînement de milice).\n- : Pas de gains lorsque vous tuez quelqu'un.", L"+ : Gagne du moral lorsque vous faites une mission qui n'est pas liée au combat (excepté l'entraînement de milice).\n- : Pas de gains lorsque vous tuez quelqu'un.",
L"+ : A plus de chance d'infliger des pertes de stats sur l'ennemi, qui peut aussi infliger de lourds dégâts.\n Gagne du moral lorsque vous infligez des pertes de stats sur l'ennemi.\n- : A une pénalité pour la communication et son moral baisse plus rapidement lorsqu'il ne combat pas.", L"+ : A plus de chance d'infliger des pertes de stats sur l'ennemi, qui peut aussi infliger de lourds dégâts.\n Gagne du moral lorsque vous infligez des pertes de stats sur l'ennemi.\n- : A une pénalité pour la communication et son moral baisse plus rapidement lorsqu'il ne combat pas.",
L"+ : A de meilleures performances lorsqu'un certain type d'ennemi est opposé à lui.\n- : Les mercenaires qui possèdent le même type que l'ennemi gagne moins de moral.", L"+ : A de meilleures performances lorsqu'un certain type d'ennemi est opposé à lui.\n- : Les mercenaires qui possèdent le même type que l'ennemi gagne moins de moral.",
L"A: Gains morale when retreating.\nD: Loses morale when encountering numerically superior enemy forces.", // TODO.Translate
}; };
+1
View File
@@ -464,6 +464,7 @@ STR16 gzIMPNewCharacterTraitsHelpTexts[]=
L"V: Erhält Moralzuwachs für nichtkämpferische Tätigkeiten (Außnahme: Milizausbildung).\nN: Erhält keinen Moralzuwachs für das Töten von Gegnern.", L"V: Erhält Moralzuwachs für nichtkämpferische Tätigkeiten (Außnahme: Milizausbildung).\nN: Erhält keinen Moralzuwachs für das Töten von Gegnern.",
L"V: Hat eine höhere Chance, Statusschäden anzurichten, und kann besonders fiese Wunden verursachen.\n Erhält mehr Moral für erfolgreiche Statusschäden.\nN: Kann schlechter mit Leuten reden. Die Moral sinkt ohne Kampf schneller.", L"V: Hat eine höhere Chance, Statusschäden anzurichten, und kann besonders fiese Wunden verursachen.\n Erhält mehr Moral für erfolgreiche Statusschäden.\nN: Kann schlechter mit Leuten reden. Die Moral sinkt ohne Kampf schneller.",
L"V: Ist leistungsfähiger, wenn Söldner des anderen Geschlechts in der Nähe sind.\nN: Die Moral anderer naher Söldner des gleichen Geschlechts steigt langsamer.", L"V: Ist leistungsfähiger, wenn Söldner des anderen Geschlechts in der Nähe sind.\nN: Die Moral anderer naher Söldner des gleichen Geschlechts steigt langsamer.",
L"A: Gains morale when retreating.\nD: Loses morale when encountering numerically superior enemy forces.", // TODO.Translate
}; };
STR16 gzIMPDisabilitiesHelpTexts[]= STR16 gzIMPDisabilitiesHelpTexts[]=
+1
View File
@@ -460,6 +460,7 @@ STR16 gzIMPNewCharacterTraitsHelpTexts[]=
L"A: Gains morale on non-combat assignments (except training militia).\nD: Gains no morale for killing.", L"A: Gains morale on non-combat assignments (except training militia).\nD: Gains no morale for killing.",
L"A: Higher chance for inflicting stat loss, which may also inflict special painful wounds.\n Gains bonus morale for inflicting stat loss.\nD: Penalty in communicating with people and morale sinks faster while not in battle.", L"A: Higher chance for inflicting stat loss, which may also inflict special painful wounds.\n Gains bonus morale for inflicting stat loss.\nD: Penalty in communicating with people and morale sinks faster while not in battle.",
L"A: Better performance when mercs of opposite gender are nearby.\nD: Morale for mercs of the same gender grows slower when nearby.", L"A: Better performance when mercs of opposite gender are nearby.\nD: Morale for mercs of the same gender grows slower when nearby.",
L"A: Gains morale when retreating.\nD: Loses morale when encountering numerically superior enemy forces.", // TODO.Translate
}; };
STR16 gzIMPDisabilitiesHelpTexts[]= STR16 gzIMPDisabilitiesHelpTexts[]=
+1
View File
@@ -462,6 +462,7 @@ STR16 gzIMPNewCharacterTraitsHelpTexts[]=
L"A: Gains morale on non-combat assignments (except training militia).\nD: Gains no morale for killing.", L"A: Gains morale on non-combat assignments (except training militia).\nD: Gains no morale for killing.",
L"A: Higher chance for inflicting stat loss, which may also inflict special painful wounds.\n Gains bonus morale for inflicting stat loss.\nD: Penalty in communicating with people and morale sinks faster while not in battle.", L"A: Higher chance for inflicting stat loss, which may also inflict special painful wounds.\n Gains bonus morale for inflicting stat loss.\nD: Penalty in communicating with people and morale sinks faster while not in battle.",
L"A: Better performance when mercs of opposite gender are nearby.\nD: Morale for mercs of the same gender grows slower when nearby.", L"A: Better performance when mercs of opposite gender are nearby.\nD: Morale for mercs of the same gender grows slower when nearby.",
L"A: Gains morale when retreating.\nD: Loses morale when encountering numerically superior enemy forces.", // TODO.Translate
}; };
STR16 gzIMPDisabilitiesHelpTexts[]= STR16 gzIMPDisabilitiesHelpTexts[]=
+1
View File
@@ -463,6 +463,7 @@ STR16 gzIMPNewCharacterTraitsHelpTexts[]=
L"плюсы: Боевой дух повышается при выполнении небоевых заданий (кроме тренировки ополчения).\n \nминусы: Убийство врагов не повышает боевой дух.", //Pacifist L"плюсы: Боевой дух повышается при выполнении небоевых заданий (кроме тренировки ополчения).\n \nминусы: Убийство врагов не повышает боевой дух.", //Pacifist
L"плюсы: Имеет больший шанс нанести болезненные раны и травмы, приводящие к ухудшению параметров.\nБоевой дух повышается при нанесении таких ран.\n \nминусы: Имеет проблемы в общении и быстро теряет боевой дух, если не сражается.", //Malicious L"плюсы: Имеет больший шанс нанести болезненные раны и травмы, приводящие к ухудшению параметров.\nБоевой дух повышается при нанесении таких ран.\n \nминусы: Имеет проблемы в общении и быстро теряет боевой дух, если не сражается.", //Malicious
L"плюсы: Лучше работает в компании представителей противоположного пола.\n \nминусы: Боевой дух бойцов того же пола в его присутствии растёт медленнее.", //Show-off L"плюсы: Лучше работает в компании представителей противоположного пола.\n \nминусы: Боевой дух бойцов того же пола в его присутствии растёт медленнее.", //Show-off
L"A: Gains morale when retreating.\nD: Loses morale when encountering numerically superior enemy forces.", // TODO.Translate
}; };
STR16 gzIMPDisabilitiesHelpTexts[]= STR16 gzIMPDisabilitiesHelpTexts[]=
+1
View File
@@ -7815,6 +7815,7 @@ STR16 gzIMPCharacterTraitText[]=
L"Pacyfista", L"Pacyfista",
L"Podstępny", L"Podstępny",
L"Gwiazdor", L"Gwiazdor",
L"Coward", // TODO.Translate
L"Cechy charakteru I.M.P.-a", L"Cechy charakteru I.M.P.-a",
}; };
+1
View File
@@ -7798,6 +7798,7 @@ STR16 gzIMPCharacterTraitText[]=
L"Миролюбивый", //Pacifist L"Миролюбивый", //Pacifist
L"Злобный", //Malicious L"Злобный", //Malicious
L"Хвастун", //Show-off L"Хвастун", //Show-off
L"Coward", // TODO.Translate
L"I.M.P.: Личностные качества", //I.M.P. Character Traits L"I.M.P.: Личностные качества", //I.M.P. Character Traits
}; };