grfspecial.c
changeset 449 d9325d9f24bb
parent 448 5aa84112454c
--- a/grfspecial.c	Wed Nov 17 17:15:36 2004 +0000
+++ b/grfspecial.c	Wed Nov 17 18:03:33 2004 +0000
@@ -702,11 +702,6 @@
 	/* This is one single huge TODO. It doesn't handle anything more than
 	 * just waypoints for now. */
 
-	/* TODO: Differentiate between railtypes. This is missing in the new
-	 * GRF file specification yet, though, so I need to agree on this with
-	 * patchman yet. We just assume all the station stuff is for railtype 0
-	 * (railroad) for now. --pasky */
-
 	//printf("sci %d %d [0x%02x]\n", stid, numinfo, prop);
 	switch (prop) {
 		case 0x08:
@@ -729,7 +724,12 @@
 						stat->sclass = STAT_CLASS_WAYP;
 						break;
 					default:
-						stat->sclass = STAT_CLASS_CUSTOM;
+						/* TODO: No support for custom
+						 * classes for now, so stuff
+						 * everything to the single
+						 * default one. --pasky */
+						stat->sclass = STAT_CLASS_DFLT;
+						//stat->sclass = STAT_CLASS_CUSTOM;
 						break;
 				}
 			}
@@ -826,38 +826,72 @@
 			ret = 1;
 			break;
 		}
-		case 0x0c:
+		case 0x0C:
 		{	/* Platforms number */
-			/* TODO */
 			FOR_EACH_OBJECT {
-				grf_load_byte(&buf);
+				struct StationSpec *stat = &_cur_grffile->stations[stid + i];
+
+				stat->allowed_platforms = ~grf_load_byte(&buf);
 			}
-			ret = 1;
 			break;
 		}
-		case 0x0d:
+		case 0x0D:
 		{	/* Platforms length */
-			/* TODO */
 			FOR_EACH_OBJECT {
-				grf_load_byte(&buf);
+				struct StationSpec *stat = &_cur_grffile->stations[stid + i];
+
+				stat->allowed_lengths = ~grf_load_byte(&buf);
 			}
-			ret = 1;
 			break;
 		}
 		case 0x0e:
 		{	/* Define custom layout */
-			/* TODO */
 			FOR_EACH_OBJECT {
+				struct StationSpec *stat = &_cur_grffile->stations[stid + i];
+
 				while (buf < *bufp + len) {
 					byte length = grf_load_byte(&buf);
 					byte number = grf_load_byte(&buf);
-					int k = length * number;
+					StationLayout layout;
+					int l, p;
 
-					if (!length && !number) break;
-					while (k--) grf_load_byte(&buf);
+					if (length == 0 || number == 0) break;
+
+					//debug("l %d > %d ?", length, stat->lengths);
+					if (length > stat->lengths) {
+						stat->platforms = realloc(stat->platforms, length);
+						memset(stat->platforms + stat->lengths, 0, length - stat->lengths);
+
+						stat->layouts = realloc(stat->layouts, length * sizeof(*stat->layouts));
+						memset(stat->layouts + stat->lengths, 0,
+						       (length - stat->lengths) * sizeof(*stat->layouts));
+
+						stat->lengths = length;
+					}
+					l = length - 1; // index is zero-based
+
+					//debug("p %d > %d ?", number, stat->platforms[l]);
+					if (number > stat->platforms[l]) {
+						stat->layouts[l] = realloc(stat->layouts[l],
+						                               number * sizeof(**stat->layouts));
+						// We expect NULL being 0 here, but C99 guarantees that.
+						memset(stat->layouts[l] + stat->platforms[l], 0,
+						       (number - stat->platforms[l]) * sizeof(**stat->layouts));
+
+						stat->platforms[l] = number;
+					}
+
+					layout = malloc(length * number);
+					for (l = 0; l < length; l++)
+						for (p = 0; p < number; p++)
+							layout[l * number + p] = grf_load_byte(&buf);
+
+					l--;
+					p--;
+					free(stat->layouts[l][p]);
+					stat->layouts[l][p] = layout;
 				}
 			}
-			ret = 1;
 			break;
 		}
 		case 0x0f: