Add defense knowledge for AIs
This commit is contained in:
parent
1e7ac6e98b
commit
35ce3d8299
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user