Don't use getDistance from battle graph for kart
As sometimes it will return 0 if kart is on unknown node Also try to make banana avoidance better
This commit is contained in:
@@ -310,6 +310,6 @@ void AIBaseController::checkPosition(const Vec3 &point, posData *pos_data,
|
||||
|
||||
pos_data->angle = atan2(fabsf(local_coordinates.getX()),
|
||||
fabsf(local_coordinates.getZ()));
|
||||
pos_data->distance = p.length_2d();
|
||||
pos_data->distance = p.length();
|
||||
|
||||
} // checkPosition
|
||||
|
||||
@@ -61,6 +61,7 @@ void ArenaAI::reset()
|
||||
m_cur_kart_pos_data = {0};
|
||||
m_is_stuck = false;
|
||||
m_is_uturn = false;
|
||||
m_avoiding_banana = false;
|
||||
m_target_point = Vec3(0, 0, 0);
|
||||
m_time_since_last_shot = 0.0f;
|
||||
m_time_since_driving = 0.0f;
|
||||
@@ -86,6 +87,7 @@ void ArenaAI::update(float dt)
|
||||
// This is used to enable firing an item backwards.
|
||||
m_controls->m_look_back = false;
|
||||
m_controls->m_nitro = false;
|
||||
m_avoiding_banana = false;
|
||||
|
||||
// Don't do anything if there is currently a kart animations shown.
|
||||
if (m_kart->getKartAnimation())
|
||||
@@ -380,23 +382,22 @@ void ArenaAI::updateBananaLocation()
|
||||
if (it != item_list.end())
|
||||
{
|
||||
Vec3 banana_lc;
|
||||
posData banana_pos = {0};
|
||||
checkPosition(it->first->getXYZ(), &banana_pos, &banana_lc,
|
||||
checkPosition(it->first->getXYZ(), NULL, &banana_lc,
|
||||
true/*use_front_xyz*/);
|
||||
|
||||
// If satisfy the below condition, AI should not eat banana
|
||||
if (banana_pos.behind || banana_pos.angle > 0.3f)
|
||||
// If satisfy the below condition, AI should not eat banana:
|
||||
// banana_lc.z() < 0.0f, behind the kart
|
||||
if (banana_lc.z() < 0.0f)
|
||||
{
|
||||
node++;
|
||||
continue;
|
||||
}
|
||||
|
||||
const float dist = banana_lc.length() * 2;
|
||||
banana_lc = (banana_lc.x() < 0 ? banana_lc + Vec3(dist, 0, 0) :
|
||||
banana_lc - Vec3(dist, 0, 0));
|
||||
// If the node AI will pass has a banana, adjust the aim position
|
||||
banana_lc = (banana_lc.x() < 0 ? banana_lc + Vec3(5, 0, 0) :
|
||||
banana_lc - Vec3(5, 0, 0));
|
||||
m_aiming_points[1] = m_kart->getTrans()(banana_lc);
|
||||
|
||||
m_avoiding_banana = true;
|
||||
// Handle one banana only
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -64,6 +64,8 @@ protected:
|
||||
/** The target point. */
|
||||
Vec3 m_target_point;
|
||||
|
||||
bool m_avoiding_banana;
|
||||
|
||||
void collectItemInArena(Vec3*, int*) const;
|
||||
float findAngleFrom3Edges(float a, float b, float c);
|
||||
private:
|
||||
@@ -122,7 +124,7 @@ private:
|
||||
virtual void resetAfterStop() {};
|
||||
virtual void findClosestKart(bool use_difficulty) = 0;
|
||||
virtual void findTarget() = 0;
|
||||
virtual bool forceBraking() { return false; }
|
||||
virtual bool forceBraking() { return m_avoiding_banana; }
|
||||
virtual bool ignorePathFinding() { return false; }
|
||||
public:
|
||||
static int m_test_node_for_banana;
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
#include "karts/abstract_kart.hpp"
|
||||
#include "karts/controller/kart_control.hpp"
|
||||
#include "modes/three_strikes_battle.hpp"
|
||||
#include "tracks/battle_graph.hpp"
|
||||
|
||||
#ifdef AI_DEBUG
|
||||
#include "irrlicht.h"
|
||||
@@ -119,11 +118,10 @@ void BattleAI::findClosestKart(bool use_difficulty)
|
||||
continue;
|
||||
}
|
||||
|
||||
float test_distance = BattleGraph::get()->getDistance(m_world
|
||||
->getKartNode(kart->getWorldKartId()), getCurrentNode());
|
||||
if (test_distance <= distance)
|
||||
Vec3 d = kart->getXYZ() - m_kart->getXYZ();
|
||||
if (d.length() <= distance)
|
||||
{
|
||||
distance = test_distance;
|
||||
distance = d.length();
|
||||
closest_kart_num = i;
|
||||
}
|
||||
}
|
||||
@@ -136,7 +134,6 @@ void BattleAI::findClosestKart(bool use_difficulty)
|
||||
{
|
||||
m_closest_kart = m_world->getKart(closest_kart_num);
|
||||
checkPosition(m_closest_kart_point, &m_closest_kart_pos_data);
|
||||
m_closest_kart_pos_data.distance = distance;
|
||||
|
||||
// Do a mini-skid to closest kart only when firing target,
|
||||
// not straight ahead, not too far, in front of it
|
||||
|
||||
@@ -66,7 +66,8 @@ private:
|
||||
virtual int getCurrentNode() const;
|
||||
virtual bool isWaiting() const;
|
||||
virtual bool canSkid(float steer_fraction) { return false; }
|
||||
virtual bool forceBraking() OVERRIDE { return m_force_brake; }
|
||||
virtual bool forceBraking() OVERRIDE
|
||||
{ return m_avoiding_banana || m_force_brake; }
|
||||
virtual bool ignorePathFinding() OVERRIDE
|
||||
{ return m_chasing_ball; }
|
||||
public:
|
||||
|
||||
Reference in New Issue
Block a user