summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormiham <miham@openttd.org>2004-11-17 00:52:54 +0000
committermiham <miham@openttd.org>2004-11-17 00:52:54 +0000
commit86d19cb577a8b6d73840563d36983e7caf4d1eb6 (patch)
treef9cadca3e19886b1b11b1dd94abd5ed3be4e94b8
parentcd6cb848892c7714d90845a85be24181f44bc7ee (diff)
downloadopenttd-86d19cb577a8b6d73840563d36983e7caf4d1eb6.tar.xz
(svn r647) Cleanup custom station classes handling. (pasky)
-rw-r--r--grfspecial.c23
-rw-r--r--rail_cmd.c4
-rw-r--r--rail_gui.c2
-rw-r--r--station.h17
-rw-r--r--station_cmd.c12
5 files changed, 41 insertions, 17 deletions
diff --git a/grfspecial.c b/grfspecial.c
index 1fbef4e0b..e9ea0126d 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 053c6792c..80fec6b11 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 050ac03bc..b50b56c59 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 7d926b0e6..5d1c7b507 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 d6d707e17..a55563259 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;
}