diff --git a/src/lang/english.txt b/src/lang/english.txt index 3871c72a8f..4c9b9b85e3 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 be0253f952..a2ad21ec60 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 cfa23287dd..ca641577bf 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 */