From 86d19cb577a8b6d73840563d36983e7caf4d1eb6 Mon Sep 17 00:00:00 2001 From: miham Date: Wed, 17 Nov 2004 00:52:54 +0000 Subject: [PATCH] (svn r647) Cleanup custom station classes handling. (pasky) --- grfspecial.c | 23 ++++++++++++++++++----- rail_cmd.c | 4 ++-- rail_gui.c | 2 +- station.h | 17 ++++++++++++++--- station_cmd.c | 12 ++++++------ 5 files changed, 41 insertions(+), 17 deletions(-) diff --git a/grfspecial.c b/grfspecial.c index 1fbef4e0bf..e9ea0126dd 100644 --- a/grfspecial.c +++ b/grfspecial.c @@ -710,12 +710,25 @@ static bool StationChangeInfo(uint stid, int numinfo, int prop, byte **bufp, int { /* Class ID */ FOR_EACH_ENGINE { struct StationSpec *stat = &_cur_grffile->stations[stid + i]; + uint32 classid; /* classid, for a change, is always little-endian */ - stat->classid = *(buf++) << 24; - stat->classid |= *(buf++) << 16; - stat->classid |= *(buf++) << 8; - stat->classid |= *(buf++); + classid = *(buf++) << 24; + classid |= *(buf++) << 16; + classid |= *(buf++) << 8; + classid |= *(buf++); + + switch (classid) { + case 'DFLT': + stat->sclass = STAT_CLASS_DFLT; + break; + case 'WAYP': + stat->sclass = STAT_CLASS_WAYP; + break; + default: + stat->sclass = STAT_CLASS_CUSTOM; + break; + } } break; } @@ -1288,7 +1301,7 @@ static void NewVehicle_SpriteGroupMapping(byte *buf, int len) stat->spritegroup[0] = _cur_grffile->spritegroups[groupid]; stat->grfid = _cur_grffile->grfid; SetCustomStation(stid, stat); - stat->classid = 0; + stat->sclass = STAT_CLASS_NONE; } } return; diff --git a/rail_cmd.c b/rail_cmd.c index 053c6792c6..80fec6b113 100644 --- a/rail_cmd.c +++ b/rail_cmd.c @@ -1564,7 +1564,7 @@ static void DrawTile_Track(TileInfo *ti) if (!IS_RAIL_DEPOT(m5) && IS_RAIL_WAYPOINT(m5) && _map3_lo[ti->tile]&16) { // look for customization - struct StationSpec *stat = GetCustomStation('WAYP', _map3_hi[ti->tile]); + struct StationSpec *stat = GetCustomStation(STAT_CLASS_WAYP, _map3_hi[ti->tile]); if (stat) { DrawTileSeqStruct const *seq; @@ -1677,7 +1677,7 @@ void DrawWaypointSprite(int x, int y, int stat_id, int railtype) return; } - stat = GetCustomStation('WAYP', stat_id - 1); + stat = GetCustomStation(STAT_CLASS_WAYP, stat_id - 1); assert(stat); relocation = GetCustomStationRelocation(stat, NULL, 1); // emulate station tile - open with building diff --git a/rail_gui.c b/rail_gui.c index 050ac03bcf..b50b56c59f 100644 --- a/rail_gui.c +++ b/rail_gui.c @@ -307,7 +307,7 @@ static void BuildRailClick_Sign(Window *w) static void BuildRailClick_Waypoint(Window *w) { - _waypoint_count = GetCustomStationsCount('WAYP'); + _waypoint_count = GetCustomStationsCount(STAT_CLASS_WAYP); if (HandlePlacePushButton(w, 18, SPR_OPENTTD_BASE + 7, 1, PlaceRail_Waypoint) && _waypoint_count > 1) ShowBuildWaypointPicker(); diff --git a/station.h b/station.h index 7d926b0e68..5d1c7b5075 100644 --- a/station.h +++ b/station.h @@ -97,7 +97,18 @@ struct StationSpec { uint32 grfid; int localidx; // per-GRFFile station index + 1; SetCustomStation() takes care of this - uint32 classid; + enum StationClass { + STAT_CLASS_NONE, // unused station slot or so + STAT_CLASS_DFLT, // default station class + STAT_CLASS_WAYP, // waypoints + + /* TODO: When we actually support custom classes, they are + * going to be allocated dynamically (with some classid->sclass + * mapping, there's a TTDPatch limit on 16 custom classes in + * the whole game at the same time) with base at + * STAT_CLASS_CUSTOM. --pasky */ + STAT_CLASS_CUSTOM, // some custom class + } sclass; byte tiles; DrawTileSprites renderdata[8]; @@ -114,11 +125,11 @@ struct StationSpec { 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). */ -struct StationSpec *GetCustomStation(uint32 classid, byte stid); +struct StationSpec *GetCustomStation(enum StationClass sclass, byte stid); /* Get sprite offset for a given custom station and station structure (may be * NULL if ctype is set - that means we are in a build dialog). The station * structure is used for variational sprite groups. */ uint32 GetCustomStationRelocation(struct StationSpec *spec, struct Station *stat, byte ctype); -int GetCustomStationsCount(uint32 classid); +int GetCustomStationsCount(enum StationClass sclass); #endif /* STATION_H */ diff --git a/station_cmd.c b/station_cmd.c index d6d707e179..a555632594 100644 --- a/station_cmd.c +++ b/station_cmd.c @@ -967,7 +967,7 @@ void SetCustomStation(byte local_stid, struct StationSpec *spec) { int stid = -1; - assert(spec->classid == 'WAYP'); + assert(spec->sclass == STAT_CLASS_WAYP); if (spec->localidx != 0) { /* Already allocated, try to resolve to global stid */ @@ -998,9 +998,9 @@ void SetCustomStation(byte local_stid, struct StationSpec *spec) memcpy(&_waypoint_data[stid], spec, sizeof(*spec)); } -struct StationSpec *GetCustomStation(uint32 classid, byte stid) +struct StationSpec *GetCustomStation(enum StationClass sclass, byte stid) { - assert(classid == 'WAYP'); + assert(sclass == STAT_CLASS_WAYP); if (stid > _waypoint_highest_id) return NULL; return &_waypoint_data[stid]; @@ -1092,7 +1092,7 @@ uint32 GetCustomStationRelocation(struct StationSpec *spec, struct Station *stat { struct RealSpriteGroup *rsg; - assert(spec->classid == 'WAYP'); + assert(spec->sclass == STAT_CLASS_WAYP); rsg = ResolveStationSpriteGroup(&spec->spritegroup[ctype], stat); @@ -1112,9 +1112,9 @@ uint32 GetCustomStationRelocation(struct StationSpec *spec, struct Station *stat return 0x42D; } -int GetCustomStationsCount(uint32 classid) +int GetCustomStationsCount(enum StationClass sclass) { - assert(classid == 'WAYP'); + assert(sclass == STAT_CLASS_WAYP); return _waypoint_highest_id + 1; }