From 119c6fe6bbac3be63520879b940b9fc6aee1b62d Mon Sep 17 00:00:00 2001 From: rftrdev <102184004+rftrdev@users.noreply.github.com> Date: Fri, 26 May 2023 21:28:00 -0700 Subject: [PATCH] Fix FindBestNearbyCover() and delete global var (#156) --- TacticalAI/AIInternals.h | 3 +-- TacticalAI/AIMain.cpp | 1 - TacticalAI/AIUtils.cpp | 40 +++++++++++++++++++----------------- TacticalAI/Attacks.cpp | 7 ++++--- TacticalAI/FindLocations.cpp | 2 +- TacticalAI/ai.h | 6 +++--- 6 files changed, 30 insertions(+), 29 deletions(-) diff --git a/TacticalAI/AIInternals.h b/TacticalAI/AIInternals.h index cc7afa94..1e72dedc 100644 --- a/TacticalAI/AIInternals.h +++ b/TacticalAI/AIInternals.h @@ -174,7 +174,6 @@ extern THREATTYPE Threat[MAXMERCS]; extern int ThreatPercent[10]; extern UINT8 SkipCoverCheck; extern INT8 GameOption[MAXGAMEOPTIONS]; -extern UINT32 guiThreatCnt; typedef enum { @@ -322,4 +321,4 @@ BOOLEAN GetBestAoEGridNo(SOLDIERTYPE *pSoldier, INT32* pGridNo, INT16 aRadius, U BOOLEAN GetFarthestOpponent(SOLDIERTYPE *pSoldier, UINT8* puID, INT16 sRange); // are there more allies than friends in adjacent sectors? -BOOLEAN MoreFriendsThanEnemiesinNearbysectors(UINT8 ausTeam, INT16 aX, INT16 aY, INT8 aZ); \ No newline at end of file +BOOLEAN MoreFriendsThanEnemiesinNearbysectors(UINT8 ausTeam, INT16 aX, INT16 aY, INT8 aZ); diff --git a/TacticalAI/AIMain.cpp b/TacticalAI/AIMain.cpp index b195326e..f60ab755 100644 --- a/TacticalAI/AIMain.cpp +++ b/TacticalAI/AIMain.cpp @@ -1430,7 +1430,6 @@ void ActionDone(SOLDIERTYPE *pSoldier) UINT8 SkipCoverCheck = FALSE; THREATTYPE Threat[MAXMERCS]; -UINT32 guiThreatCnt = 0; // threat percentage is based on the certainty of opponent knowledge: // opplist value: -4 -3 -2 -1 SEEN 1 2 3 4 5 diff --git a/TacticalAI/AIUtils.cpp b/TacticalAI/AIUtils.cpp index a511bc89..2f947a9f 100644 --- a/TacticalAI/AIUtils.cpp +++ b/TacticalAI/AIUtils.cpp @@ -5938,7 +5938,7 @@ INT32 RandomizeOpponentLocation(INT32 sSpot, SOLDIERTYPE *pOpponent, INT16 sMaxD } // first call PrepareThreatlist to make threat list -UINT8 ClosestKnownThreatID(SOLDIERTYPE *pSoldier) +UINT8 ClosestKnownThreatID(SOLDIERTYPE *pSoldier, UINT32 uiThreatCnt) { CHECKF(pSoldier); @@ -5948,7 +5948,7 @@ UINT8 ClosestKnownThreatID(SOLDIERTYPE *pSoldier) UINT8 ubClosestOpponentID = NOBODY; // use global defined threat list - for (uiLoop = 0; uiLoop < guiThreatCnt; uiLoop++) + for (uiLoop = 0; uiLoop < uiThreatCnt; uiLoop++) { // if for some reason we have incorrect location if (TileIsOutOfBounds(Threat[uiLoop].sGridNo)) @@ -5968,7 +5968,7 @@ UINT8 ClosestKnownThreatID(SOLDIERTYPE *pSoldier) } // first call PrepareThreatlist to make threat list -UINT8 ClosestSeenThreatID(SOLDIERTYPE *pSoldier, UINT8 ubMax) +UINT8 ClosestSeenThreatID(SOLDIERTYPE *pSoldier, UINT32 uiThreatCnt, UINT8 ubMax) { CHECKF(pSoldier); @@ -5978,7 +5978,7 @@ UINT8 ClosestSeenThreatID(SOLDIERTYPE *pSoldier, UINT8 ubMax) UINT8 ubClosestOpponentID = NOBODY; // use global defined threat list - for (uiLoop = 0; uiLoop < guiThreatCnt; uiLoop++) + for (uiLoop = 0; uiLoop < uiThreatCnt; uiLoop++) { // if for some reason we have incorrect location if (TileIsOutOfBounds(Threat[uiLoop].sGridNo)) @@ -6001,7 +6001,7 @@ UINT8 ClosestSeenThreatID(SOLDIERTYPE *pSoldier, UINT8 ubMax) return(ubClosestOpponentID); } -void PrepareThreatlist(SOLDIERTYPE *pSoldier) +UINT32 PrepareThreatlist(SOLDIERTYPE *pSoldier) { SOLDIERTYPE *pOpponent; INT32 iThreatRange, iClosestThreatRange = 1500; @@ -6014,10 +6014,10 @@ void PrepareThreatlist(SOLDIERTYPE *pSoldier) INT32 iThreatCertainty; INT32 iMaxThreatRange = MAX_THREAT_RANGE + AI_PATHCOST_RADIUS; - guiThreatCnt = 0; + UINT32 uiThreatCnt = 0; if (!pSoldier) - return; + return 0; // look through all opponents for those we know of for (uiLoop = 0; uiLoop < guiNumMercSlots; uiLoop++) @@ -6065,35 +6065,37 @@ void PrepareThreatlist(SOLDIERTYPE *pSoldier) } // remember this opponent as a current threat, but DON'T REDUCE FOR COVER! - Threat[guiThreatCnt].iValue = CalcManThreatValue(pOpponent, pSoldier->sGridNo, FALSE, pSoldier); + Threat[uiThreatCnt].iValue = CalcManThreatValue(pOpponent, pSoldier->sGridNo, FALSE, pSoldier); // if the opponent is no threat at all for some reason - if (Threat[guiThreatCnt].iValue == -999) + if (Threat[uiThreatCnt].iValue == -999) { continue; // check next opponent } - Threat[guiThreatCnt].pOpponent = pOpponent; - Threat[guiThreatCnt].sGridNo = sThreatLoc; - Threat[guiThreatCnt].iCertainty = iThreatCertainty; - Threat[guiThreatCnt].iOrigRange = iThreatRange; + Threat[uiThreatCnt].pOpponent = pOpponent; + Threat[uiThreatCnt].sGridNo = sThreatLoc; + Threat[uiThreatCnt].iCertainty = iThreatCertainty; + Threat[uiThreatCnt].iOrigRange = iThreatRange; // calculate how many APs he will have at the start of the next turn - Threat[guiThreatCnt].iAPs = pOpponent->CalcActionPoints(); + Threat[uiThreatCnt].iAPs = pOpponent->CalcActionPoints(); // sevenfm: more information - Threat[guiThreatCnt].bLevel = bThreatLevel; - Threat[guiThreatCnt].bKnowledge = bKnowledge; - Threat[guiThreatCnt].bPersonalKnowledge = bPersonalKnowledge; - Threat[guiThreatCnt].bPublicKnowledge = bPublicKnowledge; + Threat[uiThreatCnt].bLevel = bThreatLevel; + Threat[uiThreatCnt].bKnowledge = bKnowledge; + Threat[uiThreatCnt].bPersonalKnowledge = bPersonalKnowledge; + Threat[uiThreatCnt].bPublicKnowledge = bPublicKnowledge; if (iThreatRange < iClosestThreatRange) { iClosestThreatRange = iThreatRange; } - guiThreatCnt++; + uiThreatCnt++; } + + return uiThreatCnt; } UINT8 CountPublicKnownEnemies(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 sDistance) diff --git a/TacticalAI/Attacks.cpp b/TacticalAI/Attacks.cpp index 2b77b69f..d84d2668 100644 --- a/TacticalAI/Attacks.cpp +++ b/TacticalAI/Attacks.cpp @@ -3755,6 +3755,7 @@ void CheckTossSelfSmoke(SOLDIERTYPE *pSoldier, ATTACKTYPE *pBestThrow) { INT16 ubMinAPcost; INT8 bGrenadeIn = NO_SLOT; + UINT32 uiThreatCnt = 0; // initialize pBestThrow->ubPossible = FALSE; @@ -3771,7 +3772,7 @@ void CheckTossSelfSmoke(SOLDIERTYPE *pSoldier, ATTACKTYPE *pBestThrow) bGrenadeIn = FindThrowableGrenade(pSoldier, EXPLOSV_SMOKE); // prepare threat list for ClosestSeenThreatID(), ClosestKnownThreatID() - PrepareThreatlist(pSoldier); + uiThreatCnt = PrepareThreatlist(pSoldier); if (bGrenadeIn != NO_SLOT) { @@ -3812,7 +3813,7 @@ void CheckTossSelfSmoke(SOLDIERTYPE *pSoldier, ATTACKTYPE *pBestThrow) if (TileIsOutOfBounds(sTargetSpot)) { - ubClosestThreatID = ClosestSeenThreatID(pSoldier, SEEN_LAST_TURN); + ubClosestThreatID = ClosestSeenThreatID(pSoldier, uiThreatCnt, SEEN_LAST_TURN); if (ubClosestThreatID != NOBODY && MercPtrs[ubClosestThreatID] && @@ -3826,7 +3827,7 @@ void CheckTossSelfSmoke(SOLDIERTYPE *pSoldier, ATTACKTYPE *pBestThrow) if (TileIsOutOfBounds(sTargetSpot)) { - ubClosestThreatID = ClosestKnownThreatID(pSoldier); + ubClosestThreatID = ClosestKnownThreatID(pSoldier, uiThreatCnt); if (ubClosestThreatID != NOBODY && MercPtrs[ubClosestThreatID] && diff --git a/TacticalAI/FindLocations.cpp b/TacticalAI/FindLocations.cpp index 826c45c6..37fcd984 100644 --- a/TacticalAI/FindLocations.cpp +++ b/TacticalAI/FindLocations.cpp @@ -753,7 +753,7 @@ INT32 FindBestNearbyCover(SOLDIERTYPE *pSoldier, INT32 morale, INT32 *piPercentB iMyThreatValue = CalcManThreatValue(pSoldier, NOWHERE, FALSE, pSoldier); // prepare threat list from known enemies - PrepareThreatlist(pSoldier); + uiThreatCnt = PrepareThreatlist(pSoldier); // if no known opponents were found to threaten us, can't worry about cover if (!uiThreatCnt) diff --git a/TacticalAI/ai.h b/TacticalAI/ai.h index c30be8cb..c97d1936 100644 --- a/TacticalAI/ai.h +++ b/TacticalAI/ai.h @@ -314,9 +314,9 @@ BOOLEAN AICheckFriendsNoContact( SOLDIERTYPE *pSoldier ); BOOLEAN AICheckIsFlanking( SOLDIERTYPE *pSoldier ); INT8 CalcMoraleNew(SOLDIERTYPE *pSoldier); -void PrepareThreatlist(SOLDIERTYPE *pSoldier); -UINT8 ClosestSeenThreatID(SOLDIERTYPE *pSoldier, UINT8 ubMax = SEEN_CURRENTLY); // first call PrepareThreatlist to make threat list -UINT8 ClosestKnownThreatID(SOLDIERTYPE *pSoldier); // first call PrepareThreatlist to make threat list +UINT32 PrepareThreatlist(SOLDIERTYPE *pSoldier); +UINT8 ClosestSeenThreatID(SOLDIERTYPE *pSoldier, UINT32 uiThreatCnt, UINT8 ubMax = SEEN_CURRENTLY); // first call PrepareThreatlist to make threat list +UINT8 ClosestKnownThreatID(SOLDIERTYPE *pSoldier, UINT32 uiThreatCnt); // first call PrepareThreatlist to make threat list BOOLEAN ProneSightCoverAtSpot(SOLDIERTYPE *pSoldier, INT32 sSpot, BOOLEAN fUnlimited); BOOLEAN SightCoverAtSpot(SOLDIERTYPE *pSoldier, INT32 sSpot, BOOLEAN fUnlimited);