New Trait: Snitch (Trait 22) (by anv)

Every midnight snitches will give you a report about their collegues' opinions. Information includes:
- merc whining about high death rate,
- merc whining about player reputation,
- merc whining about his low morale,
- merc whining about some other merc (unliked, not only hated),
- merc planning to quit (leave without renewing contract, only AIM mercs) next day,
- merc whining about player inactivity,
- merc whining about player owing them money (you can only owe money to MERC mercs).

List of snitches (trait 22)
Beth
Bud
Buzz
Carp
Ears
Gary
Hurl
Lance
Leon
Weasel

see: http://www.bears-pit.com/board/ubbthreads.php/topics/329412/Snitches_+_Externalised_morale.html

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@6723 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Wanne
2014-01-01 12:02:23 +00:00
parent 224ebe9ba3
commit d5b4599e9c
54 changed files with 1395 additions and 163 deletions
+4
View File
@@ -9403,6 +9403,10 @@ void BeginRemoveMercFromContract( SOLDIERTYPE *pSoldier )
if( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__AIM_MERC )
{
ModifyPlayerReputation(REPUTATION_EARLY_FIRING);
// piss off his buddies too
HandleBuddiesReactionToFiringMerc(pSoldier, MORALE_BUDDY_FIRED_EARLY);
}
}
}
+30
View File
@@ -53,6 +53,7 @@ void MercDepartEquipmentBoxCallBack( UINT8 bExitValue );
BOOLEAN HandleFiredDeadMerc( SOLDIERTYPE *pSoldier );
void HandleExtendMercsContract( SOLDIERTYPE *pSoldier );
void HandleSoldierLeavingWithLowMorale( SOLDIERTYPE *pSoldier );
void HandleBuddiesReactionToFiringMerc(SOLDIERTYPE *pFiredSoldier, INT8 bMoraleEvent );
void HandleSoldierLeavingForAnotherContract( SOLDIERTYPE *pSoldier );
//BOOLEAN SoldierWantsToDelayRenewalOfContract( SOLDIERTYPE *pSoldier );
void HandleNotifyPlayerCantAffordInsurance( void );
@@ -743,6 +744,29 @@ BOOLEAN WillMercRenew( SOLDIERTYPE *pSoldier, BOOLEAN fSayQuote )
}
}
void HandleBuddiesReactionToFiringMerc(SOLDIERTYPE *pFiredSoldier, INT8 bMoraleEvent )
{
INT8 bMercID, bOtherID;
INT8 bLastTeamID;
SOLDIERTYPE * pSoldier;
bMercID = gTacticalStatus.Team[ gbPlayerNum ].bFirstID;
bLastTeamID = gTacticalStatus.Team[ gbPlayerNum ].bLastID;
// loop through all mercs to find buddies
for ( pSoldier = MercPtrs[ bMercID ]; bMercID <= bLastTeamID; bMercID++,pSoldier++)
{
//if the merc is active, in Arulco, not POW and is a buddy
if ( WhichBuddy(pSoldier->ubProfile,pFiredSoldier->ubProfile) != (-1) &&
pSoldier->bActive && pSoldier->ubProfile != NO_PROFILE &&
!(pSoldier->bAssignment == IN_TRANSIT ||
pSoldier->bAssignment == ASSIGNMENT_DEAD ||
pSoldier->bAssignment == ASSIGNMENT_POW) )
{
HandleMoraleEvent(pSoldier, bMoraleEvent, pSoldier->sSectorX, pSoldier->sSectorY, pSoldier->bSectorZ);
}
}
}
void HandleSoldierLeavingWithLowMorale( SOLDIERTYPE *pSoldier )
{
@@ -751,6 +775,9 @@ void HandleSoldierLeavingWithLowMorale( SOLDIERTYPE *pSoldier )
// this will cause him give us lame excuses for a while until he gets over it
// 3-6 days (but the first 1-2 days of that are spent "returning" home)
gMercProfiles[ pSoldier->ubProfile ].ubDaysOfMoraleHangover = (UINT8) (3 + Random(4));
// piss off his buddies too
HandleBuddiesReactionToFiringMerc(pSoldier, MORALE_BUDDY_FIRED_EARLY);
}
}
@@ -912,6 +939,9 @@ BOOLEAN StrategicRemoveMerc( SOLDIERTYPE *pSoldier )
EndCurrentContractRenewal( );
}
// anv: let buddies react
HandleBuddiesReactionToFiringMerc(pSoldier, MORALE_BUDDY_FIRED);
// ATE: Determine which HISTORY ENTRY to use...
if ( pSoldier->ubLeaveHistoryCode == 0 )
{
+1
View File
@@ -61,6 +61,7 @@ BOOLEAN BeginStrategicRemoveMerc( SOLDIERTYPE *pSoldier, BOOLEAN fAddRehireButto
BOOLEAN WillMercRenew( SOLDIERTYPE *pSoldier, BOOLEAN fSayQuote );
void HandleBuddiesReactionToFiringMerc(SOLDIERTYPE *pFiredSoldier, INT8 bMoraleEvent );
void CheckIfMercGetsAnotherContract( SOLDIERTYPE *pSoldier );
void FindOutIfAnyMercAboutToLeaveIsGonnaRenew( void );
+6
View File
@@ -597,6 +597,9 @@ void MercDailyUpdate()
// HEADROCK HAM 3.6: Pay for militia upkeep
HandleMilitiaUpkeepPayment();
// anv: time for snitches to report
HandleSnitchCheck();
}
/*
@@ -877,6 +880,9 @@ void MercComplainAboutEquipment( UINT8 ubProfile )
{
// Say quote!
TacticalCharacterDialogue( pSoldier, QUOTE_WHINE_EQUIPMENT );
// anv: morale hit
HandleMoraleEvent( pSoldier, MORALE_BAD_EQUIPMENT, pSoldier->sSectorX, pSoldier->sSectorY, pSoldier->bSectorZ );
ModifyPlayerReputation(REPUTATION_TOWN_LOST);
}
}
}
+40 -2
View File
@@ -79,9 +79,9 @@ UINT8 CalcDeathRate(void)
void ModifyPlayerReputation(INT8 bRepChange)
{
INT32 iNewBadRep;
INT8 bRepChangeValue = gReputationSettings.bValues[bRepChange];
// subtract, so that a negative reputation change results in an increase in bad reputation
iNewBadRep = (INT32) gStrategicStatus.ubBadReputation - bRepChange;
iNewBadRep = (INT32) gStrategicStatus.ubBadReputation - bRepChangeValue;
// keep within a 0-100 range (0 = Saint, 100 = Satan)
iNewBadRep = __max( 0, iNewBadRep );
@@ -175,6 +175,44 @@ BOOLEAN MercThinksHisMoraleIsTooLow( SOLDIERTYPE *pSoldier )
}
}
BOOLEAN MercIsOwedTooMuchMoney( UINT8 ubProfileID )
{
if(gMercProfiles[ ubProfileID ].iBalance >= gMercProfiles[ ubProfileID ].sSalary * gMoraleSettings.bValues[MORALE_OWED_MONEY_DAYS])
{
return(TRUE);
}
else
{
return(FALSE);
}
}
BOOLEAN MercThinksPlayerIsInactiveTooLong( UINT8 ubProfileID )
{
UINT8 ubTolerance;
ubTolerance = gMoraleSettings.bValues[MORALE_PLAYER_INACTIVE_DAYS];
if( gMercProfiles[ubProfileID].bCharacterTrait == CHAR_TRAIT_PACIFIST )
{
ubTolerance = max(0, ubTolerance + gMoraleSettings.bValues[MORALE_PLAYER_INACTIVE_DAYS_PACIFIST_BONUS]);
}
else if( gMercProfiles[ubProfileID].bCharacterTrait == CHAR_TRAIT_AGGRESSIVE )
{
ubTolerance = max(0, ubTolerance + gMoraleSettings.bValues[MORALE_PLAYER_INACTIVE_DAYS_AGGRESSIVE_BONUS]);
}
if( ubTolerance == 0)
{
return(FALSE);
}
if( gStrategicStatus.ubNumberOfDaysOfInactivity >= ubTolerance )
{
return(TRUE);
}
else
{
return(FALSE);
}
}
void UpdateLastDayOfPlayerActivity( UINT16 usDay )
{
if ( usDay > gStrategicStatus.usLastDayOfPlayerActivity )
+40 -15
View File
@@ -18,23 +18,46 @@ class SOLDIERTYPE;
#define ARMY_GUN_LEVELS 11
// anv: externalised, now these serve as enums below
// player reputation modifiers
#define REPUTATION_LOW_DEATHRATE +5
#define REPUTATION_HIGH_DEATHRATE -5
#define REPUTATION_GREAT_MORALE +3
#define REPUTATION_POOR_MORALE -3
#define REPUTATION_BATTLE_WON +2
#define REPUTATION_BATTLE_LOST -2
#define REPUTATION_TOWN_WON +5
#define REPUTATION_TOWN_LOST -5
#define REPUTATION_SOLDIER_DIED -2 // per exp. level
#define REPUTATION_SOLDIER_CAPTURED -1
#define REPUTATION_KILLED_CIVILIAN -5
#define REPUTATION_EARLY_FIRING -3
#define REPUTATION_KILLED_MONSTER_QUEEN +15
#define REPUTATION_KILLED_DEIDRANNA +25
//#define REPUTATION_LOW_DEATHRATE +5
//#define REPUTATION_HIGH_DEATHRATE -5
//#define REPUTATION_GREAT_MORALE +3
//#define REPUTATION_POOR_MORALE -3
//#define REPUTATION_BATTLE_WON +2
//#define REPUTATION_BATTLE_LOST -2
//#define REPUTATION_TOWN_WON +5
//#define REPUTATION_TOWN_LOST -5
//#define REPUTATION_SOLDIER_DIED -2 // per exp. level
//#define REPUTATION_SOLDIER_CAPTURED -1
//#define REPUTATION_KILLED_CIVILIAN -5
//#define REPUTATION_EARLY_FIRING -3
//#define REPUTATION_KILLED_MONSTER_QUEEN +15
//#define REPUTATION_KILLED_DEIDRANNA +25
typedef enum
{
REPUTATION_LOW_DEATHRATE = 0,
REPUTATION_HIGH_DEATHRATE,
REPUTATION_GREAT_MORALE,
REPUTATION_POOR_MORALE,
REPUTATION_BATTLE_WON,
REPUTATION_BATTLE_LOST, // 5
REPUTATION_TOWN_WON,
REPUTATION_TOWN_LOST,
REPUTATION_SOLDIER_DIED,
REPUTATION_SOLDIER_CAPTURED,
REPUTATION_KILLED_CIVILIAN, // 10
REPUTATION_EARLY_FIRING,
REPUTATION_KILLED_MONSTER_QUEEN,
REPUTATION_KILLED_DEIDRANNA,
REPUTATION_MERC_COMPLAIN_EQUIPMENT,
REPUTATION_MERC_OWED_MONEY, // 15
REPUTATION_PLAYER_IS_INACTIVE,
REPUTATION_MERC_FIRED_ON_BAD_TERMS,
NUM_REPUTATION_EVENTS,
} ReputationEventNames;
// flags to remember whether a certain E-mail has already been sent out
#define ENRICO_EMAIL_SENT_SOME_PROGRESS 0x0001
@@ -125,6 +148,8 @@ void ModifyPlayerReputation(INT8 bRepChange);
BOOLEAN MercThinksDeathRateTooHigh( UINT8 ubProfileID );
BOOLEAN MercThinksBadReputationTooHigh( UINT8 ubProfileID );
BOOLEAN MercThinksHisMoraleIsTooLow( SOLDIERTYPE *pSoldier );
BOOLEAN MercIsOwedTooMuchMoney( UINT8 ubProfileID );
BOOLEAN MercThinksPlayerIsInactiveTooLong( UINT8 ubProfileID );
void HandleEnricoEmail(void);