(svn r4466) -Fix: (FS#71) Game no longer crashes when the last vehicle serving a station has been deleted.
-Negative side effect: upon loading old games, stations whose last vehicle was a station have (temporarily) lower ratings.
-Positive side effect: station.h no longer includes vehicle.h (breaks the station.h->vehicle.h->rail.h chain)
--- a/economy.c Tue Apr 18 07:20:37 2006 +0000
+++ b/economy.c Tue Apr 18 08:50:17 2006 +0000
@@ -1435,7 +1435,7 @@
v->cargo_source = ge->enroute_from;
v->cargo_days = ge->enroute_time;
result |= 2;
- st->last_vehicle = v->index;
+ st->last_vehicle_type = v->type;
}
}
--- a/oldloader.c Tue Apr 18 07:20:37 2006 +0000
+++ b/oldloader.c Tue Apr 18 08:50:17 2006 +0000
@@ -682,7 +682,7 @@
OCL_SVAR( OC_UINT8, Station, blocked_months_obsolete ),
OCL_NULL( 1 ), // Unknown
OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Station, airport_flags ),
- OCL_SVAR( OC_UINT16, Station, last_vehicle ),
+ OCL_NULL( 2 ), // last_vehicle. now last_vehicle_type
OCL_NULL( 4 ), // Junk at end of chunk
--- a/openttd.c Tue Apr 18 07:20:37 2006 +0000
+++ b/openttd.c Tue Apr 18 08:50:17 2006 +0000
@@ -1403,6 +1403,13 @@
}
}
+ if (CheckSavegameVersion(26)) {
+ Station *st;
+ FOR_ALL_STATIONS(st) {
+ st->last_vehicle_type = VEH_Invalid;
+ }
+ }
+
FOR_ALL_PLAYERS(p) p->avail_railtypes = GetPlayerRailtypes(p->index);
return true;
--- a/saveload.c Tue Apr 18 07:20:37 2006 +0000
+++ b/saveload.c Tue Apr 18 08:50:17 2006 +0000
@@ -30,7 +30,7 @@
#include "variables.h"
#include <setjmp.h>
-const uint16 SAVEGAME_VERSION = 25;
+const uint16 SAVEGAME_VERSION = 26;
uint16 _sl_version; /// the major savegame version identifier
byte _sl_minor_version; /// the minor savegame version, DO NOT USE!
--- a/station.h Tue Apr 18 07:20:37 2006 +0000
+++ b/station.h Tue Apr 18 08:50:17 2006 +0000
@@ -7,7 +7,6 @@
#include "pool.h"
#include "sprite.h"
#include "tile.h"
-#include "vehicle.h"
#include "newgrf_station.h"
typedef struct GoodsEntry {
@@ -72,7 +71,7 @@
uint32 airport_flags;
StationID index;
- VehicleID last_vehicle;
+ byte last_vehicle_type;
GoodsEntry goods[NUM_CARGO];
/* Stuff that is no longer used, but needed for conversion */
--- a/station_cmd.c Tue Apr 18 07:20:37 2006 +0000
+++ b/station_cmd.c Tue Apr 18 08:50:17 2006 +0000
@@ -467,7 +467,7 @@
st->delete_ctr = 0;
st->facilities = 0;
- st->last_vehicle = INVALID_VEHICLE;
+ st->last_vehicle_type = VEH_Invalid;
for (ge = st->goods; ge != endof(st->goods); ge++) {
ge->waiting_acceptance = 0;
@@ -2317,8 +2317,7 @@
{
byte days = ge->days_since_pickup;
- if (st->last_vehicle != INVALID_VEHICLE &&
- GetVehicle(st->last_vehicle)->type == VEH_Ship)
+ if (st->last_vehicle_type == VEH_Ship)
days >>= 2;
(days > 21) ||
(rating += 25, days > 12) ||
@@ -2644,7 +2643,7 @@
st->time_since_load = 255;
st->time_since_unload = 255;
st->delete_ctr = 0;
- st->last_vehicle = INVALID_VEHICLE;
+ st->last_vehicle_type = VEH_Invalid;
st->facilities = FACIL_AIRPORT | FACIL_DOCK;
st->build_date = _date;
@@ -2817,7 +2816,8 @@
SLE_CONDVAR(Station,airport_flags, SLE_VAR_U32 | SLE_FILE_U16, 0, 2),
SLE_CONDVAR(Station,airport_flags, SLE_UINT32, 3, SL_MAX_VERSION),
- SLE_VAR(Station,last_vehicle, SLE_UINT16),
+ SLE_CONDNULL(2, 0, 25), /* Ex last-vehicle */
+ SLE_CONDVAR(Station,last_vehicle_type, SLE_UINT8 , 26, SL_MAX_VERSION),
// Was custom station class and id
SLE_CONDNULL(2, 3, 25),
--- a/vehicle.h Tue Apr 18 07:20:37 2006 +0000
+++ b/vehicle.h Tue Apr 18 08:50:17 2006 +0000
@@ -8,6 +8,7 @@
#include "rail.h"
enum {
+ VEH_Invalid = 0,
VEH_Train = 0x10,
VEH_Road = 0x11,
VEH_Ship = 0x12,