Quote:
Originally Posted by botnavigate.cpp
Code:
int BotFindGoal (bot_t *pBot)
// Chooses a Destination (Goal) Waypoint for a Bot
int iTactic;
int iOffensive;
int iDefensive;
int iGoalDesire;
int iForwardDesire;
int iCampDesire;
int iBackoffDesire;
int iTacticChoice;
int *pOffensiveWPTS = NULL;
int iNumOffensives;
int *pDefensiveWPTS = NULL;
int iNumDefensives;
bool bHasHostage = BotHasHostage (pBot);
int index;
int min_index;
float distance;
float min_distance;
int iGoalChoices[4];
float iGoalDistances[4];
edict_t *pEdict;
int iBotIndex = pBot->curr_wpt_index; // KWo - 14.02.2006
int iTestIndex; // KWo - 14.02.2006
bool bSorting; // KWo - 14.02.2006
bool bGoalNearby = false; // KWo - 12.02.2006
int iClosestGoalIndex = -1; // KWo - 12.02.2006
int iRescueIndex; // KWo - 24.12.2206
pEdict = pBot->pEdict;
// if there is debugoal enabled - return the index of the debugged goal
if (g_iDebugGoalIndex != -1) // KWo - 25.07.2006
{
pBot->chosengoal_index = g_iDebugGoalIndex;
return (g_iDebugGoalIndex);
}
// Pathfinding Behaviour depending on Maptype
if (pBot->bot_team == TEAM_CS_TERRORIST)
{
pOffensiveWPTS = &g_rgiCTWaypoints[0];
iNumOffensives = g_iNumCTPoints;
pDefensiveWPTS = &g_rgiTerrorWaypoints[0];
iNumDefensives = g_iNumTerrorPoints;
}
else
{
pOffensiveWPTS = &g_rgiTerrorWaypoints[0];
iNumOffensives = g_iNumTerrorPoints;
pDefensiveWPTS = &g_rgiCTWaypoints[0];
iNumDefensives = g_iNumCTPoints;
}
// Terrorist carrying the C4 ?
if ((pBot->pEdict->v.weapons & (1 << CS_WEAPON_C4))
|| pBot->bIsVIP)
{
iTactic = 3;
goto tacticchosen;
}
else if (bHasHostage && (pBot->bot_team == TEAM_CS_COUNTER))
{
min_distance = 9999;
min_index = -1;
for (index = 0; index < g_iNumRescuePoints; index++) // KWo - 24.12.2006
{
iRescueIndex = g_rgiRescueWaypoints[index];
distance = (paths[iRescueIndex]->origin - pEdict->v.origin).Length();
if (distance < min_distance)
{
min_distance = distance;
min_index = index;
}
}
if (min_index != -1)
{
pBot->chosengoal_index = g_rgiRescueWaypoints[min_index]; // KWo - 27.02.2007
if (pBot->chosengoal_index != pBot->curr_wpt_index) // KWo - 27.02.2007
pBot->fTimeHostageRescue = 0.0;
// ALERT(at_logged, "[DEBUG] BotFindGoal - Bot's %s has a hostage and chose a goal = %d, flags = %d.\n", pBot->name, pBot->chosengoal_index, paths[pBot->chosengoal_index]->flags);
return (g_rgiRescueWaypoints[min_index]);
}
}
iOffensive = (int) pBot->fAgressionLevel * 100;
iDefensive = (int) pBot->fFearLevel * 100;
// ALERT(at_logged, "[DEBUG] BotFindGoal - Bot's %s AgressionLevel = %f, FearLevel = %f.\n", pBot->name, pBot->fAgressionLevel, pBot->fFearLevel);
if ((g_iMapType & MAP_AS) || (g_iMapType & MAP_CS))
{
if (pBot->bot_team == TEAM_CS_TERRORIST)
{
iDefensive += 30;
iOffensive -= 30;
}
else // KWo - 27.06.2006
{
iDefensive -= 30;
iOffensive += 30;
}
}
if (g_iMapType & MAP_DE)
{
if (pBot->bot_team == TEAM_CS_COUNTER)
{
if (g_bBombPlanted)
{
if ((g_b_cv_chat) && (g_bBombSayString)) // KWo - 06.04.2006
{
BotPrepareChatMessage (pBot, szBombChat[RANDOM_LONG (0, iNumBombChats - 1)]);
BotPushMessageQueue (pBot, MSG_CS_SAY);
g_bBombSayString = FALSE;
}
int iTemp = BotChooseBombWaypoint (pBot); // KWo - 27.06.2006
pBot->chosengoal_index = iTemp; // KWo - 27.06.2006
return (iTemp); // KWo - 27.06.2006
}
iDefensive += 30;
iOffensive -= 30;
}
else // KWo - 27.06.2006
{
iDefensive -= 30;
iOffensive += 30;
}
}
/*
iGoalDesire = RANDOM_LONG (0, 100) + iOffensive;
iForwardDesire = RANDOM_LONG (0, 100) + iOffensive;
iCampDesire = RANDOM_LONG (0, 100) + iDefensive;
iBackoffDesire = RANDOM_LONG (0, 100) + iDefensive;
*/
iGoalDesire = RANDOM_LONG (0, 70) + iOffensive;
iForwardDesire = RANDOM_LONG (0, 50) + iOffensive;
iCampDesire = RANDOM_LONG (0, 70) + iDefensive;
iBackoffDesire = RANDOM_LONG (0, 50) + iDefensive;
if (!BotHasSniperWeapon(pBot) && !BotHasRifleWeapon(pBot)) // KWo - 27.02.2007
iCampDesire = 0;
else if (BotHasSniperWeapon(pBot))
iCampDesire = (int)(RANDOM_FLOAT(1.5,2.5) * (float)(iCampDesire));
// ALERT(at_logged, "[DEBUG] BotFindGoal - Bot's %s GoalDesire = %d, ForwardDesire = %d, iCampDesire = %d, iBackoffDesire = %d.\n", pBot->name, iGoalDesire, iForwardDesire, iCampDesire, iBackoffDesire);
iTacticChoice = iBackoffDesire;
iTactic = 0;
if (iCampDesire > iTacticChoice)
{
iTacticChoice = iCampDesire;
iTactic = 1;
}
if (iForwardDesire > iTacticChoice)
{
iTacticChoice = iForwardDesire;
iTactic = 2;
}
if (iGoalDesire > iTacticChoice)
{
iTacticChoice = iGoalDesire;
iTactic = 3;
}
tacticchosen:
for (index = 0; index < 4; index++)
{
iGoalChoices[index] = -1;
iGoalDistances[index] = 9999.0;
}
// Defensive Goal
if (iTactic == 0)
{
for (index = 0; index < 4; index++)
{
iGoalChoices[index] = pDefensiveWPTS[RANDOM_LONG (0, iNumDefensives - 1)];
assert ((iGoalChoices[index] >= 0) && (iGoalChoices[index] < g_iNumWaypoints));
}
}
// Camp Waypoint Goal
else if (iTactic == 1)
{
for (index = 0; index < 4; index++)
{
iGoalChoices[index] = g_rgiCampWaypoints[RANDOM_LONG (0, g_iNumCampPoints - 1)];
assert ((iGoalChoices[index] >= 0) && (iGoalChoices[index] < g_iNumWaypoints));
}
}
// Offensive Goal
else if (iTactic == 2)
{
for (index = 0; index < 4; index++)
{
iGoalChoices[index] = pOffensiveWPTS[RANDOM_LONG (0, iNumOffensives - 1)];
assert ((iGoalChoices[index] >= 0) && (iGoalChoices[index] < g_iNumWaypoints));
}
}
// Map Goal Waypoint
else if (iTactic == 3)
{
Vector vBotOrigin = pBot->pEdict->v.origin; // KWo - 12.02.2006
for (index = 0; index < g_iNumGoalPoints; index++) // KWo - 12.02.2006
{
iClosestGoalIndex = g_rgiGoalWaypoints[index];
if ((vBotOrigin - paths[iClosestGoalIndex]->origin).Length() < 600) // KWo - 03.09.2006
{
if ((iClosestGoalIndex >= 0) && (iClosestGoalIndex < g_iNumWaypoints))
{
bGoalNearby = true;
break;
}
}
}
for (index = 0; index < 4; index++)
{
iGoalChoices[index] = g_rgiGoalWaypoints[RANDOM_LONG (0, g_iNumGoalPoints - 1)];
assert ((iGoalChoices[index] >= 0) && (iGoalChoices[index] < g_iNumWaypoints));
}
}
if ((pBot->curr_wpt_index < 0) || (pBot->curr_wpt_index >= g_iNumWaypoints))
BotChangeWptIndex (pBot, WaypointFindNearestToMove (pBot->pEdict->v.origin));
if ((iTactic == 3) && (bGoalNearby) && (pBot->pEdict->v.weapons & (1 << CS_WEAPON_C4))) // KWo - 12.02.2006
{
pBot->chosengoal_index = iClosestGoalIndex; // KWo - 27.06.2006
return (iClosestGoalIndex);
}
if (pBot->bot_personality == 1) // Psycho doesn't care about danger :) KWo - 14.02.2006
{
iTestIndex = iGoalChoices[RANDOM_LONG (0, 3)];
if ((iTestIndex >=0) && (iTestIndex < g_iNumWaypoints))
{
pBot->chosengoal_index = iTestIndex; // KWo - 27.06.2006
// ALERT(at_logged, "[DEBUG] BotFindGoal - Bot's %s chose goal = %d, flags = %d.\n", pBot->name, pBot->chosengoal_index, paths[pBot->chosengoal_index]->flags);
return (iTestIndex);
}
}
do
{
bSorting = FALSE;
for (index = 0; index < 3; index++)
{
iTestIndex = iGoalChoices[index + 1];
if (iTestIndex < 0)
break;
if (pBot->bot_team == TEAM_CS_TERRORIST)
{
if ((pBotExperienceData + (iBotIndex * g_iNumWaypoints) + iGoalChoices[index])->wTeam0Value
< (pBotExperienceData + (iBotIndex * g_iNumWaypoints) + iTestIndex)->wTeam0Value)
{
iGoalChoices[index + 1] = iGoalChoices[index];
iGoalChoices[index] = iTestIndex;
bSorting = TRUE;
}
}
else
{
if ((pBotExperienceData + (iBotIndex * g_iNumWaypoints) + iGoalChoices[index])->wTeam1Value
< (pBotExperienceData + (iBotIndex * g_iNumWaypoints) + iTestIndex)->wTeam1Value)
{
iGoalChoices[index + 1] = iGoalChoices[index];
iGoalChoices[index] = iTestIndex;
bSorting = TRUE;
}
}
}
} while (bSorting);
pBot->chosengoal_index = iGoalChoices[0]; // KWo - 27.06.2006
// ALERT(at_logged, "[DEBUG] BotFindGoal - Bot's %s chose goal = %d, flags %d.\n", pBot->name, pBot->chosengoal_index, paths[pBot->chosengoal_index]->flags);
return (iGoalChoices[0]);
}
|
After reading that - I can say so - I was focusing before on fixing problems with map goals, camps and rescue points, but now I can see there is still something to do with team specyfic waypoints.
But any change here may really affect bots behavior (I mean even on standard maps).
As You can see the bots - according to their aggressivity/fear level and the map type - they "choose" some kind of tactic with choosing the goal they would to go. More aggressive go to map goals and offensive WPs, more scarried go to camp and deffensive WPs etc.
If I would remove team specyfic waypoints I would need to force You to put at least some camps, etc. Or I would remove to use the tactic for such maps at all which would affect so - they would always start to go in the same predictable direction.
Another thing against - there is a lot of such maps waypointed already with all these kind of waypoints - changing the work for them would break the backward compatibility. I really don't wan to test what may happen somewhere else in the code if I remove the necessity of placing waypoints they are needed for podbots since the beginning. I have a lot of other things to do, but I'm alone. But if You have time - You can read some my sticky at this forum
how to comiple podbot mm under windows with mingw/cygwin - so You can mess around the code and let me know the results.