diff options
author | celestar <celestar@openttd.org> | 2005-01-30 22:04:14 +0000 |
---|---|---|
committer | celestar <celestar@openttd.org> | 2005-01-30 22:04:14 +0000 |
commit | b312055c805286641ce1fb57fb7efdc63daed870 (patch) | |
tree | 1b4965bbdd1fe6252f37dc3900abe5b0c5313de7 | |
parent | 1c109afdaafe6d2ce6fe8fd34678d7f9a50d5fcd (diff) | |
download | openttd-b312055c805286641ce1fb57fb7efdc63daed870.tar.xz |
(svn r1743) -Fix: Multistop: Added some debug output and made sure that orphaned slots are cleared.
-rw-r--r-- | roadveh_cmd.c | 4 | ||||
-rw-r--r-- | station_cmd.c | 37 |
2 files changed, 39 insertions, 2 deletions
diff --git a/roadveh_cmd.c b/roadveh_cmd.c index 21b28c41a..d69894530 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 a1694a009..d6d81c702 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; } |