From 0578c2a89a0a4b5ff84aa2d8bea22c9523ec2e3b Mon Sep 17 00:00:00 2001 From: Sevenfm Date: Sat, 11 Apr 2020 11:13:53 +0000 Subject: [PATCH] New option: SOLDIER_TOOLTIP_DEBUG_AI shows additional AI debug information. Show tooltips for all persons. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8784 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- GameSettings.cpp | 2 + GameSettings.h | 2 + Tactical/Interface.cpp | 20 +++--- Tactical/SoldierTooltips.cpp | 130 ++++++++++++++++++++++++++++++++--- 4 files changed, 133 insertions(+), 21 deletions(-) diff --git a/GameSettings.cpp b/GameSettings.cpp index 598b99b4..d125e4ff 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -1299,6 +1299,8 @@ void LoadGameExternalOptions() gGameExternalOptions.ubUDTModifier = (UINT8) iniReader.ReadInteger("Tactical Tooltip Settings", "DYNAMIC_TOOLTIP_RANGE_MODIFIER", 50, 0, 100); gGameExternalOptions.gfAllowUDTDetail = iniReader.ReadBoolean("Tactical Tooltip Settings","ALLOW_DYNAMIC_TOOLTIP_DETAIL_LEVEL",0); + gGameExternalOptions.fEnableSoldierTooltipDebugAI = iniReader.ReadBoolean("Tactical Tooltip Settings", "SOLDIER_TOOLTIP_DEBUG_AI", false, false); + //################# Tactical Gameplay Settings ################## diff --git a/GameSettings.h b/GameSettings.h index a10062fd..708f6741 100644 --- a/GameSettings.h +++ b/GameSettings.h @@ -820,6 +820,8 @@ typedef struct BOOLEAN gfAllowUDTRange; BOOLEAN gfAllowUDTDetail; INT8 ubUDTModifier; + // sevenfm: debug tooltip for AI + BOOLEAN fEnableSoldierTooltipDebugAI; //Kaiden MERC Deaths Externalized: BOOLEAN gfMercsDieOnAssignment; diff --git a/Tactical/Interface.cpp b/Tactical/Interface.cpp index 9fcf9700..1d0ef91a 100644 --- a/Tactical/Interface.cpp +++ b/Tactical/Interface.cpp @@ -117,16 +117,11 @@ TAUNT_VALUES zTaunt[NUM_TAUNT]; // anv: externalised taunts BOOLEAN gfInMovementMenu = FALSE; INT32 giMenuAnchorX, giMenuAnchorY; -//*ddd -//#define PROG_BAR_START_Y 2 - -//**ddd{ -//assign 0 to define if using large progress bar -//#define fSmallSizeProgressbar 1 INT32 HEIGHT_PROGRESSBAR, PROG_BAR_START_Y; -//ddd} -extern BOOLEAN gfCannotGetThrough; // sevenfm: will use it when showing red laser dot +// sevenfm +extern BOOLEAN gfCannotGetThrough; // will use it when showing red laser dot +extern void SoldierTooltip(SOLDIERTYPE*); BOOLEAN gfProgBarActive = FALSE; UINT8 gubProgNumEnemies = 0; @@ -2231,8 +2226,11 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) } } //------------ - } + } } + // sevenfm: additionally show tooltip + if (gGameSettings.fOptions[TOPTION_ALLOW_SOLDIER_TOOLTIPS]) + SoldierTooltip(pSoldier); } else //pSoldier->ubProfile != NO_PROFILE || ( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE ) { @@ -2255,9 +2253,7 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) pStr = GetSoldierHealthString( pSoldier ); - //jones - extern void SoldierTooltip(SOLDIERTYPE*); - //if ( gGameExternalOptions.gfAllowSoldierToolTips ) // changed by SANDRO + //jones if ( gGameSettings.fOptions[TOPTION_ALLOW_SOLDIER_TOOLTIPS] ) SoldierTooltip(pSoldier); diff --git a/Tactical/SoldierTooltips.cpp b/Tactical/SoldierTooltips.cpp index 76baa4b0..dac43998 100644 --- a/Tactical/SoldierTooltips.cpp +++ b/Tactical/SoldierTooltips.cpp @@ -26,21 +26,54 @@ #include "soldier profile type.h" #include "Soldier macros.h" #include "Encyclopedia_new.h" ///< Encyclopedia item visibility +// sevenfm +#include "ai.h" +#include "AIInternals.h" +#include "opplist.h" +#include "Map Screen Interface.h" +#include "cheats.h" +#include "Drugs and Alcohol.h" #endif //forward declarations of common classes to eliminate includes class OBJECTTYPE; class SOLDIERTYPE; +#define TOOLTIP_TEXT_SIZE 4096 struct MOUSETT { - CHAR16 FastHelpText[ 1024 ]; + CHAR16 FastHelpText[TOOLTIP_TEXT_SIZE]; INT32 iX; INT32 iY; INT32 iW; }; +// sevenfm: display various AI debug information in tooltip +STR16 gStrAlertStatus[] = { L"Green", L"Yellow", L"Red", L"Black" }; +STR16 gStrAttitude[] = { L"DEFENSIVE", L"BRAVESOLO", L"BRAVEAID", L"CUNNINGSOLO", L"CUNNINGAID", L"AGGRESSIVE", L"MAXATTITUDES", L"ATTACKSLAYONLY" }; +STR16 gStrOrders[] = { L"STATIONARY", L"ONGUARD", L"CLOSEPATROL", L"FARPATROL", L"POINTPATROL", L"ONCALL", L"SEEKENEMY", L"RNDPTPATROL", L"SNIPER" }; +STR16 gStrTeam[] = { L"OUR_TEAM", L"ENEMY_TEAM", L"CREATURE_TEAM", L"MILITIA_TEAM", L"CIV_TEAM", L"LAST_TEAM", L"PLAYER_PLAN", L"LAN_TEAM_ONE", L"LAN_TEAM_TWO", L"LAN_TEAM_THREE", L"LAN_TEAM_FOUR" }; +STR16 gStrClass[] = { L"SOLDIER_CLASS_NONE", L"SOLDIER_CLASS_ADMINISTRATOR", L"SOLDIER_CLASS_ELITE", L"SOLDIER_CLASS_ARMY", L"SOLDIER_CLASS_GREEN_MILITIA", L"SOLDIER_CLASS_REG_MILITIA", L"SOLDIER_CLASS_ELITE_MILITIA", L"SOLDIER_CLASS_CREATURE", L"SOLDIER_CLASS_MINER", L"SOLDIER_CLASS_ZOMBIE", L"SOLDIER_CLASS_TANK", L"SOLDIER_CLASS_JEEP", L"SOLDIER_CLASS_BANDIT"}; + +STR16 SeenStr(INT32 value) +{ + switch (value) + { + case -4: return L"HEARD 3"; + case -3: return L"HEARD 2"; + case -2: return L"HEARD LAST"; + case -1: return L"HEARD THIS"; + case 0: return L"NOT HEARD OR SEEN"; + case 1: return L"SEEN CURR"; + case 2: return L"SEEN THIS"; + case 3: return L"SEEN LAST"; + case 4: return L"SEEN 2"; + case 5: return L"SEEN 3"; + } + return L"unknown"; +} + extern struct MOUSETT mouseTT; extern BOOL mouseTTrender,mouseTTdone; @@ -59,9 +92,10 @@ void SoldierTooltip( SOLDIERTYPE* pSoldier ) if(!pSoldier) return; - // WANNE: No tooltips on bloodcats, bugs, tanks, roboter - if ( CREATURE_OR_BLOODCAT( pSoldier ) || ARMED_VEHICLE( pSoldier ) || - AM_A_ROBOT( pSoldier)) + // WANNE: No tooltips on bloodcats, bugs, tanks, robots + // sevenfm: allow tooltip in debug mode + if (gGameExternalOptions.ubSoldierTooltipDetailLevel < 4 && + (CREATURE_OR_BLOODCAT( pSoldier ) || ARMED_VEHICLE( pSoldier ) || AM_A_ROBOT( pSoldier))) { return; } @@ -201,12 +235,91 @@ void SoldierTooltip( SOLDIERTYPE* pSoldier ) return; } } - //} // fMercIsUsingScope is false - // gGameExternalOptions.fEnableDynamicSoldierTooltips + swprintf(pStrInfo, L""); + // sevenfm: AI tooltip + if (gGameExternalOptions.fEnableSoldierTooltipDebugAI) + { + swprintf(pStrInfo, L"%s|[ |A|I |Info |]\n", pStrInfo); + swprintf(pStrInfo, L"%s|Alert |Status: %s\n", pStrInfo, gStrAlertStatus[pSoldier->aiData.bAlertStatus]); + swprintf(pStrInfo, L"%s|Orders: %s\n", pStrInfo, gStrOrders[pSoldier->aiData.bOrders]); + swprintf(pStrInfo, L"%s|Attitude: %s\n", pStrInfo, gStrAttitude[pSoldier->aiData.bAttitude]); + swprintf(pStrInfo, L"%s|Class: %s\n", pStrInfo, gStrClass[pSoldier->ubSoldierClass]); + swprintf(pStrInfo, L"%s|Team: %s |Side: %d\n", pStrInfo, gStrTeam[pSoldier->bTeam], pSoldier->bSide); + if (pSoldier->bTeam == CIV_TEAM && pSoldier->ubCivilianGroup > 0) + { + swprintf(pStrInfo, L"%s|Civ |Group: %s\n", pStrInfo, zCivGroupName[pSoldier->ubCivilianGroup].szCurGroup); + } + if (pSoldier->aiData.bNeutral) + { + swprintf(pStrInfo, L"%s|Neutral\n", pStrInfo); + } + swprintf(pStrInfo, L"%s|A|I |Morale/|R|C|D: %d/%d\n", pStrInfo, pSoldier->aiData.bAIMorale, RangeChangeDesire(pSoldier)); + swprintf(pStrInfo, L"%s|Last |Action: %d\n", pStrInfo, pSoldier->aiData.bLastAction); + swprintf(pStrInfo, L"%s|OpponentsSeen: %d |LastTurn: %d, |Public %d\n", pStrInfo, pSoldier->aiData.bOppCnt, CountSeenEnemiesLastTurn(pSoldier), CountSeenEnemiesLastTurn(pSoldier)); + swprintf(pStrInfo, L"%s|Friends|Black: %d\n", pStrInfo, CountFriendsBlack(pSoldier)); + swprintf(pStrInfo, L"%s|Soldier Level: %d |Diff: %d\n", pStrInfo, pSoldier->stats.bExpLevel, SoldierDifficultyLevel(pSoldier)); + INT32 usOrigin; + swprintf(pStrInfo, L"%s|Roaming |Range: %d\n", pStrInfo, RoamingRange(pSoldier, &usOrigin)); + swprintf(pStrInfo, L"%s|Aware |of |Opposition: %d\n", pStrInfo, gTacticalStatus.Team[pSoldier->bTeam].bAwareOfOpposition); + swprintf(pStrInfo, L"%s|Collapsed %d |BreathCollapsed %d\n", pStrInfo, pSoldier->bCollapsed, pSoldier->bBreathCollapsed); + if (pSoldier->ubPreviousAttackerID != NOBODY && MercPtrs[pSoldier->ubPreviousAttackerID]) + { + swprintf(pStrInfo, L"%s|Under |Fire %d AttackerID %d AttackerTarget %d\n", pStrInfo, pSoldier->aiData.bUnderFire, pSoldier->ubPreviousAttackerID, MercPtrs[pSoldier->ubPreviousAttackerID]->sLastTarget); + } + else + { + swprintf(pStrInfo, L"%s|Under |Fire %d AttackerID %d\n", pStrInfo, pSoldier->aiData.bUnderFire, pSoldier->ubPreviousAttackerID); + } - // WANNE: Check if enemy soldier is in line of sight but only if player has not choosen debug details + swprintf(pStrInfo, L"%s|Visible %d |Moved %d\n", pStrInfo, pSoldier->bVisible, pSoldier->aiData.bMoved); + swprintf(pStrInfo, L"%s|Noise %d %d %d |Public |Noise %d %d %d\n", pStrInfo, pSoldier->aiData.sNoiseGridno, pSoldier->bNoiseLevel, pSoldier->aiData.ubNoiseVolume, gsPublicNoiseGridNo[pSoldier->bTeam], gbPublicNoiseLevel[pSoldier->bTeam], gubPublicNoiseVolume[pSoldier->bTeam]); + + // show watched locations: + INT8 bLoop; + swprintf(pStrInfo, L"%s---Watched Locations---\n", pStrInfo); + for (bLoop = 0; bLoop < NUM_WATCHED_LOCS; bLoop++) + { + if (!TileIsOutOfBounds(gsWatchedLoc[pSoldier->ubID][bLoop])) + { + swprintf(pStrInfo, L"%sGridNo %d Points %d\n", pStrInfo, gsWatchedLoc[pSoldier->ubID][bLoop], gubWatchedLocPoints[pSoldier->ubID][bLoop]); + } + } + + // sevenfm: show flank info + if (pSoldier->IsFlanking()) + { + swprintf(pStrInfo, L"%s|Flank %s\n", pStrInfo, pSoldier->flags.lastFlankLeft ? L"left" : L"right"); + swprintf(pStrInfo, L"%s|Flank Num %d\n", pStrInfo, pSoldier->numFlanks); + swprintf(pStrInfo, L"%s|Last Flank spot %d\n", pStrInfo, pSoldier->lastFlankSpot); + } + + //sevenfm: show opponents info + swprintf(pStrInfo, L"%s---Public list (not neutral)---\n", pStrInfo); + for (UINT16 oppID = 0; oppID < MAX_NUM_SOLDIERS; oppID++) + { + if (gbPublicOpplist[pSoldier->bTeam][oppID] != NOT_HEARD_OR_SEEN && + !MercPtrs[oppID]->aiData.bNeutral) + { + swprintf(pStrInfo, L"%s[%d] %s %s\n", pStrInfo, oppID, MercPtrs[oppID]->GetName(), SeenStr(gbPublicOpplist[pSoldier->bTeam][oppID])); + } + } + swprintf(pStrInfo, L"%s---Soldier list (not neutral)---\n", pStrInfo); + for (UINT16 oppID = 0; oppID < MAX_NUM_SOLDIERS; oppID++) + { + if (pSoldier->aiData.bOppList[oppID] != NOT_HEARD_OR_SEEN && + !MercPtrs[oppID]->aiData.bNeutral) + { + swprintf(pStrInfo, L"%s[%d] %s %s\n", pStrInfo, oppID, MercPtrs[oppID]->GetName(), SeenStr(pSoldier->aiData.bOppList[oppID])); + } + } + swprintf(pStrInfo, L"%s|What I know %d\n", pStrInfo, WhatIKnowThatPublicDont(pSoldier, FALSE)); + + swprintf(pStrInfo, L"%s \n", pStrInfo); + } + + // WANNE: Check if enemy soldier is in line of sight but only if player has not chosen debug details if ( ubTooltipDetailLevel < DL_Full) { // Get the current selected merc @@ -218,8 +331,7 @@ void SoldierTooltip( SOLDIERTYPE* pSoldier ) return; } } - - swprintf( pStrInfo, L"" ); + if ( ubTooltipDetailLevel == DL_Debug ) { // display "debug" info