(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)
This commit is contained in:
celestar 2006-04-18 08:50:17 +00:00
parent 62f7907d3a
commit e75e4e8f74
7 changed files with 17 additions and 10 deletions

View File

@ -1435,7 +1435,7 @@ int LoadUnloadVehicle(Vehicle *v)
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;
}
}

View File

@ -682,7 +682,7 @@ static const OldChunks station_chunk[] = {
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

View File

@ -1403,6 +1403,13 @@ bool AfterLoadGame(void)
}
}
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;

View File

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

View File

@ -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 @@ struct Station {
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 */

View File

@ -467,7 +467,7 @@ static void StationInitialize(Station *st, TileIndex tile)
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 @@ static void UpdateStationRating(Station *st)
{
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 @@ void BuildOilRig(TileIndex tile)
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 @@ static const SaveLoad _station_desc[] = {
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),

View File

@ -8,6 +8,7 @@
#include "rail.h"
enum {
VEH_Invalid = 0,
VEH_Train = 0x10,
VEH_Road = 0x11,
VEH_Ship = 0x12,