mirror of
https://github.com/1dot13/source.git
synced 2026-07-29 13:52:17 +02:00
- Added 3 new opinion events (OPINIONEVENT_BRUTAL_GOOD, OPINIONEVENT_BRUTAL_BAD and OPINIONEVENT_TEACHER)
- Fix: during dialogue, mercs did not agree often enough - Fix: if no mercs were in any squad, Melody website did not show relations - Dialogue has been reordered, this should make adding new ones slightly easier git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7533 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
@@ -3582,6 +3582,9 @@ void LoadMoraleSettings()
|
||||
gDynamicOpinionEvent[OPINIONEVENT_SOLVECONFLICT_AGGRESSIVE_BAD].sOpinionModifier = iniReader.ReadInteger( "Dynamic Opinion Modifiers Settings", "OPINIONEVENT_SOLVECONFLICT_AGGRESSIVE_BAD", -3, -50, 0 );
|
||||
gDynamicOpinionEvent[OPINIONEVENT_DISEASE_DISGUSTING].sOpinionModifier = iniReader.ReadInteger( "Dynamic Opinion Modifiers Settings", "OPINIONEVENT_DISEASE_DISGUSTING", -3, -50, 0 );
|
||||
gDynamicOpinionEvent[OPINIONEVENT_DISEASE_TREATMENT].sOpinionModifier = iniReader.ReadInteger( "Dynamic Opinion Modifiers Settings", "OPINIONEVENT_DISEASE_TREATMENT", 1, 0, 50 );
|
||||
gDynamicOpinionEvent[OPINIONEVENT_BRUTAL_GOOD].sOpinionModifier = iniReader.ReadInteger( "Dynamic Opinion Modifiers Settings", "OPINIONEVENT_BRUTAL_GOOD", 1, 0, 50 );
|
||||
gDynamicOpinionEvent[OPINIONEVENT_BRUTAL_BAD].sOpinionModifier = iniReader.ReadInteger( "Dynamic Opinion Modifiers Settings", "OPINIONEVENT_BRUTAL_BAD", -3, -50, 0 );
|
||||
gDynamicOpinionEvent[OPINIONEVENT_TEACHER].sOpinionModifier = iniReader.ReadInteger( "Dynamic Opinion Modifiers Settings", "OPINIONEVENT_TEACHER", 1, 0, 50 );
|
||||
}
|
||||
|
||||
void LoadReputationSettings()
|
||||
|
||||
@@ -410,7 +410,7 @@ void RenderMercCompareAnalyze()
|
||||
usPosX = LAPTOP_SCREEN_UL_X;
|
||||
usPosY = MCA_START_CONTENT_Y;
|
||||
|
||||
if ( DropDownTemplate<DROPDOWNNR_MERCCOMPARE_SQUADSELECTION>::getInstance().HasEntries() )
|
||||
if ( DropDownTemplate<DROPDOWNNR_MERCCOMPARE1>::getInstance( ).HasEntries( ) && DropDownTemplate<DROPDOWNNR_MERCCOMPARE2>::getInstance( ).HasEntries( ) )
|
||||
{
|
||||
gMercCompareProfile1 = (UINT8)DropDownTemplate<DROPDOWNNR_MERCCOMPARE1>::getInstance( ).GetSelectedEntryKey( );
|
||||
gMercCompareProfile2 = (UINT8)DropDownTemplate<DROPDOWNNR_MERCCOMPARE2>::getInstance( ).GetSelectedEntryKey( );
|
||||
|
||||
+10
-9
@@ -36,6 +36,7 @@
|
||||
#include "Tactical Save.h"
|
||||
#include "Strategic AI.h"
|
||||
#include "interface Dialogue.h"
|
||||
#include "DynamicDialogue.h"
|
||||
#endif
|
||||
|
||||
#ifdef JA2UB
|
||||
@@ -832,12 +833,12 @@ void ChangeStat( MERCPROFILESTRUCT *pProfile, SOLDIERTYPE *pSoldier, UINT8 ubSta
|
||||
if (fChangeSalary)
|
||||
{
|
||||
// increase all salaries and medical deposits, once for each level gained
|
||||
for (uiLevelCnt = 0; uiLevelCnt < (UINT32) sPtsChanged; uiLevelCnt++)
|
||||
for (uiLevelCnt = 0; uiLevelCnt < (UINT32) sPtsChanged; ++uiLevelCnt)
|
||||
{
|
||||
pProfile->sSalary = (INT16) CalcNewSalary(pProfile->sSalary, fChangeTypeIncrease, MAX_DAILY_SALARY);
|
||||
pProfile->uiWeeklySalary = CalcNewSalary(pProfile->uiWeeklySalary, fChangeTypeIncrease, MAX_LARGE_SALARY);
|
||||
pProfile->uiBiWeeklySalary = CalcNewSalary(pProfile->uiBiWeeklySalary, fChangeTypeIncrease, MAX_LARGE_SALARY);
|
||||
pProfile->sTrueSalary = (INT16) CalcNewSalary(pProfile->sTrueSalary, fChangeTypeIncrease, MAX_DAILY_SALARY);
|
||||
pProfile->sSalary = (INT16) CalcNewSalary(pProfile->sSalary, fChangeTypeIncrease, MAX_DAILY_SALARY);
|
||||
pProfile->uiWeeklySalary = CalcNewSalary(pProfile->uiWeeklySalary, fChangeTypeIncrease, MAX_LARGE_SALARY);
|
||||
pProfile->uiBiWeeklySalary = CalcNewSalary(pProfile->uiBiWeeklySalary, fChangeTypeIncrease, MAX_LARGE_SALARY);
|
||||
pProfile->sTrueSalary = (INT16) CalcNewSalary(pProfile->sTrueSalary, fChangeTypeIncrease, MAX_DAILY_SALARY);
|
||||
pProfile->sMedicalDepositAmount = (INT16) CalcNewSalary(pProfile->sMedicalDepositAmount, fChangeTypeIncrease, MAX_DAILY_SALARY);
|
||||
|
||||
//if (pSoldier != NULL)
|
||||
@@ -846,9 +847,11 @@ void ChangeStat( MERCPROFILESTRUCT *pProfile, SOLDIERTYPE *pSoldier, UINT8 ubSta
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
// Flugente: dynamic opinions
|
||||
if ( FROM_TRAINING == ubReason )
|
||||
HandleDynamicOpinionTeaching( pSoldier, ubStat );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1071,8 +1074,6 @@ void ProcessUpdateStats( MERCPROFILESTRUCT *pProfile, SOLDIERTYPE *pSoldier, UIN
|
||||
ChangeStat( pProfile, pSoldier, ubStat, sPtsChanged, ubReason );
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
+178
-146
@@ -27,6 +27,7 @@
|
||||
#include "random.h"
|
||||
#include "strategicmap.h"
|
||||
#include "connect.h"
|
||||
#include "Campaign.h"
|
||||
|
||||
extern INT32 ReadFieldByField( HWFILE hFile, PTR pDest, UINT32 uiFieldSize, UINT32 uiElementSize, UINT32 uiCurByteCount );
|
||||
|
||||
@@ -400,44 +401,34 @@ void CreateSpeechEventsFromDynamicOpinionEvent( DynamicOpinionSpeechEvent aEvent
|
||||
{
|
||||
// cause either denies or agrees with complainant
|
||||
|
||||
// if multiple persons causes/complainants are involved, we always have to disagree - otherwise this thing is over before it gets interesting
|
||||
UINT32 chancetoagree = 0;
|
||||
BOOLEAN fMultiplePeopleAction = FALSE;
|
||||
UINT32 chancetoagree = 0;
|
||||
|
||||
for ( UINT8 i = 0; i < DOST_INTERJECTORS_MAX; ++i )
|
||||
// the more we dislike the other guy, the higher the chance we disagree
|
||||
// personality also influences this
|
||||
INT8 agreemodifier_personal = SoldierRelation( aEvent.data.event.ubProfileCause, aEvent.data.event.ubProfileComplainant );
|
||||
|
||||
switch ( gMercProfiles[aEvent.data.event.ubProfileCause].bCharacterTrait )
|
||||
{
|
||||
if ( aEvent.data.ubProfileSideCause[i] != NO_PROFILE || aEvent.data.ubProfileSideComplainant[i] != NO_PROFILE )
|
||||
{
|
||||
fMultiplePeopleAction = TRUE;
|
||||
break;
|
||||
}
|
||||
case(CHAR_TRAIT_NORMAL) : agreemodifier_personal += 0; break;
|
||||
case(CHAR_TRAIT_SOCIABLE) : agreemodifier_personal += 10; break;
|
||||
case(CHAR_TRAIT_LONER) : agreemodifier_personal += -3; break;
|
||||
case(CHAR_TRAIT_OPTIMIST) : agreemodifier_personal += 5; break;
|
||||
case(CHAR_TRAIT_ASSERTIVE) : agreemodifier_personal += -5; break;
|
||||
case(CHAR_TRAIT_INTELLECTUAL) : agreemodifier_personal += 2; break;
|
||||
case(CHAR_TRAIT_PRIMITIVE) : agreemodifier_personal += -4; break;
|
||||
case(CHAR_TRAIT_AGGRESSIVE) : agreemodifier_personal += -10; break;
|
||||
case(CHAR_TRAIT_PHLEGMATIC) : agreemodifier_personal += -20; break;
|
||||
case(CHAR_TRAIT_DAUNTLESS) : agreemodifier_personal += -10; break;
|
||||
case(CHAR_TRAIT_PACIFIST) : agreemodifier_personal += 20; break;
|
||||
case(CHAR_TRAIT_MALICIOUS) : agreemodifier_personal += -8; break;
|
||||
case(CHAR_TRAIT_SHOWOFF) : agreemodifier_personal += -3; break;
|
||||
}
|
||||
|
||||
if ( !fMultiplePeopleAction )
|
||||
{
|
||||
// the more we dislike the other guy, the higher the chance we disagree
|
||||
// personality also influences this
|
||||
INT8 agreemodifier_personal = SoldierRelation( aEvent.data.event.ubProfileCause, aEvent.data.event.ubProfileComplainant );
|
||||
// if the event is positive, then we are much more likely to agree
|
||||
if ( gDynamicOpinionEvent[aEvent.data.event.ubEventId].sOpinionModifier > 0 )
|
||||
agreemodifier_personal += 50;
|
||||
|
||||
switch ( gMercProfiles[aEvent.data.event.ubProfileCause].bCharacterTrait )
|
||||
{
|
||||
case(CHAR_TRAIT_NORMAL) : agreemodifier_personal += 0; break;
|
||||
case(CHAR_TRAIT_SOCIABLE) : agreemodifier_personal += 10; break;
|
||||
case(CHAR_TRAIT_LONER) : agreemodifier_personal += -3; break;
|
||||
case(CHAR_TRAIT_OPTIMIST) : agreemodifier_personal += 5; break;
|
||||
case(CHAR_TRAIT_ASSERTIVE) : agreemodifier_personal += -5; break;
|
||||
case(CHAR_TRAIT_INTELLECTUAL) : agreemodifier_personal += 2; break;
|
||||
case(CHAR_TRAIT_PRIMITIVE) : agreemodifier_personal += -4; break;
|
||||
case(CHAR_TRAIT_AGGRESSIVE) : agreemodifier_personal += -10; break;
|
||||
case(CHAR_TRAIT_PHLEGMATIC) : agreemodifier_personal += -20; break;
|
||||
case(CHAR_TRAIT_DAUNTLESS) : agreemodifier_personal += -10; break;
|
||||
case(CHAR_TRAIT_PACIFIST) : agreemodifier_personal += 20; break;
|
||||
case(CHAR_TRAIT_MALICIOUS) : agreemodifier_personal += -8; break;
|
||||
case(CHAR_TRAIT_SHOWOFF) : agreemodifier_personal += -3; break;
|
||||
}
|
||||
|
||||
chancetoagree = min( 0, 25 + agreemodifier_personal );
|
||||
}
|
||||
chancetoagree = max( 0, 25 + agreemodifier_personal );
|
||||
|
||||
// if he agrees, then this dialogue will soon be over - interjector won't have to play his part
|
||||
if ( Chance( chancetoagree ) )
|
||||
@@ -501,7 +492,7 @@ void CreateSpeechEventsFromDynamicOpinionEvent( DynamicOpinionSpeechEvent aEvent
|
||||
else if ( gMercProfiles[aEvent.data.ubProfileINTERJECTOR].bCharacterTrait == CHAR_TRAIT_LONER )
|
||||
chance_nothing += 20;
|
||||
|
||||
if ( !fMultiplePeopleAction && Chance( chance_nothing ) )
|
||||
if ( Chance( chance_nothing ) )
|
||||
{
|
||||
// say nothing...
|
||||
impaction.ubEventType = DOST_INTERJECTOR_NOTHING;
|
||||
@@ -611,49 +602,46 @@ void CreateSpeechEventsFromDynamicOpinionEvent( DynamicOpinionSpeechEvent aEvent
|
||||
gDynamicOpinionSpeechEventVector.push_back( impaction );
|
||||
gDynamicOpinionSpeechInCurrentDialogue.push_back( impaction );
|
||||
++cnt;
|
||||
|
||||
// if other people are involved too, they can speak too
|
||||
if ( fMultiplePeopleAction )
|
||||
{
|
||||
for ( UINT8 i = 0; i < DOST_INTERJECTORS_MAX; ++i )
|
||||
{
|
||||
if ( aEvent.data.ubProfileSideComplainant[i] != NO_PROFILE )
|
||||
{
|
||||
DynamicOpinionSpeechEvent response;
|
||||
response.data = aEvent.data;
|
||||
response.ubEventType = DOST_SIDEWITH_VICTIM;
|
||||
response.usSpeaker = aEvent.data.ubProfileSideComplainant[i];
|
||||
response.usQueueNumber = queuenumber++;
|
||||
response.usSide = DOST_POSITION_LEFT;
|
||||
response.usNumonside = (UINT8)GetSidePosition( response.usSide );
|
||||
response.usStarttime = GetJA2Clock( ) + cnt * gGameExternalOptions.sDynamicDialogueTimeOffset;
|
||||
|
||||
gDynamicOpinionSpeechEventVector.push_back( response );
|
||||
gDynamicOpinionSpeechInCurrentDialogue.push_back( response );
|
||||
++cnt;
|
||||
}
|
||||
|
||||
if ( aEvent.data.ubProfileSideCause[i] != NO_PROFILE )
|
||||
{
|
||||
DynamicOpinionSpeechEvent response;
|
||||
response.data = aEvent.data;
|
||||
response.ubEventType = DOST_SIDEWITH_CAUSE;
|
||||
response.usSpeaker = aEvent.data.ubProfileSideCause[i];
|
||||
response.usQueueNumber = queuenumber++;
|
||||
response.usSide = DOST_POSITION_RIGHT;
|
||||
response.usNumonside = (UINT8)GetSidePosition( response.usSide );
|
||||
response.usStarttime = GetJA2Clock( ) + cnt * gGameExternalOptions.sDynamicDialogueTimeOffset;
|
||||
|
||||
gDynamicOpinionSpeechEventVector.push_back( response );
|
||||
gDynamicOpinionSpeechInCurrentDialogue.push_back( response );
|
||||
++cnt;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// if other people are involved too, they can speak too
|
||||
for ( UINT8 i = 0; i < DOST_INTERJECTORS_MAX; ++i )
|
||||
{
|
||||
if ( aEvent.data.ubProfileSideComplainant[i] != NO_PROFILE )
|
||||
{
|
||||
DynamicOpinionSpeechEvent response;
|
||||
response.data = aEvent.data;
|
||||
response.ubEventType = DOST_SIDEWITH_VICTIM;
|
||||
response.usSpeaker = aEvent.data.ubProfileSideComplainant[i];
|
||||
response.usQueueNumber = queuenumber++;
|
||||
response.usSide = DOST_POSITION_LEFT;
|
||||
response.usNumonside = (UINT8)GetSidePosition( response.usSide );
|
||||
response.usStarttime = GetJA2Clock( ) + cnt * gGameExternalOptions.sDynamicDialogueTimeOffset;
|
||||
|
||||
gDynamicOpinionSpeechEventVector.push_back( response );
|
||||
gDynamicOpinionSpeechInCurrentDialogue.push_back( response );
|
||||
++cnt;
|
||||
}
|
||||
|
||||
if ( aEvent.data.ubProfileSideCause[i] != NO_PROFILE )
|
||||
{
|
||||
DynamicOpinionSpeechEvent response;
|
||||
response.data = aEvent.data;
|
||||
response.ubEventType = DOST_SIDEWITH_CAUSE;
|
||||
response.usSpeaker = aEvent.data.ubProfileSideCause[i];
|
||||
response.usQueueNumber = queuenumber++;
|
||||
response.usSide = DOST_POSITION_RIGHT;
|
||||
response.usNumonside = (UINT8)GetSidePosition( response.usSide );
|
||||
response.usStarttime = GetJA2Clock( ) + cnt * gGameExternalOptions.sDynamicDialogueTimeOffset;
|
||||
|
||||
gDynamicOpinionSpeechEventVector.push_back( response );
|
||||
gDynamicOpinionSpeechInCurrentDialogue.push_back( response );
|
||||
++cnt;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( aEvent.ubEventType >= DOST_INTERJECTOR_TO_VICTIM_DENY && aEvent.ubEventType <= DOST_INTERJECTOR_SOLVE_AGGRESSIVE )
|
||||
{
|
||||
@@ -850,7 +838,7 @@ void StartDynamicOpinionDialogue( )
|
||||
CleanDynamicOpinionSpeechEvents( );
|
||||
}
|
||||
|
||||
// TODO: if possible, merge events if possible, thereby creating fewer but deeper dialogues
|
||||
// if possible, merge events if possible, thereby creating fewer but deeper dialogues
|
||||
void PerformPossibleDynamicOpinionEventMerges( )
|
||||
{
|
||||
for ( std::vector<DynamicOpinionSpeechEvent>::iterator it = gDynamicOpinionSpeechEventArchiveVector.begin( ); it != gDynamicOpinionSpeechEventArchiveVector.end( ); ) // not having ++it here is intentional!
|
||||
@@ -872,8 +860,8 @@ void PerformPossibleDynamicOpinionEventMerges( )
|
||||
// if cause are the same
|
||||
if ( event1.data.event.ubProfileCause == event2.data.event.ubProfileCause )
|
||||
{
|
||||
// if there is still room, add to the lsit of complainants and delete this event
|
||||
for ( UINT8 i = 0; i < 4; ++i )
|
||||
// if there is still room, add to the list of complainants and delete this event
|
||||
for ( UINT8 i = 0; i < DOST_INTERJECTORS_MAX; ++i )
|
||||
{
|
||||
if ( event1.data.ubProfileSideComplainant[i] == NO_PROFILE )
|
||||
{
|
||||
@@ -977,76 +965,23 @@ BOOLEAN DynamicOpinionTacticalCharacterDialogue( DynamicOpinionSpeechEvent& aEve
|
||||
|
||||
switch ( aEvent.ubEventType )
|
||||
{
|
||||
// victim begins dialogue
|
||||
case DOST_VICTIM_INITIATE:
|
||||
wcscpy( gzQuoteStr, szDynamicDialogueText_DOST_VICTIM_INITIATE[aEvent.data.event.ubEventId] );
|
||||
break;
|
||||
|
||||
// victim denies what INTERJECTOR said
|
||||
case DOST_VICTIM_TO_INTERJECTOR_DENY:
|
||||
wcscpy( gzQuoteStr, szDynamicDialogueText_DOST_VICTIM_TO_INTERJECTOR_DENY[Random( 20 )] );
|
||||
// cause denies what imp said
|
||||
case DOST_CAUSE_TO_INTERJECTOR_DENY:
|
||||
// yep, same dialogue
|
||||
wcscpy( gzQuoteStr, szDynamicDialogueText_DOST_VICTIM_TO_INTERJECTOR_DENY[Random( 28 )] );
|
||||
break;
|
||||
|
||||
// victim agrees what imp said
|
||||
case DOST_VICTIM_TO_INTERJECTOR_AGREE:
|
||||
wcscpy( gzQuoteStr, szDynamicDialogueText_DOST_VICTIM_TO_INTERJECTOR_AGREE[Random( 12 )] );
|
||||
break;
|
||||
|
||||
// cause denies victim's accusation
|
||||
case DOST_CAUSE_TO_VICTIM_DENY:
|
||||
wcscpy( gzQuoteStr, szDynamicDialogueText_DOST_CAUSE_TO_VICTIM_DENY[aEvent.data.event.ubEventId] );
|
||||
break;
|
||||
|
||||
// cause accepts responsibility to victim
|
||||
case DOST_CAUSE_TO_VICTIM_AGREE:
|
||||
wcscpy( gzQuoteStr, szDynamicDialogueText_DOST_CAUSE_TO_VICTIM_AGREE[aEvent.data.event.ubEventId] );
|
||||
break;
|
||||
|
||||
// cause denies what imp said
|
||||
case DOST_CAUSE_TO_INTERJECTOR_DENY:
|
||||
wcscpy( gzQuoteStr, szDynamicDialogueText_DOST_CAUSE_TO_INTERJECTOR_DENY[Random(21)] );
|
||||
break;
|
||||
|
||||
// cause agrees what imp said
|
||||
case DOST_CAUSE_TO_INTERJECTOR_AGREE:
|
||||
wcscpy( gzQuoteStr, szDynamicDialogueText_DOST_CAUSE_TO_INTERJECTOR_AGREE[Random(12)] );
|
||||
// yep, same dialogue
|
||||
wcscpy( gzQuoteStr, szDynamicDialogueText_DOST_VICTIM_TO_INTERJECTOR_AGREE[Random( 17 )] );
|
||||
break;
|
||||
|
||||
// special: creates the imp dialogue selection
|
||||
case DOST_INTERJECTOR_DIALOGUESELECTION:
|
||||
wcscpy( gzQuoteStr, szDynamicDialogueText_DOST_INTERJECTOR_DIALOGUESELECTION[aEvent.data.event.ubEventId] );
|
||||
break;
|
||||
|
||||
// imp denies victim's accusation
|
||||
case DOST_INTERJECTOR_TO_VICTIM_DENY:
|
||||
wcscpy( gzQuoteStr, szDynamicDialogueText_DOST_INTERJECTOR_TO_VICTIM_DENY[aEvent.data.event.ubEventId] );
|
||||
break;
|
||||
|
||||
// imp agrees to victim that cause is to blame
|
||||
case DOST_INTERJECTOR_TO_VICTIM_AGREE:
|
||||
wcscpy( gzQuoteStr, szDynamicDialogueText_DOST_INTERJECTOR_TO_VICTIM_AGREE[aEvent.data.event.ubEventId] );
|
||||
break;
|
||||
|
||||
// imp denies victim denial
|
||||
case DOST_INTERJECTOR_TO_CAUSE_DENY:
|
||||
wcscpy( gzQuoteStr, szDynamicDialogueText_DOST_INTERJECTOR_TO_CAUSE_DENY[aEvent.data.event.ubEventId] );
|
||||
break;
|
||||
|
||||
// imp agrees that victim is not to blame
|
||||
case DOST_INTERJECTOR_TO_CAUSE_AGREE:
|
||||
wcscpy( gzQuoteStr, szDynamicDialogueText_DOST_INTERJECTOR_TO_CAUSE_AGREE[aEvent.data.event.ubEventId] );
|
||||
break;
|
||||
|
||||
// imp tries to solve the situation peacefully
|
||||
case DOST_INTERJECTOR_SOLVE_REASON:
|
||||
wcscpy( gzQuoteStr, szDynamicDialogueText_DOST_INTERJECTOR_SOLVE_REASON[aEvent.data.event.ubEventId] );
|
||||
break;
|
||||
|
||||
// imp tries to solve the situation aggressively
|
||||
case DOST_INTERJECTOR_SOLVE_AGGRESSIVE:
|
||||
wcscpy( gzQuoteStr, szDynamicDialogueText_DOST_INTERJECTOR_SOLVE_AGGRESSIVE[aEvent.data.event.ubEventId] );
|
||||
break;
|
||||
|
||||
|
||||
|
||||
// interjector decides to say nothing
|
||||
case DOST_INTERJECTOR_NOTHING:
|
||||
wcscpy( gzQuoteStr, L"I don't want to say anything, but a bug forces me to! Help! Inform Flugente!" );
|
||||
@@ -1054,16 +989,16 @@ BOOLEAN DynamicOpinionTacticalCharacterDialogue( DynamicOpinionSpeechEvent& aEve
|
||||
|
||||
// another person sides with victim
|
||||
case DOST_SIDEWITH_VICTIM:
|
||||
wcscpy( gzQuoteStr, szDynamicDialogueText_DOST_SIDEWITH_VICTIM[Random( 14 )] );
|
||||
wcscpy( gzQuoteStr, szDynamicDialogueText_DOST_SIDEWITH_VICTIM[Random( 19 )] );
|
||||
break;
|
||||
|
||||
// another person sides with cause
|
||||
case DOST_SIDEWITH_CAUSE:
|
||||
wcscpy( gzQuoteStr, szDynamicDialogueText_DOST_SIDEWITH_CAUSE[Random( 14 )] );
|
||||
wcscpy( gzQuoteStr, szDynamicDialogueText_DOST_SIDEWITH_CAUSE[Random( 18 )] );
|
||||
break;
|
||||
|
||||
default:
|
||||
wcscpy( gzQuoteStr, L"I am a missing text. Help me!" );
|
||||
wcscpy( gzQuoteStr, szDynamicDialogueText[aEvent.data.event.ubEventId][aEvent.ubEventType] );
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1078,6 +1013,8 @@ BOOLEAN DynamicOpinionTacticalCharacterDialogue( DynamicOpinionSpeechEvent& aEve
|
||||
ReplaceTextWithOtherText( gzQuoteStr, L"$VICTIM_PRONOUN$", (gMercProfiles[aEvent.data.event.ubProfileComplainant].bSex == MALE) ? szDynamicDialogueText_GenderText[2] : szDynamicDialogueText_GenderText[3] );
|
||||
ReplaceTextWithOtherText( gzQuoteStr, L"$CAUSE_GENDER$", (gMercProfiles[aEvent.data.event.ubProfileCause].bSex == MALE) ? szDynamicDialogueText_GenderText[0] : szDynamicDialogueText_GenderText[1] );
|
||||
ReplaceTextWithOtherText( gzQuoteStr, L"$CAUSE_PRONOUN$", (gMercProfiles[aEvent.data.event.ubProfileCause].bSex == MALE) ? szDynamicDialogueText_GenderText[2] : szDynamicDialogueText_GenderText[3] );
|
||||
ReplaceTextWithOtherText( gzQuoteStr, L"$INTERJECTOR_GENDER$", (gMercProfiles[aEvent.data.ubProfileINTERJECTOR].bSex == MALE) ? szDynamicDialogueText_GenderText[0] : szDynamicDialogueText_GenderText[1] );
|
||||
ReplaceTextWithOtherText( gzQuoteStr, L"$INTERJECTOR_PRONOUN$", (gMercProfiles[aEvent.data.ubProfileINTERJECTOR].bSex == MALE) ? szDynamicDialogueText_GenderText[2] : szDynamicDialogueText_GenderText[3] );
|
||||
|
||||
pDDBox->SetText( gzQuoteStr );
|
||||
pDDBox->SetEvent( aEvent );
|
||||
@@ -1112,7 +1049,7 @@ BOOLEAN DynamicOpinionTacticalCharacterDialogue( DynamicOpinionSpeechEvent& aEve
|
||||
|
||||
IMPDialogueChooseBox_Static::getInstance( ).SetEvent( aEvent );
|
||||
IMPDialogueChooseBox_Static::getInstance( ).SetEntries( entryvec );
|
||||
IMPDialogueChooseBox_Static::getInstance( ).SetHelpText( szDynamicDialogueText_DOST_INTERJECTOR_DIALOGUESELECTION[aEvent.data.event.ubEventId] );
|
||||
IMPDialogueChooseBox_Static::getInstance( ).SetHelpText( szDynamicDialogueText[aEvent.data.event.ubEventId][DOST_INTERJECTOR_DIALOGUESELECTION] );
|
||||
IMPDialogueChooseBox_Static::getInstance( ).Create( sX, sY + 60 );
|
||||
IMPDialogueChooseBox_Static::getInstance( ).SetStartTime( aEvent.usStarttime );
|
||||
IMPDialogueChooseBox_Static::getInstance( ).SetEndTime( aEvent.usStarttime + 2 * gGameExternalOptions.sDynamicDialogueTimeOffset );
|
||||
@@ -1169,7 +1106,6 @@ void AddOpinionEvent( UINT8 usProfileA, UINT8 usProfileB, UINT8 usEvent, BOOLEAN
|
||||
if ( !pSoldier || pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE )
|
||||
return;
|
||||
|
||||
|
||||
UINT32 ustmpFlagmask[OPINION_FLAGMASKS_NUMBER];
|
||||
for ( UINT8 i = 0; i < OPINION_FLAGMASKS_NUMBER; ++i )
|
||||
{
|
||||
@@ -1251,6 +1187,10 @@ void AddOpinionEvent( UINT8 usProfileA, UINT8 usProfileB, UINT8 usEvent, BOOLEAN
|
||||
case OPINIONEVENT_SOLVECONFLICT_AGGRESSIVE_BAD: gMercProfiles[usProfileA].usDynamicOpinionFlagmask[usProfileB][3] |= OPINIONFLAG_STAGE1_SOLVECONFLICT_AGGRESSIVE_BAD; break;
|
||||
case OPINIONEVENT_DISEASE_DISGUSTING: gMercProfiles[usProfileA].usDynamicOpinionFlagmask[usProfileB][3] |= OPINIONFLAG_STAGE1_DISEASE_DISGUSTING; break;
|
||||
case OPINIONEVENT_DISEASE_TREATMENT: gMercProfiles[usProfileA].usDynamicOpinionFlagmask[usProfileB][3] |= OPINIONFLAG_STAGE1_DISEASE_TREATMENT; break;
|
||||
case OPINIONEVENT_BRUTAL_GOOD: gMercProfiles[usProfileA].usDynamicOpinionFlagmask[usProfileB][3] |= OPINIONFLAG_STAGE1_BRUTAL_GOOD; break;
|
||||
|
||||
case OPINIONEVENT_BRUTAL_BAD: gMercProfiles[usProfileA].usDynamicOpinionFlagmask[usProfileB][4] |= OPINIONFLAG_STAGE1_BRUTAL_BAD; break;
|
||||
case OPINIONEVENT_TEACHER: gMercProfiles[usProfileA].usDynamicOpinionFlagmask[usProfileB][4] |= OPINIONFLAG_STAGE1_TEACHER; break;
|
||||
|
||||
default: break;
|
||||
}
|
||||
@@ -1561,6 +1501,27 @@ INT8 GetDynamicOpinion( UINT8 usProfileA, UINT8 usProfileB, UINT8 usEvent )
|
||||
if ( gMercProfiles[usProfileA].usDynamicOpinionFlagmask[usProfileB][3] & OPINIONFLAG_STAGE4_DISEASE_TREATMENT ) ++numflags;
|
||||
break;
|
||||
|
||||
case OPINIONEVENT_BRUTAL_GOOD:
|
||||
if ( gMercProfiles[usProfileA].usDynamicOpinionFlagmask[usProfileB][3] & OPINIONFLAG_STAGE1_BRUTAL_GOOD ) ++numflags;
|
||||
if ( gMercProfiles[usProfileA].usDynamicOpinionFlagmask[usProfileB][3] & OPINIONFLAG_STAGE2_BRUTAL_GOOD ) ++numflags;
|
||||
if ( gMercProfiles[usProfileA].usDynamicOpinionFlagmask[usProfileB][3] & OPINIONFLAG_STAGE3_BRUTAL_GOOD ) ++numflags;
|
||||
if ( gMercProfiles[usProfileA].usDynamicOpinionFlagmask[usProfileB][3] & OPINIONFLAG_STAGE4_BRUTAL_GOOD ) ++numflags;
|
||||
break;
|
||||
|
||||
case OPINIONEVENT_BRUTAL_BAD:
|
||||
if ( gMercProfiles[usProfileA].usDynamicOpinionFlagmask[usProfileB][4] & OPINIONFLAG_STAGE1_BRUTAL_BAD ) ++numflags;
|
||||
if ( gMercProfiles[usProfileA].usDynamicOpinionFlagmask[usProfileB][4] & OPINIONFLAG_STAGE2_BRUTAL_BAD ) ++numflags;
|
||||
if ( gMercProfiles[usProfileA].usDynamicOpinionFlagmask[usProfileB][4] & OPINIONFLAG_STAGE3_BRUTAL_BAD ) ++numflags;
|
||||
if ( gMercProfiles[usProfileA].usDynamicOpinionFlagmask[usProfileB][4] & OPINIONFLAG_STAGE4_BRUTAL_BAD ) ++numflags;
|
||||
break;
|
||||
|
||||
case OPINIONEVENT_TEACHER:
|
||||
if ( gMercProfiles[usProfileA].usDynamicOpinionFlagmask[usProfileB][4] & OPINIONFLAG_STAGE1_TEACHER ) ++numflags;
|
||||
if ( gMercProfiles[usProfileA].usDynamicOpinionFlagmask[usProfileB][4] & OPINIONFLAG_STAGE2_TEACHER ) ++numflags;
|
||||
if ( gMercProfiles[usProfileA].usDynamicOpinionFlagmask[usProfileB][4] & OPINIONFLAG_STAGE3_TEACHER ) ++numflags;
|
||||
if ( gMercProfiles[usProfileA].usDynamicOpinionFlagmask[usProfileB][4] & OPINIONFLAG_STAGE4_TEACHER ) ++numflags;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -1808,6 +1769,51 @@ void HandleDynamicOpinionTeamDrinking( SOLDIERTYPE* pSoldier )
|
||||
}
|
||||
}
|
||||
|
||||
void HandleDynamicOpinionTeaching( SOLDIERTYPE* pSoldier, UINT8 ubStat )
|
||||
{
|
||||
if ( !pSoldier || pSoldier->ubProfile == NO_PROFILE )
|
||||
return;
|
||||
|
||||
// because this code is as annoying as it is, ubStat has a different numbering than bTrainStat. The only reasonable explanation for that is that the designers decided to be jerks on purpose
|
||||
// we have to get the correct bTrainStat
|
||||
INT8 trainstat = 0;
|
||||
switch ( ubStat )
|
||||
{
|
||||
case STRAMT: trainstat = STRENGTH; break;
|
||||
case DEXTAMT: trainstat = DEXTERITY; break;
|
||||
case AGILAMT: trainstat = AGILITY; break;
|
||||
case HEALTHAMT: trainstat = HEALTH; break;
|
||||
case LDRAMT: trainstat = LEADERSHIP; break;
|
||||
case MARKAMT: trainstat = MARKSMANSHIP; break;
|
||||
case EXPLODEAMT: trainstat = EXPLOSIVE_ASSIGN; break;
|
||||
case MEDICALAMT: trainstat = MEDICAL; break;
|
||||
case MECHANAMT: trainstat = MECHANICAL; break;
|
||||
|
||||
default:
|
||||
// other stats cannot be trained (including wisdom), so get out of here
|
||||
return;
|
||||
break;
|
||||
}
|
||||
|
||||
SOLDIERTYPE* pTeamSoldier = NULL;
|
||||
UINT16 bMercID = gTacticalStatus.Team[gbPlayerNum].bFirstID;
|
||||
UINT16 bLastTeamID = gTacticalStatus.Team[gbPlayerNum].bLastID;
|
||||
for ( pTeamSoldier = MercPtrs[bMercID]; bMercID <= bLastTeamID; ++bMercID, pTeamSoldier++ )
|
||||
{
|
||||
// award event for every trainer in this sector
|
||||
if ( pTeamSoldier->bActive && pTeamSoldier->ubProfile != NO_PROFILE && pTeamSoldier->ubProfile != pSoldier->ubProfile &&
|
||||
pTeamSoldier->sSectorX == pSoldier->sSectorX && pTeamSoldier->sSectorY == pSoldier->sSectorY && pTeamSoldier->bSectorZ == pSoldier->bSectorZ &&
|
||||
!(pTeamSoldier->bAssignment == IN_TRANSIT || pTeamSoldier->bAssignment == ASSIGNMENT_DEAD) )
|
||||
{
|
||||
// if he's training teammates in this stat
|
||||
if ( (pTeamSoldier->bAssignment == TRAIN_TEAMMATE) && (pTeamSoldier->bTrainStat == trainstat) && (EnoughTimeOnAssignment( pTeamSoldier )) && !pTeamSoldier->flags.fMercAsleep )
|
||||
{
|
||||
AddOpinionEvent( pSoldier->ubProfile, pTeamSoldier->ubProfile, OPINIONEVENT_TEACHER );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
UINT8 GetRandomMercInSectorNotInList( INT16 sX, INT16 sY, INT8 sZ, std::vector<UINT8> aTaboo, BOOLEAN fImpOnly )
|
||||
{
|
||||
@@ -1948,6 +1954,9 @@ void HandleDynamicOpinionChange( SOLDIERTYPE* pSoldier, UINT8 usEvent, BOOLEAN f
|
||||
case OPINIONEVENT_WORSTCOMMANDEREVER:
|
||||
case OPINIONEVENT_DISEASE_DISGUSTING:
|
||||
case OPINIONEVENT_DISEASE_TREATMENT:
|
||||
case OPINIONEVENT_BRUTAL_GOOD:
|
||||
case OPINIONEVENT_BRUTAL_BAD:
|
||||
case OPINIONEVENT_TEACHER:
|
||||
break;
|
||||
|
||||
case OPINIONEVENT_SLOWSUSDOWN:
|
||||
@@ -1987,13 +1996,14 @@ void HandleDynamicOpinionChange( SOLDIERTYPE* pSoldier, UINT8 usEvent, BOOLEAN f
|
||||
break;
|
||||
}
|
||||
|
||||
UINT8 usEventUsed; // it is possible that the individaul event is switched
|
||||
SOLDIERTYPE* pTeamSoldier = NULL;
|
||||
UINT16 bMercID = gTacticalStatus.Team[gbPlayerNum].bFirstID;
|
||||
UINT16 bLastTeamID = gTacticalStatus.Team[gbPlayerNum].bLastID;
|
||||
for ( pTeamSoldier = MercPtrs[bMercID]; bMercID <= bLastTeamID; ++bMercID, pTeamSoldier++ )
|
||||
{
|
||||
// we test several conditions before we allow adding an opinion
|
||||
// other merc must be active, have a profile be someone else and not travel or be dead
|
||||
// other merc must be active, have a profile, be someone else and not be in transit or dead
|
||||
if ( pTeamSoldier->bActive && pTeamSoldier->ubProfile != NO_PROFILE && pTeamSoldier->ubProfile != pSoldier->ubProfile &&
|
||||
!(pTeamSoldier->bAssignment == IN_TRANSIT || pTeamSoldier->bAssignment == ASSIGNMENT_DEAD) )
|
||||
{
|
||||
@@ -2013,8 +2023,10 @@ void HandleDynamicOpinionChange( SOLDIERTYPE* pSoldier, UINT8 usEvent, BOOLEAN f
|
||||
if ( gDynamicOpinionEvent[usEvent].fSquadsOnly && pTeamSoldier->bAssignment >= ON_DUTY )
|
||||
continue;
|
||||
|
||||
usEventUsed = usEvent;
|
||||
|
||||
// event-specific checks
|
||||
switch ( usEvent )
|
||||
switch ( usEventUsed )
|
||||
{
|
||||
case OPINIONEVENT_CONTRACTEXTENSION:
|
||||
break;
|
||||
@@ -2107,6 +2119,26 @@ void HandleDynamicOpinionChange( SOLDIERTYPE* pSoldier, UINT8 usEvent, BOOLEAN f
|
||||
case OPINIONEVENT_DISEASE_TREATMENT:
|
||||
break;
|
||||
|
||||
case OPINIONEVENT_BRUTAL_GOOD:
|
||||
case OPINIONEVENT_BRUTAL_BAD:
|
||||
// if we are a good guy or a pacifist, then we dislike excessive violence
|
||||
if ( gMercProfiles[pTeamSoldier->ubProfile].ubMiscFlags3 & PROFILE_MISC_FLAG3_GOODGUY ||
|
||||
gMercProfiles[pTeamSoldier->ubProfile].bCharacterTrait == CHAR_TRAIT_PACIFIST )
|
||||
usEventUsed = OPINIONEVENT_BRUTAL_GOOD;
|
||||
// if we are malicious, agressive or a psycho, then we like it
|
||||
else if ( gMercProfiles[pTeamSoldier->ubProfile].bDisability == PSYCHO || MercUnderTheInfluence( pTeamSoldier, DRUG_TYPE_PSYCHO ) ||
|
||||
gMercProfiles[pTeamSoldier->ubProfile].bCharacterTrait == CHAR_TRAIT_AGGRESSIVE ||
|
||||
gMercProfiles[pTeamSoldier->ubProfile].bCharacterTrait == CHAR_TRAIT_MALICIOUS )
|
||||
usEventUsed = OPINIONEVENT_BRUTAL_GOOD;
|
||||
else
|
||||
continue;
|
||||
break;
|
||||
|
||||
case OPINIONEVENT_TEACHER:
|
||||
// other guy needs to be a trainer
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
// either unknown event, or event is handled elsewhere - exit
|
||||
return;
|
||||
@@ -2114,9 +2146,9 @@ void HandleDynamicOpinionChange( SOLDIERTYPE* pSoldier, UINT8 usEvent, BOOLEAN f
|
||||
}
|
||||
|
||||
if ( fOffender )
|
||||
AddOpinionEvent( pTeamSoldier->ubProfile, pSoldier->ubProfile, usEvent, fStartDialogue );
|
||||
AddOpinionEvent( pTeamSoldier->ubProfile, pSoldier->ubProfile, usEventUsed, fStartDialogue );
|
||||
else
|
||||
AddOpinionEvent( pSoldier->ubProfile, pTeamSoldier->ubProfile, usEvent, fStartDialogue );
|
||||
AddOpinionEvent( pSoldier->ubProfile, pTeamSoldier->ubProfile, usEventUsed, fStartDialogue );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,6 +56,10 @@ enum
|
||||
OPINIONEVENT_SOLVECONFLICT_AGGRESSIVE_BAD, // other guy attempted to solve the conflict agressively, and we thought that was bad
|
||||
OPINIONEVENT_DISEASE_DISGUSTING, // we have a disease, which others might find disgusting
|
||||
OPINIONEVENT_DISEASE_TREATMENT, // someone treated our diseases
|
||||
OPINIONEVENT_BRUTAL_GOOD, // other guy killed someone in a brutal fashion, and we like that
|
||||
|
||||
OPINIONEVENT_BRUTAL_BAD, // other guy killed someone in a brutal fashion, and we dislike that
|
||||
OPINIONEVENT_TEACHER, // other guy taught us and we are grateful
|
||||
|
||||
OPINIONEVENT_MAX
|
||||
};
|
||||
@@ -235,10 +239,51 @@ extern DynamicOpinionEvent gDynamicOpinionEvent[OPINIONEVENT_MAX];
|
||||
#define OPINIONFLAG_STAGE3_DISEASE_TREATMENT 0x04000000 //67108864
|
||||
#define OPINIONFLAG_STAGE4_DISEASE_TREATMENT 0x08000000 //134217728
|
||||
|
||||
/*#define OPINIONFLAG_STAGE1_AGAINST_ENEMY 0x10000000 //268435456 // was against our dialogue enemy in dialogue
|
||||
#define OPINIONFLAG_STAGE2_AGAINST_ENEMY 0x20000000 //536870912
|
||||
#define OPINIONFLAG_STAGE3_AGAINST_ENEMY 0x40000000 //1073741824
|
||||
#define OPINIONFLAG_STAGE4_AGAINST_ENEMY 0x80000000 //2147483648*/
|
||||
#define OPINIONFLAG_STAGE1_BRUTAL_GOOD 0x10000000 //268435456 // other guy killed someone in a brutal fashion, and we like that
|
||||
#define OPINIONFLAG_STAGE2_BRUTAL_GOOD 0x20000000 //536870912
|
||||
#define OPINIONFLAG_STAGE3_BRUTAL_GOOD 0x40000000 //1073741824
|
||||
#define OPINIONFLAG_STAGE4_BRUTAL_GOOD 0x80000000 //2147483648
|
||||
|
||||
// flagmask 5
|
||||
#define OPINIONFLAG_STAGE1_BRUTAL_BAD 0x00000001 //1 // other guy killed someone in a brutal fashion, and we dislike that
|
||||
#define OPINIONFLAG_STAGE2_BRUTAL_BAD 0x00000002 //2
|
||||
#define OPINIONFLAG_STAGE3_BRUTAL_BAD 0x00000004 //4
|
||||
#define OPINIONFLAG_STAGE4_BRUTAL_BAD 0x00000008 //8
|
||||
|
||||
#define OPINIONFLAG_STAGE1_TEACHER 0x00000010 //16 // other guy taught us and we are grateful
|
||||
#define OPINIONFLAG_STAGE2_TEACHER 0x00000020 //32
|
||||
#define OPINIONFLAG_STAGE3_TEACHER 0x00000040 //64
|
||||
#define OPINIONFLAG_STAGE4_TEACHER 0x00000080 //128
|
||||
|
||||
/*#define OPINIONFLAG_STAGE1_SOLVECONFLICT_REASON_BAD 0x00000100 //256 // attempted to solve the conflict reasonably, and we thought that was bad
|
||||
#define OPINIONFLAG_STAGE2_SOLVECONFLICT_REASON_BAD 0x00000200 //512
|
||||
#define OPINIONFLAG_STAGE3_SOLVECONFLICT_REASON_BAD 0x00000400 //1024
|
||||
#define OPINIONFLAG_STAGE4_SOLVECONFLICT_REASON_BAD 0x00000800 //2048
|
||||
|
||||
#define OPINIONFLAG_STAGE1_SOLVECONFLICT_AGGRESSIVE_GOOD 0x00001000 //4096 // attempted to solve the conflict agressively, and we thought that was good
|
||||
#define OPINIONFLAG_STAGE2_SOLVECONFLICT_AGGRESSIVE_GOOD 0x00002000 //8192
|
||||
#define OPINIONFLAG_STAGE3_SOLVECONFLICT_AGGRESSIVE_GOOD 0x00004000 //16384
|
||||
#define OPINIONFLAG_STAGE4_SOLVECONFLICT_AGGRESSIVE_GOOD 0x00008000 //32768
|
||||
|
||||
#define OPINIONFLAG_STAGE1_SOLVECONFLICT_AGGRESSIVE_BAD 0x00010000 //65536 // attempted to solve the conflict agressively, and we thought that was bad
|
||||
#define OPINIONFLAG_STAGE2_SOLVECONFLICT_AGGRESSIVE_BAD 0x00020000 //131072
|
||||
#define OPINIONFLAG_STAGE3_SOLVECONFLICT_AGGRESSIVE_BAD 0x00040000 //262144
|
||||
#define OPINIONFLAG_STAGE4_SOLVECONFLICT_AGGRESSIVE_BAD 0x00080000 //524288
|
||||
|
||||
#define OPINIONFLAG_STAGE1_DISEASE_DISGUSTING 0x00100000 //1048576 // is diseased, which we find disgusting
|
||||
#define OPINIONFLAG_STAGE2_DISEASE_DISGUSTING 0x00200000 //2097152
|
||||
#define OPINIONFLAG_STAGE3_DISEASE_DISGUSTING 0x00400000 //4194304
|
||||
#define OPINIONFLAG_STAGE4_DISEASE_DISGUSTING 0x00800000 //8388608
|
||||
|
||||
#define OPINIONFLAG_STAGE1_DISEASE_TREATMENT 0x01000000 //16777216 // treated our disease, which we like
|
||||
#define OPINIONFLAG_STAGE2_DISEASE_TREATMENT 0x02000000 //33554432
|
||||
#define OPINIONFLAG_STAGE3_DISEASE_TREATMENT 0x04000000 //67108864
|
||||
#define OPINIONFLAG_STAGE4_DISEASE_TREATMENT 0x08000000 //134217728
|
||||
|
||||
#define OPINIONFLAG_STAGE1_BRUTAL_GOOD 0x10000000 //268435456 // other guy killed someone in a brutal fashion, and we like that
|
||||
#define OPINIONFLAG_STAGE2_BRUTAL_GOOD 0x20000000 //536870912
|
||||
#define OPINIONFLAG_STAGE3_BRUTAL_GOOD 0x40000000 //1073741824
|
||||
#define OPINIONFLAG_STAGE4_BRUTAL_GOOD 0x80000000 //2147483648*/
|
||||
|
||||
#define OPINIONFLAG_STAGE1_ALL 0x11111111 // flags of all first stages, used when rolling over
|
||||
#define OPINIONFLAG_STAGE4_ALL 0x88888888 // flags of all final stages, used when rolling over
|
||||
@@ -421,6 +466,7 @@ void HandleDynamicOpinionOnContractExtension( UINT8 ubCode, UINT8 usProfile );
|
||||
void HandleDynamicOpinionBattleLosses( );
|
||||
void HandleDynamicOpinionRetreat( );
|
||||
void HandleDynamicOpinionTeamDrinking( SOLDIERTYPE* pSoldier );
|
||||
void HandleDynamicOpinionTeaching( SOLDIERTYPE* pSoldier, UINT8 ubStat );
|
||||
|
||||
// get id of a random merc in a sector, provided one exists
|
||||
UINT8 GetRandomMercInSectorNotInList( INT16 sX, INT16 sY, INT8 sZ, std::vector<UINT8> aTaboo, BOOLEAN fImpOnly );
|
||||
|
||||
+3
-1
@@ -147,7 +147,9 @@ DynamicOpinionEvent gDynamicOpinionEvent[OPINIONEVENT_MAX] =
|
||||
{OPINIONEVENT_SOLVECONFLICT_AGGRESSIVE_BAD, -3, TRUE, FALSE, TRUE, FALSE},
|
||||
{OPINIONEVENT_DISEASE_DISGUSTING, -3, TRUE, FALSE, TRUE, FALSE},
|
||||
{OPINIONEVENT_DISEASE_TREATMENT, 1, TRUE, FALSE, TRUE, FALSE},
|
||||
|
||||
{OPINIONEVENT_BRUTAL_GOOD, 1, TRUE, FALSE, TRUE, FALSE},
|
||||
{OPINIONEVENT_BRUTAL_BAD, -2, TRUE, FALSE, TRUE, FALSE},
|
||||
{OPINIONEVENT_TEACHER, 1, TRUE, FALSE, FALSE, FALSE}
|
||||
};
|
||||
|
||||
BOOLEAN gfSomeoneSaidMoraleQuote = FALSE;
|
||||
|
||||
@@ -6558,6 +6558,11 @@ void SoldierGotHitGunFire( SOLDIERTYPE *pSoldier, UINT16 usWeaponIndex, INT16 sD
|
||||
if ( pSoldier->ubBodyType < 4 )
|
||||
{
|
||||
pSoldier->ChangeToFlybackAnimation( (UINT8)bDirection );
|
||||
|
||||
// Flugente: dynamic opinions
|
||||
if ( ubAttackerID != NOBODY )
|
||||
HandleDynamicOpinionChange( MercPtrs[ubAttackerID], OPINIONEVENT_BRUTAL_GOOD, TRUE, TRUE );
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -6568,12 +6573,16 @@ void SoldierGotHitGunFire( SOLDIERTYPE *pSoldier, UINT16 usWeaponIndex, INT16 sD
|
||||
if ( pSoldier->ubBodyType < 4 || pSoldier->ubBodyType == HATKIDCIV || pSoldier->ubBodyType == KIDCIV )
|
||||
{
|
||||
pSoldier->EVENT_InitNewSoldierAnim( JFK_HITDEATH, 0, FALSE );
|
||||
|
||||
// Flugente: dynamic opinions
|
||||
if ( ubAttackerID != NOBODY )
|
||||
HandleDynamicOpinionChange( MercPtrs[ubAttackerID], OPINIONEVENT_BRUTAL_GOOD, TRUE, TRUE );
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
DoGenericHit( pSoldier, ubSpecial, bDirection );
|
||||
|
||||
}
|
||||
|
||||
void SoldierGotHitExplosion( SOLDIERTYPE *pSoldier, UINT16 usWeaponIndex, INT16 sDamage, UINT16 bDirection, UINT16 sRange, UINT8 ubAttackerID, UINT8 ubSpecial, UINT8 ubHitLocation )
|
||||
|
||||
+5
-12
@@ -2853,21 +2853,14 @@ extern STR16 szTacticalInventoryDialogString[];
|
||||
extern STR16 szTacticalCoverDialogString[];
|
||||
extern STR16 szTacticalCoverDialogPrintString[];
|
||||
|
||||
// OPINIONEVENT_MAX is 34
|
||||
// DOST_MAX is 17
|
||||
|
||||
extern STR16 szDynamicDialogueText[34][17];
|
||||
|
||||
// Flugente: dynamic dialogue
|
||||
extern STR16 szDynamicDialogueText_DOST_VICTIM_INITIATE[];
|
||||
extern STR16 szDynamicDialogueText_DOST_VICTIM_TO_INTERJECTOR_DENY[];
|
||||
extern STR16 szDynamicDialogueText_DOST_VICTIM_TO_INTERJECTOR_AGREE[];
|
||||
extern STR16 szDynamicDialogueText_DOST_CAUSE_TO_VICTIM_DENY[];
|
||||
extern STR16 szDynamicDialogueText_DOST_CAUSE_TO_VICTIM_AGREE[];
|
||||
extern STR16 szDynamicDialogueText_DOST_CAUSE_TO_INTERJECTOR_DENY[];
|
||||
extern STR16 szDynamicDialogueText_DOST_CAUSE_TO_INTERJECTOR_AGREE[];
|
||||
extern STR16 szDynamicDialogueText_DOST_INTERJECTOR_DIALOGUESELECTION[];
|
||||
extern STR16 szDynamicDialogueText_DOST_INTERJECTOR_TO_VICTIM_DENY[];
|
||||
extern STR16 szDynamicDialogueText_DOST_INTERJECTOR_TO_VICTIM_AGREE[];
|
||||
extern STR16 szDynamicDialogueText_DOST_INTERJECTOR_TO_CAUSE_DENY[];
|
||||
extern STR16 szDynamicDialogueText_DOST_INTERJECTOR_TO_CAUSE_AGREE[];
|
||||
extern STR16 szDynamicDialogueText_DOST_INTERJECTOR_SOLVE_REASON[];
|
||||
extern STR16 szDynamicDialogueText_DOST_INTERJECTOR_SOLVE_AGGRESSIVE[];
|
||||
extern STR16 szDynamicDialogueText_DOST_SIDEWITH_VICTIM[];
|
||||
extern STR16 szDynamicDialogueText_DOST_SIDEWITH_CAUSE[];
|
||||
|
||||
|
||||
+649
-436
File diff suppressed because it is too large
Load Diff
+649
-436
File diff suppressed because it is too large
Load Diff
+649
-435
File diff suppressed because it is too large
Load Diff
+649
-436
File diff suppressed because it is too large
Load Diff
+649
-436
File diff suppressed because it is too large
Load Diff
+649
-436
File diff suppressed because it is too large
Load Diff
+649
-436
File diff suppressed because it is too large
Load Diff
+651
-453
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user