File diff r448:4e5a3380e573 → r449:046a2e56577f
grfspecial.c
Show inline comments
 
@@ -702,11 +702,6 @@ static bool StationChangeInfo(uint stid,
 
	/* 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 @@ static bool StationChangeInfo(uint stid,
 
						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 @@ static bool StationChangeInfo(uint stid,
 
			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 == 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
 

	
 
					if (!length && !number) break;
 
					while (k--) grf_load_byte(&buf);
 
					//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: