diff --git a/src/karts/controller/ai_base_controller.hpp b/src/karts/controller/ai_base_controller.hpp index 24ffa253f..d108ebe0a 100644 --- a/src/karts/controller/ai_base_controller.hpp +++ b/src/karts/controller/ai_base_controller.hpp @@ -66,7 +66,7 @@ protected: float normalizeAngle(float angle); virtual void update (float delta) ; virtual void setSteering (float angle, float dt); - virtual bool canSkid(float steer_fraction) { return false; } + virtual bool canSkid(float steer_fraction) = 0; // ------------------------------------------------------------------------ /** This can be called to detect if the kart is stuck (i.e. repeatedly * hitting part of the track). */ diff --git a/src/karts/controller/battle_ai.cpp b/src/karts/controller/battle_ai.cpp index 8cf85c2ef..2504daa8d 100644 --- a/src/karts/controller/battle_ai.cpp +++ b/src/karts/controller/battle_ai.cpp @@ -75,6 +75,7 @@ void BattleAI::reset() //----------------------------------------------------------------------------- void BattleAI::update(float dt) { + m_mini_skid = false; ArenaAI::update(dt); } // update @@ -129,6 +130,16 @@ 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); + + // Do a mini-skid to closest kart only when firing target, + // not straight ahead, not too far, in front of it + // and with suitable difficulties. + if (m_closest_kart_pos_data.angle > 0.2f && + m_closest_kart_pos_data.distance < 20.f && + !m_closest_kart_pos_data.behind && + (m_cur_difficulty == RaceManager::DIFFICULTY_HARD || + m_cur_difficulty == RaceManager::DIFFICULTY_BEST)) + m_mini_skid = true; } } // findClosestKart diff --git a/src/karts/controller/battle_ai.hpp b/src/karts/controller/battle_ai.hpp index 1d79ea6a0..cdb08d73d 100644 --- a/src/karts/controller/battle_ai.hpp +++ b/src/karts/controller/battle_ai.hpp @@ -36,10 +36,13 @@ private: /** Keep a pointer to world. */ ThreeStrikesBattle *m_world; + bool m_mini_skid; + virtual void findClosestKart(bool use_difficulty); virtual void findTarget(); virtual int getCurrentNode() const; virtual bool isWaiting() const; + virtual bool canSkid(float steer_fraction) { return m_mini_skid; } public: BattleAI(AbstractKart *kart, StateManager::ActivePlayer *player = NULL); diff --git a/src/karts/controller/end_controller.hpp b/src/karts/controller/end_controller.hpp index 5d59105b4..df4703ec1 100644 --- a/src/karts/controller/end_controller.hpp +++ b/src/karts/controller/end_controller.hpp @@ -74,23 +74,24 @@ private: *that can be done, and end up setting their respective m_controls *variable. */ - void handleSteering(float dt); - void handleRescue(const float DELTA); + void handleSteering(float dt); + void handleRescue(const float DELTA); - void checkCrashes(const int STEPS, const Vec3& pos); - void findNonCrashingPoint(Vec3 *result); - int calcSteps(); + void checkCrashes(const int STEPS, const Vec3& pos); + void findNonCrashingPoint(Vec3 *result); + int calcSteps(); + virtual bool canSkid(float steer_fraction) { return false; } public: - EndController(AbstractKart *kart, - StateManager::ActivePlayer* player, - Controller *prev_controller); - ~EndController(); - virtual void update (float delta) ; - virtual void reset (); + EndController(AbstractKart *kart, + StateManager::ActivePlayer* player, + Controller *prev_controller); + ~EndController(); + virtual void update (float delta) ; + virtual void reset (); /** Returns if the original controller of the kart was a player * controller. This way e.g. highscores can still be assigned * to the right player. */ - virtual bool isPlayerController () const {return getPlayer()!=NULL;} + virtual bool isPlayerController () const { return getPlayer() != NULL; } virtual void action (PlayerAction action, int value); virtual void newLap (int lap);