Pre-add spare tire karts probably

This commit is contained in:
Benau 2016-10-07 14:39:39 +08:00
parent b66e6ef06d
commit 91af45337f
10 changed files with 134 additions and 60 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -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++)
{

View File

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

View File

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

View File

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

View File

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

View File

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