changeset 3505:9604df1e9283 draft

(svn r4356) - NewGRF: Load more newstation properties.
author peter1138 <peter1138@openttd.org>
date Tue, 11 Apr 2006 13:00:06 +0000
parents a1f4afd9767b
children 6033a91bfec7
files newgrf.c newgrf_callbacks.h newgrf_station.h
diffstat 3 files changed, 73 insertions(+), 71 deletions(-) [+]
line wrap: on
line diff
--- a/newgrf.c
+++ b/newgrf.c
@@ -758,9 +758,10 @@
 
 static bool StationChangeInfo(uint stid, int numinfo, int prop, byte **bufp, int len)
 {
+	StationSpec *stat;
 	byte *buf = *bufp;
 	int i;
-	int ret = 0;
+	bool ret = false;
 
 	/* Allocate station specs if necessary */
 	if (_cur_grffile->num_stations < stid + numinfo) {
@@ -773,25 +774,24 @@
 		}
 	}
 
+	stat = &_cur_grffile->stations[stid];
+
 	switch (prop) {
-		case 0x08:
-		{	/* Class ID */
+		case 0x08: /* Class ID */
 			FOR_EACH_OBJECT {
-				StationSpec *stat = &_cur_grffile->stations[stid + i];
 				uint32 classid;
 
-				/* classid, for a change, is always little-endian */
+				/* classid, for a change, is big-endian */
 				classid = *(buf++) << 24;
 				classid |= *(buf++) << 16;
 				classid |= *(buf++) << 8;
 				classid |= *(buf++);
 
-				stat->sclass = AllocateStationClass(classid);
+				stat[i].sclass = AllocateStationClass(classid);
 			}
 			break;
-		}
-		case 0x09:
-		{	/* Define sprite layout */
+
+		case 0x09: /* Define sprite layout */
 			FOR_EACH_OBJECT {
 				StationSpec *stat = &_cur_grffile->stations[stid + i];
 				int t;
@@ -838,9 +838,8 @@
 				}
 			}
 			break;
-		}
-		case 0x0a:
-		{	/* Copy sprite layout */
+
+		case 0x0A: /* Copy sprite layout */
 			FOR_EACH_OBJECT {
 				StationSpec *stat = &_cur_grffile->stations[stid + i];
 				byte srcid = grf_load_byte(&buf);
@@ -876,36 +875,20 @@
 				}
 			}
 			break;
-		}
-		case 0x0b:
-		{	/* Callback */
-			/* TODO */
-			FOR_EACH_OBJECT {
-				grf_load_byte(&buf);
-			}
-			ret = 1;
+
+		case 0x0B: /* Callback mask */
+			FOR_EACH_OBJECT stat[i].callbackmask = grf_load_byte(&buf);
 			break;
-		}
-		case 0x0C:
-		{	/* Platforms number */
-			FOR_EACH_OBJECT {
-				StationSpec *stat = &_cur_grffile->stations[stid + i];
-
-				stat->allowed_platforms = ~grf_load_byte(&buf);
-			}
+
+		case 0x0C: /* Disallowed number of platforms */
+			FOR_EACH_OBJECT stat[i].disallowed_platforms = grf_load_byte(&buf);
 			break;
-		}
-		case 0x0D:
-		{	/* Platforms length */
-			FOR_EACH_OBJECT {
-				StationSpec *stat = &_cur_grffile->stations[stid + i];
-
-				stat->allowed_lengths = ~grf_load_byte(&buf);
-			}
+
+		case 0x0D: /* Disallowed platform lengths */
+			FOR_EACH_OBJECT stat[i].disallowed_lengths = grf_load_byte(&buf);
 			break;
-		}
-		case 0x0e:
-		{	/* Define custom layout */
+
+		case 0x0E: /* Define custom layout */
 			FOR_EACH_OBJECT {
 				StationSpec *stat = &_cur_grffile->stations[stid + i];
 
@@ -957,45 +940,41 @@
 				}
 			}
 			break;
