(svn r4757) - Newstations: add saveload support for custom station speclists
authorpeter1138
Sat, 06 May 2006 21:46:26 +0000
changeset 3765 e057e2b740d4
parent 3764 ebcaf412fb3a
child 3766 f0077e6b6f99
(svn r4757) - Newstations: add saveload support for custom station speclists
newgrf_station.c
newgrf_station.h
openttd.c
saveload.c
station.h
station_cmd.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
--- 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
--- 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;
 }
--- 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 <setjmp.h>
 
-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!
 
--- 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);
--- 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)