summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--grfspecial.c1
-rw-r--r--station.h11
-rw-r--r--station_cmd.c34
3 files changed, 38 insertions, 8 deletions
diff --git a/grfspecial.c b/grfspecial.c
index 55b813bd5..4470c687e 100644
--- a/grfspecial.c
+++ b/grfspecial.c
@@ -1219,6 +1219,7 @@ static void NewVehicle_SpriteGroupMapping(byte *buf, int len)
seq->image += _cur_grffile->spritegroups[groupid].loading[0];
}
}
+ stat->grfid = _cur_grffile->grfid;
SetCustomStation(stid, stat);
stat->classid = 0;
}
diff --git a/station.h b/station.h
index 73ac8f8f7..b8759e49f 100644
--- a/station.h
+++ b/station.h
@@ -110,13 +110,22 @@ typedef struct DrawTileSprites {
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);
diff --git a/station_cmd.c b/station_cmd.c
index 05b235833..8d8ce56ea 100644
--- a/station_cmd.c
+++ b/station_cmd.c
@@ -958,19 +958,39 @@ uint GetStationPlatforms(Station *st, uint tile)
/* 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));
}