# HG changeset patch # User peter1138 # Date 1146951986 0 # Node ID a4ddbff73f9f2bddbd13d255197500c257bb389b # Parent f017ce73e96b47262a6c963a3fb8025fcbf4c507 (svn r4757) - Newstations: add saveload support for custom station speclists diff -r f017ce73e96b -r a4ddbff73f9f newgrf_station.c --- a/newgrf_station.c Sat May 06 20:48:40 2006 +0000 +++ b/newgrf_station.c Sat May 06 21:46:26 2006 +0000 @@ -164,6 +164,23 @@ } +const StationSpec *GetCustomStationSpecByGrf(uint32 grfid, byte localidx) +{ + StationClassID i; + uint j; + + for (i = STAT_CLASS_DFLT; i < STAT_CLASS_MAX; i++) { + for (j = 0; j < station_classes[i].stations; j++) { + const StationSpec *statspec = station_classes[i].spec[j]; + if (statspec == NULL) continue; + if (statspec->grfid == grfid && statspec->localidx == localidx) return statspec; + } + } + + return NULL; +} + + /* Evaluate a tile's position within a station, and return the result a bitstuffed format. * if not centred: .TNLcCpP, if centred: .TNL..CP * T = Tile layout number (GetStationGfx), N = Number of platforms, L = Length of platforms diff -r f017ce73e96b -r a4ddbff73f9f newgrf_station.h --- a/newgrf_station.h Sat May 06 20:48:40 2006 +0000 +++ b/newgrf_station.h Sat May 06 21:46:26 2006 +0000 @@ -94,6 +94,7 @@ void SetCustomStationSpec(StationSpec *statspec); const StationSpec *GetCustomStationSpec(StationClassID sclass, uint station); +const StationSpec *GetCustomStationSpecByGrf(uint32 grfid, byte localidx); /* Get sprite offset for a given custom station and station structure (may be * NULL - that means we are in a build dialog). The station structure is used diff -r f017ce73e96b -r a4ddbff73f9f openttd.c --- a/openttd.c Sat May 06 20:48:40 2006 +0000 +++ b/openttd.c Sat May 06 21:46:26 2006 +0000 @@ -1426,5 +1426,7 @@ FOR_ALL_PLAYERS(p) p->avail_railtypes = GetPlayerRailtypes(p->index); + if (!CheckSavegameVersion(27)) AfterLoadStations(); + return true; } diff -r f017ce73e96b -r a4ddbff73f9f saveload.c --- a/saveload.c Sat May 06 20:48:40 2006 +0000 +++ b/saveload.c Sat May 06 21:46:26 2006 +0000 @@ -30,7 +30,7 @@ #include "variables.h" #include -const uint16 SAVEGAME_VERSION = 26; +const uint16 SAVEGAME_VERSION = 27; uint16 _sl_version; /// the major savegame version identifier byte _sl_minor_version; /// the minor savegame version, DO NOT USE! diff -r f017ce73e96b -r a4ddbff73f9f station.h --- a/station.h Sat May 06 20:48:40 2006 +0000 +++ b/station.h Sat May 06 21:46:26 2006 +0000 @@ -194,6 +194,7 @@ VARDEF bool _station_sort_dirty[MAX_PLAYERS]; VARDEF bool _global_station_sort_dirty; +void AfterLoadStations(void); void GetProductionAroundTiles(AcceptedCargo produced, TileIndex tile, int w, int h, int rad); void GetAcceptanceAroundTiles(AcceptedCargo accepts, TileIndex tile, int w, int h, int rad); uint GetStationPlatforms(const Station *st, TileIndex tile); diff -r f017ce73e96b -r a4ddbff73f9f station_cmd.c --- a/station_cmd.c Sat May 06 20:48:40 2006 +0000 +++ b/station_cmd.c Sat May 06 21:46:26 2006 +0000 @@ -2821,6 +2821,22 @@ } +void AfterLoadStations(void) +{ + Station *st; + uint i; + + /* Update the speclists of all stations to point to the currently loaded custom stations. */ + FOR_ALL_STATIONS(st) { + for (i = 0; i < st->num_specs; i++) { + if (st->speclist[i].grfid == 0) continue; + + st->speclist[i].spec = GetCustomStationSpecByGrf(st->speclist[i].grfid, st->speclist[i].localidx); + } + } +} + + const TileTypeProcs _tile_type_station_procs = { DrawTile_Station, /* draw_tile_proc */ GetSlopeZ_Station, /* get_slope_z_proc */ @@ -2906,6 +2922,7 @@ /* Used by newstations for graphic variations */ SLE_CONDVAR(Station,random_bits, SLE_UINT16, 27, SL_MAX_VERSION), SLE_CONDVAR(Station,waiting_triggers, SLE_UINT8, 27, SL_MAX_VERSION), + SLE_CONDVAR(Station,num_specs, SLE_UINT8, 27, SL_MAX_VERSION), // reserve extra space in savegame here. (currently 32 bytes) SLE_CONDNULL(32, 2, SL_MAX_VERSION), @@ -2927,10 +2944,17 @@ SLE_END() }; +static const SaveLoad _station_speclist_desc[] = { + SLE_CONDVAR(StationSpecList, grfid, SLE_UINT32, 27, SL_MAX_VERSION), + SLE_CONDVAR(StationSpecList, localidx, SLE_UINT8, 27, SL_MAX_VERSION), + + SLE_END() +}; + static void SaveLoad_STNS(Station *st) { - int i; + uint i; SlObject(st, _station_desc); for (i = 0; i != NUM_CARGO; i++) { @@ -2941,6 +2965,12 @@ st->goods[i].enroute_from = INVALID_STATION; } } + + if (st->num_specs != 0) { + /* Allocate speclist memory when loading a game */ + if (st->speclist == NULL) st->speclist = calloc(st->num_specs, sizeof(*st->speclist)); + for (i = 0; i < st->num_specs; i++) SlObject(&st->speclist[i], _station_speclist_desc); + } } static void Save_STNS(void)