Adjusted base node definitions

This commit is contained in:
RGreenlees 2024-01-18 22:51:04 +00:00 committed by pierow
parent bb810972c5
commit f59de3b88f
2 changed files with 76 additions and 2 deletions

View file

@ -670,7 +670,6 @@ void AITAC_PopulateHiveData()
if (NearestNode) if (NearestNode)
{ {
NewHive.HiveResNodeRef = NearestNode; NewHive.HiveResNodeRef = NearestNode;
NearestNode->bIsBaseNode = true;
NearestNode->ParentHive = NewHive.HiveEntity->edict(); NearestNode->ParentHive = NewHive.HiveEntity->edict();
} }
@ -719,6 +718,11 @@ void AITAC_RefreshHiveData()
it->OwningTeam = CurrentOwningTeam; it->OwningTeam = CurrentOwningTeam;
it->Status = CurrentStatus; it->Status = CurrentStatus;
if (it->HiveResNodeRef)
{
it->HiveResNodeRef->bIsBaseNode = (it->Status != HIVE_STATUS_UNBUILT);
}
if (it->Status != HIVE_STATUS_UNBUILT && it->ObstacleRefs[REGULAR_NAV_MESH] == 0) if (it->Status != HIVE_STATUS_UNBUILT && it->ObstacleRefs[REGULAR_NAV_MESH] == 0)
{ {
UTIL_AddTemporaryObstacles(UTIL_GetCentreOfEntity(it->HiveEntity->edict()) - Vector(0.0f, 0.0f, 25.0f), 125.0f, 300.0f, DT_AREA_NULL, it->ObstacleRefs); UTIL_AddTemporaryObstacles(UTIL_GetCentreOfEntity(it->HiveEntity->edict()) - Vector(0.0f, 0.0f, 25.0f), 125.0f, 300.0f, DT_AREA_NULL, it->ObstacleRefs);
@ -835,11 +839,48 @@ Vector AITAC_GetTeamStartingLocation(AvHTeamNumber Team)
// Update reachabilities since team starting points have been modified // Update reachabilities since team starting points have been modified
bNavMeshModified = true; bNavMeshModified = true;
AITAC_OnTeamStartsModified();
} }
return (Team == GetGameRules()->GetTeamANumber()) ? TeamAStartingLocation : TeamBStartingLocation; return (Team == GetGameRules()->GetTeamANumber()) ? TeamAStartingLocation : TeamBStartingLocation;
} }
void AITAC_OnTeamStartsModified()
{
AvHTeamNumber TeamANum = GetGameRules()->GetTeamANumber();
AvHTeamNumber TeamBNum = GetGameRules()->GetTeamBNumber();
bool bTeamAIsMarine = (AIMGR_GetTeamType(TeamANum) == AVH_CLASS_TYPE_MARINE);
bool bTeamBIsMarine = (AIMGR_GetTeamType(TeamBNum) == AVH_CLASS_TYPE_MARINE);
if (!bTeamAIsMarine && !bTeamBIsMarine) { return; }
AvHAIResourceNode* TeamAMarineNode = nullptr;
AvHAIResourceNode* TeamBMarineNode = nullptr;
if (bTeamAIsMarine)
{
TeamAMarineNode = AITAC_GetNearestResourceNodeToLocation(TeamAStartingLocation);
}
if (bTeamBIsMarine)
{
TeamBMarineNode = AITAC_GetNearestResourceNodeToLocation(TeamBStartingLocation);
}
vector<AvHAIResourceNode*> AllNodes = AITAC_GetAllResourceNodes();
for (auto it = AllNodes.begin(); it != AllNodes.end(); it++)
{
AvHAIResourceNode* ThisNode = (*it);
if (!ThisNode) { continue; }
ThisNode->bIsBaseNode = (!ThisNode->ParentHive) && (ThisNode == TeamAMarineNode || ThisNode == TeamBMarineNode);
}
}
Vector AITAC_GetCommChairLocation(AvHTeamNumber Team) Vector AITAC_GetCommChairLocation(AvHTeamNumber Team)
{ {
if (Team != TEAM_IND) if (Team != TEAM_IND)
@ -3451,7 +3492,22 @@ edict_t* AITAC_GetNearestHiddenPlayerInLocation(AvHTeamNumber Team, const Vector
return Result; return Result;
} }
const vector<AvHAIResourceNode*> AITAC_GetAllReachableResourceNodes(AvHTeamNumber Team)
{
vector<AvHAIResourceNode*> Results;
for (auto it = ResourceNodes.begin(); it != ResourceNodes.end(); it++)
{
unsigned int CheckReachabilityFlags = (Team == GetGameRules()->GetTeamANumber()) ? it->TeamAReachabilityFlags : it->TeamBReachabilityFlags;
if (CheckReachabilityFlags != AI_REACHABILITY_UNREACHABLE && CheckReachabilityFlags != AI_REACHABILITY_NONE)
{
Results.push_back(&(*it));
}
}
return Results;
}
const vector<AvHAIResourceNode*> AITAC_GetAllResourceNodes() const vector<AvHAIResourceNode*> AITAC_GetAllResourceNodes()
{ {
@ -3641,7 +3697,22 @@ bool AITAC_IsAlienCapperNeeded(AvHAIPlayer* pBot)
AvHTeamNumber BotTeam = pBot->Player->GetTeam(); AvHTeamNumber BotTeam = pBot->Player->GetTeam();
AvHTeamNumber EnemyTeam = AIMGR_GetEnemyTeam(BotTeam); AvHTeamNumber EnemyTeam = AIMGR_GetEnemyTeam(BotTeam);
float ResNodeOwnership = AITAC_GetTeamResNodeOwnership(BotTeam, true); int NumOwnedNodes = 0;
int NumEnemyNodes = 0;
int NumEligibleNodes = 0;
vector<AvHAIResourceNode*> AllNodes = AITAC_GetAllReachableResourceNodes(BotTeam);
for (auto it = AllNodes.begin(); it != AllNodes.end(); it++)
{
AvHAIResourceNode* ThisNode = (*it);
if (ThisNode->OwningTeam == BotTeam) { NumOwnedNodes++; }
if (ThisNode->OwningTeam == EnemyTeam) { NumEnemyNodes++; }
if (ThisNode->OwningTeam != EnemyTeam || !ThisNode->bIsBaseNode) { NumEligibleNodes++; }
}
float ResNodeOwnership = (float)NumOwnedNodes / (float)NumEligibleNodes;
if (ResNodeOwnership > 0.6f) { return false; } if (ResNodeOwnership > 0.6f) { return false; }

View file

@ -156,6 +156,7 @@ edict_t* AITAC_GetMarineEligibleToBuildSiege(AvHTeamNumber Team, const AvHAIHive
edict_t* AITAC_GetNearestHiddenPlayerInLocation(AvHTeamNumber Team, const Vector Location, const float MaxRadius); edict_t* AITAC_GetNearestHiddenPlayerInLocation(AvHTeamNumber Team, const Vector Location, const float MaxRadius);
const vector<AvHAIResourceNode*> AITAC_GetAllResourceNodes(); const vector<AvHAIResourceNode*> AITAC_GetAllResourceNodes();
const vector<AvHAIResourceNode*> AITAC_GetAllReachableResourceNodes(AvHTeamNumber Team);
const vector<AvHAIHiveDefinition*> AITAC_GetAllHives(); const vector<AvHAIHiveDefinition*> AITAC_GetAllHives();
const vector<AvHAIHiveDefinition*> AITAC_GetAllTeamHives(AvHTeamNumber Team); const vector<AvHAIHiveDefinition*> AITAC_GetAllTeamHives(AvHTeamNumber Team);
@ -169,4 +170,6 @@ bool AITAC_ShouldBotBuildHive(AvHAIPlayer* pBot, AvHAIHiveDefinition** EligibleH
AvHAIDeployableStructureType AITAC_GetNextMissingUpgradeChamberForTeam(AvHTeamNumber Team); AvHAIDeployableStructureType AITAC_GetNextMissingUpgradeChamberForTeam(AvHTeamNumber Team);
void AITAC_OnTeamStartsModified();
#endif #endif