diff --git a/GameSettings.cpp b/GameSettings.cpp index fce99fcf..88b2b465 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -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_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_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_BATTLE_WON] = iniReader.ReadInteger("Strategic Morale Settings","MORALE_BATTLE_WON", 4, -100, 100); diff --git a/Laptop/IMP Background.cpp b/Laptop/IMP Background.cpp index 2cc1a870..fa497ecd 100644 --- a/Laptop/IMP Background.cpp +++ b/Laptop/IMP Background.cpp @@ -712,7 +712,6 @@ BOOLEAN IsBackGroundAllowed( UINT16 ubNumber ) break; } - switch ( iAttitude ) { case CHAR_TRAIT_SOCIABLE: @@ -723,17 +722,6 @@ BOOLEAN IsBackGroundAllowed( UINT16 ubNumber ) if ( zBackground[ ubNumber ].value[BG_LEADERSHIP] > 0 ) return FALSE; 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: break; } diff --git a/Laptop/IMP Character Trait.cpp b/Laptop/IMP Character Trait.cpp index 40efa439..cb605829 100644 --- a/Laptop/IMP Character Trait.cpp +++ b/Laptop/IMP Character Trait.cpp @@ -70,7 +70,7 @@ INT32 giIMPCharacterTraitFinsihButtonImage; //image handle 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 ) { -// UINT32 ubCnt; VOBJECT_DESC VObjectDesc; //add the skill trait buttons @@ -117,8 +116,6 @@ void EnterIMPCharacterTrait( void ) return; } - - giIMPCharacterTraitFinsihButtonImage = LoadButtonImage( "LAPTOP\\button_5.sti" ,-1,0,-1,1,-1 ); giIMPCharacterTraitFinsihButton = CreateIconAndTextButton( giIMPCharacterTraitFinsihButtonImage, pImpButtonText[ 13 ], FONT12ARIAL, FONT_WHITE, DEFAULT_SHADOW, @@ -126,9 +123,7 @@ void EnterIMPCharacterTrait( void ) TEXT_CJUSTIFIED, LAPTOP_SCREEN_UL_X + ( 350 ), LAPTOP_SCREEN_WEB_UL_Y + ( 340 ), BUTTON_TOGGLE, MSYS_PRIORITY_HIGH, BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnIMPCharacterTraitFinishCallback ); - - - + SetButtonCursor( giIMPCharacterTraitFinsihButton, CURSOR_WWW); //if we are not DONE and are just reviewing @@ -145,7 +140,7 @@ void EnterIMPCharacterTrait( void ) // add regions for help texts UINT16 usPosX = IMP_CHARACTER_1ST_COLUMN_START_X + 62; 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 ), (usPosX + 156), ( usPosY + 17), MSYS_PRIORITY_HIGH, @@ -167,7 +162,6 @@ void EnterIMPCharacterTrait( void ) } } - void RenderIMPCharacterTrait( void ) { //render the metal background graphic @@ -175,22 +169,19 @@ void RenderIMPCharacterTrait( void ) //Display the title 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 - 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(); } - void ExitIMPCharacterTrait( void ) { - INT32 iCnt; - DeleteVideoObjectFromIndex( guiIST_GreyGoldBox2 ); //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( giIMPCharacterTraitAnswerButton[iCnt] != -1 ) @@ -207,7 +198,6 @@ void ExitIMPCharacterTrait( void ) UnloadButtonImage( giIMPCharacterTraitFinsihButtonImage ); } - void HandleIMPCharacterTrait( void ) { if( gfIST_Redraw2 ) @@ -221,13 +211,12 @@ void HandleIMPCharacterTrait( void ) void AddImpCharacterTraitButtons() { - INT32 iCnt = 0; UINT16 usPosX, usPosY; usPosX = IMP_CHARACTER_1ST_COLUMN_START_X; 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 giIMPCharacterTraitAnswerButton[iCnt] = -1; @@ -287,8 +276,6 @@ void BtnIMPCharacterTraitAnswerCallback(GUI_BUTTON *btn,INT32 reason) void HandleIMPCharacterTraitAnswers( UINT32 uiSkillPressed ) { - INT8 bCnt; - //if we are DONE and are just reviewing if( iCurrentProfileMode == IMP__FINISH ) { @@ -296,13 +283,13 @@ void HandleIMPCharacterTraitAnswers( UINT32 uiSkillPressed ) } //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; } //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 ); return; @@ -337,11 +324,8 @@ void HandleIMPCharacterTraitAnswers( UINT32 uiSkillPressed ) void HandleCharacterTraitButtonStates( ) { - INT8 bCnt; - - 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 skill is selected ( ie depressed ) if( gfCharacterTraitQuestions[ bCnt ] ) { @@ -356,7 +340,6 @@ void HandleCharacterTraitButtonStates( ) void IMPCharacterTraitDisplayCharacterTraits() { - INT8 bCnt; UINT16 usPosX, usPosY; UINT16 usBoxPosX, usBoxPosY; HVOBJECT hImageHandle; @@ -367,7 +350,7 @@ void IMPCharacterTraitDisplayCharacterTraits() 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; - 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; usBoxPosY = usPosY - IMP_CHARACTER_TRAIT__GREY_BOX_OFFSET_Y; @@ -409,7 +392,6 @@ void IMPCharacterTraitDisplayCharacterTraits() } } - void BtnIMPCharacterTraitFinishCallback(GUI_BUTTON *btn,INT32 reason) { // btn callback for IMP personality quiz answer button @@ -443,7 +425,6 @@ void BtnIMPCharacterTraitFinishCallback(GUI_BUTTON *btn,INT32 reason) } } - BOOLEAN CameBackToCharacterTraitPageButNotFinished() { //if we are in a page that comes after this one @@ -459,21 +440,18 @@ BOOLEAN CameBackToCharacterTraitPageButNotFinished() INT8 iChosenCharacterTrait() { - INT8 bCnt; - INT8 iCharacterTraitNumber = 0; - //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( gfCharacterTraitQuestions[ bCnt ] ) { - iCharacterTraitNumber = bCnt; + return bCnt; } } - return( iCharacterTraitNumber ); -} + return 0; +} void AssignCharacterTraitHelpText( UINT8 ubNumber ) { @@ -484,6 +462,4 @@ void AssignCharacterTraitHelpText( UINT8 ubNumber ) // Set region help text SetRegionFastHelpText( &(gMR_CharacterTraitHelpTextRegions[ubNumber]), apStr ); SetRegionHelpEndCallback( &gMR_CharacterTraitHelpTextRegions[ubNumber], MSYS_NO_CALLBACK ); - - return; } diff --git a/Laptop/IMP Character Trait.h b/Laptop/IMP Character Trait.h index 810ea6a5..c1f4a261 100644 --- a/Laptop/IMP Character Trait.h +++ b/Laptop/IMP Character Trait.h @@ -8,41 +8,6 @@ void RenderIMPCharacterTrait( void ); void ExitIMPCharacterTrait( 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(); STR16 gzIMPCharacterTraitText[]; diff --git a/Laptop/email.cpp b/Laptop/email.cpp index fe37d9ea..e2ea2826 100644 --- a/Laptop/email.cpp +++ b/Laptop/email.cpp @@ -4287,6 +4287,10 @@ void HandleIMPCharProfileResultsMessage( void) wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_SHOWOFF]); iOffSet = IMP_ATTITUDE_ARROGANT; break; + case CHAR_TRAIT_COWARD: + wcscpy( pString, gzIMPCharacterTraitText[CHAR_TRAIT_COWARD] ); + iOffSet = IMP_ATTITUDE_COWARD; + break; } wcscat(pString, L". ±"); diff --git a/Strategic/Strategic Movement.cpp b/Strategic/Strategic Movement.cpp index 0b4ca5b8..ef7e0ed9 100644 --- a/Strategic/Strategic Movement.cpp +++ b/Strategic/Strategic Movement.cpp @@ -1075,6 +1075,19 @@ void PrepareForPreBattleInterface( GROUP *pPlayerDialogGroup, GROUP *pInitiating #endif 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 || pInitiatingBattleGroup && pInitiatingBattleGroup->usGroupTeam != OUR_TEAM && pInitiatingBattleGroup->ubSectorX == gWorldSectorX && diff --git a/Strategic/Strategic Status.cpp b/Strategic/Strategic Status.cpp index bef7493b..0b75d11f 100644 --- a/Strategic/Strategic Status.cpp +++ b/Strategic/Strategic Status.cpp @@ -187,7 +187,7 @@ BOOLEAN MercIsOwedTooMuchMoney( UINT8 ubProfileID ) BOOLEAN MercThinksPlayerIsInactiveTooLong( UINT8 ubProfileID ) { 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]); } diff --git a/Tactical/DynamicDialogue.cpp b/Tactical/DynamicDialogue.cpp index 7a376fee..a3f6ddac 100644 --- a/Tactical/DynamicDialogue.cpp +++ b/Tactical/DynamicDialogue.cpp @@ -432,6 +432,7 @@ void CreateSpeechEventsFromDynamicOpinionEvent( DynamicOpinionSpeechEvent aEvent case(CHAR_TRAIT_PACIFIST) : agreemodifier_personal += 20; break; case(CHAR_TRAIT_MALICIOUS) : agreemodifier_personal += -8; 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 @@ -566,6 +567,10 @@ void CreateSpeechEventsFromDynamicOpinionEvent( DynamicOpinionSpeechEvent aEvent chance_to_reason += -2; chance_to_agression += 2; break; + case CHAR_TRAIT_COWARD: + chance_to_reason += 20; + chance_to_agression += -20; + break; } if ( Chance( chance_to_reason ) ) @@ -2189,6 +2194,9 @@ void HandleDynamicOpinionChange( SOLDIERTYPE* pSoldier, UINT8 usEvent, BOOLEAN f break; 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; case OPINIONEVENT_CIVKILLER: diff --git a/Tactical/Morale.cpp b/Tactical/Morale.cpp index f0c2707b..eca9a746 100644 --- a/Tactical/Morale.cpp +++ b/Tactical/Morale.cpp @@ -103,7 +103,9 @@ MoraleEvent gbMoraleEvent[NUM_MORALE_EVENTS] = { TACTICAL_MORALE_EVENT, 5}, //MORALE_GOOD_FOOD, { TACTICAL_MORALE_EVENT, -1}, //MORALE_BAD_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 { STRATEGIC_MORALE_EVENT, -5}, //MORALE_BUDDY_FIRED, { 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) ) { // 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 ); - + // Double morale drop for aggressive people if ( DoesMercHavePersonality( pTeamSoldier, CHAR_TRAIT_AGGRESSIVE ) ) 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 @@ -807,7 +813,8 @@ void HandleMoraleEvent( SOLDIERTYPE *pSoldier, INT8 bMoraleEvent, INT16 sMapX, I HandleMoraleEventForSoldier( pTeamSoldier, MORALE_RAN_AWAY ); break; 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; default: HandleMoraleEventForSoldier( pTeamSoldier, MORALE_RAN_AWAY ); @@ -1010,6 +1017,19 @@ void HandleMoraleEvent( SOLDIERTYPE *pSoldier, INT8 bMoraleEvent, INT16 sMapX, I HandleMoraleEventForSoldier( pSoldier, bMoraleEvent ); 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_EARLY: case MORALE_BUDDY_FIRED_ON_BAD_TERMS: diff --git a/Tactical/Morale.h b/Tactical/Morale.h index 23de171e..db146a76 100644 --- a/Tactical/Morale.h +++ b/Tactical/Morale.h @@ -55,6 +55,8 @@ typedef enum MORALE_BAD_FOOD, MORALE_LOATHSOME_FOOD, MORALE_FEAR_OF_HEIGHTS, + MORALE_RAN_AWAY_COWARD, + MORALE_ENEMYGROUP_COWARD, // added by anv MORALE_BUDDY_FIRED, diff --git a/Tactical/soldier profile type.h b/Tactical/soldier profile type.h index 4750c603..dafbba30 100644 --- a/Tactical/soldier profile type.h +++ b/Tactical/soldier profile type.h @@ -198,6 +198,7 @@ typedef enum CHAR_TRAIT_PACIFIST, CHAR_TRAIT_MALICIOUS, CHAR_TRAIT_SHOWOFF, + CHAR_TRAIT_COWARD, NUM_CHAR_TRAITS } CharacterTraits; diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index 9713996e..cc0be15d 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -7797,6 +7797,7 @@ STR16 gzIMPCharacterTraitText[]= L"和平主义者", L"恶毒", L"爱炫耀", + L"Coward", // TODO.Translate L"I.M.P. 性格特征", }; diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index 0f820f9f..ea681332 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -7810,6 +7810,7 @@ STR16 gzIMPCharacterTraitText[]= L"Pacifist", L"Malicious", L"Show-off", + L"Coward", // TODO.Translate L"I.M.P. Character Traits", }; diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index a3820dea..da5918d0 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -7798,6 +7798,7 @@ STR16 gzIMPCharacterTraitText[]= L"Pacifist", L"Malicious", L"Show-off", + L"Coward", L"I.M.P. Character Traits", }; diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index f34cfb40..31a22b06 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -7804,6 +7804,7 @@ STR16 gzIMPCharacterTraitText[]= L"Pacifiste", L"Malicieux", L"Frimeur", + L"Coward", // TODO.Translate L"IMP : Traits de caractère", }; diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index a952aff0..f4171c31 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -7631,6 +7631,7 @@ STR16 gzIMPCharacterTraitText[]= L"Pazifistisch", L"Sadistisch", L"Machohaft", //LOOTF - alt. "Angeberisch" + L"Feigling", L"B.S.E. - Charakterzüge", }; diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index a06da897..beb506da 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -7800,6 +7800,7 @@ STR16 gzIMPCharacterTraitText[]= L"Pacifist", L"Malicious", L"Show-off", + L"Coward", // TODO.Translate L"I.M.P. Character Traits", }; diff --git a/Utils/_Ja25ChineseText.cpp b/Utils/_Ja25ChineseText.cpp index bc0541fd..ed36814d 100644 --- a/Utils/_Ja25ChineseText.cpp +++ b/Utils/_Ja25ChineseText.cpp @@ -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: 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"A: Gains morale when retreating.\nD: Loses morale when encountering numerically superior enemy forces.", // TODO.Translate }; STR16 gzIMPDisabilitiesHelpTexts[]= diff --git a/Utils/_Ja25DutchText.cpp b/Utils/_Ja25DutchText.cpp index 277aafd3..36c9232d 100644 --- a/Utils/_Ja25DutchText.cpp +++ b/Utils/_Ja25DutchText.cpp @@ -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: 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: Gains morale when retreating.\nD: Loses morale when encountering numerically superior enemy forces.", // TODO.Translate }; STR16 gzIMPDisabilitiesHelpTexts[]= diff --git a/Utils/_Ja25EnglishText.cpp b/Utils/_Ja25EnglishText.cpp index 2c9b57b2..0a76742f 100644 --- a/Utils/_Ja25EnglishText.cpp +++ b/Utils/_Ja25EnglishText.cpp @@ -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: 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: Gains morale when retreating.\nD: Loses morale when encountering numerically superior enemy forces.", }; STR16 gzIMPDisabilitiesHelpTexts[]= diff --git a/Utils/_Ja25FrenchText.cpp b/Utils/_Ja25FrenchText.cpp index a420f67a..0cc2f3f2 100644 --- a/Utils/_Ja25FrenchText.cpp +++ b/Utils/_Ja25FrenchText.cpp @@ -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"+ : 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: Gains morale when retreating.\nD: Loses morale when encountering numerically superior enemy forces.", // TODO.Translate }; diff --git a/Utils/_Ja25GermanText.cpp b/Utils/_Ja25GermanText.cpp index 7a5a2898..63688865 100644 --- a/Utils/_Ja25GermanText.cpp +++ b/Utils/_Ja25GermanText.cpp @@ -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: 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"A: Gains morale when retreating.\nD: Loses morale when encountering numerically superior enemy forces.", // TODO.Translate }; STR16 gzIMPDisabilitiesHelpTexts[]= diff --git a/Utils/_Ja25ItalianText.cpp b/Utils/_Ja25ItalianText.cpp index b5215d4a..bd077a0a 100644 --- a/Utils/_Ja25ItalianText.cpp +++ b/Utils/_Ja25ItalianText.cpp @@ -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: 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: Gains morale when retreating.\nD: Loses morale when encountering numerically superior enemy forces.", // TODO.Translate }; STR16 gzIMPDisabilitiesHelpTexts[]= diff --git a/Utils/_Ja25PolishText.cpp b/Utils/_Ja25PolishText.cpp index 2a203131..b16fc733 100644 --- a/Utils/_Ja25PolishText.cpp +++ b/Utils/_Ja25PolishText.cpp @@ -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: 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: Gains morale when retreating.\nD: Loses morale when encountering numerically superior enemy forces.", // TODO.Translate }; STR16 gzIMPDisabilitiesHelpTexts[]= diff --git a/Utils/_Ja25RussianText.cpp b/Utils/_Ja25RussianText.cpp index c0c581f6..28dc3cdc 100644 --- a/Utils/_Ja25RussianText.cpp +++ b/Utils/_Ja25RussianText.cpp @@ -463,6 +463,7 @@ STR16 gzIMPNewCharacterTraitsHelpTexts[]= L"плюсы: Боевой дух повышается при выполнении небоевых заданий (кроме тренировки ополчения).\n \nминусы: Убийство врагов не повышает боевой дух.", //Pacifist L"плюсы: Имеет больший шанс нанести болезненные раны и травмы, приводящие к ухудшению параметров.\nБоевой дух повышается при нанесении таких ран.\n \nминусы: Имеет проблемы в общении и быстро теряет боевой дух, если не сражается.", //Malicious L"плюсы: Лучше работает в компании представителей противоположного пола.\n \nминусы: Боевой дух бойцов того же пола в его присутствии растёт медленнее.", //Show-off + L"A: Gains morale when retreating.\nD: Loses morale when encountering numerically superior enemy forces.", // TODO.Translate }; STR16 gzIMPDisabilitiesHelpTexts[]= diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index f4daed38..166bb0d3 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -7815,6 +7815,7 @@ STR16 gzIMPCharacterTraitText[]= L"Pacyfista", L"Podstępny", L"Gwiazdor", + L"Coward", // TODO.Translate L"Cechy charakteru I.M.P.-a", }; diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index a39ad1f2..1666dc6e 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -7798,6 +7798,7 @@ STR16 gzIMPCharacterTraitText[]= L"Миролюбивый", //Pacifist L"Злобный", //Malicious L"Хвастун", //Show-off + L"Coward", // TODO.Translate L"I.M.P.: Личностные качества", //I.M.P. Character Traits };