Add defense knowledge for AIs

This commit is contained in:
Benau 2016-01-20 16:30:26 +08:00
parent 1e7ac6e98b
commit 35ce3d8299
3 changed files with 76 additions and 1 deletions

View File

@ -148,8 +148,18 @@ void SoccerAI::findClosestKart(bool use_difficulty)
//-----------------------------------------------------------------------------
void SoccerAI::findTarget()
{
// Check whether any defense is needed
if ((m_world->getBallPosition() - NavMesh::get()->getNavPoly(m_world
->getGoalNode(m_cur_team)).getCenter()).length_2d() < 50.0f &&
m_world->getDefender(m_cur_team) == (signed)m_kart->getWorldKartId())
{
m_target_node = m_world->getBallNode();
m_target_point = correctBallPosition(m_world->getBallPosition());
return;
}
// Find a suitable target to drive to, either ball or powerup
if ((m_world->getBallPosition() - m_kart->getXYZ()).length_2d() > 10.0f &&
if ((m_world->getBallPosition() - m_kart->getXYZ()).length_2d() > 20.0f &&
(m_kart->getPowerup()->getType() == PowerupManager::POWERUP_NOTHING &&
m_kart->getAttachment()->getType() != Attachment::ATTACH_SWATTER))
collectItemInArena(&m_target_point , &m_target_node);

View File

@ -105,6 +105,8 @@ void SoccerWorld::reset()
m_blue_scorers.clear();
m_blue_score_times.clear();
m_ball_hitter = -1;
m_red_defender = -1;
m_blue_defender = -1;
PtrVector<TrackObject>& objects = tom->getObjects();
for(unsigned int i=0; i<objects.size(); i++)
{
@ -149,7 +151,10 @@ void SoccerWorld::update(float dt)
updateBallPosition();
if (m_track->hasNavMesh())
{
updateKartNodes();
updateDefenders();
}
if (world->getPhase() == World::GOAL_PHASE)
{
@ -535,3 +540,54 @@ bool SoccerWorld::isCorrectGoal(unsigned int kart_id, bool first_goal) const
}
return false;
} // isCorrectGoal
//-----------------------------------------------------------------------------
void SoccerWorld::updateDefenders()
{
if (isRaceOver()) return;
float distance = 99999.9f;
int defender = -1;
// Check for red team
for (unsigned int i = 0; i < (unsigned)m_karts.size(); ++i)
{
if (m_karts[i]->getController()->isPlayerController() ||
getKartTeam(m_karts[i]->getWorldKartId()) != SOCCER_TEAM_RED)
continue;
Vec3 d = NavMesh::get()->getNavPoly(this
->getGoalNode(SOCCER_TEAM_RED)).getCenter()
- m_karts[i]->getXYZ();
if (d.length_2d() <= distance)
{
defender = i;
distance = d.length_2d();
}
}
if (defender != -1) m_red_defender = defender;
distance = 99999.9f;
defender = -1;
// Check for blue team
for (unsigned int i = 0; i < (unsigned)m_karts.size(); ++i)
{
if (m_karts[i]->getController()->isPlayerController() ||
getKartTeam(m_karts[i]->getWorldKartId()) != SOCCER_TEAM_BLUE)
continue;
Vec3 d = NavMesh::get()->getNavPoly(this
->getGoalNode(SOCCER_TEAM_BLUE)).getCenter()
- m_karts[i]->getXYZ();
if (d.length_2d() <= distance)
{
defender = i;
distance = d.length_2d();
}
}
if (defender != -1) m_blue_defender = defender;
} // updateDefenders

View File

@ -82,6 +82,9 @@ private:
int m_red_goal_node;
int m_blue_goal_node;
int m_red_defender;
int m_blue_defender;
/** Set the team for the karts */
void initKartList();
/** Function to init the locations of two goals on the polygon map */
@ -92,6 +95,7 @@ private:
void updateBallPosition();
/** Clean up */
void resetAllNodes();
void updateDefenders();
public:
@ -155,6 +159,11 @@ public:
}
// ------------------------------------------------------------------------
bool isCorrectGoal(unsigned int kart_id, bool first_goal) const;
// ------------------------------------------------------------------------
const int& getDefender(SoccerTeam team) const
{
return (team == SOCCER_TEAM_BLUE ? m_blue_defender : m_red_defender);
}
}; // SoccerWorld