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:
Benau
2016-05-30 12:56:14 +08:00
parent 913bb511b8
commit 999dee9bce
5 changed files with 18 additions and 17 deletions

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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

View File

@@ -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: