(svn r592) -newgrf: Dynamically allocate global custom station IDs (pasky).

pull/155/head
darkvater 20 years ago
parent ccc496ba2c
commit 5847317526

@ -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;
}

@ -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);

@ -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));
}

Loading…
Cancel
Save