New ability: a disguised spy can distract unalerted enemies, making it easier to sneak by.

For more info, see http://thepit.ja-galaxy-forum.com/index.php?t=msg&th=20228&goto=352562&#msg_352562

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8528 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2018-02-25 19:07:31 +00:00
parent c8e9a3fb8e
commit 3bbdd4a23a
22 changed files with 339 additions and 20 deletions
+85 -1
View File
@@ -10672,6 +10672,32 @@ void PrisonerSurrenderMessageBoxCallBack( UINT8 ubExitValue )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[ STR_PRISONER_REFUSE_TAKE_PRISONERS ] );
}
}
// we distract the enemy by essentially talking them to death
else if ( ubExitValue == 3 )
{
// Flugente: if we are disguised and talk to a non-profile NPC, we will continue to 'chat' with the enemy as long as we aren't ordered to do something else.
// This way we can easily order our spies to 'distract 'enemies'
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) &&
pSoldier->bTeam == gbPlayerNum &&
MercPtrs[prisonerdialoguetargetID] &&
MercPtrs[prisonerdialoguetargetID]->bTeam == ENEMY_TEAM &&
MercPtrs[prisonerdialoguetargetID]->ubProfile == NO_PROFILE &&
MercPtrs[prisonerdialoguetargetID]->aiData.bAlertStatus < STATUS_RED &&
!MercPtrs[prisonerdialoguetargetID]->RecognizeAsCombatant( gusSelectedSoldier ) )
{
// both soldiers face each other
pSoldier->EVENT_SetSoldierDesiredDirection( GetDirectionToGridNoFromGridNo( pSoldier->sGridNo, MercPtrs[prisonerdialoguetargetID]->sGridNo ) );
MercPtrs[prisonerdialoguetargetID]->EVENT_SetSoldierDesiredDirection( GetDirectionToGridNoFromGridNo( MercPtrs[prisonerdialoguetargetID]->sGridNo, pSoldier->sGridNo ) );
MercPtrs[prisonerdialoguetargetID]->usChatPartnerID = gusSelectedSoldier;
pSoldier->usChatPartnerID = prisonerdialoguetargetID;
}
else
{
// normal dialog
StartCivQuote( MercPtrs[prisonerdialoguetargetID] );
}
}
else
{
// normal dialog
@@ -10681,6 +10707,50 @@ void PrisonerSurrenderMessageBoxCallBack( UINT8 ubExitValue )
ReduceAttackBusyCount( );
}
// Flugente: disguised mercs can distract enemies by talking to them. In order to display that, we sometimes display excerpts of their 'chats'
void CheckChatPartners()
{
if ( guiCurrentScreen == GAME_SCREEN )
{
if ( !CivQuoteActive() )
{
static BOOLEAN fMercQuoteThisTime = TRUE;
SOLDIERTYPE* pSoldier = NULL;
for ( int ubLoop = gTacticalStatus.Team[gbPlayerNum].bFirstID; ubLoop <= gTacticalStatus.Team[gbPlayerNum].bLastID; ++ubLoop )
{
pSoldier = MercPtrs[ubLoop];
if ( pSoldier && pSoldier->bVisible && pSoldier->usChatPartnerID != NOBODY && MercPtrs[pSoldier->usChatPartnerID]->bVisible )
{
INT16 sScreenX, sScreenY;
if ( fMercQuoteThisTime )
GetSoldierScreenPos( pSoldier, &sScreenX, &sScreenY );
else
GetSoldierScreenPos( MercPtrs[pSoldier->usChatPartnerID], &sScreenX, &sScreenY );
if ( gsVIEWPORT_START_X <= sScreenX &&
gsVIEWPORT_END_X >= sScreenX &&
gsVIEWPORT_WINDOW_START_Y <= sScreenY &&
gsVIEWPORT_WINDOW_END_Y >= sScreenY )
{
if ( fMercQuoteThisTime )
BeginChatQuote( pSoldier, sScreenX, sScreenY );
else
BeginChatQuote( MercPtrs[pSoldier->usChatPartnerID], sScreenX, sScreenY );
fMercQuoteThisTime = !fMercQuoteThisTime;
break;
}
}
}
}
}
}
// Flugente: offer the enemy the chance to surrender
void HandleSurrenderOffer( SOLDIERTYPE* pSoldier )
{
@@ -10694,7 +10764,21 @@ void HandleSurrenderOffer( SOLDIERTYPE* pSoldier )
// open a dialogue box and see wether we really want to offer this, or just talk
wcscpy( gzUserDefinedButton[0], TacticalStr[ PRISONER_DEMAND_SURRENDER_STR ] );
wcscpy( gzUserDefinedButton[1], TacticalStr[ PRISONER_OFFER_SURRENDER_STR ] );
wcscpy( gzUserDefinedButton[2], TacticalStr[ PRISONER_TALK_STR ] );
SOLDIERTYPE* pTargetSoldier = NULL;
if ( GetSoldier( &pTargetSoldier, prisonerdialoguetargetID ) &&
pTargetSoldier->bTeam == ENEMY_TEAM &&
pTargetSoldier->ubProfile == NO_PROFILE &&
pTargetSoldier->aiData.bAlertStatus < STATUS_RED &&
!pTargetSoldier->RecognizeAsCombatant( gusSelectedSoldier ) )
{
wcscpy( gzUserDefinedButton[2], TacticalStr[PRISONER_DISTRACT_STR] );
}
else
{
wcscpy( gzUserDefinedButton[2], TacticalStr[PRISONER_TALK_STR] );
}
wcscpy( gzUserDefinedButton[3], TacticalStr[ PRISONER_TALK_STR ] );
DoMessageBox( MSG_BOX_BASIC_MEDIUM_BUTTONS, TacticalStr[ PRISONER_OFFER_SURRENDER ], guiCurrentScreen, MSG_BOX_FLAG_GENERIC_FOUR_BUTTONS, PrisonerSurrenderMessageBoxCallBack, NULL );
}