Add doxygen for Soccer and SpareTire AI
This commit is contained in:
parent
021509387d
commit
7505630cd4
@ -139,22 +139,22 @@ void BattleAI::findTarget()
|
|||||||
bool find_sta = false;
|
bool find_sta = false;
|
||||||
if (m_world->spareTireKartsSpawned())
|
if (m_world->spareTireKartsSpawned())
|
||||||
{
|
{
|
||||||
switch (m_cur_difficulty)
|
switch (m_cur_difficulty)
|
||||||
{
|
{
|
||||||
case RaceManager::DIFFICULTY_EASY:
|
case RaceManager::DIFFICULTY_EASY:
|
||||||
case RaceManager::DIFFICULTY_MEDIUM:
|
case RaceManager::DIFFICULTY_MEDIUM:
|
||||||
{
|
{
|
||||||
find_sta = m_world->getKartLife(m_kart->getWorldKartId()) == 1;
|
find_sta = m_world->getKartLife(m_kart->getWorldKartId()) == 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case RaceManager::DIFFICULTY_HARD:
|
case RaceManager::DIFFICULTY_HARD:
|
||||||
case RaceManager::DIFFICULTY_BEST:
|
case RaceManager::DIFFICULTY_BEST:
|
||||||
{
|
{
|
||||||
find_sta = m_world->getKartLife(m_kart->getWorldKartId()) != 3;
|
find_sta = m_world->getKartLife(m_kart->getWorldKartId()) != 3;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: assert(false);
|
default: assert(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool consider_difficulty = !find_sta;
|
bool consider_difficulty = !find_sta;
|
||||||
|
@ -71,7 +71,6 @@ SoccerAI::SoccerAI(AbstractKart *kart)
|
|||||||
} // SoccerAI
|
} // SoccerAI
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
SoccerAI::~SoccerAI()
|
SoccerAI::~SoccerAI()
|
||||||
{
|
{
|
||||||
#ifdef AI_DEBUG
|
#ifdef AI_DEBUG
|
||||||
@ -103,6 +102,10 @@ void SoccerAI::reset()
|
|||||||
} // reset
|
} // reset
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
/** Update \ref m_front_transform for ball aiming functions, also make AI stop
|
||||||
|
* after goal.
|
||||||
|
* \param dt Time step size.
|
||||||
|
*/
|
||||||
void SoccerAI::update(float dt)
|
void SoccerAI::update(float dt)
|
||||||
{
|
{
|
||||||
#ifdef BALL_AIM_DEBUG
|
#ifdef BALL_AIM_DEBUG
|
||||||
@ -129,6 +132,11 @@ void SoccerAI::update(float dt)
|
|||||||
} // update
|
} // update
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
/** Find the closest kart around this AI, it won't find the kart with same
|
||||||
|
* team, consider_difficulty and find_sta are not used here.
|
||||||
|
* \param consider_difficulty If take current difficulty into account.
|
||||||
|
* \param find_sta If find \ref SpareTireAI only.
|
||||||
|
*/
|
||||||
void SoccerAI::findClosestKart(bool consider_difficulty, bool find_sta)
|
void SoccerAI::findClosestKart(bool consider_difficulty, bool find_sta)
|
||||||
{
|
{
|
||||||
float distance = 99999.9f;
|
float distance = 99999.9f;
|
||||||
@ -163,6 +171,13 @@ void SoccerAI::findClosestKart(bool consider_difficulty, bool find_sta)
|
|||||||
} // findClosestKart
|
} // findClosestKart
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
/** Find a suitable target to follow, it will first call
|
||||||
|
* \ref SoccerWorld::getBallChaser to check if this AI should go chasing the
|
||||||
|
* ball and try to score, otherwise it will call \ref tryCollectItem if
|
||||||
|
* needed. After that it will call \ref SoccerWorld::getAttacker to see if
|
||||||
|
* this AI should attack the kart in opposite team which is chasing the ball,
|
||||||
|
* if not go for the closest kart found by \ref findClosestKart.
|
||||||
|
*/
|
||||||
void SoccerAI::findTarget()
|
void SoccerAI::findTarget()
|
||||||
{
|
{
|
||||||
findClosestKart(true/*consider_difficulty*/, false/*find_sta*/);
|
findClosestKart(true/*consider_difficulty*/, false/*find_sta*/);
|
||||||
@ -201,6 +216,11 @@ void SoccerAI::findTarget()
|
|||||||
} // findTarget
|
} // findTarget
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
/** Determine the point for aiming when try to steer or overtake the ball.
|
||||||
|
* AI will overtake the ball if the aiming position calculated by world is
|
||||||
|
* non-reachable.
|
||||||
|
* \return The coordinates to aim at.
|
||||||
|
*/
|
||||||
Vec3 SoccerAI::determineBallAimingPosition()
|
Vec3 SoccerAI::determineBallAimingPosition()
|
||||||
{
|
{
|
||||||
#ifdef BALL_AIM_DEBUG
|
#ifdef BALL_AIM_DEBUG
|
||||||
@ -276,6 +296,11 @@ Vec3 SoccerAI::determineBallAimingPosition()
|
|||||||
} // determineBallAimingPosition
|
} // determineBallAimingPosition
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
/** Used in \ref determineBallAimingPosition to test if AI can overtake the
|
||||||
|
* ball by testing distance.
|
||||||
|
* \param ball_lc Local coordinates of the ball.
|
||||||
|
* \return False if the kart is too close to the ball which can't overtake
|
||||||
|
*/
|
||||||
bool SoccerAI::isOvertakable(const Vec3& ball_lc)
|
bool SoccerAI::isOvertakable(const Vec3& ball_lc)
|
||||||
{
|
{
|
||||||
// No overtake if ball is behind
|
// No overtake if ball is behind
|
||||||
@ -298,6 +323,13 @@ bool SoccerAI::isOvertakable(const Vec3& ball_lc)
|
|||||||
} // isOvertakable
|
} // isOvertakable
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
/** Used in \ref determineBallAimingPosition to pick a correct point to
|
||||||
|
* overtake the ball
|
||||||
|
* \param ball_lc Local coordinates of the ball.
|
||||||
|
* \param aim_lc Local coordinates of the aiming position.
|
||||||
|
* \param[out] overtake_lc Local coordinates of the overtaking position.
|
||||||
|
* \return True if overtaking is possible.
|
||||||
|
*/
|
||||||
bool SoccerAI::determineOvertakePosition(const Vec3& ball_lc,
|
bool SoccerAI::determineOvertakePosition(const Vec3& ball_lc,
|
||||||
const Vec3& aim_lc,
|
const Vec3& aim_lc,
|
||||||
Vec3* overtake_lc)
|
Vec3* overtake_lc)
|
||||||
@ -434,6 +466,12 @@ bool SoccerAI::determineOvertakePosition(const Vec3& ball_lc,
|
|||||||
} // determineOvertakePosition
|
} // determineOvertakePosition
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
/** Used in \ref determineOvertakePosition to adjust the overtake position
|
||||||
|
* which is calculated by slope of line if it's too close.
|
||||||
|
* \param old_slope Old slope calculated.
|
||||||
|
* \param rotate_up If adjust the slope upwards.
|
||||||
|
* \return A newly calculated slope.
|
||||||
|
*/
|
||||||
float SoccerAI::rotateSlope(float old_slope, bool rotate_up)
|
float SoccerAI::rotateSlope(float old_slope, bool rotate_up)
|
||||||
{
|
{
|
||||||
const float theta = atan(old_slope) + (old_slope < 0 ? M_PI : 0);
|
const float theta = atan(old_slope) + (old_slope < 0 ? M_PI : 0);
|
||||||
|
@ -45,41 +45,68 @@ private:
|
|||||||
/** Keep a pointer to world. */
|
/** Keep a pointer to world. */
|
||||||
SoccerWorld *m_world;
|
SoccerWorld *m_world;
|
||||||
|
|
||||||
|
/** Save the team this AI belongs to. */
|
||||||
SoccerTeam m_cur_team;
|
SoccerTeam m_cur_team;
|
||||||
|
|
||||||
|
/** Save the opposite team of this AI team. */
|
||||||
SoccerTeam m_opp_team;
|
SoccerTeam m_opp_team;
|
||||||
|
|
||||||
/** Define which way to handle to ball, either steer with it,
|
/** Define which way to handle to ball, either steer with it,
|
||||||
* or overtake it (Denfense).
|
* or overtake it (Defense). */
|
||||||
*/
|
|
||||||
bool m_overtake_ball;
|
bool m_overtake_ball;
|
||||||
|
|
||||||
|
/** True if \ref forceBraking() is needed to be called. */
|
||||||
bool m_force_brake;
|
bool m_force_brake;
|
||||||
|
|
||||||
|
/** True if AI should steer with the ball. */
|
||||||
bool m_chasing_ball;
|
bool m_chasing_ball;
|
||||||
|
|
||||||
|
/** The front point of kart with the same rotation of center mass, used
|
||||||
|
* to determine point for aiming with ball */
|
||||||
btTransform m_front_transform;
|
btTransform m_front_transform;
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
Vec3 determineBallAimingPosition();
|
Vec3 determineBallAimingPosition();
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
bool determineOvertakePosition(const Vec3& ball_lc, const Vec3& aim_lc,
|
bool determineOvertakePosition(const Vec3& ball_lc, const Vec3& aim_lc,
|
||||||
Vec3* overtake_lc);
|
Vec3* overtake_lc);
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
bool isOvertakable(const Vec3& ball_lc);
|
bool isOvertakable(const Vec3& ball_lc);
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
float rotateSlope(float old_slope, bool rotate_up);
|
float rotateSlope(float old_slope, bool rotate_up);
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
virtual bool canSkid(float steer_fraction) OVERRIDE
|
virtual bool canSkid(float steer_fraction) OVERRIDE
|
||||||
{ return m_mini_skid && !(m_overtake_ball || m_chasing_ball); }
|
{ return m_mini_skid && !(m_overtake_ball || m_chasing_ball); }
|
||||||
virtual void findClosestKart(bool consider_difficulty, bool find_sta) OVERRIDE;
|
// ------------------------------------------------------------------------
|
||||||
|
virtual void findClosestKart(bool consider_difficulty,
|
||||||
|
bool find_sta) OVERRIDE;
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
virtual void findTarget() OVERRIDE;
|
virtual void findTarget() OVERRIDE;
|
||||||
virtual bool forceBraking() OVERRIDE { return m_force_brake; }
|
// ------------------------------------------------------------------------
|
||||||
|
virtual bool forceBraking() OVERRIDE { return m_force_brake; }
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
virtual int getCurrentNode() const OVERRIDE;
|
virtual int getCurrentNode() const OVERRIDE;
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
virtual float getKartDistance(const AbstractKart* kart) const OVERRIDE;
|
virtual float getKartDistance(const AbstractKart* kart) const OVERRIDE;
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
virtual bool ignorePathFinding() OVERRIDE
|
virtual bool ignorePathFinding() OVERRIDE
|
||||||
{ return m_overtake_ball || m_chasing_ball; }
|
{ return m_overtake_ball || m_chasing_ball; }
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
virtual bool isKartOnRoad() const OVERRIDE;
|
virtual bool isKartOnRoad() const OVERRIDE;
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
virtual bool isWaiting() const OVERRIDE;
|
virtual bool isWaiting() const OVERRIDE;
|
||||||
virtual void resetAfterStop() OVERRIDE { m_overtake_ball = false; }
|
// ------------------------------------------------------------------------
|
||||||
|
virtual void resetAfterStop() OVERRIDE { m_overtake_ball = false; }
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SoccerAI(AbstractKart *kart);
|
SoccerAI(AbstractKart *kart);
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
~SoccerAI();
|
~SoccerAI();
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
virtual void update (float delta) OVERRIDE;
|
virtual void update (float delta) OVERRIDE;
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
virtual void reset () OVERRIDE;
|
virtual void reset () OVERRIDE;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -61,6 +61,10 @@ void SpareTireAI::reset()
|
|||||||
} // reset
|
} // reset
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
/** Besides calling update from parent class, it will auto \ref unspawn if
|
||||||
|
* \ref m_timer reaches zero which it will be decreased here.
|
||||||
|
* \param dt Time step size.
|
||||||
|
*/
|
||||||
void SpareTireAI::update(float dt)
|
void SpareTireAI::update(float dt)
|
||||||
{
|
{
|
||||||
BattleAI::update(dt);
|
BattleAI::update(dt);
|
||||||
@ -71,9 +75,11 @@ void SpareTireAI::update(float dt)
|
|||||||
} // update
|
} // update
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
/** Randomly find a start node for spare tire kart to move, called after \ref
|
||||||
|
* spawn.
|
||||||
|
*/
|
||||||
void SpareTireAI::findDefaultPath()
|
void SpareTireAI::findDefaultPath()
|
||||||
{
|
{
|
||||||
// Randomly find a start node for spare tire kart to move
|
|
||||||
assert(m_idx == -1);
|
assert(m_idx == -1);
|
||||||
|
|
||||||
RandomGenerator random;
|
RandomGenerator random;
|
||||||
@ -83,6 +89,9 @@ void SpareTireAI::findDefaultPath()
|
|||||||
} // findDefaultPath
|
} // findDefaultPath
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
/** For SpareTireAI, it will pick next node in \ref m_fixed_target_nodes after
|
||||||
|
* reach the one in \ref m_idx, or the first one if it's the last.
|
||||||
|
*/
|
||||||
void SpareTireAI::findTarget()
|
void SpareTireAI::findTarget()
|
||||||
{
|
{
|
||||||
assert(m_idx != -1 && m_idx < 4);
|
assert(m_idx != -1 && m_idx < 4);
|
||||||
@ -95,6 +104,10 @@ void SpareTireAI::findTarget()
|
|||||||
} // findTarget
|
} // findTarget
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
/** Spawn the SpareTireAI, it will start appearing in the battle mode and
|
||||||
|
* moving around.
|
||||||
|
* \param time_to_last Time before calling \ref unspawn.
|
||||||
|
*/
|
||||||
void SpareTireAI::spawn(float time_to_last)
|
void SpareTireAI::spawn(float time_to_last)
|
||||||
{
|
{
|
||||||
findDefaultPath();
|
findDefaultPath();
|
||||||
@ -108,6 +121,9 @@ void SpareTireAI::spawn(float time_to_last)
|
|||||||
} // spawn
|
} // spawn
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
/** Unspawn the SpareTireAI, it will be hidden in the battle mode but not
|
||||||
|
* deleted, so it can be called with \ref spawn again later.
|
||||||
|
*/
|
||||||
void SpareTireAI::unspawn()
|
void SpareTireAI::unspawn()
|
||||||
{
|
{
|
||||||
m_idx = -1;
|
m_idx = -1;
|
||||||
@ -115,6 +131,10 @@ void SpareTireAI::unspawn()
|
|||||||
} // unspawn
|
} // unspawn
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
/** Callback function when a kart crashes into the SpareTireAI, the kart will
|
||||||
|
* increase one life if its life is not equal 3. A message will be shown too.
|
||||||
|
* \param k \ref AbstractKart this SpareTireAI crashed.
|
||||||
|
*/
|
||||||
void SpareTireAI::crashed(const AbstractKart *k)
|
void SpareTireAI::crashed(const AbstractKart *k)
|
||||||
{
|
{
|
||||||
// Nothing happen when two spare tire karts crash each other
|
// Nothing happen when two spare tire karts crash each other
|
||||||
|
@ -27,22 +27,38 @@
|
|||||||
class SpareTireAI : public BattleAI
|
class SpareTireAI : public BattleAI
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
/** The 4 bounding boxes \ref ArenaNode to follow. */
|
||||||
int m_fixed_target_nodes[4];
|
int m_fixed_target_nodes[4];
|
||||||
|
|
||||||
|
/** The current index of \ref ArenaNode in \ref m_fixed_target_nodes to
|
||||||
|
* follow, if it's -1, \ref update is not needed to be called. */
|
||||||
int m_idx;
|
int m_idx;
|
||||||
|
|
||||||
|
/** Store the time before calling \ref unspawn. */
|
||||||
float m_timer;
|
float m_timer;
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
virtual void findTarget() OVERRIDE;
|
virtual void findTarget() OVERRIDE;
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
void findDefaultPath();
|
void findDefaultPath();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SpareTireAI(AbstractKart *kart);
|
SpareTireAI(AbstractKart *kart);
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
virtual void crashed(const AbstractKart *k) OVERRIDE;
|
virtual void crashed(const AbstractKart *k) OVERRIDE;
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
virtual void update(float delta) OVERRIDE;
|
virtual void update(float delta) OVERRIDE;
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
virtual void reset() OVERRIDE;
|
virtual void reset() OVERRIDE;
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
void spawn(float time_to_last);
|
void spawn(float time_to_last);
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
void unspawn();
|
void unspawn();
|
||||||
bool isMoving() const { return m_idx != -1; }
|
// ------------------------------------------------------------------------
|
||||||
|
/** Return true if this AI needed to be called \ref update by \ref World,
|
||||||
|
* ie it is spawned. */
|
||||||
|
bool isMoving() const { return m_idx != -1; }
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user