mirror of https://github.com/OpenTTD/OpenTTD
(svn r4757) - Newstations: add saveload support for custom station speclists
parent
a7a194c4df
commit
10992deeb3
|
@ -164,6 +164,23 @@ const StationSpec *GetCustomStationSpec(StationClassID sclass, uint station)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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.
|
/* Evaluate a tile's position within a station, and return the result a bitstuffed format.
|
||||||
* if not centred: .TNLcCpP, if centred: .TNL..CP
|
* if not centred: .TNLcCpP, if centred: .TNL..CP
|
||||||
* T = Tile layout number (GetStationGfx), N = Number of platforms, L = Length of platforms
|
* T = Tile layout number (GetStationGfx), N = Number of platforms, L = Length of platforms
|
||||||
|
|
|
@ -94,6 +94,7 @@ uint GetNumCustomStations(StationClassID sclass);
|
||||||
|
|
||||||
void SetCustomStationSpec(StationSpec *statspec);
|
void SetCustomStationSpec(StationSpec *statspec);
|
||||||
const StationSpec *GetCustomStationSpec(StationClassID sclass, uint station);
|
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
|
/* 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
|
* NULL - that means we are in a build dialog). The station structure is used
|
||||||
|
|
|
@ -1426,5 +1426,7 @@ bool AfterLoadGame(void)
|
||||||
|
|
||||||
FOR_ALL_PLAYERS(p) p->avail_railtypes = GetPlayerRailtypes(p->index);
|
FOR_ALL_PLAYERS(p) p->avail_railtypes = GetPlayerRailtypes(p->index);
|
||||||
|
|
||||||
|
if (!CheckSavegameVersion(27)) AfterLoadStations();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
#include "variables.h"
|
#include "variables.h"
|
||||||
#include <setjmp.h>
|
#include <setjmp.h>
|
||||||
|
|
||||||
const uint16 SAVEGAME_VERSION = 26;
|
const uint16 SAVEGAME_VERSION = 27;
|
||||||
uint16 _sl_version; /// the major savegame version identifier
|
uint16 _sl_version; /// the major savegame version identifier
|
||||||
byte _sl_minor_version; /// the minor savegame version, DO NOT USE!
|
byte _sl_minor_version; /// the minor savegame version, DO NOT USE!
|
||||||
|
|
||||||
|
|
|
@ -194,6 +194,7 @@ static inline uint16 GetRoadStopPoolSize(void)
|
||||||
VARDEF bool _station_sort_dirty[MAX_PLAYERS];
|
VARDEF bool _station_sort_dirty[MAX_PLAYERS];
|
||||||
VARDEF bool _global_station_sort_dirty;
|
VARDEF bool _global_station_sort_dirty;
|
||||||
|
|
||||||
|
void AfterLoadStations(void);
|
||||||
void GetProductionAroundTiles(AcceptedCargo produced, TileIndex tile, int w, int h, int rad);
|
void GetProductionAroundTiles(AcceptedCargo produced, TileIndex tile, int w, int h, int rad);
|
||||||
void GetAcceptanceAroundTiles(AcceptedCargo accepts, 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);
|
uint GetStationPlatforms(const Station *st, TileIndex tile);
|
||||||
|
|
|
@ -2821,6 +2821,22 @@ void InitializeStations(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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 = {
|
const TileTypeProcs _tile_type_station_procs = {
|
||||||
DrawTile_Station, /* draw_tile_proc */
|
DrawTile_Station, /* draw_tile_proc */
|
||||||
GetSlopeZ_Station, /* get_slope_z_proc */
|
GetSlopeZ_Station, /* get_slope_z_proc */
|
||||||
|
@ -2906,6 +2922,7 @@ static const SaveLoad _station_desc[] = {
|
||||||
/* Used by newstations for graphic variations */
|
/* Used by newstations for graphic variations */
|
||||||
SLE_CONDVAR(Station,random_bits, SLE_UINT16, 27, SL_MAX_VERSION),
|
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,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)
|
// reserve extra space in savegame here. (currently 32 bytes)
|
||||||
SLE_CONDNULL(32, 2, SL_MAX_VERSION),
|
SLE_CONDNULL(32, 2, SL_MAX_VERSION),
|
||||||
|
@ -2927,10 +2944,17 @@ static const SaveLoad _goods_desc[] = {
|
||||||
SLE_END()
|
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)
|
static void SaveLoad_STNS(Station *st)
|
||||||
{
|
{
|
||||||
int i;
|
uint i;
|
||||||
|
|
||||||
SlObject(st, _station_desc);
|
SlObject(st, _station_desc);
|
||||||
for (i = 0; i != NUM_CARGO; i++) {
|
for (i = 0; i != NUM_CARGO; i++) {
|
||||||
|
@ -2941,6 +2965,12 @@ static void SaveLoad_STNS(Station *st)
|
||||||
st->goods[i].enroute_from = INVALID_STATION;
|
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)
|
static void Save_STNS(void)
|
||||||
|
|
Loading…
Reference in New Issue