Fix FindBestNearbyCover() and delete global var (#156)

This commit is contained in:
rftrdev
2023-05-26 21:28:00 -07:00
committed by GitHub
parent f2ab296b49
commit 119c6fe6bb
6 changed files with 30 additions and 29 deletions
+1 -2
View File
@@ -174,7 +174,6 @@ extern THREATTYPE Threat[MAXMERCS];
extern int ThreatPercent[10]; extern int ThreatPercent[10];
extern UINT8 SkipCoverCheck; extern UINT8 SkipCoverCheck;
extern INT8 GameOption[MAXGAMEOPTIONS]; extern INT8 GameOption[MAXGAMEOPTIONS];
extern UINT32 guiThreatCnt;
typedef enum typedef enum
{ {
@@ -322,4 +321,4 @@ BOOLEAN GetBestAoEGridNo(SOLDIERTYPE *pSoldier, INT32* pGridNo, INT16 aRadius, U
BOOLEAN GetFarthestOpponent(SOLDIERTYPE *pSoldier, UINT8* puID, INT16 sRange); BOOLEAN GetFarthestOpponent(SOLDIERTYPE *pSoldier, UINT8* puID, INT16 sRange);
// are there more allies than friends in adjacent sectors? // are there more allies than friends in adjacent sectors?
BOOLEAN MoreFriendsThanEnemiesinNearbysectors(UINT8 ausTeam, INT16 aX, INT16 aY, INT8 aZ); BOOLEAN MoreFriendsThanEnemiesinNearbysectors(UINT8 ausTeam, INT16 aX, INT16 aY, INT8 aZ);
-1
View File
@@ -1430,7 +1430,6 @@ void ActionDone(SOLDIERTYPE *pSoldier)
UINT8 SkipCoverCheck = FALSE; UINT8 SkipCoverCheck = FALSE;
THREATTYPE Threat[MAXMERCS]; THREATTYPE Threat[MAXMERCS];
UINT32 guiThreatCnt = 0;
// threat percentage is based on the certainty of opponent knowledge: // threat percentage is based on the certainty of opponent knowledge:
// opplist value: -4 -3 -2 -1 SEEN 1 2 3 4 5 // opplist value: -4 -3 -2 -1 SEEN 1 2 3 4 5
+21 -19
View File
@@ -5938,7 +5938,7 @@ INT32 RandomizeOpponentLocation(INT32 sSpot, SOLDIERTYPE *pOpponent, INT16 sMaxD
} }
// first call PrepareThreatlist to make threat list // first call PrepareThreatlist to make threat list
UINT8 ClosestKnownThreatID(SOLDIERTYPE *pSoldier) UINT8 ClosestKnownThreatID(SOLDIERTYPE *pSoldier, UINT32 uiThreatCnt)
{ {
CHECKF(pSoldier); CHECKF(pSoldier);
@@ -5948,7 +5948,7 @@ UINT8 ClosestKnownThreatID(SOLDIERTYPE *pSoldier)
UINT8 ubClosestOpponentID = NOBODY; UINT8 ubClosestOpponentID = NOBODY;
// use global defined threat list // 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 for some reason we have incorrect location
if (TileIsOutOfBounds(Threat[uiLoop].sGridNo)) if (TileIsOutOfBounds(Threat[uiLoop].sGridNo))
@@ -5968,7 +5968,7 @@ UINT8 ClosestKnownThreatID(SOLDIERTYPE *pSoldier)
} }
// first call PrepareThreatlist to make threat list // first call PrepareThreatlist to make threat list
UINT8 ClosestSeenThreatID(SOLDIERTYPE *pSoldier, UINT8 ubMax) UINT8 ClosestSeenThreatID(SOLDIERTYPE *pSoldier, UINT32 uiThreatCnt, UINT8 ubMax)
{ {
CHECKF(pSoldier); CHECKF(pSoldier);
@@ -5978,7 +5978,7 @@ UINT8 ClosestSeenThreatID(SOLDIERTYPE *pSoldier, UINT8 ubMax)
UINT8 ubClosestOpponentID = NOBODY; UINT8 ubClosestOpponentID = NOBODY;
// use global defined threat list // 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 for some reason we have incorrect location
if (TileIsOutOfBounds(Threat[uiLoop].sGridNo)) if (TileIsOutOfBounds(Threat[uiLoop].sGridNo))
@@ -6001,7 +6001,7 @@ UINT8 ClosestSeenThreatID(SOLDIERTYPE *pSoldier, UINT8 ubMax)
return(ubClosestOpponentID); return(ubClosestOpponentID);
} }
void PrepareThreatlist(SOLDIERTYPE *pSoldier) UINT32 PrepareThreatlist(SOLDIERTYPE *pSoldier)
{ {
SOLDIERTYPE *pOpponent; SOLDIERTYPE *pOpponent;
INT32 iThreatRange, iClosestThreatRange = 1500; INT32 iThreatRange, iClosestThreatRange = 1500;
@@ -6014,10 +6014,10 @@ void PrepareThreatlist(SOLDIERTYPE *pSoldier)
INT32 iThreatCertainty; INT32 iThreatCertainty;
INT32 iMaxThreatRange = MAX_THREAT_RANGE + AI_PATHCOST_RADIUS; INT32 iMaxThreatRange = MAX_THREAT_RANGE + AI_PATHCOST_RADIUS;
guiThreatCnt = 0; UINT32 uiThreatCnt = 0;
if (!pSoldier) if (!pSoldier)
return; return 0;
// look through all opponents for those we know of // look through all opponents for those we know of
for (uiLoop = 0; uiLoop < guiNumMercSlots; uiLoop++) 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! // 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 the opponent is no threat at all for some reason
if (Threat[guiThreatCnt].iValue == -999) if (Threat[uiThreatCnt].iValue == -999)
{ {
continue; // check next opponent continue; // check next opponent
} }
Threat[guiThreatCnt].pOpponent = pOpponent; Threat[uiThreatCnt].pOpponent = pOpponent;
Threat[guiThreatCnt].sGridNo = sThreatLoc; Threat[uiThreatCnt].sGridNo = sThreatLoc;
Threat[guiThreatCnt].iCertainty = iThreatCertainty; Threat[uiThreatCnt].iCertainty = iThreatCertainty;
Threat[guiThreatCnt].iOrigRange = iThreatRange; Threat[uiThreatCnt].iOrigRange = iThreatRange;
// calculate how many APs he will have at the start of the next turn // 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 // sevenfm: more information
Threat[guiThreatCnt].bLevel = bThreatLevel; Threat[uiThreatCnt].bLevel = bThreatLevel;
Threat[guiThreatCnt].bKnowledge = bKnowledge; Threat[uiThreatCnt].bKnowledge = bKnowledge;
Threat[guiThreatCnt].bPersonalKnowledge = bPersonalKnowledge; Threat[uiThreatCnt].bPersonalKnowledge = bPersonalKnowledge;
Threat[guiThreatCnt].bPublicKnowledge = bPublicKnowledge; Threat[uiThreatCnt].bPublicKnowledge = bPublicKnowledge;
if (iThreatRange < iClosestThreatRange) if (iThreatRange < iClosestThreatRange)
{ {
iClosestThreatRange = iThreatRange; iClosestThreatRange = iThreatRange;
} }
guiThreatCnt++; uiThreatCnt++;
} }
return uiThreatCnt;
} }
UINT8 CountPublicKnownEnemies(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 sDistance) UINT8 CountPublicKnownEnemies(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 sDistance)
+4 -3
View File
@@ -3755,6 +3755,7 @@ void CheckTossSelfSmoke(SOLDIERTYPE *pSoldier, ATTACKTYPE *pBestThrow)
{ {
INT16 ubMinAPcost; INT16 ubMinAPcost;
INT8 bGrenadeIn = NO_SLOT; INT8 bGrenadeIn = NO_SLOT;
UINT32 uiThreatCnt = 0;
// initialize // initialize
pBestThrow->ubPossible = FALSE; pBestThrow->ubPossible = FALSE;
@@ -3771,7 +3772,7 @@ void CheckTossSelfSmoke(SOLDIERTYPE *pSoldier, ATTACKTYPE *pBestThrow)
bGrenadeIn = FindThrowableGrenade(pSoldier, EXPLOSV_SMOKE); bGrenadeIn = FindThrowableGrenade(pSoldier, EXPLOSV_SMOKE);
// prepare threat list for ClosestSeenThreatID(), ClosestKnownThreatID() // prepare threat list for ClosestSeenThreatID(), ClosestKnownThreatID()
PrepareThreatlist(pSoldier); uiThreatCnt = PrepareThreatlist(pSoldier);
if (bGrenadeIn != NO_SLOT) if (bGrenadeIn != NO_SLOT)
{ {
@@ -3812,7 +3813,7 @@ void CheckTossSelfSmoke(SOLDIERTYPE *pSoldier, ATTACKTYPE *pBestThrow)
if (TileIsOutOfBounds(sTargetSpot)) if (TileIsOutOfBounds(sTargetSpot))
{ {
ubClosestThreatID = ClosestSeenThreatID(pSoldier, SEEN_LAST_TURN); ubClosestThreatID = ClosestSeenThreatID(pSoldier, uiThreatCnt, SEEN_LAST_TURN);
if (ubClosestThreatID != NOBODY && if (ubClosestThreatID != NOBODY &&
MercPtrs[ubClosestThreatID] && MercPtrs[ubClosestThreatID] &&
@@ -3826,7 +3827,7 @@ void CheckTossSelfSmoke(SOLDIERTYPE *pSoldier, ATTACKTYPE *pBestThrow)
if (TileIsOutOfBounds(sTargetSpot)) if (TileIsOutOfBounds(sTargetSpot))
{ {
ubClosestThreatID = ClosestKnownThreatID(pSoldier); ubClosestThreatID = ClosestKnownThreatID(pSoldier, uiThreatCnt);
if (ubClosestThreatID != NOBODY && if (ubClosestThreatID != NOBODY &&
MercPtrs[ubClosestThreatID] && MercPtrs[ubClosestThreatID] &&
+1 -1
View File
@@ -753,7 +753,7 @@ INT32 FindBestNearbyCover(SOLDIERTYPE *pSoldier, INT32 morale, INT32 *piPercentB
iMyThreatValue = CalcManThreatValue(pSoldier, NOWHERE, FALSE, pSoldier); iMyThreatValue = CalcManThreatValue(pSoldier, NOWHERE, FALSE, pSoldier);
// prepare threat list from known enemies // 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 no known opponents were found to threaten us, can't worry about cover
if (!uiThreatCnt) if (!uiThreatCnt)
+3 -3
View File
@@ -314,9 +314,9 @@ BOOLEAN AICheckFriendsNoContact( SOLDIERTYPE *pSoldier );
BOOLEAN AICheckIsFlanking( SOLDIERTYPE *pSoldier ); BOOLEAN AICheckIsFlanking( SOLDIERTYPE *pSoldier );
INT8 CalcMoraleNew(SOLDIERTYPE *pSoldier); INT8 CalcMoraleNew(SOLDIERTYPE *pSoldier);
void PrepareThreatlist(SOLDIERTYPE *pSoldier); UINT32 PrepareThreatlist(SOLDIERTYPE *pSoldier);
UINT8 ClosestSeenThreatID(SOLDIERTYPE *pSoldier, UINT8 ubMax = SEEN_CURRENTLY); // first call PrepareThreatlist to make threat list UINT8 ClosestSeenThreatID(SOLDIERTYPE *pSoldier, UINT32 uiThreatCnt, UINT8 ubMax = SEEN_CURRENTLY); // first call PrepareThreatlist to make threat list
UINT8 ClosestKnownThreatID(SOLDIERTYPE *pSoldier); // 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 ProneSightCoverAtSpot(SOLDIERTYPE *pSoldier, INT32 sSpot, BOOLEAN fUnlimited);
BOOLEAN SightCoverAtSpot(SOLDIERTYPE *pSoldier, INT32 sSpot, BOOLEAN fUnlimited); BOOLEAN SightCoverAtSpot(SOLDIERTYPE *pSoldier, INT32 sSpot, BOOLEAN fUnlimited);