@@ -20,13 +20,13 @@ extern DepotPool _depot_pool;
struct Depot : DepotPool::PoolItem<&_depot_pool> {
Town *town;
char *name;
TileIndex xy;
uint16 town_cn; ///< The Nth depot for this town (consecutive number)
uint16 town_cn; ///< The N-1th depot for this town (consecutive number)
Date build_date; ///< Date of construction
Depot(TileIndex xy = INVALID_TILE) : xy(xy) {}
~Depot();
static FORCEINLINE Depot *GetByTile(TileIndex tile)
@@ -2292,12 +2292,25 @@ bool AfterLoadGame()
for (TileIndex t = 0; t < map_size; t++) {
if (!IsTileType(t, MP_STATION)) continue;
if (!IsBuoy(t) && !IsOilRig(t) && !(IsDock(t) && GetTileSlope(t, NULL) == SLOPE_FLAT)) {
SetWaterClass(t, WATER_CLASS_INVALID);
}
/* Waypoints with custom name may have a non-unique town_cn,
* renumber those. First set all affected waypoints to the
* highest possible number to get them numbered in the
* order they have in the pool. */
Waypoint *wp;
FOR_ALL_WAYPOINTS(wp) {
if (wp->name != NULL) wp->town_cn = UINT16_MAX;
if (wp->name != NULL) MakeDefaultName(wp);
/* Road stops is 'only' updating some caches */
AfterLoadRoadStops();
AfterLoadLabelMaps();
@@ -237,14 +237,14 @@ extern TownID _new_town_id;
* @tparam T The type/class to make a default name for
* @param obj The object/instance we want to find the name for
*/
template <class T>
void MakeDefaultName(T *obj)
{
/* We only want to set names if it hasn't been set before. */
assert(obj->name == NULL);
/* We only want to set names if it hasn't been set before, or when we're calling from afterload. */
assert(obj->name == NULL || obj->town_cn == UINT16_MAX);
obj->town = ClosestTownFromTile(obj->xy, UINT_MAX);
/* Find first unused number belonging to this town. This can never fail,
* as long as there can be at most 65535 waypoints/depots in total.
*
@@ -263,14 +263,14 @@ void MakeDefaultName(T *obj)
do {
T *lobj = T::GetIfValid(cid);
/* check only valid waypoints... */
if (lobj != NULL && obj != lobj) {
/* only objects with 'generic' name within the same city and with the same type*/
if (lobj->name == NULL && lobj->town == obj->town && lobj->IsOfType(obj)) {
/* only objects within the same city and with the same type */
if (lobj->town == obj->town && lobj->IsOfType(obj)) {
/* if lobj->town_cn < next, uint will overflow to '+inf' */
uint i = (uint)lobj->town_cn - next;
if (i < 32) {
SetBit(used, i); // update bitmap
if (i == 0) {
@@ -12,13 +12,13 @@
#ifndef WAYPOINT_H
#define WAYPOINT_H
#include "base_station_base.h"
struct Waypoint : SpecializedStation<Waypoint, true> {
uint16 town_cn; ///< The Nth waypoint for this town (consecutive number)
uint16 town_cn; ///< The N-1th waypoint for this town (consecutive number)
Waypoint(TileIndex tile = INVALID_TILE) : SpecializedStation<Waypoint, true>(tile) { }
~Waypoint();
void UpdateVirtCoord();
@@ -403,18 +403,12 @@ CommandCost CmdRenameWaypoint(TileIndex
if (strlen(text) >= MAX_LENGTH_STATION_NAME_BYTES) return CMD_ERROR;
if (!IsUniqueWaypointName(text)) return_cmd_error(STR_ERROR_NAME_MUST_BE_UNIQUE);
if (flags & DC_EXEC) {
free(wp->name);
if (reset) {
wp->name = NULL;
MakeDefaultName(wp);
} else {
wp->name = strdup(text);
wp->name = reset ? NULL : strdup(text);
wp->UpdateVirtCoord();
return CommandCost();
Status change: