(svn r659) Support for cutomized TTDPatch-style new stations (no selector GUI yet) (pasky)

This commit is contained in:
tron
2004-11-17 18:03:33 +00:00
parent c4e9896851
commit 3a7abc2a35
5 changed files with 169 additions and 53 deletions

View File

@@ -702,11 +702,6 @@ static bool StationChangeInfo(uint stid, int numinfo, int prop, byte **bufp, int
/* 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, int numinfo, int prop, byte **bufp, int
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, int numinfo, int prop, byte **bufp, int
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: