diff --git a/GameVersion.cpp b/GameVersion.cpp index 71325151..1ccb797a 100644 --- a/GameVersion.cpp +++ b/GameVersion.cpp @@ -15,9 +15,9 @@ #ifdef JA2EDITOR #ifdef JA2UB - CHAR16 zVersionLabel[256] = { L"Unfinished Business - Map Editor v1.13.8525 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Unfinished Business - Map Editor v1.13.8528 (Development Build)" }; #else - CHAR16 zVersionLabel[256] = { L"Map Editor v1.13.8525 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Map Editor v1.13.8528 (Development Build)" }; #endif // ------------------------------ @@ -27,11 +27,11 @@ //DEBUG BUILD VERSION #ifdef JA2UB - CHAR16 zVersionLabel[256] = { L"Debug: Unfinished Business - v1.13.8525 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Debug: Unfinished Business - v1.13.8528 (Development Build)" }; #elif defined (JA113DEMO) - CHAR16 zVersionLabel[256] = { L"Debug: JA2 Demo - v1.13.8525 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Debug: JA2 Demo - v1.13.8528 (Development Build)" }; #else - CHAR16 zVersionLabel[256] = { L"Debug: v1.13.8525 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Debug: v1.13.8528 (Development Build)" }; #endif #elif defined CRIPPLED_VERSION @@ -46,16 +46,16 @@ //RELEASE BUILD VERSION #ifdef JA2UB - CHAR16 zVersionLabel[256] = { L"Release Unfinished Business - v1.13.8525 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Release Unfinished Business - v1.13.8528 (Development Build)" }; #elif defined (JA113DEMO) - CHAR16 zVersionLabel[256] = { L"Release JA2 Demo - v1.13.8525 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Release JA2 Demo - v1.13.8528 (Development Build)" }; #else - CHAR16 zVersionLabel[256] = { L"Release v1.13.8525 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Release v1.13.8528 (Development Build)" }; #endif #endif -CHAR8 czVersionNumber[16] = { "Build 18.02.22" }; //YY.MM.DD +CHAR8 czVersionNumber[16] = { "Build 18.02.25" }; //YY.MM.DD CHAR16 zTrackingNumber[16] = { L"Z" }; // SAVE_GAME_VERSION is defined in header, change it there diff --git a/GameVersion.h b/GameVersion.h index 4b8cee23..6dfd1401 100644 --- a/GameVersion.h +++ b/GameVersion.h @@ -21,6 +21,7 @@ extern CHAR16 zTrackingNumber[16]; // Keeps track of the saved game version. Increment the saved game version whenever // you will invalidate the saved game file +#define CHAT_TO_DISTRACT 176 // Flugente: internal variable allows us to distract enemies by engrossing them in conversation #define INDIVIDUAL_MILITIA_RANKFIX 175 // Flugente: internal individual militia change requires variable change #define DRAGPERSONS 174 // Flugente: we can drag people and corpses now #define SEPARATE_VOICESETS 173 // Flugente: voice sets are now separate from profile slots, and we can have many more of them @@ -94,7 +95,7 @@ extern CHAR16 zTrackingNumber[16]; #define AP100_SAVEGAME_DATATYPE_CHANGE 105 // Before this, we didn't have the 100AP structure changes #define NIV_SAVEGAME_DATATYPE_CHANGE 102 // Before this, we used the old structure system -#define SAVE_GAME_VERSION INDIVIDUAL_MILITIA_RANKFIX +#define SAVE_GAME_VERSION CHAT_TO_DISTRACT //#define RUSSIANGOLD #ifdef __cplusplus diff --git a/SaveLoadGame.cpp b/SaveLoadGame.cpp index ac201613..28f95e15 100644 --- a/SaveLoadGame.cpp +++ b/SaveLoadGame.cpp @@ -2221,7 +2221,10 @@ BOOLEAN SOLDIERTYPE::Load(HWFILE hFile) this->CancelDrag(); } - numBytesRead = ReadFieldByField(hFile, &this->bUnusedINT16_5, sizeof(bUnusedINT16_5), sizeof(INT16), numBytesRead ); + numBytesRead = ReadFieldByField(hFile, &this->usChatPartnerID, sizeof( usChatPartnerID ), sizeof(INT16), numBytesRead ); + + if ( guiCurrentSaveGameVersion < CHAT_TO_DISTRACT ) + this->usChatPartnerID = NOBODY; numBytesRead = ReadFieldByField(hFile, &this->bExtraStrength, sizeof(bExtraStrength), sizeof(INT16), numBytesRead); numBytesRead = ReadFieldByField(hFile, &this->bExtraDexterity, sizeof(bExtraDexterity), sizeof(INT16), numBytesRead); diff --git a/Tactical/Civ Quotes.cpp b/Tactical/Civ Quotes.cpp index bb7e5e39..b6e96199 100644 --- a/Tactical/Civ Quotes.cpp +++ b/Tactical/Civ Quotes.cpp @@ -483,6 +483,86 @@ void BeginCivQuote( SOLDIERTYPE *pCiv, UINT16 ubCivQuoteID, UINT16 ubEntryID, IN gCivQuoteData.pCiv = pCiv; } +void BeginChatQuote( SOLDIERTYPE *pCiv, INT16 sX, INT16 sY ) +{ + VIDEO_OVERLAY_DESC VideoOverlayDesc; + + // OK, do we have another on? + if ( gCivQuoteData.bActive ) + { + // Delete? + ShutDownQuoteBox( TRUE ); + } + + if ( pCiv->bTeam == gbPlayerNum ) + swprintf( gzCivQuote, L"\"%s\"", szChatTextSpy[Random( 24 )] ); + else + swprintf( gzCivQuote, L"\"%s\"", szChatTextEnemy[Random( 24 )] ); + + // Create video oeverlay.... + memset( &VideoOverlayDesc, 0, sizeof( VIDEO_OVERLAY_DESC ) ); + + // Prepare text box + gCivQuoteData.iDialogueBox = PrepareMercPopupBox( gCivQuoteData.iDialogueBox, BASIC_MERC_POPUP_BACKGROUND, BASIC_MERC_POPUP_BORDER, gzCivQuote, DIALOGUE_DEFAULT_WIDTH, 0, 0, 0, &gusCivQuoteBoxWidth, &gusCivQuoteBoxHeight ); + + // Flugente: have the box appear a bit above the soldier. Otherwise it will obstruct us from aiming at him, which is annoying if it happens very often + sY -= 30; + + // OK, find center for box...... + sX = sX - ( gusCivQuoteBoxWidth / 2 ); + sY = sY - ( gusCivQuoteBoxHeight / 2 ); + + // OK, limit to screen...... + { + if ( sX < 0 ) + { + sX = 0; + } + + // CHECK FOR LEFT/RIGHT + if ( ( sX + gusCivQuoteBoxWidth ) > SCREEN_WIDTH ) + { + sX = SCREEN_WIDTH - gusCivQuoteBoxWidth; + } + + // Now check for top + if ( sY < gsVIEWPORT_WINDOW_START_Y ) + { + sY = gsVIEWPORT_WINDOW_START_Y; + } + + // Check for bottom + if ( ( sY + gusCivQuoteBoxHeight ) > ( SCREEN_HEIGHT - INV_INTERFACE_HEIGHT ) ) + { + sY = ( SCREEN_HEIGHT - INV_INTERFACE_HEIGHT ) - gusCivQuoteBoxHeight; + } + } + + VideoOverlayDesc.sLeft = sX; + VideoOverlayDesc.sTop = sY; + VideoOverlayDesc.sRight = VideoOverlayDesc.sLeft + gusCivQuoteBoxWidth; + VideoOverlayDesc.sBottom = VideoOverlayDesc.sTop + gusCivQuoteBoxHeight; + VideoOverlayDesc.sX = VideoOverlayDesc.sLeft; + VideoOverlayDesc.sY = VideoOverlayDesc.sTop; + VideoOverlayDesc.BltCallback = RenderCivQuoteBoxOverlay; + + gCivQuoteData.iVideoOverlay = RegisterVideoOverlay( 0, &VideoOverlayDesc ); + + //Define main region + MSYS_DefineRegion( &( gCivQuoteData.MouseRegion ), VideoOverlayDesc.sLeft, VideoOverlayDesc.sTop, VideoOverlayDesc.sRight, VideoOverlayDesc.sBottom, MSYS_PRIORITY_HIGHEST, + CURSOR_NORMAL, MSYS_NO_CALLBACK, QuoteOverlayClickCallback ); + // Add region + MSYS_AddRegion( &( gCivQuoteData.MouseRegion ) ); + + gCivQuoteData.bActive = TRUE; + + gCivQuoteData.uiTimeOfCreation = GetJA2Clock(); + + gCivQuoteData.uiDelayTime = FindDelayForString( gzCivQuote ) + 500; + + gCivQuoteData.pCiv = pCiv; +} + UINT16 DetermineCivQuoteEntry( SOLDIERTYPE *pCiv, UINT16 *pubCivHintToUse, BOOLEAN fCanUseHints ) { UINT8 ubCivType; @@ -878,7 +958,6 @@ void HandleCivQuote( ) void StartCivQuote( SOLDIERTYPE *pCiv ) { UINT16 ubCivQuoteID; - INT16 sX, sY; UINT16 ubEntryID = 0; INT16 sScreenX, sScreenY; UINT16 ubCivHintToUse; @@ -975,17 +1054,15 @@ void StartCivQuote( SOLDIERTYPE *pCiv ) // Determine location... // Get location of civ on screen..... GetSoldierScreenPos( pCiv, &sScreenX, &sScreenY ); - sX = sScreenX; - sY = sScreenY; // begin quote - BeginCivQuote( pCiv, ubCivQuoteID, ubEntryID, sX, sY ); + BeginCivQuote( pCiv, ubCivQuoteID, ubEntryID, sScreenX, sScreenY ); // Increment use if ( ubCivQuoteID != CIV_QUOTE_HINT ) { //pCiv->bCurrentCivQuoteDelta++; - CivQuoteDelta++; + ++CivQuoteDelta; /* if ( pCiv->bCurrentCivQuoteDelta == 2 ) { @@ -2010,4 +2087,9 @@ void ShowTauntPopupBox( SOLDIERTYPE *pCiv, STR16 gzTauntQuote ) gCivQuoteData.uiDelayTime = min( gTauntsSettings.sMaxDelay , max( gTauntsSettings.sMinDelay, FindDelayForString( gzTauntQuote ) + gTauntsSettings.sModDelay ) ); gCivQuoteData.pCiv = pCiv; -} \ No newline at end of file +} + +BOOLEAN CivQuoteActive() +{ + return gCivQuoteData.bActive; +} diff --git a/Tactical/Civ Quotes.h b/Tactical/Civ Quotes.h index b98fd4f0..d950b9be 100644 --- a/Tactical/Civ Quotes.h +++ b/Tactical/Civ Quotes.h @@ -172,5 +172,8 @@ BOOLEAN LoadCivQuotesFromLoadGameFile( HWFILE hFile ); BOOLEAN ShutDownQuoteBoxIfActive( ); void BeginCivQuote( SOLDIERTYPE *pCiv, UINT16 ubCivQuoteID, UINT16 ubEntryID, INT16 sX, INT16 sY ); +void BeginChatQuote( SOLDIERTYPE *pCiv, INT16 sX, INT16 sY ); + +BOOLEAN CivQuoteActive(); #endif \ No newline at end of file diff --git a/Tactical/Overhead.cpp b/Tactical/Overhead.cpp index 1d3772f0..d7a823f5 100644 --- a/Tactical/Overhead.cpp +++ b/Tactical/Overhead.cpp @@ -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 ); } diff --git a/Tactical/Overhead.h b/Tactical/Overhead.h index 6c118bed..edb854ee 100644 --- a/Tactical/Overhead.h +++ b/Tactical/Overhead.h @@ -357,6 +357,9 @@ extern UINT8 NumZombiesInSector(); // Flugente: offer the enemy the chance to surrender void HandleSurrenderOffer( SOLDIERTYPE* pSoldier ); +// Flugente: disguised mercs can distract enemies by talking to them. In order to display that, we sometimes display excerpts of their 'chats' +void CheckChatPartners(); + // Flugente: order a team to drop gear, or pick it up // setting fForce to TRUE allows dropping of gear in combat (used in auto-resolve instances) void TeamDropAll(UINT8 bTeam, BOOLEAN fForce = FALSE); diff --git a/Tactical/Points.cpp b/Tactical/Points.cpp index c7ed8fb4..9c79f657 100644 --- a/Tactical/Points.cpp +++ b/Tactical/Points.cpp @@ -923,6 +923,8 @@ void DeductPoints( SOLDIERTYPE *pSoldier, INT16 sAPCost, INT32 iBPCost, UINT8 ub // if we are temporarily overt if ( pSoldier->usSoldierFlagMask & SOLDIER_COVERT_TEMPORARY_OVERT && pSoldier->usSkillCooldown[SOLDIER_COOLDOWN_COVERTOPS_TEMPORARYOVERT_APS] > 0 ) pSoldier->usSkillCooldown[SOLDIER_COOLDOWN_COVERTOPS_TEMPORARYOVERT_APS] = max( 0, (INT16)(pSoldier->usSkillCooldown[SOLDIER_COOLDOWN_COVERTOPS_TEMPORARYOVERT_APS] - sAPCost) ); + + pSoldier->StopChatting(); } // in real time, there IS no AP cost, (only breath cost) diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp index 85e31c7f..a4899e92 100644 --- a/Tactical/Soldier Control.cpp +++ b/Tactical/Soldier Control.cpp @@ -19968,6 +19968,17 @@ FLOAT SOLDIERTYPE::GetIntelGain() return totalvalue; } +void SOLDIERTYPE::StopChatting() +{ + if ( this->usChatPartnerID != NOBODY ) + { + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[DISTRACT_STOP_STR], this->GetName(), MercPtrs[this->usChatPartnerID]->GetName() ); + + MercPtrs[this->usChatPartnerID]->usChatPartnerID = NOBODY; + this->usChatPartnerID = NOBODY; + } +} + INT32 CheckBleeding( SOLDIERTYPE *pSoldier ) { INT8 bBandaged; //,savedOurTurn; diff --git a/Tactical/Soldier Control.h b/Tactical/Soldier Control.h index 5ee758c1..bb2e0b76 100644 --- a/Tactical/Soldier Control.h +++ b/Tactical/Soldier Control.h @@ -1506,7 +1506,7 @@ public: //INT16 bUnusedINT16_4; INT16 sDragCorpseID; // Flugente: id of corpse we are dragging - INT16 bUnusedINT16_5; + UINT16 usChatPartnerID; // Flugente: the id of another merc we are 'chatting' with // Flugente: new variables for extra stats INT16 bExtraStrength; // additional strength gained via power armor @@ -1979,6 +1979,8 @@ public: // Flugente: spy assignments UINT8 GetUncoverRisk(); FLOAT GetIntelGain(); + + void StopChatting(); ////////////////////////////////////////////////////////////////////////////// }; // SOLDIERTYPE; diff --git a/TacticalAI/AIMain.cpp b/TacticalAI/AIMain.cpp index b1f1ea18..c4b386e0 100644 --- a/TacticalAI/AIMain.cpp +++ b/TacticalAI/AIMain.cpp @@ -1318,6 +1318,20 @@ void TurnBasedHandleNPCAI(SOLDIERTYPE *pSoldier) EndAIGuysTurn( pSoldier); return; } + + // Flugente: if we are distracted by chatting and not alert, do nothing + if ( pSoldier->usChatPartnerID != NOBODY ) + { + if ( pSoldier->aiData.bAlertStatus < STATUS_RED ) + { + EndAIGuysTurn( pSoldier ); + return; + } + else + { + pSoldier->StopChatting(); + } + } if ((pSoldier->aiData.bAction != AI_ACTION_NONE) && pSoldier->aiData.bActionInProgress) { diff --git a/TacticalAI/Realtime.cpp b/TacticalAI/Realtime.cpp index 1ba07c3f..3bbeb1fa 100644 --- a/TacticalAI/Realtime.cpp +++ b/TacticalAI/Realtime.cpp @@ -76,6 +76,20 @@ void RTHandleAI( SOLDIERTYPE * pSoldier ) if ( pSoldier->usSoldierFlagMask & SOLDIER_POW || pSoldier->usSkillCooldown[SOLDIER_COOLDOWN_CRYO] ) return; + // Flugente: if we are distracted by chatting and not alert, do nothing + if ( pSoldier->usChatPartnerID != NOBODY ) + { + if ( pSoldier->aiData.bAlertStatus < STATUS_RED ) + { + EndAIGuysTurn( pSoldier ); + return; + } + else + { + pSoldier->StopChatting(); + } + } + // if man has nothing to do if (pSoldier->aiData.bAction == AI_ACTION_NONE) { diff --git a/Utils/Text.h b/Utils/Text.h index a26c33a7..9020d4f6 100644 --- a/Utils/Text.h +++ b/Utils/Text.h @@ -1106,8 +1106,9 @@ enum PRISONER_OFFER_SURRENDER, PRISONER_DEMAND_SURRENDER_STR, PRISONER_OFFER_SURRENDER_STR, + PRISONER_DISTRACT_STR, PRISONER_TALK_STR, - + // sevenfm: new disarm trap dialog, new messages for wrong mines when arming DISARM_DIALOG_DISARM, DISARM_DIALOG_INSPECT, @@ -1142,6 +1143,8 @@ enum IMPROVEGEARDESCRIBE_STR, IMPROVEGEARPICKUPMAG_STR, + DISTRACT_STOP_STR, + TEXT_NUM_TACTICAL_STR }; @@ -3059,6 +3062,9 @@ extern STR16 szIntelWebsiteText[]; extern STR16 szIntelText[]; +extern STR16 szChatTextSpy[]; +extern STR16 szChatTextEnemy[]; + #define TACTICAL_INVENTORY_DIALOG_NUM 16 #define TACTICAL_COVER_DIALOG_NUM 16 diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index 70c64804..f2d2aa65 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -4013,6 +4013,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"你想要做什么?", L"劝说敌人投降", L"缴械投降", //L"Offer surrender", + L"Distract", // TODO.Translate L"交谈", // added by sevenfm: disarm messagebox options, messages when arming wrong bomb @@ -4048,6 +4049,8 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"补充装备", //L"Improve gear", L"%s 将 %s 进行了临时补给", //L"%s changed %s for superior version", L"%s 捡起 %s", //L"%s picked up %s", + + L"%s has stopped chatting with %s", // TODO.Translate }; //Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface. diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index 5932922f..2024e2bc 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -4014,6 +4014,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"What do you want to do?", L"Demand surrender", L"Offer surrender", + L"Distract", // TODO.Translate L"Talk", // TODO.Translate @@ -4050,6 +4051,8 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"Improve gear", L"%s changed %s for superior version", L"%s picked up %s", // TODO.Translate + + L"%s has stopped chatting with %s", // TODO.Translate }; //Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface. diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index b97348e1..ba695c82 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -4013,6 +4013,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"What do you want to do?", L"Demand surrender", L"Offer surrender", + L"Distract", L"Talk", // added by sevenfm: disarm messagebox options, messages when arming wrong bomb @@ -4048,6 +4049,8 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"Improve gear", L"%s changed %s for superior version", L"%s picked up %s", + + L"%s has stopped chatting with %s", }; //Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface. @@ -11362,4 +11365,70 @@ STR16 szIntelText[] = L"%s has been discovered, going to sector!", }; +STR16 szChatTextSpy[] = +{ + L"... so imagine my surprise when suddenly...", + L"... and did I ever tell you the story of that one time...", + L"... so, in conclusion, the colonel decided...", + L"... tell you, they did not see that coming...", + + L"... so, without further consideration...", + L"... but then SHE said...", + L"... and, speaking of llamas...", + L"... there I was, in the middle of the dustbowl, when...", + + L"... and let me tell, those things chafe...", + L"... you should have seen his face...", + L"... which wasn't the last of what we saw of them...", + L"... which reminds me, my grandmother used to say...", + + L"... who, by the way, is a total berk...", + L"... also, the roots were off by a margin...", + L"... and I was like, 'Back off, heathen!'...", + L"... at that point the vicars were in oben rebellion...", + + L"... not that I would've minded, you know, but...", + L"... if not for that ridiculous hat...", + L"... besides, it wasn't his favourite leg anyway...", + L"... even though the ships were still watertight...", + + L"... aside from the fact that giraffes can't do that...", + L"... totally wasted that fork, mind you...", + L"... and no bakery in sight. After that...", + L"... even though regulations are clear in that regard...", +}; + +STR16 szChatTextEnemy[] = +{ + L"Whoa. I had no idea!", + L"Really?", + L"Uhhhh....", + L"Well... you see, uhh...", + + L"I am not entirely sure that...", + L"I... well...", + L"If I could just...", + L"But...", + + L"I don't mean to intrude, but...", + L"Really? I had no idea!", + L"What? All of it?", + L"No way!", + + L"Haha!", + L"Whoa, the guys are not going to believe me!", + L"... yeah, just...", + L"That's just like the gypsy woman said!", + + L"... yeah, is that why...", + L"... hehe, talk about refurbishing...", + L"... yeah, I guess...", + L"Wait. What?", + + L"... wouldn't have minded seeing that...", + L"... now that you mention it...", + L"... but where did all the chalk go...", + L"... had never even considered that...", +}; + #endif //ENGLISH diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index ca926447..a25498f4 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -4019,6 +4019,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"Voulez-vous proposer ?", L"Leur reddition", L"Votre reddition", + L"Distract", // TODO.Translate L"Parler", // added by sevenfm: disarm messagebox options, messages when arming wrong bomb @@ -4054,6 +4055,8 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"Improve gear", L"%s changed %s for superior version", L"%s picked up %s", // TODO.Translate + + L"%s has stopped chatting with %s", // TODO.Translate }; //Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface. diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index 89fcb32d..b49f6f72 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -4021,6 +4021,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"Was möchten Sie tun?", L"Kapitulation fordern", L"Kapitulation anbieten", + L"Ablenken", L"Sprechen", // added by sevenfm: disarm messagebox options, messages when arming wrong bomb @@ -4056,6 +4057,8 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"Improve gear", L"%s changed %s for superior version", L"%s picked up %s", // TODO.Translate + + L"%s has stopped chatting with %s", // TODO.Translate }; //Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface. diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index 5c16d8de..9527dc57 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -4008,6 +4008,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"What do you want to do?", L"Demand surrender", L"Offer surrender", + L"Distract", // TODO.Translate L"Talk", // TODO.Translate @@ -4044,6 +4045,8 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"Improve gear", L"%s changed %s for superior version", L"%s picked up %s", // TODO.Translate + + L"%s has stopped chatting with %s", // TODO.Translate }; //Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface. diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index c1bb9f3a..5574356b 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -4019,6 +4019,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"What do you want to do?", L"Demand surrender", L"Offer surrender", + L"Distract", // TODO.Translate L"Talk", // TODO.Translate @@ -4055,6 +4056,8 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"Improve gear", L"%s changed %s for superior version", L"%s picked up %s", // TODO.Translate + + L"%s has stopped chatting with %s", // TODO.Translate }; //Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface. diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index bcfe98b3..1b15692a 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -4013,6 +4013,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"Что вы хотите сделать?", L"Требовать сдаться", L"Предложить сдаться", + L"Distract", // TODO.Translate L"Переговоры", // added by sevenfm: disarm messagebox options, messages when arming wrong bomb @@ -4048,6 +4049,8 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"Комплектовать", L"%s скомплевтовал %s", L"%s поднял %s", + + L"%s has stopped chatting with %s", // TODO.Translate }; //Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface. diff --git a/gameloop.cpp b/gameloop.cpp index 12302e4a..3dad19ca 100644 --- a/gameloop.cpp +++ b/gameloop.cpp @@ -30,6 +30,7 @@ #include "Tactical Placement GUI.h"//dnl ch45 071009 #include "Map Screen Interface Map Inventory.h"//dnl ch51 081009 #include "World Items.h"//dnl ch77 191113 + #include "Overhead.h" // added by Flugente #endif #include "SaveLoadScreen.h" @@ -410,6 +411,9 @@ void GameLoop(void) // Flugente: dynamic opinions: Dialogue Boxes need to be refreshed RefreshBoxes( ); + + // Flugente:disguised mercs can distract enemies by talking to them. In order to display that, we sometimes display excerpts of their 'chats' + CheckChatPartners(); //DEBUG MODE : DEBUG RENDER ENTRY : point to drop in debugging render code if( (gGameSettings.fOptions[TOPTION_RETAIN_DEBUG_OPTIONS_IN_RELEASE]) || (JA2BETAVERSION_FLAG))