Skip to content

Commit 56cdcfb

Browse files
committed
Implement the gameplay side of Rally Order (missing: the server side, and proper storage at the end of each race)
1 parent cb2f82f commit 56cdcfb

File tree

5 files changed

+75
-1
lines changed

5 files changed

+75
-1
lines changed

src/karts/kart.cpp

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,8 @@ Kart::Kart (const std::string& ident, unsigned int world_kart_id,
245245
m_controller = NULL;
246246
m_tyres = new Tyres(this);
247247
m_is_disqualified = false;
248+
m_rally_start = false;
249+
m_rally_wait_mode = false;
248250
m_is_under_tme_ruleset = true;
249251
m_initial_color = 0.0f;
250252
m_saved_controller = NULL;
@@ -3364,6 +3366,57 @@ void Kart::updatePhysics(int ticks)
33643366
// Cap speed if necessary
33653367
const Material *m = getMaterial();
33663368

3369+
bool wait_mode = false;
3370+
3371+
RaceManager::RallyOrder *rally_order = RaceManager::get()->getRallyOrder();
3372+
RaceManager::RallyPlayer *current_player = NULL;
3373+
LinearWorld* lw = dynamic_cast<LinearWorld*>(World::getWorld());
3374+
std::string name = StringUtils::wideToUtf8(getController()->getName());
3375+
if (lw && rally_order) {
3376+
for (RaceManager::RallyPlayer &p : rally_order->players) {
3377+
if (p.username == name) {
3378+
current_player = &p;
3379+
break;
3380+
}
3381+
}
3382+
}
3383+
3384+
if (!current_player) {
3385+
//TODO: Build a fake player as per the strategy variables - need a support procedure for this
3386+
}
3387+
3388+
float time = World::getWorld()->getTime();
3389+
if (current_player) {
3390+
if (current_player->gap_to_leader
3391+
<=
3392+
(float)rally_order->warmup_cutoff)
3393+
{
3394+
if (time < current_player->gap_to_leader) {
3395+
setSlowdown(MaxSpeed::MS_DECREASE_STOP, getKartProperties()->getTyresPitSpeedFraction(), stk_config->time2Ticks(0.1f), -1);
3396+
m_rally_start = true;
3397+
} else {
3398+
setSlowdown(MaxSpeed::MS_DECREASE_STOP, getKartProperties()->getTyresPitSpeedFraction(), stk_config->time2Ticks(0.1f), 0);
3399+
m_rally_start = false;
3400+
}
3401+
} else {
3402+
if (time < current_player->gap_to_leader) {
3403+
m_rally_wait_mode = true;
3404+
m_rally_start = true;
3405+
} else {
3406+
m_rally_wait_mode = false;
3407+
m_rally_start = false;
3408+
}
3409+
}
3410+
}
3411+
3412+
//TODO: ACTUALLY MAKE THE RALLYORDER BE FILLED UP PROPERLY
3413+
// SO THIS HACK OF A TEST FOR WARMUP MODE ISN'T NEEDED
3414+
//if (time < 40.0) {
3415+
// m_rally_wait_mode = true;
3416+
//} else {
3417+
// m_rally_wait_mode = false;
3418+
//}
3419+
33673420

33683421
ItemPolicy *item_policy = RaceManager::get()->getItemPolicy();
33693422
item_policy->enforceVirtualPaceCarRulesForKart(this);
@@ -3379,7 +3432,9 @@ void Kart::updatePhysics(int ticks)
33793432

33803433
uint32_t rules = item_policy->m_policy_sections[leader_sec].m_rules;
33813434

3382-
if (rules & ItemPolicyRules::IPT_GHOST_KARTS) {
3435+
if (m_rally_start) {
3436+
getBody()->setTag(GHOST_NO_COLLECTIBLE_KART_TAG);
3437+
} else if (rules & ItemPolicyRules::IPT_GHOST_KARTS) {
33833438
getBody()->setTag(NO_COLLISION_KART_TAG);
33843439
} else {
33853440
getBody()->setTag(KART_TAG);

src/karts/kart.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,8 @@ class Kart : public Moveable
443443
bool m_is_disqualified;
444444
float m_initial_color;
445445

446+
bool m_rally_start;
447+
bool m_rally_wait_mode;
446448

447449
const core::stringw& getName() const { return m_name; }
448450

src/race/race_manager.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ RaceManager::RaceManager()
157157
setNumPlayers(0);
158158
setSpareTireKartNum(0);
159159

160+
m_rally_mode = false;
160161
m_tme_rules.fuel_mode = 0;
161162
m_tme_rules.do_item_preview = 0;
162163
m_tme_rules.wildcards = 0;

src/race/race_manager.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,9 @@ class RaceManager
355355

356356
private:
357357

358+
bool m_rally_mode;
359+
RallyOrder m_rally_order;
360+
358361
/** The kart status data for each kart. */
359362
std::vector<KartStatus> m_kart_status;
360363

@@ -492,6 +495,10 @@ class RaceManager
492495

493496
void setTyreModRules(int fuel_mode, const std::vector<int> &tyre_alloc, int wildcards, bool item_preview);
494497

498+
void setRallyMode(bool a) { m_rally_mode = a; }
499+
bool getRallyMode() const { return m_rally_mode; }
500+
RallyOrder *getRallyOrder() { return getRallyMode() ? &m_rally_order : NULL; }
501+
495502
TyreModRules *getTyreModRules(void);
496503

497504

src/tracks/check_structure.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,11 @@ void CheckStructure::update(float dt)
116116
{
117117
const Vec3 &xyz = world->getKart(i)->getFrontXYZ();
118118
if(world->getKart(i)->getKartAnimation()) continue;
119+
120+
// In rally warmup mode, checklines aren't counted
121+
if (world->getKart(i) && world->getKart(i)->m_rally_wait_mode)
122+
continue;
123+
119124
// Only check active checklines.
120125
if(m_is_active[i] && isTriggered(m_previous_position[i], xyz, i))
121126
{
@@ -222,6 +227,10 @@ void CheckStructure::trigger(unsigned int kart_index)
222227
switch(m_check_type)
223228
{
224229
case CT_NEW_LAP :
230+
// Don't start new laps if rally warmup mode is active
231+
if (World::getWorld()->getKart(kart_index)->m_rally_wait_mode)
232+
break;
233+
225234
World::getWorld()->newLap(kart_index);
226235
if(UserConfigParams::m_check_debug)
227236
{

0 commit comments

Comments
 (0)