New Feature: dynamic dialogue is played when dynamic opinions are active. Mercs can comment on each others actions, and this can influence their opinions further. IMP character answers can even be chosen by the player.

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7297 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2014-06-27 22:12:29 +00:00
parent b083314318
commit 3a9cb5ecc3
52 changed files with 9062 additions and 5920 deletions
+432
View File
@@ -0,0 +1,432 @@
#ifndef __DYNAMICDIALOGUE_H
#define __DYNAMICDIALOGUE_H
/**
* @file
* @author Flugente (bears-pit.com)
* @brief This file contains declarations of classes and functions used for dynamic dialogue
*/
#include "Types.h"
#include "Soldier Control.h"
// Flugente: calculate A's opinion of B
INT8 SoldierRelation( SOLDIERTYPE* pSoldierA, SOLDIERTYPE* pSoldierB );
INT8 SoldierRelation( UINT8 usProfileA, UINT8 usProfileB );
// Flugente: dynamic opinions
enum
{
OPINIONEVENT_FRIENDLYFIRE,
OPINIONEVENT_SNITCHSOLDMEOUT,
OPINIONEVENT_SNITCHINTERFERENCE,
OPINIONEVENT_FRIENDSWITHHATED,
OPINIONEVENT_CONTRACTEXTENSION,
OPINIONEVENT_ORDEREDRETREAT,
OPINIONEVENT_CIVKILLER,
OPINIONEVENT_SLOWSUSDOWN,
OPINIONEVENT_NOSHARINGFOOD,
OPINIONEVENT_ANNOYINGDISABILITY,
OPINIONEVENT_ADDICT,
OPINIONEVENT_THIEF,
OPINIONEVENT_WORSTCOMMANDEREVER,
OPINIONEVENT_RICHGUY,
OPINIONEVENT_BETTERGEAR,
OPINIONEVENT_YOUMOUNTEDAGUNONMYBREASTS,
OPINIONEVENT_BANDAGED,
OPINIONEVENT_DRINKBUDDIES_GOOD,
OPINIONEVENT_DRINKBUDDIES_SUPER,
OPINIONEVENT_DRINKBUDDIES_BAD,
OPINIONEVENT_DRINKBUDDIES_WORSE,
// events from dialogue
OPINIONEVENT_AGAINST_US, // other guy was against us in dialogue
OPINIONEVENT_FOR_US, // other guy was for us in dialogue
OPINIONEVENT_AGAINST_ENEMY, // other guy was against our dialogue enemy in dialogue
OPINIONEVENT_FOR_ENEMY, // other guy was for our dialogue enemy in dialogue
OPINIONEVENT_SOLVECONFLICT_REASON_GOOD, // other guy attempted to solve the conflict reasonably, and we thought that was good
OPINIONEVENT_SOLVECONFLICT_REASON_BAD, // other guy attempted to solve the conflict reasonably, and we thought that was bad
OPINIONEVENT_SOLVECONFLICT_AGGRESSIVE_GOOD, // other guy attempted to solve the conflict agressively, and we thought that was good
OPINIONEVENT_SOLVECONFLICT_AGGRESSIVE_BAD, // other guy attempted to solve the conflict agressively, and we thought that was bad
OPINIONEVENT_MAX
};
typedef struct DynamicOpinionEvent
{
UINT8 ubEventId;
INT8 sOpinionModifier;
BOOLEAN fSameSector;
BOOLEAN fSameAssignment;
BOOLEAN fAwake;
BOOLEAN fSquadsOnly;
} DynamicOpinionEvent;
extern DynamicOpinionEvent gDynamicOpinionEvent[OPINIONEVENT_MAX];
// -------- added by Flugente: flags for opinions --------
// easier than adding 32 differently named variables. DO NOT CHANGE THEM, UNLESS YOU KNOW WHAT YOU ARE DOING!!!
// if someone influences our opinion, STAGE1 gets set. Every day, stages move up one step, until we 'forget' them
// these flags describe what the other guy did to us....
// flagmask 1
#define OPINIONFLAG_STAGE1_FRIENDLYFIRE 0x00000001 //1 // fired on us
#define OPINIONFLAG_STAGE2_FRIENDLYFIRE 0x00000002 //2
#define OPINIONFLAG_STAGE3_FRIENDLYFIRE 0x00000004 //4
#define OPINIONFLAG_STAGE4_FRIENDLYFIRE 0x00000008 //8
#define OPINIONFLAG_STAGE1_SNITCHSOLDMEOUT 0x00000010 //16 // has been snitching to the player about us
#define OPINIONFLAG_STAGE2_SNITCHSOLDMEOUT 0x00000020 //32
#define OPINIONFLAG_STAGE3_SNITCHSOLDMEOUT 0x00000040 //64
#define OPINIONFLAG_STAGE4_SNITCHSOLDMEOUT 0x00000080 //128
#define OPINIONFLAG_STAGE1_INTERFERENCE 0x00000100 //256 // is interfering with us (stopped us from taking drugs or stealing)
#define OPINIONFLAG_STAGE2_INTERFERENCE 0x00000200 //512
#define OPINIONFLAG_STAGE3_INTERFERENCE 0x00000400 //1024
#define OPINIONFLAG_STAGE4_INTERFERENCE 0x00000800 //2048
#define OPINIONFLAG_STAGE1_FRIENDSWITHHATED 0x00001000 //4096 // is friends with someone we hate
#define OPINIONFLAG_STAGE2_FRIENDSWITHHATED 0x00002000 //8192
#define OPINIONFLAG_STAGE3_FRIENDSWITHHATED 0x00004000 //16384
#define OPINIONFLAG_STAGE4_FRIENDSWITHHATED 0x00008000 //32768
#define OPINIONFLAG_STAGE1_CONTRACTEXTENSION 0x00010000 //65536 // got his contract extended before we did, even though we had less time left
#define OPINIONFLAG_STAGE2_CONTRACTEXTENSION 0x00020000 //131072
#define OPINIONFLAG_STAGE3_CONTRACTEXTENSION 0x00040000 //262144
#define OPINIONFLAG_STAGE4_CONTRACTEXTENSION 0x00080000 //524288
#define OPINIONFLAG_STAGE1_ORDEREDRETREAT 0x00100000 //1048576 // was commander (most senior merc around) and ordered retreat
#define OPINIONFLAG_STAGE2_ORDEREDRETREAT 0x00200000 //2097152
#define OPINIONFLAG_STAGE3_ORDEREDRETREAT 0x00400000 //4194304
#define OPINIONFLAG_STAGE4_ORDEREDRETREAT 0x00800000 //8388608
#define OPINIONFLAG_STAGE1_CIVKILLER 0x01000000 //16777216 // killed an unarmed civilian
#define OPINIONFLAG_STAGE2_CIVKILLER 0x02000000 //33554432
#define OPINIONFLAG_STAGE3_CIVKILLER 0x04000000 //67108864
#define OPINIONFLAG_STAGE4_CIVKILLER 0x08000000 //134217728
#define OPINIONFLAG_STAGE1_SLOWSUSDOWN 0x10000000 //268435456 // is overloaded and thus slows us down
#define OPINIONFLAG_STAGE2_SLOWSUSDOWN 0x20000000 //536870912
#define OPINIONFLAG_STAGE3_SLOWSUSDOWN 0x40000000 //1073741824
#define OPINIONFLAG_STAGE4_SLOWSUSDOWN 0x80000000 //2147483648
// flagmask 2
#define OPINIONFLAG_STAGE1_NOSHARINGFOOD 0x00000001 //1 // had water/food when we needed it. So he did not share!
#define OPINIONFLAG_STAGE2_NOSHARINGFOOD 0x00000002 //2
#define OPINIONFLAG_STAGE3_NOSHARINGFOOD 0x00000004 //4
#define OPINIONFLAG_STAGE4_NOSHARINGFOOD 0x00000008 //8
#define OPINIONFLAG_STAGE1_ANNOYINGDISABILITY 0x00000010 //16 // disability kicked in at a bad time, putting the team at risk (forgeful, nervous, psycho...)
#define OPINIONFLAG_STAGE2_ANNOYINGDISABILITY 0x00000020 //32
#define OPINIONFLAG_STAGE3_ANNOYINGDISABILITY 0x00000040 //64
#define OPINIONFLAG_STAGE4_ANNOYINGDISABILITY 0x00000080 //128
#define OPINIONFLAG_STAGE1_ADDICT 0x00000100 //256 // is taking drugs
#define OPINIONFLAG_STAGE2_ADDICT 0x00000200 //512
#define OPINIONFLAG_STAGE3_ADDICT 0x00000400 //1024
#define OPINIONFLAG_STAGE4_ADDICT 0x00000800 //2048
#define OPINIONFLAG_STAGE1_THIEF 0x00001000 //4096 // is stealing items
#define OPINIONFLAG_STAGE2_THIEF 0x00002000 //8192
#define OPINIONFLAG_STAGE3_THIEF 0x00004000 //16384
#define OPINIONFLAG_STAGE4_THIEF 0x00008000 //32768
#define OPINIONFLAG_STAGE1_WORSTCOMMANDEREVER 0x00010000 //65536 // was commander (most senior merc around) when a lot of our people (including militia) died
#define OPINIONFLAG_STAGE2_WORSTCOMMANDEREVER 0x00020000 //131072
#define OPINIONFLAG_STAGE3_WORSTCOMMANDEREVER 0x00040000 //262144
#define OPINIONFLAG_STAGE4_WORSTCOMMANDEREVER 0x00080000 //524288
#define OPINIONFLAG_STAGE1_RICHGUY 0x00100000 //1048576 // gets paid a lot more than we do
#define OPINIONFLAG_STAGE2_RICHGUY 0x00200000 //2097152
#define OPINIONFLAG_STAGE3_RICHGUY 0x00400000 //4194304
#define OPINIONFLAG_STAGE4_RICHGUY 0x00800000 //8388608
#define OPINIONFLAG_STAGE1_BETTERGEAR 0x01000000 //16777216 // has a lot better gear than we do
#define OPINIONFLAG_STAGE2_BETTERGEAR 0x02000000 //33554432
#define OPINIONFLAG_STAGE3_BETTERGEAR 0x04000000 //67108864
#define OPINIONFLAG_STAGE4_BETTERGEAR 0x08000000 //134217728
#define OPINIONFLAG_STAGE1_YOUMOUNTEDAGUNONMYBREASTS 0x10000000 //268435456 // used our body to rest his gun on
#define OPINIONFLAG_STAGE2_YOUMOUNTEDAGUNONMYBREASTS 0x20000000 //536870912
#define OPINIONFLAG_STAGE3_YOUMOUNTEDAGUNONMYBREASTS 0x40000000 //1073741824
#define OPINIONFLAG_STAGE4_YOUMOUNTEDAGUNONMYBREASTS 0x80000000 //2147483648
// flagmask 3
#define OPINIONFLAG_STAGE1_BANDAGED 0x00000001 //1 // bandaged our wounds
#define OPINIONFLAG_STAGE2_BANDAGED 0x00000002 //2
#define OPINIONFLAG_STAGE3_BANDAGED 0x00000004 //4
#define OPINIONFLAG_STAGE4_BANDAGED 0x00000008 //8
#define OPINIONFLAG_STAGE1_DRINKBUDDIES_GOOD 0x00000010 //16 // had a drink with him, he's okay.
#define OPINIONFLAG_STAGE2_DRINKBUDDIES_GOOD 0x00000020 //32
#define OPINIONFLAG_STAGE3_DRINKBUDDIES_GOOD 0x00000040 //64
#define OPINIONFLAG_STAGE4_DRINKBUDDIES_GOOD 0x00000080 //128
#define OPINIONFLAG_STAGE1_DRINKBUDDIES_SUPER 0x00000100 //256 // had a drink with him, he's super okay
#define OPINIONFLAG_STAGE2_DRINKBUDDIES_SUPER 0x00000200 //512
#define OPINIONFLAG_STAGE3_DRINKBUDDIES_SUPER 0x00000400 //1024
#define OPINIONFLAG_STAGE4_DRINKBUDDIES_SUPER 0x00000800 //2048
#define OPINIONFLAG_STAGE1_DRINKBUDDIES_BAD 0x00001000 //4096 // had a drink with him, don't like him
#define OPINIONFLAG_STAGE2_DRINKBUDDIES_BAD 0x00002000 //8192
#define OPINIONFLAG_STAGE3_DRINKBUDDIES_BAD 0x00004000 //16384
#define OPINIONFLAG_STAGE4_DRINKBUDDIES_BAD 0x00008000 //32768
#define OPINIONFLAG_STAGE1_DRINKBUDDIES_WORSE 0x00010000 //65536 // had a drink with him, and I REALLY don't like him now
#define OPINIONFLAG_STAGE2_DRINKBUDDIES_WORSE 0x00020000 //131072
#define OPINIONFLAG_STAGE3_DRINKBUDDIES_WORSE 0x00040000 //262144
#define OPINIONFLAG_STAGE4_DRINKBUDDIES_WORSE 0x00080000 //524288
#define OPINIONFLAG_STAGE1_AGAINST_US 0x00100000 //1048576 // was against us in dialogue
#define OPINIONFLAG_STAGE2_AGAINST_US 0x00200000 //2097152
#define OPINIONFLAG_STAGE3_AGAINST_US 0x00400000 //4194304
#define OPINIONFLAG_STAGE4_AGAINST_US 0x00800000 //8388608
#define OPINIONFLAG_STAGE1_FOR_US 0x01000000 //16777216 // other guy was for us in dialogue
#define OPINIONFLAG_STAGE2_FOR_US 0x02000000 //33554432
#define OPINIONFLAG_STAGE3_FOR_US 0x04000000 //67108864
#define OPINIONFLAG_STAGE4_FOR_US 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
// flagmask 4
#define OPINIONFLAG_STAGE1_FOR_ENEMY 0x00000001 //1 // was for our dialogue enemy in dialogue
#define OPINIONFLAG_STAGE2_FOR_ENEMY 0x00000002 //2
#define OPINIONFLAG_STAGE3_FOR_ENEMY 0x00000004 //4
#define OPINIONFLAG_STAGE4_FOR_ENEMY 0x00000008 //8
#define OPINIONFLAG_STAGE1_SOLVECONFLICT_REASON_GOOD 0x00000010 //16 // attempted to solve the conflict reasonably, and we thought that was good
#define OPINIONFLAG_STAGE2_SOLVECONFLICT_REASON_GOOD 0x00000020 //32
#define OPINIONFLAG_STAGE3_SOLVECONFLICT_REASON_GOOD 0x00000040 //64
#define OPINIONFLAG_STAGE4_SOLVECONFLICT_REASON_GOOD 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_AGAINST_US 0x00100000 //1048576 // was against us in dialogue
#define OPINIONFLAG_STAGE2_AGAINST_US 0x00200000 //2097152
#define OPINIONFLAG_STAGE3_AGAINST_US 0x00400000 //4194304
#define OPINIONFLAG_STAGE4_AGAINST_US 0x00800000 //8388608
#define OPINIONFLAG_STAGE1_FOR_US 0x01000000 //16777216 // other guy was for us in dialogue
#define OPINIONFLAG_STAGE2_FOR_US 0x02000000 //33554432
#define OPINIONFLAG_STAGE3_FOR_US 0x04000000 //67108864
#define OPINIONFLAG_STAGE4_FOR_US 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_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
// ----------------------------------------------------------------
// we have several 'roles' in a dialogue for now:
// victim - a merc initiating dialogue because an event has happened to him (can also be a positive thing)
// cause - the merc that caused the event through his behaviour
// interjector - an person that is neither victim nor cause and attemtps to solve the situation, the player can control his/her actions
// speaker - whoever speaks the current line, for no one of the above
typedef enum
{
// opinion event has occured and a merc points that out to ...
DOST_VICTIM_INITIATE, // victim begins dialogue
DOST_VICTIM_TO_INTERJECTOR_DENY, // victim denies what interjector said
DOST_VICTIM_TO_INTERJECTOR_AGREE, // victim agrees what interjector said
DOST_CAUSE_TO_VICTIM_DENY, // cause denies victim's accusation
DOST_CAUSE_TO_VICTIM_AGREE, // cause accepts responsibility to victim
DOST_CAUSE_TO_INTERJECTOR_DENY, // cause denies what interjector said
DOST_CAUSE_TO_INTERJECTOR_AGREE, // cause agrees what interjector said
DOST_INTERJECTOR_DIALOGUESELECTION, // special: creates the interjector dialogue selection
DOST_INTERJECTOR_TO_VICTIM_DENY, // interjector denies victim's accusation
DOST_INTERJECTOR_TO_VICTIM_AGREE, // interjectorinterjector agrees to victim that cause is to blame
DOST_INTERJECTOR_TO_CAUSE_DENY, // interjector denies victim denial
DOST_INTERJECTOR_TO_CAUSE_AGREE, // interjector agrees that victim is not to blame
DOST_INTERJECTOR_SOLVE_REASON, // interjector tries to solve the situation peacefully
DOST_INTERJECTOR_SOLVE_AGGRESSIVE, // interjector tries to solve the situation aggressively
DOST_INTERJECTOR_NOTHING, // interjector decides to say nothing
DOST_SIDEWITH_VICTIM, // another person sides with victim
DOST_SIDEWITH_CAUSE, // another person sides with cause
DOST_MAX,
} DynamicOpinionSpeechType;
// the different choices we can take when selecting what approach to use in dialogue
enum
{
DOST_CHOICE_NOTHING = 0,
DOST_CHOICE_SIDEWITH_VICTIM,
DOST_CHOICE_SIDEWITH_CAUSE,
DOST_CHOICE_REASON,
DOST_CHOICE_AGGRESSIVE,
DOST_CHOICE_MAX
};
enum
{
DOST_POSITION_LEFT,
DOST_POSITION_RIGHT,
DOST_POSITION_MIDDLE,
};
enum
{
DOST_PRIORITY_LOW, // can be handled hours later if needed
DOST_PRIORITY_NORMAL, // normal priority
DOST_PRIORITY_HIGH, // urgent, handle as soon as possible
DOST_PRIORITY_MAX
};
typedef struct OpinionEvent
{
OpinionEvent( ) :
ubEventId( 0 ),
ubProfileComplainant( NO_PROFILE ),
ubProfileCause( NO_PROFILE ),
usSector( 0 )
{}
UINT8 ubEventId; // the dynamic opinion event this is all about
UINT8 ubProfileComplainant; // the merc who started this dialogue by complaining
UINT8 ubProfileCause; // the merc who caused the event
UINT8 usSector; // sector of incident
} OpinionEvent;
#define DOST_INTERJECTORS_MAX 4
typedef struct DynamicOpinionSpeechEvent_EventData
{
DynamicOpinionSpeechEvent_EventData( ) :
event( ),
usId( 0 ),
usPriority( 0 ),
ubProfileINTERJECTOR( NO_PROFILE )
{}
OpinionEvent event; // the event that this is all about
UINT16 usId; // id that signifies wether dialogue belongs to this event or another one
UINT8 usPriority; // priority of event, used when determining which event will be handled next
// other mercs an interfere in the dialogue
UINT8 ubProfileINTERJECTOR; // if an INTERJECTOR tries to solve the situation, it'll be this guy
// several other mercs can agree with either cause or complainant. Most of the time, these guys will have similar events at the time, which will simply be merged
// the goal is to have less dialogue events while making them somewhat deeper
UINT8 ubProfileSideCause[DOST_INTERJECTORS_MAX];
UINT8 ubProfileSideComplainant[DOST_INTERJECTORS_MAX];
} DynamicOpinionSpeechEvent_EventData;
typedef struct DynamicOpinionSpeechEvent
{
DynamicOpinionSpeechEvent( ) :
data( ),
usStarttime( 0 ),
ubEventType( DOST_INTERJECTOR_NOTHING ),
usQueueNumber( 0 ),
usSpeaker( NO_PROFILE ),
usSide( DOST_POSITION_LEFT ),
usNumonside( 0 )
{}
DynamicOpinionSpeechEvent_EventData data;
UINT32 usStarttime; // time this dialogue should be displayed
UINT8 ubEventType; // kind of speech event (from DynamicOpinionSpeechType)
UINT8 usQueueNumber; // number of this dialogue bit in the event's queue
UINT8 usSpeaker; // the merc who says this
UINT8 usSide; // side with ubProfileComplainant (DOST_POSITION_LEFT), ubProfileCause (DOST_POSITION_RIGHT) or stay neutral (DOST_POSITION_MIDDLE)
UINT8 usNumonside; // this argument is the x'th on this side
UINT8 usFiller[3]; // to appease the petty gods of padding AGAIN
} DynamicOpinionSpeechEvent;
void CleanDynamicOpinionSpeechEvents( );
void AddDynamicOpinionEvent_New( OpinionEvent aEvent );
void AddDynamicOpinionEvent_Continue( DynamicOpinionSpeechEvent aEvent );
void CreateSpeechEventsFromDynamicOpinionEvent( DynamicOpinionSpeechEvent aEvent );
void HandleDynamicOpinionSpeechEvents( );
void StartDynamicOpinionDialogue( );
void PerformPossibleDynamicOpinionEventMerges( );
BOOLEAN DynamicOpinionTacticalCharacterDialogue( DynamicOpinionSpeechEvent& aEvent );
INT8 GetSidePosition( UINT8 aDostPosition );
BOOLEAN DynamicOpinionSpeechInProgress( );
void SetfDynamicOpinionSpeechInProgress( BOOLEAN aVal );
BOOLEAN SaveDynamicDialogue( HWFILE hwFile );
BOOLEAN LoadDynamicDialogue( HWFILE hwFile );
// modify usProfileA's opinion of usProfileB because of usEvent
void AddOpinionEvent( UINT8 usProfileA, UINT8 usProfileB, UINT8 usEvent, BOOLEAN fStartDialogue = TRUE );
// get usProfileA's opinion of usProfileB on one of the last 4 days
INT8 GetDynamicOpinionDay( UINT8 usProfileA, UINT8 usProfileB, UINT8 usDay );
// get usProfileA's opinion of usProfileB concerning usEvent
INT8 GetDynamicOpinion( UINT8 usProfileA, UINT8 usProfileB, UINT8 usEvent );
// daily rollover of opinions
void HandleDynamicOpinionsDailyRefresh( );
// a day has passed, 'age' opinions
void RolloverDynamicOpinions( UINT8 usProfileA );
// check wether other people are friends with someone else we hate. All persons must be in Arulco
void CheckForFriendsofHated( SOLDIERTYPE* pSoldier );
void HandleDynamicOpinionOnContractExtension( UINT8 ubCode, UINT8 usProfile );
void HandleDynamicOpinionBattleLosses( );
void HandleDynamicOpinionRetreat( );
void HandleDynamicOpinionTeamDrinking( SOLDIERTYPE* pSoldier );
// 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 );
UINT8 GetFittingInterjectorProfile( UINT8 usEvent, UINT8 usProfileVictim, UINT8 usProfileCause );
UINT8 HighestInventoryCoolness( SOLDIERTYPE* pSoldier );
void HandleDynamicOpinionChange( SOLDIERTYPE* pSoldier, UINT8 usEvent, BOOLEAN fOffender, BOOLEAN fStartDialogue );
#endif