(svn r647) Cleanup custom station classes handling. (pasky)
authormiham
Wed, 17 Nov 2004 00:52:54 +0000
changeset 438 79b5df3f394a
parent 437 b66c60ebaa8c
child 439 4e71a04a7fce
(svn r647) Cleanup custom station classes handling. (pasky)
grfspecial.c
rail_cmd.c
rail_gui.c
station.h
station_cmd.c
--- a/grfspecial.c	Tue Nov 16 23:51:38 2004 +0000
+++ b/grfspecial.c	Wed Nov 17 00:52:54 2004 +0000
@@ -710,12 +710,25 @@
 		{	/* 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 @@
 				stat->spritegroup[0] = _cur_grffile->spritegroups[groupid];
 				stat->grfid = _cur_grffile->grfid;
 				SetCustomStation(stid, stat);
-				stat->classid = 0;
+				stat->sclass = STAT_CLASS_NONE;
 			}
 		}
 		return;
--- a/rail_cmd.c	Tue Nov 16 23:51:38 2004 +0000
+++ b/rail_cmd.c	Wed Nov 17 00:52:54 2004 +0000
@@ -1564,7 +1564,7 @@
 
 		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 @@
 		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
--- a/rail_gui.c	Tue Nov 16 23:51:38 2004 +0000
+++ b/rail_gui.c	Wed Nov 17 00:52:54 2004 +0000
@@ -307,7 +307,7 @@
 
 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();
--- a/station.h	Tue Nov 16 23:51:38 2004 +0000
+++ b/station.h	Wed Nov 17 00:52:54 2004 +0000
@@ -97,7 +97,18 @@
 	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 @@
 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 */
--- a/station_cmd.c	Tue Nov 16 23:51:38 2004 +0000
+++ b/station_cmd.c	Wed Nov 17 00:52:54 2004 +0000
@@ -967,7 +967,7 @@
 {
 	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 @@
 	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 @@
 {
 	struct RealSpriteGroup *rsg;
 
-	assert(spec->classid == 'WAYP');
+	assert(spec->sclass == STAT_CLASS_WAYP);
 
 	rsg = ResolveStationSpriteGroup(&spec->spritegroup[ctype], stat);
 
@@ -1112,9 +1112,9 @@
 	return 0x42D;
 }
 
-int GetCustomStationsCount(uint32 classid)
+int GetCustomStationsCount(enum StationClass sclass)
 {
-	assert(classid == 'WAYP');
+	assert(sclass == STAT_CLASS_WAYP);
 	return _waypoint_highest_id + 1;
 }