(svn r592) -newgrf: Dynamically allocate global custom station IDs (pasky).
authordarkvater
Sun, 14 Nov 2004 14:53:15 +0000
changeset 400 ad545734c8de
parent 399 b156fa8bcd63
child 401 4153ead8f31e
(svn r592) -newgrf: Dynamically allocate global custom station IDs (pasky).
grfspecial.c
station.h
station_cmd.c
--- a/grfspecial.c	Sun Nov 14 14:10:03 2004 +0000
+++ b/grfspecial.c	Sun Nov 14 14:53:15 2004 +0000
@@ -1219,6 +1219,7 @@
 					seq->image += _cur_grffile->spritegroups[groupid].loading[0];
 				}
 			}
+			stat->grfid = _cur_grffile->grfid;
 			SetCustomStation(stid, stat);
 			stat->classid = 0;
 		}
--- a/station.h	Sun Nov 14 14:10:03 2004 +0000
+++ b/station.h	Sun Nov 14 14:53:15 2004 +0000
@@ -110,13 +110,22 @@
 
 
 struct StationSpec {
-	int globalidx;
+	uint32 grfid;
+	int localidx; // per-GRFFile station index + 1; SetCustomStation() takes care of this
+
 	uint32 classid;
+
 	byte tiles;
 	DrawTileSprites renderdata[8];
 };
 
+/* Here, @stid is local per-GRFFile station index. If spec->localidx is not yet
+ * set, it gets new dynamically allocated global index and spec->localidx is
+ * set to @stid, otherwise we take it as that we are replacing it and try to
+ * search for it first (that isn't much fast but we do it only very seldom). */
 void SetCustomStation(byte stid, struct StationSpec *spec);
+/* Here, @stid is global station index (in continous range 0..GetCustomStationsCount())
+ * (lookup is therefore very fast as we do this very frequently). */
 DrawTileSprites *GetCustomStationRenderdata(uint32 classid, byte stid);
 int GetCustomStationsCount(uint32 classid);
 
--- a/station_cmd.c	Sun Nov 14 14:10:03 2004 +0000
+++ b/station_cmd.c	Sun Nov 14 14:53:15 2004 +0000
@@ -958,19 +958,39 @@
 
 
 /* TODO: Multiple classes! */
-/* FIXME: Also, we should actually allocate the station id (but
- * SetCustomStation() needs to be able to override an existing custom station
- * as well) on our own. This would also prevent possible weirdness if some GRF
- * file used non-contignuous station ids. --pasky */
 
 static int _waypoint_highest_id = -1;
 static struct StationSpec _waypoint_data[256];
 
-void SetCustomStation(byte stid, struct StationSpec *spec)
+void SetCustomStation(byte local_stid, struct StationSpec *spec)
 {
+	int stid = -1;
+
 	assert(spec->classid == 'WAYP');
-	if (stid > _waypoint_highest_id)
-		_waypoint_highest_id = stid;
+
+	if (spec->localidx != 0) {
+		/* Already allocated, try to resolve to global stid */
+		int i;
+
+		for (i = 0; i <= _waypoint_highest_id; i++) {
+			if (_waypoint_data[i].grfid == spec->grfid
+			    && _waypoint_data[i].localidx == local_stid + 1) {
+				stid = i;
+				break;
+			}
+		}
+	}
+
+	if (stid == -1) {
+		/* Allocate new one. */
+		if (_waypoint_highest_id >= 255) {
+			error("Too many custom stations allocated.");
+			return;
+		}
+		stid = ++_waypoint_highest_id;
+		spec->localidx = local_stid + 1;
+	}
+
 	memcpy(&_waypoint_data[stid], spec, sizeof(*spec));
 }