Pre-add spare tire karts probably
This commit is contained in:
parent
b66e6ef06d
commit
91af45337f
@ -866,13 +866,13 @@ void Kart::finishedRace(float time, bool from_server)
|
||||
m_finished_race = true;
|
||||
m_finish_time = time;
|
||||
|
||||
// If this is spare tire kart, end now
|
||||
if (dynamic_cast<SpareTireAI*>(m_controller) != NULL) return;
|
||||
|
||||
m_controller->finishedRace(time);
|
||||
m_kart_model->finishedRace();
|
||||
race_manager->kartFinishedRace(this, time);
|
||||
|
||||
// If this is spare tire kart, end now
|
||||
if (dynamic_cast<SpareTireAI*>(m_controller) != NULL) return;
|
||||
|
||||
if ((race_manager->getMinorMode() == RaceManager::MINOR_MODE_NORMAL_RACE ||
|
||||
race_manager->getMinorMode() == RaceManager::MINOR_MODE_TIME_TRIAL ||
|
||||
race_manager->getMinorMode() == RaceManager::MINOR_MODE_FOLLOW_LEADER)
|
||||
|
@ -23,8 +23,7 @@
|
||||
#include "graphics/camera.hpp"
|
||||
#include "graphics/irr_driver.hpp"
|
||||
#include "io/file_manager.hpp"
|
||||
#include "items/item_manager.hpp"
|
||||
#include "karts/kart.hpp"
|
||||
#include "karts/abstract_kart.hpp"
|
||||
#include "karts/controller/spare_tire_ai.hpp"
|
||||
#include "karts/kart_model.hpp"
|
||||
#include "karts/kart_properties.hpp"
|
||||
@ -67,42 +66,16 @@ void ThreeStrikesBattle::init()
|
||||
{
|
||||
WorldWithRank::init();
|
||||
m_display_rank = false;
|
||||
m_kart_info.resize(m_karts.size());
|
||||
|
||||
// Spare tire karts only added with large arena
|
||||
const int all_nodes =
|
||||
ArenaGraph::get() ? ArenaGraph::get()->getNumNodes() : 0;
|
||||
if (all_nodes > 200)
|
||||
// Copy STA pointer to m_spare_tire_karts array, allowing them to respawn
|
||||
// easily
|
||||
for (KartList::iterator i = m_karts.begin(); i != m_karts.end() ; i++)
|
||||
{
|
||||
const unsigned int max_sta_num = unsigned(m_karts.size() * 0.8f);
|
||||
for (int i = 0; i < all_nodes; i++)
|
||||
{
|
||||
// Pre-spawn the spare tire karts on the item position, preventing
|
||||
// affecting current karts
|
||||
Item* item = ItemManager::get()->getFirstItemInQuad(i);
|
||||
if (item == NULL) continue;
|
||||
btTransform t;
|
||||
t.setOrigin(item->getXYZ());
|
||||
t.setRotation(item->getRotation());
|
||||
|
||||
AbstractKart* sta = new Kart("nolok", m_karts.size(),
|
||||
m_karts.size() + 1, t, PLAYER_DIFFICULTY_NORMAL, KRT_BLUE);
|
||||
sta->init(RaceManager::KartType::KT_AI);
|
||||
sta->setController(new SpareTireAI(sta));
|
||||
|
||||
m_karts.push_back(sta);
|
||||
m_spare_tire_karts.push_back(sta);
|
||||
m_kart_track_sector.push_back(new TrackSector());
|
||||
m_position_index.push_back(0);
|
||||
#ifdef DEBUG
|
||||
m_position_used.push_back(false);
|
||||
#endif
|
||||
m_track->adjustForFog(sta->getNode());
|
||||
|
||||
if (m_spare_tire_karts.size() >= max_sta_num) break;
|
||||
}
|
||||
if (dynamic_cast<SpareTireAI*>((*i)->getController()) != NULL)
|
||||
m_spare_tire_karts.push_back(*i);
|
||||
}
|
||||
|
||||
m_kart_info.resize(m_karts.size());
|
||||
} // ThreeStrikesBattle
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@ -137,9 +110,8 @@ void ThreeStrikesBattle::reset()
|
||||
bool is_sta = false;
|
||||
if (dynamic_cast<SpareTireAI*>(m_karts[n]->getController()) != NULL)
|
||||
{
|
||||
m_kart_info[n].m_lives = -1;
|
||||
m_kart_info[n].m_lives = 0;
|
||||
m_karts[n]->setPosition(-1);
|
||||
m_karts[n]->finishedRace(0.0f);
|
||||
eliminateKart(n, /*notify_of_elimination*/ false);
|
||||
is_sta = true;
|
||||
}
|
||||
@ -185,6 +157,16 @@ void ThreeStrikesBattle::reset()
|
||||
m_track->getTrackObjectManager()->removeObject(obj);
|
||||
}
|
||||
m_tires.clearWithoutDeleting();
|
||||
|
||||
// Finish all spare tire karts first
|
||||
if (!m_spare_tire_karts.empty())
|
||||
{
|
||||
updateKartRanks();
|
||||
for (unsigned int i = 0; i < m_spare_tire_karts.size(); i++)
|
||||
{
|
||||
m_spare_tire_karts[i]->finishedRace(0.0f);
|
||||
}
|
||||
}
|
||||
} // reset
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@ -539,7 +521,7 @@ bool ThreeStrikesBattle::isRaceOver()
|
||||
return (irr_driver->getRealTime()-m_start_time)*0.001f > 20.0f;
|
||||
|
||||
// for tests : never over when we have a single player there :)
|
||||
if (race_manager->getNumberOfKarts()==1 &&
|
||||
if (race_manager->getNumberOfKarts() - m_spare_tire_karts.size () ==1 &&
|
||||
getCurrentNumKarts()==1 &&
|
||||
UserConfigParams::m_artist_debug_mode)
|
||||
{
|
||||
@ -569,8 +551,6 @@ void ThreeStrikesBattle::getKartsDisplayInfo(
|
||||
const unsigned int kart_amount = getNumKarts();
|
||||
for(unsigned int i = 0; i < kart_amount ; i++)
|
||||
{
|
||||
if (dynamic_cast<SpareTireAI*>(m_karts[i]->getController()) != NULL)
|
||||
continue;
|
||||
RaceGUIBase::KartIconDisplayInfo& rank_info = (*info)[i];
|
||||
|
||||
// reset color
|
||||
@ -638,3 +618,28 @@ bool ThreeStrikesBattle::spareTireKartsSpawned() const
|
||||
|
||||
return sta->needUpdate();
|
||||
} // spareTireKartsSpawned
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void ThreeStrikesBattle::addKartLife(unsigned int id)
|
||||
{
|
||||
m_kart_info[id].m_lives++;
|
||||
updateKartRanks();
|
||||
|
||||
scene::ISceneNode* kart_node = m_karts[id]->getNode();
|
||||
core::list<scene::ISceneNode*>& children =
|
||||
const_cast<core::list<scene::ISceneNode*>&>(kart_node->getChildren());
|
||||
for (core::list<scene::ISceneNode*>::Iterator it = children.begin();
|
||||
it != children.end(); it++)
|
||||
{
|
||||
scene::ISceneNode* curr = *it;
|
||||
if (core::stringc(curr->getName()) == "tire1")
|
||||
{
|
||||
curr->setVisible(m_kart_info[id].m_lives >= 3);
|
||||
}
|
||||
else if (core::stringc(curr->getName()) == "tire2")
|
||||
{
|
||||
curr->setVisible(m_kart_info[id].m_lives >= 2);
|
||||
}
|
||||
}
|
||||
|
||||
} // addKartLife
|
||||
|
@ -118,9 +118,10 @@ public:
|
||||
|
||||
void updateKartRanks();
|
||||
void increaseRescueCount() { m_total_rescue++; }
|
||||
void addKartLife(unsigned int id) { m_kart_info[id].m_lives++; }
|
||||
void addKartLife(unsigned int id);
|
||||
int getKartLife(unsigned int id) const { return m_kart_info[id].m_lives; }
|
||||
bool spareTireKartsSpawned() const;
|
||||
unsigned int getNumSpareTireKarts() const { return m_spare_tire_karts.size(); }
|
||||
}; // ThreeStrikesBattles
|
||||
|
||||
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include "io/file_manager.hpp"
|
||||
#include "input/device_manager.hpp"
|
||||
#include "input/keyboard_device.hpp"
|
||||
#include "items/item_manager.hpp"
|
||||
#include "items/projectile_manager.hpp"
|
||||
#include "karts/controller/battle_ai.hpp"
|
||||
#include "karts/controller/soccer_ai.hpp"
|
||||
@ -64,6 +65,7 @@
|
||||
#include "states_screens/race_gui.hpp"
|
||||
#include "states_screens/race_result_gui.hpp"
|
||||
#include "states_screens/state_manager.hpp"
|
||||
#include "tracks/arena_graph.hpp"
|
||||
#include "tracks/track.hpp"
|
||||
#include "tracks/track_manager.hpp"
|
||||
#include "utils/constants.hpp"
|
||||
@ -221,6 +223,44 @@ void World::init()
|
||||
|
||||
} // for i
|
||||
|
||||
// Pre-add spare tire karts in battle mode
|
||||
if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_3_STRIKES &&
|
||||
m_track->hasNavMesh())
|
||||
{
|
||||
// Spare tire karts only added with large arena
|
||||
const int all_nodes =
|
||||
ArenaGraph::get() ? ArenaGraph::get()->getNumNodes() : 0;
|
||||
if (all_nodes > 200)
|
||||
{
|
||||
const unsigned int max_sta_num = unsigned(m_karts.size() * 0.8f);
|
||||
unsigned int sta_created = 0;
|
||||
for (int i = 0; i < all_nodes; i++)
|
||||
{
|
||||
// Pre-spawn the spare tire karts on the item position,
|
||||
// preven affecting current karts
|
||||
Item* item = ItemManager::get()->getFirstItemInQuad(i);
|
||||
if (item == NULL) continue;
|
||||
btTransform t;
|
||||
t.setOrigin(item->getXYZ());
|
||||
t.setRotation(item->getRotation());
|
||||
|
||||
AbstractKart* sta = new Kart("nolok", m_karts.size(),
|
||||
m_karts.size() + 1, t, PLAYER_DIFFICULTY_NORMAL, KRT_BLUE);
|
||||
sta->init(RaceManager::KartType::KT_AI);
|
||||
sta->setController(new SpareTireAI(sta));
|
||||
|
||||
m_karts.push_back(sta);
|
||||
race_manager->addSpareTireKartStatus();
|
||||
m_track->adjustForFog(sta->getNode());
|
||||
|
||||
sta_created++;
|
||||
if (sta_created >= max_sta_num) break;
|
||||
}
|
||||
num_karts = m_karts.size();
|
||||
race_manager->setNumKarts(num_karts);
|
||||
}
|
||||
}
|
||||
|
||||
// Now that all models are loaded, apply the overrides
|
||||
irr_driver->applyObjectPassShader();
|
||||
|
||||
|
@ -96,7 +96,7 @@ void History::updateSaving(float dt)
|
||||
m_all_deltas[m_current] = dt;
|
||||
|
||||
World *world = World::getWorld();
|
||||
unsigned int num_karts = race_manager->getNumberOfKarts();
|
||||
unsigned int num_karts = world->getNumKarts();
|
||||
unsigned int index = m_current*num_karts;
|
||||
for(unsigned int i=0; i<num_karts; i++)
|
||||
{
|
||||
|
@ -751,6 +751,12 @@ public:
|
||||
{
|
||||
return m_watching_replay;
|
||||
} // isWatchingReplay
|
||||
// ------------------------------------------------------------------------
|
||||
void addSpareTireKartStatus()
|
||||
{
|
||||
m_kart_status.push_back(KartStatus("nolok", 0, -1, -1,
|
||||
-1, KT_AI, PLAYER_DIFFICULTY_NORMAL));
|
||||
} // addSpareTireKartStatus
|
||||
|
||||
}; // RaceManager
|
||||
|
||||
|
@ -39,7 +39,7 @@ using namespace irr;
|
||||
#include "items/attachment_manager.hpp"
|
||||
#include "items/powerup_manager.hpp"
|
||||
#include "karts/abstract_kart.hpp"
|
||||
#include "karts/controller/controller.hpp"
|
||||
#include "karts/controller/spare_tire_ai.hpp"
|
||||
#include "karts/kart_properties.hpp"
|
||||
#include "karts/kart_properties_manager.hpp"
|
||||
#include "modes/follow_the_leader.hpp"
|
||||
@ -104,6 +104,18 @@ RaceGUI::RaceGUI()
|
||||
else
|
||||
m_lap_width = font->getDimension(L"9/9").Width;
|
||||
|
||||
} // RaceGUI
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
RaceGUI::~RaceGUI()
|
||||
{
|
||||
} // ~Racegui
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void RaceGUI::init()
|
||||
{
|
||||
RaceGUIBase::init();
|
||||
// Technically we only need getNumLocalPlayers, but using the
|
||||
// global kart id to find the data for a specific kart.
|
||||
int n = race_manager->getNumberOfKarts();
|
||||
@ -111,12 +123,7 @@ RaceGUI::RaceGUI()
|
||||
m_animation_states.resize(n);
|
||||
m_rank_animation_duration.resize(n);
|
||||
m_last_ranks.resize(n);
|
||||
} // RaceGUI
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
RaceGUI::~RaceGUI()
|
||||
{
|
||||
} // ~Racegui
|
||||
} // init
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/** Reset the gui before a race. It initialised all rank animation related
|
||||
@ -369,7 +376,10 @@ void RaceGUI::drawGlobalMiniMap()
|
||||
for(unsigned int i=0; i<world->getNumKarts(); i++)
|
||||
{
|
||||
const AbstractKart *kart = world->getKart(i);
|
||||
if(kart->isEliminated()) continue; // don't draw eliminated kart
|
||||
const SpareTireAI* sta =
|
||||
dynamic_cast<const SpareTireAI*>(kart->getController());
|
||||
// don't draw eliminated kart
|
||||
if(kart->isEliminated() && !(sta && sta->needUpdate())) continue;
|
||||
const Vec3& xyz = kart->getXYZ();
|
||||
Vec3 draw_at;
|
||||
world->getTrack()->mapPoint2MiniMap(xyz, &draw_at);
|
||||
|
@ -119,6 +119,7 @@ public:
|
||||
|
||||
RaceGUI();
|
||||
~RaceGUI();
|
||||
virtual void init();
|
||||
virtual void reset();
|
||||
virtual void renderGlobal(float dt);
|
||||
virtual void renderPlayerView(const Camera *camera, float dt);
|
||||
|
@ -42,7 +42,7 @@
|
||||
#include "karts/kart_properties_manager.hpp"
|
||||
#include "karts/rescue_animation.hpp"
|
||||
#include "modes/linear_world.hpp"
|
||||
#include "modes/world.hpp"
|
||||
#include "modes/three_strikes_battle.hpp"
|
||||
#include "tracks/track.hpp"
|
||||
#include "utils/constants.hpp"
|
||||
|
||||
@ -638,8 +638,15 @@ void RaceGUIBase::drawGlobalPlayerIcons(int bottom_margin)
|
||||
y_space = irr_driver->getActualScreenSize().Height - y_base;
|
||||
}
|
||||
|
||||
unsigned int sta = 0;
|
||||
ThreeStrikesBattle* tsb = dynamic_cast<ThreeStrikesBattle*>(World::getWorld());
|
||||
if (tsb)
|
||||
sta = tsb->getNumSpareTireKarts();
|
||||
|
||||
const unsigned int num_karts = race_manager->getNumberOfKarts() - sta;
|
||||
|
||||
// -2 because that's the spacing further on
|
||||
int ICON_PLAYER_WIDTH = y_space / race_manager->getNumberOfKarts() - 2;
|
||||
int ICON_PLAYER_WIDTH = y_space / num_karts - 2;
|
||||
|
||||
int icon_width_max = (int)(50*(irr_driver->getActualScreenSize().Width/800.0f));
|
||||
int icon_width_min = (int)(35*(irr_driver->getActualScreenSize().Height/600.0f));
|
||||
@ -664,10 +671,11 @@ void RaceGUIBase::drawGlobalPlayerIcons(int bottom_margin)
|
||||
int ICON_WIDTH = ICON_PLAYER_WIDTH * 4 / 5;
|
||||
|
||||
WorldWithRank *world = (WorldWithRank*)(World::getWorld());
|
||||
|
||||
//initialize m_previous_icons_position
|
||||
if(m_previous_icons_position.size()==0)
|
||||
{
|
||||
for(unsigned int i=0; i<race_manager->getNumberOfKarts(); i++)
|
||||
for(unsigned int i=0; i<num_karts; i++)
|
||||
{
|
||||
const AbstractKart *kart = world->getKart(i);
|
||||
int position = kart->getPosition();
|
||||
@ -686,7 +694,7 @@ void RaceGUIBase::drawGlobalPlayerIcons(int bottom_margin)
|
||||
int previous_y=y_base-ICON_PLAYER_WIDTH-2;
|
||||
|
||||
gui::ScalableFont* font = GUIEngine::getFont();
|
||||
const unsigned int kart_amount = world->getNumKarts();
|
||||
const unsigned int kart_amount = world->getNumKarts() - sta;
|
||||
|
||||
//where is the limit to hide last icons
|
||||
int y_icons_limit=irr_driver->getActualScreenSize().Height-bottom_margin-ICON_PLAYER_WIDTH;
|
||||
|
@ -43,7 +43,7 @@
|
||||
#include "modes/demo_world.hpp"
|
||||
#include "modes/overworld.hpp"
|
||||
#include "modes/soccer_world.hpp"
|
||||
#include "modes/world_with_rank.hpp"
|
||||
#include "modes/three_strikes_battle.hpp"
|
||||
#include "network/protocol_manager.hpp"
|
||||
#include "network/protocols/client_lobby_room_protocol.hpp"
|
||||
#include "race/highscores.hpp"
|
||||
@ -460,17 +460,20 @@ void RaceResultGUI::backToLobby()
|
||||
WorldWithRank *rank_world = (WorldWithRank*)World::getWorld();
|
||||
|
||||
unsigned int first_position = 1;
|
||||
unsigned int sta = 0;
|
||||
if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_FOLLOW_LEADER)
|
||||
first_position = 2;
|
||||
ThreeStrikesBattle* tsb = dynamic_cast<ThreeStrikesBattle*>(World::getWorld());
|
||||
if (tsb)
|
||||
sta = tsb->getNumSpareTireKarts();
|
||||
|
||||
// Use only the karts that are supposed to be displayed (and
|
||||
// ignore e.g. the leader in a FTL race).
|
||||
unsigned int num_karts = race_manager->getNumberOfKarts() - first_position + 1;
|
||||
unsigned int num_karts = race_manager->getNumberOfKarts() - first_position + 1 - sta;
|
||||
|
||||
// In FTL races the leader kart is not displayed
|
||||
m_all_row_infos.resize(num_karts);
|
||||
|
||||
|
||||
// Determine the kart to display in the right order,
|
||||
// and the maximum width for the kart name column
|
||||
// -------------------------------------------------
|
||||
@ -478,7 +481,7 @@ void RaceResultGUI::backToLobby()
|
||||
float max_finish_time = 0;
|
||||
|
||||
for (unsigned int position = first_position;
|
||||
position <= race_manager->getNumberOfKarts(); position++)
|
||||
position <= race_manager->getNumberOfKarts() - sta; position++)
|
||||
{
|
||||
const AbstractKart *kart = rank_world->getKartAtPosition(position);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user