From db546e607f72c70fb89fe05f5baa7b425bb92123 Mon Sep 17 00:00:00 2001 From: rubidium Date: Sat, 10 Jan 2009 14:30:01 +0000 Subject: (svn r14956) -Fix [FS#1832]: building new station parts didn't allocate a new station spec effectively breaking variable 41. This was due to the limited number of station specs that we can have per station. This fix makes newly build station parts create a new spec until one cannot allocate new station specs anymore and it'll revert to the old behaviour (sharing station specs). --- src/lang/english.txt | 1 + src/newgrf_station.cpp | 18 ++++++++++++------ src/station_cmd.cpp | 2 +- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index 3871c72a8..4c9b9b85e 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1912,6 +1912,7 @@ STR_3005_TOO_CLOSE_TO_ANOTHER_RAILROAD :{WHITE}Too clos STR_3006_ADJOINS_MORE_THAN_ONE_EXISTING :{WHITE}Adjoins more than one existing station/loading area STR_3007_TOO_MANY_STATIONS_LOADING :{WHITE}Too many stations/loading areas in this town STR_3008_TOO_MANY_STATIONS_LOADING :{WHITE}Too many stations/loading areas +STR_TOO_MANY_STATION_SPECS :{WHITE}Too many railway station parts STR_TOO_MANY_BUS_STOPS :{WHITE}Too many bus stops STR_TOO_MANY_TRUCK_STOPS :{WHITE}Too many lorry stations STR_3009_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Too close to another station/loading area diff --git a/src/newgrf_station.cpp b/src/newgrf_station.cpp index be0253f95..a2ad21ec6 100644 --- a/src/newgrf_station.cpp +++ b/src/newgrf_station.cpp @@ -693,16 +693,22 @@ int AllocateSpecToStation(const StationSpec *statspec, Station *st, bool exec) if (statspec == NULL || st == NULL) return 0; - /* Check if this spec has already been allocated */ - for (i = 1; i < st->num_specs && i < MAX_SPECLIST; i++) { - if (st->speclist[i].spec == statspec) return i; - } - for (i = 1; i < st->num_specs && i < MAX_SPECLIST; i++) { if (st->speclist[i].spec == NULL && st->speclist[i].grfid == 0) break; } - if (i == MAX_SPECLIST) return -1; + if (i == MAX_SPECLIST) { + /* As final effort when the spec list is already full... + * try to find the same spec and return that one. This might + * result in slighty "wrong" (as per specs) looking stations, + * but it's fairly unlikely that one reaches the limit anyways. + */ + for (i = 1; i < st->num_specs && i < MAX_SPECLIST; i++) { + if (st->speclist[i].spec == statspec) return i; + } + + return -1; + } if (exec) { if (i >= st->num_specs) { diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index cfa23287d..ca641577b 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -1031,7 +1031,7 @@ CommandCost CmdBuildRailroadStation(TileIndex tile_org, uint32 flags, uint32 p1, /* Check if we can allocate a custom stationspec to this station */ const StationSpec *statspec = GetCustomStationSpec((StationClassID)GB(p2, 0, 8), GB(p2, 8, 8)); int specindex = AllocateSpecToStation(statspec, st, flags & DC_EXEC); - if (specindex == -1) return CMD_ERROR; + if (specindex == -1) return_cmd_error(STR_TOO_MANY_STATION_SPECS); if (statspec != NULL) { /* Perform NewStation checks */ -- cgit v1.2.3-70-g09d2