-		}
-		case 0x0f:
-		{	/* Copy custom layout */
+
+		case 0x0F: /* Copy custom layout */
 			/* TODO */
 			FOR_EACH_OBJECT {
 				grf_load_byte(&buf);
 			}
-			ret = 1;
+			ret = true;
+			break;
+
+		case 0x10: /* Little/lots cargo threshold */
+			FOR_EACH_OBJECT stat[i].cargo_threshold = grf_load_word(&buf);
 			break;
-		}
-		case 0x10:
-		{	/* Little/lots cargo threshold */
-			/* TODO */
-			FOR_EACH_OBJECT {
-				grf_load_word(&buf);
-			}
-			ret = 1;
+
+		case 0x11: /* Pylon placement */
+			FOR_EACH_OBJECT stat[i].pylons = grf_load_byte(&buf);
+			break;
+
+		case 0x12: /* Cargo types for random triggers */
+			FOR_EACH_OBJECT stat[i].cargo_triggers = grf_load_dword(&buf);
 			break;
-		}
-		case 0x11:
-		{	/* Pylon placement */
-			/* TODO; makes sense only for electrified tracks */
-			FOR_EACH_OBJECT {
-				grf_load_word(&buf);
-			}
-			ret = 1;
+
+		case 0x13: /* General flags */
+			FOR_EACH_OBJECT stat[i].flags = grf_load_byte(&buf);
+			break;
+
+		case 0x14: /* Overhead wire placement */
+			FOR_EACH_OBJECT stat[i].wires = grf_load_byte(&buf);
 			break;
-		}
-		case 0x12:
-		{	/* Cargo types for random triggers */
-			/* TODO */
-			FOR_EACH_OBJECT {
-				grf_load_dword(&buf);
-			}
-			ret = 1;
+
+		case 0x15: /* Blocked tiles */
+			FOR_EACH_OBJECT stat[i].blocked = grf_load_byte(&buf);
 			break;
-		}
+
 		default:
-			ret = 1;
+			ret = true;
 			break;
 	}
 
--- a/newgrf_callbacks.h
+++ b/newgrf_callbacks.h
@@ -42,6 +42,14 @@
 };
 
 /**
+ * Callback masks for stations.
+ */
+enum StationCallbackMask {
+	CBM_STATION_AVAIL = 0, ///< Availability of station in construction window
+	CBM_CUSTOM_LAYOUT = 1, ///< Use callback to select a tile layout to use
+};
+
+/**
  * Result of a failed callback.
  */
 enum {
--- a/newgrf_station.h
+++ b/newgrf_station.h
@@ -27,12 +27,12 @@
 	 * Bitmask of number of platforms available for the station.
 	 * 0..6 correpsond to 1..7, while bit 7 corresponds to >7 platforms.
 	 */
-	byte allowed_platforms;
+	byte disallowed_platforms;
 	/**
 	 * Bitmask of platform lengths available for the station.
 	 * 0..6 correpsond to 1..7, while bit 7 corresponds to >7 tiles long.
 	 */
-	byte allowed_lengths;
+	byte disallowed_lengths;
 
 	/** Number of tile layouts.
 	 * A minimum of 8 is required is required for stations.
@@ -44,6 +44,21 @@
 	int tiles;
 	DrawTileSprites *renderdata; ///< Array of tile layouts.
 
+	/** Cargo threshold for choosing between little and lots of cargo
+	 * @note little/lots are equivalent to the moving/loading states for vehicles
+	 */
+	uint16 cargo_threshold;
+
+	uint32 cargo_triggers; ///< Bitmask of cargo types which cause trigger re-randomizing
+
+	byte callbackmask; ///< Bitmask of callbacks to use, @see newgrf_callbacks.h
+
+	byte flags; ///< Bitmask of flags, bit 0: use different sprite set; bit 1: divide cargo about by station size
+
+	byte pylons;  ///< Bitmask of base tiles (0 - 7) which should contain elrail pylons
+	byte wires;   ///< Bitmask of base tiles (0 - 7) which should contain elrail wires
+	byte blocked; ///< Bitmask of base tiles (0 - 7) which are blocked to trains
+
 	byte lengths;
 	byte *platforms;
 	StationLayout **layouts;