From b312055c805286641ce1fb57fb7efdc63daed870 Mon Sep 17 00:00:00 2001 From: celestar Date: Sun, 30 Jan 2005 22:04:14 +0000 Subject: [PATCH] (svn r1743) -Fix: Multistop: Added some debug output and made sure that orphaned slots are cleared. --- roadveh_cmd.c | 4 ++-- station_cmd.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/roadveh_cmd.c b/roadveh_cmd.c index 21b28c41a0..d698945301 100644 --- a/roadveh_cmd.c +++ b/roadveh_cmd.c @@ -1470,8 +1470,8 @@ again: //we have arrived at the wrong station //XXX The question is .. what to do? Actually we shouldn't be here //but I guess we need to clear the slot - DEBUG(misc, 2) ("Multistop: Wrong station, force a slot clearing"); - ClearSlot(v, rs); + DEBUG(misc, 1) ("Multistop: Wrong station, force a slot clearing. Vehicle %d at 0x%x, should go to 0x%x of station %d (%x), destination 0x%x", v->unitnumber, v->tile, v->u.road.slot->xy, st->index, st->xy, v->dest_tile); + ClearSlot(v, v->u.road.slot); } StartRoadVehSound(v); diff --git a/station_cmd.c b/station_cmd.c index a1694a0096..d6d81c7023 100644 --- a/station_cmd.c +++ b/station_cmd.c @@ -2398,6 +2398,43 @@ static void StationHandleBigTick(Station *st) if (++st->delete_ctr >= 8) DeleteStation(st); } + + //Here we saveguard against orphaned slots + { + RoadStop *rs; + + for (rs = GetPrimaryRoadStop(st, RS_BUS); rs != NULL; rs = rs->next) { + int k; + for (k = 0; k < NUM_SLOTS; k++) { + if (rs->slot[k] != INVALID_SLOT) { + Vehicle *v = GetVehicle(rs->slot[k]); + + if (v->u.road.slot != rs) { + DEBUG(misc, 1) ("Bus Slot Desync! cleaning up (Don't panic)"); + v->u.road.slot = NULL; + v->u.road.slot_age = 0; + rs->slot[k] = INVALID_SLOT; + } + } + } + } + + for (rs = GetPrimaryRoadStop(st, RS_TRUCK); rs != NULL; rs = rs->next) { + int k; + for (k = 0; k < NUM_SLOTS; k++) { + if (rs->slot[k] != INVALID_SLOT) { + Vehicle *v = GetVehicle(rs->slot[k]); + + if (v->u.road.slot != rs) { + DEBUG(misc, 1) ("Truck Slot Desync! cleaning up (Don't panic)"); + v->u.road.slot = NULL; + v->u.road.slot_age = 0; + rs->slot[k] = INVALID_SLOT; + } + } + } + } + } } static inline void byte_inc_sat(byte *p) { byte b = *p + 1; if (b != 0) *p = b; }