77#include "table/strings.h"
107 for (
const auto &depot : as->
depots) {
123template <
class T,
class F>
132 if (!T::IsValidID(t) || T::Get(t)->owner != company || !filter(T::Get(t)))
continue;
133 if (closest_station == StationID::Invalid()) {
135 }
else if (closest_station != t) {
136 return CommandCost(STR_ERROR_ADJOINS_MORE_THAN_ONE_EXISTING);
140 *st = (closest_station == StationID::Invalid()) ?
nullptr : T::Get(closest_station);
161 for (
int dx = -3; dx <= 3; dx++) {
162 for (
int dy = -3; dy <= 3; dy++) {
186 for (
const auto &p : ind->
produced) {
190 !
CargoSpec::Get(p.cargo)->classes.Any({CargoClass::Liquid, CargoClass::Passengers, CargoClass::Mail})) {
230 std::bitset<(STR_SV_STNAME_FALLBACK - STR_SV_STNAME).base()>
used_names;
240 assert(
IsInsideMM(str, STR_SV_STNAME, STR_SV_STNAME_FALLBACK));
241 return !this->
used_names.test((str - STR_SV_STNAME).base());
250 assert(
IsInsideMM(str, STR_SV_STNAME, STR_SV_STNAME_FALLBACK));
251 this->
used_names.set((str - STR_SV_STNAME).base());
270 if (s != st && s->
town == t) {
271 if (s->indtype != IT_INVALID) {
274 if (name != STR_UNDEFINED) {
283 if (
IsInsideMM(s->string_id, STR_SV_STNAME, STR_SV_STNAME_FALLBACK)) {
284 auto str = s->string_id;
285 if (str == STR_SV_STNAME_FOREST) str = STR_SV_STNAME_WOODS;
301 sni.
SetUsed(STR_SV_STNAME_OILFIELD);
302 sni.
SetUsed(STR_SV_STNAME_MINES);
303 if (sni.
indtypes[indtype])
continue;
308 return STR_SV_STNAME_FALLBACK;
315 switch (name_class) {
317 if (sni.
IsAvailable(STR_SV_STNAME_AIRPORT))
return STR_SV_STNAME_AIRPORT;
320 if (sni.
IsAvailable(STR_SV_STNAME_OILFIELD))
return STR_SV_STNAME_OILFIELD;
323 if (sni.
IsAvailable(STR_SV_STNAME_DOCKS))
return STR_SV_STNAME_DOCKS;
326 if (sni.
IsAvailable(STR_SV_STNAME_HELIPORT))
return STR_SV_STNAME_HELIPORT;
335 return STR_SV_STNAME_MINES;
341 if (sni.
IsAvailable(STR_SV_STNAME))
return STR_SV_STNAME;
342 if (sni.
IsAvailable(STR_SV_STNAME_CENTRAL))
return STR_SV_STNAME_CENTRAL;
349 return STR_SV_STNAME_LAKESIDE;
364 if (sni.
IsAvailable(STR_SV_STNAME_VALLEY))
return STR_SV_STNAME_VALLEY;
366 if (sni.
IsAvailable(STR_SV_STNAME_HEIGHTS))
return STR_SV_STNAME_HEIGHTS;
371 sni.
SetUsed(STR_SV_STNAME_SOUTH);
372 sni.
SetUsed(STR_SV_STNAME_WEST);
374 sni.
SetUsed(STR_SV_STNAME_NORTH);
375 sni.
SetUsed(STR_SV_STNAME_EAST);
378 sni.
SetUsed(STR_SV_STNAME_SOUTH);
379 sni.
SetUsed(STR_SV_STNAME_EAST);
381 sni.
SetUsed(STR_SV_STNAME_NORTH);
382 sni.
SetUsed(STR_SV_STNAME_WEST);
386 static const StringID fallback_names[] = {
391 STR_SV_STNAME_TRANSFER,
393 STR_SV_STNAME_EXCHANGE,
394 STR_SV_STNAME_ANNEXE,
395 STR_SV_STNAME_SIDINGS,
396 STR_SV_STNAME_BRANCH,
400 for (
auto str : fallback_names) {
403 return STR_SV_STNAME_FALLBACK;
415 Station *best_station =
nullptr;
420 if (cur_dist < threshold) {
421 threshold = cur_dist;
423 }
else if (cur_dist == threshold && best_station !=
nullptr) {
425 if (st->index < best_station->index) best_station = st;
443 default: NOT_REACHED();
454 pt.
y -= 32 * ZOOM_BASE;
457 if (this->
sign.kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->
index));
461 _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation(this->
index));
472 if (this->
xy == new_xy)
return;
474 _station_kdtree.Remove(this->
index);
478 _station_kdtree.Insert(this->
index);
485 st->UpdateVirtCoord();
489void BaseStation::FillCachedName()
const
495void ClearAllStationCachedNames()
498 st->cached_name.clear();
511 for (
auto it = std::begin(st->
goods); it != std::end(st->
goods); ++it) {
526 for (
auto it = std::begin(st->
goods); it != std::end(st->
goods); ++it) {
527 if (it->TotalCount() > 0) mask.
Set(
static_cast<CargoType>(std::distance(std::begin(st->
goods), it)));
540 StringID msg = reject ? STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_LIST : STR_NEWS_STATION_NOW_ACCEPTS_CARGO_LIST;
568 for (IndustryID industry : industries) {
603 return {acceptance, always_accepted};
621 return {acceptance, always_accepted};
642 uint amt = acceptance[cargo];
646 if ((!is_passengers && !st->
facilities.
Any({StationFacility::Train, StationFacility::TruckStop, StationFacility::Airport, StationFacility::Dock})) ||
647 (is_passengers && !st->
facilities.
Any({StationFacility::Train, StationFacility::BusStop, StationFacility::Airport, StationFacility::Dock}))) {
660 if (old_acc == new_acc)
return;
684 int right = left + st->
spread.
w - 1;
686 int bottom = top + st->
spread.
h - 1;
715 if (*st !=
nullptr) {
721 if (ret.
Failed())
return ret;
728 _station_kdtree.Insert((*st)->index);
754 UpdateStationSignCoord(st);
769 MarkCatchmentTilesDirty();
772 MarkCatchmentTilesDirty();
788 default: NOT_REACHED();
815 return CommandCost(STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST);
819 if (ret.
Failed())
return ret;
848 }
else if (allowed_z != flat_z) {
868 if (ret.
Failed())
return ret;
871 ret = Command<Commands::LandscapeClear>::Do(flags, tile_iter);
872 if (ret.
Failed())
return ret;
887 STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION,
889 STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP,
890 STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP,
892 STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK,
893 STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY,
894 STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT,
895 STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT,
897 return too_low_msgs[type];
912 int height = layout < std::size(bridgeable_info) ? bridgeable_info[layout].height : 0;
920 int height_diff =
GetTileMaxZ(tile) + height - bridge_height;
932 return _station_bridgeable_info[type];
1014static CommandCost CheckFlatLandRailStation(
TileIndex tile_cur,
TileIndex north_tile,
int &allowed_z,
DoCommandFlags flags,
Axis axis, StationID *station,
RailType rt, std::vector<Train *> &affected_vehicles,
StationClassID spec_class, uint16_t spec_index, uint8_t plat_len, uint8_t numtracks)
1023 if (ret.
Failed())
return ret;
1029 if (ret.
Failed())
return ret;
1040 if (*station == StationID::Invalid()) {
1042 }
else if (*station != st) {
1043 return CommandCost(STR_ERROR_ADJOINS_MORE_THAN_ONE_EXISTING);
1061 affected_vehicles.push_back(v);
1064 ret = Command<Commands::RemoveRail>::Do(flags, tile_cur, track);
1065 if (ret.
Failed())
return ret;
1072 ret = Command<Commands::LandscapeClear>::Do(flags, tile_cur);
1073 if (ret.
Failed())
return ret;
1099 if (ret.
Failed())
return ret;
1103 if (ret.
Failed())
return ret;
1118 return CommandCost(STR_ERROR_DRIVE_THROUGH_DIRECTION);
1121 if (*station == StationID::Invalid()) {
1123 }
else if (*station != st) {
1124 return CommandCost(STR_ERROR_ADJOINS_MORE_THAN_ONE_EXISTING);
1133 switch (rb.
Count()) {
1135 return CommandCost(STR_ERROR_DRIVE_THROUGH_DIRECTION);
1139 return CommandCost(STR_ERROR_DRIVE_THROUGH_CORNER);
1142 return CommandCost(STR_ERROR_DRIVE_THROUGH_JUNCTION);
1146 if (build_over_road) {
1155 if (ret.
Failed())
return ret;
1163 if (ret.
Failed())
return ret;
1181 if (ret.
Failed())
return ret;
1194 ret = Command<Commands::LandscapeClear>::Do(flags, cur_tile);
1195 if (ret.
Failed())
return ret;
1209 if (!
stl.layout.empty())
return this->
stl.layout[this->
position] & ~1;
1211 if (this->
stl.length == 1) {
1213 return this->
position == ((this->
stl.platforms - 1) / 2) ? 2 : 0;
1218 return this->
position == ((this->
stl.length - 1) / 2) ? 2 : 0;
1221 if (this->
stl.length > 4 && ((this->position % this->stl.length) == 0 || (this->position % this->stl.length) == this->stl.length - 1)) {
1227 return (((this->
position / this->
stl.length) % 2) == (this->stl.platforms % 2)) ? 4 : 6;
1243template <
class T,
class F>
1246 assert(*st ==
nullptr);
1247 bool check_surrounding =
true;
1249 if (existing_station != StationID::Invalid()) {
1250 if (adjacent && existing_station != station_to_join) {
1257 T *candidate = T::GetIfValid(existing_station);
1258 if (candidate !=
nullptr && filter(candidate)) *st = candidate;
1259 check_surrounding = (*st ==
nullptr);
1264 if (adjacent) check_surrounding =
false;
1267 if (check_surrounding) {
1270 if (ret.
Failed())
return ret;
1274 if (*st ==
nullptr && station_to_join != StationID::Invalid()) *st = T::GetIfValid(station_to_join);
1353 bool length_price_ready =
true;
1354 uint8_t tracknum = 0;
1358 CommandCost ret =
CheckFlatLandRailStation(cur_tile, tile_area.
tile, allowed_z, flags, axis, station, rt, affected_vehicles, spec_class, spec_index, plat_len, numtracks);
1359 if (ret.
Failed())
return ret;
1362 if (tracknum == numtracks) {
1363 length_price_ready =
true;
1375 if (length_price_ready) {
1377 length_price_ready =
false;
1429 if (ret.
Failed())
return ret;
1438 if (plat_len == 0 || numtracks == 0)
return CMD_ERROR;
1452 bool reuse = (station_to_join != NEW_STATION);
1453 if (!reuse) station_to_join = StationID::Invalid();
1454 bool distant_join = (station_to_join != StationID::Invalid());
1461 TileArea new_location(tile_org, w_org, h_org);
1463 if (ret.
Failed())
return ret;
1466 StationID est = StationID::Invalid();
1467 std::vector<Train *> affected_vehicles;
1470 if (cost.
Failed())
return cost;
1474 if (ret.
Failed())
return ret;
1477 if (ret.
Failed())
return ret;
1484 for (
auto [i, it, tile_track] = std::make_tuple(0, stl.begin(), tile_org); i != numtracks; ++i, tile_track += track_delta) {
1485 for (
auto [j, tile] = std::make_tuple(0, tile_track); j != plat_len; ++j, tile += tile_delta, ++it) {
1490 if (statspec !=
nullptr) {
1491 uint32_t platinfo =
GetPlatformInfo(gfx, numtracks, plat_len, i, j,
false);
1498 if (ret.
Failed())
return ret;
1504 if (!specindex.has_value())
return CommandCost(STR_ERROR_TOO_MANY_STATION_SPECS);
1506 if (statspec !=
nullptr) {
1527 if (statspec !=
nullptr) {
1535 for (
auto [i, it, tile_track] = std::make_tuple(0, stl.begin(), tile_org); i != numtracks; ++i, tile_track += track_delta) {
1536 for (
auto [j, tile] = std::make_tuple(0, tile_track); j != plat_len; ++j, tile += tile_delta, ++it) {
1541 affected_vehicles.push_back(v);
1565 if (statspec !=
nullptr) {
1571 if (callback <= UINT8_MAX) {
1591 for (uint i = 0; i < affected_vehicles.size(); ++i) {
1599 update_reservation_area =
TileArea(tile_org, 1, numtracks);
1601 update_reservation_area =
TileArea(tile_org, numtracks, 1);
1604 for (
TileIndex tile : update_reservation_area) {
1615 platform_begin = next_tile;
1618 platform_end = next_tile;
1622 bool reservation =
false;
1623 for (
TileIndex t = platform_begin; !reservation && t <= platform_end; t += tile_offset) {
1644 if (ta.
w != 0 && ta.
h != 0) {
1696 st->
spread = MakeStationAreaSmaller(st, st->
spread, func);
1699static bool TileBelongsToRailStation(BaseStation *st,
TileIndex tile)
1704static void MakeRailStationAreaSmaller(BaseStation *st)
1709static bool TileBelongsToShipStation(BaseStation *st,
TileIndex tile)
1714static void MakeShipStationAreaSmaller(
Station *st)
1717 UpdateStationDockingTiles(st);
1720static bool TileBelongsToRoadWaypointStation(BaseStation *st,
TileIndex tile)
1725void MakeRoadWaypointStationAreaSmaller(BaseStation *st,
TileArea &road_waypoint_area)
1727 road_waypoint_area = MakeStationAreaSmaller(st, road_waypoint_area, TileBelongsToRoadWaypointStation);
1758 error.
AddCost(std::move(ret));
1759 if (error.
Failed())
continue;
1762 T *st = T::GetByTile(tile);
1763 if (st ==
nullptr)
continue;
1767 error.
AddCost(std::move(ret));
1768 if (error.
Failed())
continue;
1796 DoClearSquare(tile);
1802 st->tile_waiting_random_triggers.erase(tile);
1808 include(affected_stations, st);
1814 if (quantity == 0)
return error.
Failed() ? error :
CommandCost(STR_ERROR_THERE_IS_NO_STATION);
1816 for (
T *st : affected_stations) {
1821 MakeRailStationAreaSmaller(st);
1823 UpdateStationSignCoord(st);
1830 MarkCatchmentTilesDirty();
1836 total_cost.
AddCost(quantity * removal_cost);
1851 if (end == 0) end = start;
1855 std::vector<Station *> affected_stations;
1858 if (ret.
Failed())
return ret;
1861 for (
Station *st : affected_stations) {
1864 st->MarkTilesDirty(
false);
1865 MarkCatchmentTilesDirty();
1866 st->RecomputeCatchment();
1884 if (end == 0) end = start;
1888 std::vector<Waypoint *> affected_stations;
1908 if (ret.
Failed())
return ret;
1914 assert(ta.
w != 0 && ta.
h != 0);
1920 if (st->TileBelongsToRailStation(tile)) {
1921 std::vector<T*> affected_stations;
1923 if (ret.
Failed())
return ret;
1978 if (*primary_stop ==
nullptr) {
1980 return primary_stop;
1984 while (stop->
next !=
nullptr) stop = stop->
next;
2029 if (ret.
Failed())
return ret;
2034 if (!is_preexisting_roadstop) {
2063 bool reuse = (station_to_join != NEW_STATION);
2064 if (!reuse) station_to_join = StationID::Invalid();
2065 bool distant_join = (station_to_join != StationID::Invalid());
2074 if (roadstopspec !=
nullptr) {
2093 if (!is_drive_through && RoadTypeIsTram(rt))
return CMD_ERROR;
2098 if (ret.
Failed())
return ret;
2104 if (roadstopspec !=
nullptr) {
2109 StationID est = StationID::Invalid();
2111 if (cost.
Failed())
return cost;
2115 if (ret.
Failed())
return ret;
2118 if (!
RoadStop::CanAllocateItem(
static_cast<size_t>(roadstop_area.
w) * roadstop_area.
h))
return CommandCost(is_truck_stop ? STR_ERROR_TOO_MANY_TRUCK_STOPS : STR_ERROR_TOO_MANY_BUS_STOPS);
2121 if (ret.
Failed())
return ret;
2125 if (!specindex.has_value())
return CommandCost(STR_ERROR_TOO_MANY_STATION_SPECS);
2127 if (roadstopspec !=
nullptr) {
2140 for (
TileIndex cur_tile : roadstop_area) {
2151 if (roadstopspec !=
nullptr) {
2160 *currstop = road_stop;
2162 if (is_truck_stop) {
2174 if (is_drive_through) {
2197 if (roadstopspec !=
nullptr) {
2198 st->SetRoadStopRandomBits(cur_tile,
GB(Random(), 0, 8));
2205 if (st !=
nullptr) {
2225 if (ret.
Failed())
return ret;
2240 assert(cur_stop !=
nullptr);
2260 if (ret.
Failed())
return ret;
2266 if (*primary_stop == cur_stop) {
2268 *primary_stop = cur_stop->
next;
2270 if (*primary_stop ==
nullptr) {
2277 while (pred->
next != cur_stop) pred = pred->
next;
2299 DoClearSquare(tile);
2306 StationID station_id = st->index;
2309 [station_id](
const Order *order) {
return order->IsType(OT_GOTO_STATION) && order->GetDestination() == station_id; },
2310 [station_id, tile](
Vehicle *v) {
2321 st->tile_waiting_random_triggers.erase(tile);
2322 st->RemoveRoadStopTileData(tile);
2352 if (ret.
Failed())
return ret;
2358 if (ret.
Failed())
return ret;
2377 DoClearSquare(tile);
2381 wp->tile_waiting_random_triggers.erase(tile);
2382 wp->RemoveRoadStopTileData(tile);
2385 if (replacement_spec_index < 0) {
2388 UpdateStationSignCoord(wp);
2414 CommandCost last_error(STR_ERROR_THERE_IS_NO_STATION);
2415 bool had_success =
false;
2417 for (
TileIndex cur_tile : roadstop_area) {
2437 if (road_waypoint) {
2443 last_error = std::move(ret);
2455 int count = road_bits.
Count();
2461 return had_success ? cost : last_error;
2478 if (width == 0 || height == 0)
return CMD_ERROR;
2484 TileArea roadstop_area(tile, width, height);
2498 if (end == 0) end = start;
2501 TileArea roadstop_area(start, end);
2524 uint8_t town_tolerance_distance = 8 + (
_settings_game.difficulty.town_council_tolerance * 4);
2528 uint noise_reduction = distance / town_tolerance_distance;
2549 Town *nearest =
nullptr;
2552 auto height = as->
size_y;
2555 uint perimeter_min_x =
TileX(tile);
2556 uint perimeter_min_y =
TileY(tile);
2557 uint perimeter_max_x = perimeter_min_x + width - 1;
2558 uint perimeter_max_y = perimeter_min_y + height - 1;
2560 mindist = UINT_MAX - 1;
2565 if (
TileX(cur_tile) == perimeter_min_x ||
TileX(cur_tile) == perimeter_max_x ||
TileY(cur_tile) == perimeter_min_y ||
TileY(cur_tile) == perimeter_max_y) {
2567 if (t ==
nullptr)
continue;
2570 if (dist == mindist && t->index < nearest->index) nearest = t;
2571 if (dist < mindist) {
2600 if (!st->airport.IsEmpty() && st->airport.type !=
AT_OILRIG) {
2620 bool reuse = (station_to_join != NEW_STATION);
2621 if (!reuse) station_to_join = StationID::Invalid();
2622 bool distant_join = (station_to_join != StationID::Invalid());
2629 if (ret.
Failed())
return ret;
2643 if (ret.
Failed())
return ret;
2647 if (cost.
Failed())
return cost;
2655 StringID authority_refuse_message = STR_NULL;
2656 Town *authority_refuse_town =
nullptr;
2661 authority_refuse_message = STR_ERROR_LOCAL_AUTHORITY_REFUSES_NOISE;
2662 authority_refuse_town = nearest;
2664 }
else if (
_settings_game.difficulty.town_council_tolerance != TOWN_COUNCIL_PERMISSIVE) {
2671 authority_refuse_message = STR_ERROR_LOCAL_AUTHORITY_REFUSES_AIRPORT;
2672 authority_refuse_town = t;
2676 if (authority_refuse_message != STR_NULL) {
2681 ret =
FindJoiningStation(StationID::Invalid(), station_to_join, allow_adjacent, airport_area, &st);
2682 if (ret.
Failed())
return ret;
2688 if (ret.
Failed())
return ret;
2691 return CommandCost(STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT);
2751 if (ret.
Failed())
return ret;
2759 if (!a->IsNormalAircraft())
continue;
2760 if (a->targetairport == st->index && a->state !=
FLYING) {
2761 return CommandCost(STR_ERROR_AIRCRAFT_IN_THE_WAY);
2785 if (!st->TileBelongsToAirport(tile_cur))
continue;
2788 if (ret.
Failed())
return ret;
2793 DoClearSquare(tile_cur);
2834 if (ret.
Failed())
return ret;
2853 const Vehicle *v = orderlist->GetFirstSharedVehicle();
2854 assert(v !=
nullptr);
2855 if ((v->
owner == company) != include_company)
continue;
2857 for (
const Order &order : orderlist->GetOrders()) {
2858 if (order.GetDestination() == station && (order.IsType(OT_GOTO_STATION) || order.IsType(OT_GOTO_WAYPOINT))) {
2888 bool reuse = (station_to_join != NEW_STATION);
2889 if (!reuse) station_to_join = StationID::Invalid();
2890 bool distant_join = (station_to_join != StationID::Invalid());
2902 if (ret.
Failed())
return ret;
2905 if (ret.
Failed())
return ret;
2908 ret = Command<Commands::LandscapeClear>::Do(flags, tile);
2909 if (ret.
Failed())
return ret;
2919 if (ret.
Failed())
return ret;
2925 ret = Command<Commands::LandscapeClear>::Do(flags, tile_cur);
2926 if (ret.
Failed())
return ret;
2939 ret =
FindJoiningStation(StationID::Invalid(), station_to_join, adjacent, dock_area, &st);
2940 if (ret.
Failed())
return ret;
2946 if (ret.
Failed())
return ret;
2966 UpdateStationDockingTiles(st);
2982 if (st !=
nullptr) UpdateStationDockingTiles(st);
2985 if (neutral !=
nullptr) UpdateStationDockingTiles(neutral);
3043 if (ret.
Failed())
return ret;
3053 if (ret.
Failed())
return ret;
3056 DoClearSquare(tile1);
3058 MakeWaterKeepingClass(tile2, st->
owner);
3060 MakeShipStationAreaSmaller(st);
3078 if (s->current_order.GetDestination() != st->index) {
3093 s->SetDestTile(s->GetOrderStationLocation(st->index));
3109 const auto &layouts = _station_display_datas[st];
3110 if (gfx >= layouts.size()) gfx &= 1;
3111 return layouts.data() + gfx;
3130 snow_desert =
false;
3131 *overlay_offset =
RTO_X;
3137 snow_desert =
false;
3138 *overlay_offset =
RTO_Y;
3145 *overlay_offset =
RTO_X;
3152 *overlay_offset =
RTO_Y;
3159 if (ti !=
nullptr) {
3187 if (
layout < std::size(bridgeable_info))
return bridgeable_info[
layout].disallowed_pillars;
3188 return BRIDGEPILLARFLAGS_ALL;
3207 if (image == 0)
return false;
3211 static constexpr uint8_t foundation_parts[] = {
3212 UINT8_MAX, UINT8_MAX, UINT8_MAX, 0,
3217 assert(ti->
tileh < std::size(foundation_parts));
3218 if (foundation_parts[ti->
tileh] == UINT8_MAX)
return false;
3225 static constexpr uint8_t composite_foundation_parts[] = {
3226 0b0000'0000, 0b1101'0001, 0b1110'0100, 0b1110'0000,
3227 0b1100'1010, 0b1100'1001, 0b1100'0100, 0b1100'0000,
3228 0b1101'0010, 0b1001'0001, 0b1110'0100, 0b1010'0000,
3229 0b0100'1010, 0b0000'1001, 0b0100'0100,
3231 assert(ti->tileh < std::size(composite_foundation_parts));
3233 uint8_t parts = composite_foundation_parts[ti->tileh];
3240 if (parts == 0)
return false;
3243 for (uint i : SetBitIterator(parts)) {
3262 int32_t total_offset;
3264 uint32_t relocation = 0;
3265 uint32_t ground_relocation = 0;
3268 uint tile_layout = 0;
3280 if (statspec !=
nullptr) {
3291 if (!
layout->NeedsPreprocessing()) {
3317 case APT_RADAR_GRASS_FENCE_SW:
3320 case APT_GRASS_FENCE_NE_FLAG:
3323 case APT_RADAR_FENCE_SW:
3326 case APT_RADAR_FENCE_NE:
3329 case APT_GRASS_FENCE_NE_FLAG_2:
3354 bool draw_ground =
false;
3357 DrawWaterClassGround(ti);
3362 DrawWaterClassGround(ti);
3368 DrawShoreTile(ti->
tileh);
3396 }
else if (statspec !=
nullptr) {
3446 if (stopspec !=
nullptr) {
3447 stop_draw_mode = stopspec->draw_mode;
3449 std::array<int32_t, 1> regs100;
3450 auto result = GetRoadStopLayout(ti, stopspec, st, type, view, regs100);
3451 if (result.has_value()) {
3458 processor = std::move(*result);
3478 DrawRoadOverlays(ti, PAL_NONE, road_rti, tram_rti, sprite_offset, sprite_offset);
3508 int32_t total_offset = 0;
3511 const RailTypeInfo *railtype_info =
nullptr;
3523 DrawSprite(ground + overlay_offset, PAL_NONE, x, y);
3532 uint sprite_offset = 5 - image;
3535 if (roadtype_info->UsesOverlay()) {
3537 DrawSprite(ground + sprite_offset, PAL_NONE, x, y);
3540 if (overlay)
DrawSprite(overlay + sprite_offset, PAL_NONE, x, y);
3541 }
else if (RoadTypeIsTram(roadtype)) {
3546 if (RoadTypeIsRoad(roadtype) && roadtype_info->UsesOverlay()) {
3558static void FillTileDescRoadStop(
TileIndex tile, TileDesc &td)
3584 td.
owner_type[i] = STR_LAND_AREA_INFORMATION_ROAD_OWNER;
3585 td.
owner[i] = road_owner;
3589 td.
owner_type[i] = STR_LAND_AREA_INFORMATION_TRAM_OWNER;
3590 td.
owner[i] = tram_owner;
3596void FillTileDescRailStation(
TileIndex tile, TileDesc &td)
3598 const StationSpec *spec = GetStationSpec(tile);
3600 if (spec !=
nullptr) {
3615void FillTileDescAirport(
TileIndex tile, TileDesc &td)
3641 if (
IsAirport(tile)) FillTileDescAirport(tile, td);
3645 default: NOT_REACHED();
3646 case StationType::Rail: str = STR_LAI_STATION_DESCRIPTION_RAILROAD_STATION;
break;
3648 str = (
IsHangar(tile) ? STR_LAI_STATION_DESCRIPTION_AIRCRAFT_HANGAR : STR_LAI_STATION_DESCRIPTION_AIRPORT);
3650 case StationType::Truck: str = STR_LAI_STATION_DESCRIPTION_TRUCK_LOADING_AREA;
break;
3651 case StationType::Bus: str = STR_LAI_STATION_DESCRIPTION_BUS_STATION;
break;
3774 if (new_rs != cur_rs) {
3792 AnimateStationTile(tile);
3797 AnimateAirportTile(tile);
3802 AnimateRoadStopTile(tile);
3841 if (stop + station_ahead - (
int)
TILE_SIZE >= station_length)
return {};
3855 }
else if (x < stop) {
3857 uint16_t spd = std::max(0, (stop - x) * 20 - 15);
3858 if (spd < v->cur_speed) v->
cur_speed = spd;
3888 if (cargoes.
None())
return;
3926static inline void byte_inc_sat(uint8_t *p)
3945 StationCargoAmountMap waiting_per_source;
3947 for (StationCargoAmountMap::iterator i(waiting_per_source.begin()); i != waiting_per_source.end(); ++i) {
3949 if (source_station ==
nullptr)
continue;
3962 bool waiting_changed =
false;
3964 byte_inc_sat(&st->time_since_load);
3965 byte_inc_sat(&st->time_since_unload);
3988 waiting_changed =
true;
3999 uint num_dests = ge->
HasData() ?
static_cast<uint
>(ge->
GetData().cargo.Packets()->MapSize()) : 0;
4007 uint waiting_avg = waiting / (num_dests + 1);
4009 if (
_cheats.station_rating.value) {
4010 ge->
rating = rating = MAX_STATION_RATING;
4027 rating =
GB(callback, 0, 14);
4030 if (
HasBit(callback, 14)) rating -= 0x4000;
4036 if (b >= 0) rating += b >> 2;
4040 if (waittime <= 21) rating += 25;
4041 if (waittime <= 12) rating += 25;
4042 if (waittime <= 6) rating += 45;
4043 if (waittime <= 3) rating += 35;
4056 if (age < 3) rating += 10;
4057 if (age < 2) rating += 10;
4058 if (age < 1) rating += 13;
4068 if (rating <= 64 && waiting_avg >= 100) {
4069 int dec = Random() & 0x1F;
4070 if (waiting_avg < 200) dec &= 7;
4071 waiting -= (dec + 1) * num_dests;
4072 waiting_changed =
true;
4076 if (rating <= 127 && waiting != 0) {
4077 uint32_t r = Random();
4078 if (rating <= (
int)
GB(r, 0, 7)) {
4080 waiting = std::max((
int)waiting - (
int)((
GB(r, 8, 2) + 1) * num_dests), 0);
4081 waiting_changed =
true;
4088 static const uint WAITING_CARGO_THRESHOLD = 1 << 12;
4089 static const uint WAITING_CARGO_CUT_FACTOR = 1 << 6;
4090 static const uint MAX_WAITING_CARGO = 1 << 15;
4092 if (waiting > WAITING_CARGO_THRESHOLD) {
4093 uint difference = waiting - WAITING_CARGO_THRESHOLD;
4094 waiting -= (difference / WAITING_CARGO_CUT_FACTOR);
4096 waiting = std::min(waiting, MAX_WAITING_CARGO);
4097 waiting_changed =
true;
4102 if (waiting_changed && waiting < ge->AvailableCount()) {
4115 StationID index = st->index;
4116 if (waiting_changed) {
4139 for (
Vehicle *v : st->loading_vehicles) {
4140 for (
Vehicle *u = v; u !=
nullptr; u = u->
Next()) {
4141 if (u->cargo_type != cargo)
continue;
4142 u->cargo.Reroute(UINT_MAX, &u->cargo, avoid, avoid2, &ge);
4161 if (lg ==
nullptr)
continue;
4162 std::vector<NodeID> to_remove{};
4163 for (Edge &edge : (*lg)[ge.
node].edges) {
4165 assert(to->
goods[cargo].node == edge.dest_node);
4169 bool updated =
false;
4171 if (auto_distributed) {
4174 std::vector<Vehicle *> vehicles;
4176 bool found_from =
false;
4177 bool found_to =
false;
4178 for (
const Order &order : l->GetOrders()) {
4179 if (!order.IsType(OT_GOTO_STATION) && !order.IsType(OT_IMPLICIT))
continue;
4180 if (order.GetDestination() == from->index) {
4182 if (found_to)
break;
4183 }
else if (order.GetDestination() == to->index) {
4185 if (found_from)
break;
4188 if (!found_to || !found_from)
continue;
4189 vehicles.push_back(l->GetFirstSharedVehicle());
4192 auto iter = vehicles.begin();
4193 while (iter != vehicles.end()) {
4206 *iter = next_shared;
4209 iter = vehicles.erase(iter);
4212 if (iter == vehicles.end()) iter = vehicles.begin();
4218 to_remove.emplace_back(to->
goods[cargo].node);
4231 for (NodeID r : to_remove) (*lg)[ge.
node].RemoveEdge(r);
4256 if (ge1.
link_graph == LinkGraphID::Invalid()) {
4257 if (ge2.
link_graph == LinkGraphID::Invalid()) {
4273 }
else if (ge2.
link_graph == LinkGraphID::Invalid()) {
4291 if (lg !=
nullptr) {
4292 (*lg)[ge1.
node].UpdateEdge(ge2.
node, capacity, usage, time, modes);
4305 for (
const Vehicle *v = front; v !=
nullptr; v = v->
Next()) {
4306 if (v->refit_cap > 0) {
4313 IncreaseStats(st, v->cargo_type, next_station_id, v->refit_cap,
4320static void StationHandleSmallTick(BaseStation *st)
4331void OnTick_Station()
4335 for (BaseStation *st : BaseStation::Iterate()) {
4336 StationHandleSmallTick(st);
4362 for (GoodsEntry &ge : st->goods) {
4394 if (!CargoPacket::CanAllocateItem())
return 0;
4396 GoodsEntry &ge = st->
goods[cargo];
4402 if (amount == 0)
return 0;
4404 StationID next = ge.
GetVia(st->index);
4407 if (ge.
link_graph == LinkGraphID::Invalid()) {
4408 if (LinkGraph::CanAllocateItem()) {
4419 if (lg !=
nullptr) (*lg)[ge.
node].UpdateSupply(amount);
4438static bool IsUniqueStationName(
const std::string &name)
4441 if (!st->
name.empty() && st->
name == name)
return false;
4460 if (ret.
Failed())
return ret;
4462 bool reset = text.empty();
4466 if (!IsUniqueStationName(text))
return CommandCost(STR_ERROR_NAME_MUST_BE_UNIQUE);
4494 if (st ==
nullptr)
return {
CMD_ERROR, StationID::Invalid() };
4498 if (ret.
Failed())
return { ret, StationID::Invalid() };
4502 return {
CommandCost(STR_ERROR_SITE_UNSUITABLE), StationID::Invalid() };
4505 bool other_station =
false;
4509 if (s != st && s->
xy == tile) other_station =
true;
4512 if (other_station)
return {
CommandCost(STR_ERROR_SITE_UNSUITABLE), StationID::Invalid() };
4529 if (result.
Failed())
return;
4539 if (st->TileIsInCatchment(tile)) stations.insert(st);
4552 assert(this->
w == 1 && this->
h == 1);
4553 AddNearbyStationsByCatchment(this->tile, this->stations, Town::GetByTile(this->tile)->stations_near);
4556 this->stations.insert(st);
4562 return this->stations;
4572 if (st->
goods[cargo].rating == 0)
return false;
4575 if (
_settings_game.order.selectgoods && !st->
goods[cargo].HasVehicleEverTriedLoading())
return false;
4590 if (all_stations.empty())
return 0;
4591 if (amount == 0)
return 0;
4593 Station *first_station =
nullptr;
4594 typedef std::pair<Station *, uint> StationInfo;
4595 std::vector<StationInfo> used_stations;
4597 for (
Station *st : all_stations) {
4599 if (!CanMoveGoodsToStation(st, cargo))
continue;
4603 if (first_station ==
nullptr) {
4607 if (used_stations.empty()) {
4608 used_stations.reserve(2);
4609 used_stations.emplace_back(first_station, 0);
4611 used_stations.emplace_back(st, 0);
4615 if (first_station ==
nullptr)
return 0;
4617 if (used_stations.empty()) {
4619 amount *= first_station->
goods[cargo].rating + 1;
4620 return UpdateStationWaiting(first_station, cargo, amount, source);
4623 TypedIndexContainer<std::array<uint32_t,
OWNER_END.base()>, Owner> company_best = {};
4624 TypedIndexContainer<std::array<uint32_t,
OWNER_END.base()>, Owner> company_sum = {};
4625 uint best_rating = 0;
4628 for (
auto &p : used_stations) {
4629 auto owner = p.first->owner;
4630 auto rating = p.first->goods[cargo].rating;
4631 if (rating > company_best[owner]) {
4632 best_sum += rating - company_best[owner];
4633 company_best[owner] = rating;
4634 if (rating > best_rating) best_rating = rating;
4636 company_sum[owner] += rating;
4641 amount *= best_rating + 1;
4644 for (
auto &p : used_stations) {
4645 Owner owner = p.first->owner;
4648 p.second = amount * company_best[owner] * p.first->goods[cargo].rating / best_sum / company_sum[owner];
4653 if (amount > moving) {
4654 std::stable_sort(used_stations.begin(), used_stations.end(), [cargo](
const StationInfo &a,
const StationInfo &b) {
4655 return b.first->goods[cargo].rating < a.first->goods[cargo].rating;
4658 assert(amount - moving <= used_stations.size());
4659 for (uint i = 0; i < amount - moving; i++) {
4660 used_stations[i].second++;
4665 for (
auto &p : used_stations) {
4666 moved += UpdateStationWaiting(p.first, cargo, p.second, source);
4672void UpdateStationDockingTiles(
Station *st)
4686 int x2 = std::min<int>(x + area->
w + 1,
Map::SizeX());
4687 int x1 = std::max<int>(x - 1, 0);
4689 int y2 = std::min<int>(y + area->
h + 1,
Map::SizeY());
4690 int y1 = std::max<int>(y - 1, 0);
4700 if (!Station::CanAllocateItem()) {
4706 _station_kdtree.
Insert(st->index);
4725 UpdateStationDockingTiles(st);
4737 for (
Station *near : nearby) {
4738 near->RecomputeCatchment(
true);
4868 if (ret.
Failed())
return ret;
4876 if (ret.
Failed())
return ret;
4879 if (ret.
Failed())
return ret;
4913 if (remove_road.
Failed())
return remove_road;
4918 if (remove_road.
Failed())
return remove_road;
4962 return Command<Commands::LandscapeClear>::Do(flags, tile);
4973 for (
const auto &it : this->
shares) {
4974 if (it.second == st) {
4975 return it.first - prev;
4991 if (this->
unrestricted == 0)
return StationID::Invalid();
4992 assert(!this->
shares.empty());
4994 assert(it != this->
shares.end() && it->first <= this->unrestricted);
4995 if (it->second != excluded && it->second != excluded2)
return it->second;
5000 uint end = it->first;
5001 uint begin = (it == this->
shares.begin() ? 0 : (--it)->first);
5002 uint interval = end - begin;
5003 if (interval >= this->
unrestricted)
return StationID::Invalid();
5006 SharesMap::const_iterator it2 = (rand < begin) ? this->
shares.upper_bound(rand) :
5007 this->
shares.upper_bound(rand + interval);
5008 assert(it2 != this->
shares.end() && it2->first <= this->unrestricted);
5009 if (it2->second != excluded && it2->second != excluded2)
return it2->second;
5014 uint end2 = it2->first;
5015 uint begin2 = (it2 == this->
shares.begin() ? 0 : (--it2)->first);
5016 uint interval2 = end2 - begin2;
5017 if (interval2 >= new_max)
return StationID::Invalid();
5018 new_max -= interval2;
5019 if (begin > begin2) {
5020 std::swap(begin, begin2);
5021 std::swap(end, end2);
5022 std::swap(interval, interval2);
5027 it3 = this->
shares.upper_bound(rand);
5028 }
else if (rand < begin2 - interval) {
5029 it3 = this->
shares.upper_bound(rand + interval);
5031 it3 = this->
shares.upper_bound(rand + interval + interval2);
5033 assert(it3 != this->
shares.end() && it3->first <= this->unrestricted);
5044 assert(!this->
shares.empty());
5045 SharesMap new_shares;
5047 for (
const auto &it : this->
shares) {
5048 new_shares[++i] = it.second;
5049 if (it.first == this->unrestricted) this->
unrestricted = i;
5051 this->shares.swap(new_shares);
5052 assert(!this->shares.empty() && this->unrestricted <= (--this->shares.end())->first);
5065 assert(!this->
shares.empty());
5067 uint removed_shares = 0;
5068 uint added_shares = 0;
5069 uint last_share = 0;
5070 SharesMap new_shares;
5071 for (
const auto &it : this->
shares) {
5072 if (it.second == st) {
5074 uint share = it.first - last_share;
5075 if (flow == INT_MIN || (uint)(-flow) >= share) {
5076 removed_shares += share;
5077 if (it.first <= this->unrestricted) this->
unrestricted -= share;
5078 if (flow != INT_MIN) flow += share;
5079 last_share = it.first;
5082 removed_shares += (uint)(-flow);
5084 added_shares += (uint)(flow);
5086 if (it.first <= this->unrestricted) this->
unrestricted += flow;
5092 new_shares[it.first + added_shares - removed_shares] = it.second;
5093 last_share = it.first;
5096 new_shares[last_share + (uint)flow] = st;
5103 this->shares.swap(new_shares);
5113 assert(!this->
shares.empty());
5115 uint last_share = 0;
5116 SharesMap new_shares;
5117 for (
auto &it : this->
shares) {
5119 if (it.first > this->unrestricted)
return;
5120 if (it.second == st) {
5121 flow = it.first - last_share;
5124 new_shares[it.first] = it.second;
5127 new_shares[it.first - flow] = it.second;
5129 last_share = it.first;
5131 if (flow == 0)
return;
5132 new_shares[last_share + flow] = st;
5133 this->shares.swap(new_shares);
5134 assert(!this->shares.empty());
5144 assert(!this->
shares.empty());
5146 uint next_share = 0;
5148 for (SharesMap::reverse_iterator it(this->
shares.rbegin()); it != this->shares.rend(); ++it) {
5149 if (it->first < this->unrestricted)
return;
5151 flow = next_share - it->first;
5155 if (it->first == this->unrestricted)
return;
5156 if (it->second == st) found =
true;
5158 next_share = it->first;
5160 if (flow == 0)
return;
5161 SharesMap new_shares;
5162 new_shares[flow] = st;
5163 for (SharesMap::iterator it(this->
shares.begin()); it != this->shares.end(); ++it) {
5164 if (it->second != st) {
5165 new_shares[flow + it->first] = it->second;
5170 this->
shares.swap(new_shares);
5171 assert(!this->
shares.empty());
5181 assert(runtime > 0);
5182 SharesMap new_shares;
5184 for (
auto i : this->
shares) {
5185 share = std::max(share + 1, i.first * 30 / runtime);
5186 new_shares[share] = i.second;
5189 this->shares.swap(new_shares);
5200 FlowStatMap::iterator origin_it = this->find(origin);
5201 if (origin_it == this->end()) {
5202 this->emplace(origin,
FlowStat(via, flow));
5204 origin_it->second.ChangeShare(via, flow);
5205 assert(!origin_it->second.GetShares()->empty());
5219 FlowStatMap::iterator prev_it = this->find(origin);
5220 if (prev_it == this->end()) {
5223 this->emplace(origin, fs);
5225 prev_it->second.ChangeShare(via, flow);
5226 prev_it->second.ChangeShare(StationID::Invalid(), flow);
5227 assert(!prev_it->second.GetShares()->empty());
5237 for (
auto &i : *
this) {
5239 uint local = fs.
GetShare(StationID::Invalid());
5240 if (local > INT_MAX) {
5246 fs.
ChangeShare(StationID::Invalid(), -(
int)local);
5262 std::vector<StationID> ret;
5263 for (FlowStatMap::iterator f_it = this->begin(); f_it != this->end();) {
5267 ret.push_back(f_it->first);
5268 this->erase(f_it++);
5282 for (
auto &it : *
this) {
5283 it.second.RestrictShare(via);
5293 for (
auto &it : *
this) {
5294 it.second.ReleaseShare(via);
5305 for (
const auto &it : *
this) {
5306 ret += (--(it.second.GetShares()->end()))->first;
5319 for (
const auto &it : *
this) {
5320 ret += it.second.GetShare(via);
5332 FlowStatMap::const_iterator i = this->find(from);
5333 if (i == this->end())
return 0;
5334 return (--(i->second.GetShares()->end()))->first;
5345 FlowStatMap::const_iterator i = this->find(from);
5346 if (i == this->end())
return 0;
5347 return i->second.GetShare(via);
void UpdateAirplanesOnNewStation(const Station *st)
Updates the status of the Aircraft heading or in the station.
const AirportFTAClass * GetAirport(const uint8_t airport_type)
Get the finite state machine of an airport type.
static const uint INVALID_AIRPORTTILE
id for an invalid airport tile
static const uint NEW_AIRPORTTILE_OFFSET
offset of first newgrf airport tile
@ AirportClosed
Dummy block for indicating a closed airport.
@ FLYING
Vehicle is flying in the air.
@ NUM_AIRPORTS
Maximal number of airports in total.
@ AT_OILRIG
Oilrig airport.
Enum of the default airport tiles.
void AddAnimatedTile(TileIndex tile, bool mark_dirty)
Add the given tile to the animated tile table (if it does not exist yet).
void DeleteAnimatedTile(TileIndex tile, bool immediate)
Stops animation on the given tile.
Functions related to autoslope.
bool AutoslopeCheckForAxis(TileIndex tile, int z_new, Slope tileh_new, Axis axis)
Autoslope check for tiles with something built along an axis.
bool AutoslopeCheckForEntranceEdge(TileIndex tile, int z_new, Slope tileh_new, DiagDirection entrance)
Autoslope check for tiles with an entrance on an edge.
bool AutoslopeEnabled()
Tests if autoslope is enabled for _current_company.
static constexpr uint GB(const T x, const uint8_t s, const uint8_t n)
Fetch n bits from x, started at bit s.
constexpr uint8_t FindFirstBit(T x)
Search the first set bit in a value.
constexpr bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
constexpr T ClrBit(T &x, const uint8_t y)
Clears a bit in a variable.
void DrawBridgeMiddle(const TileInfo *ti, BridgePillarFlags blocked_pillars)
Draw the middle bits of a bridge.
TileIndex GetSouthernBridgeEnd(TileIndex t)
Finds the southern end of a bridge starting at a middle tile.
int GetBridgeHeight(TileIndex t)
Get the height ('z') of a bridge.
Map accessor functions for bridges.
bool IsBridgeAbove(Tile t)
checks if a bridge is set above the ground of this tile
EnumBitSet< BridgePillarFlag, uint8_t > BridgePillarFlags
Bitset of BridgePillarFlag elements.
bool IsValidCargoType(CargoType cargo)
Test whether cargo type is not INVALID_CARGO.
EnumBitSet< CargoType, uint64_t > CargoTypes
Bitset of CargoType elements.
static constexpr CargoType NUM_CARGO
Maximum number of cargo types in a game.
CargoType
Cargo slots to indicate a cargo type within a game.
bool IsCargoInClass(CargoType cargo, CargoClasses cc)
Does cargo c have cargo class cc?
Cheats _cheats
All the cheats.
Types related to cheating.
Iterator to iterate over all tiles belonging to an airport.
Iterator to iterate over all tiles belonging to an airport spec.
uint Count() const
Count the number of set bits.
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
constexpr Tstorage base() const noexcept
Retrieve the raw value behind this bit set.
constexpr bool None() const
Test if none of the values are set.
constexpr Timpl & Flip()
Flip all bits.
constexpr Timpl & Reset()
Reset all bits.
constexpr Timpl & Set()
Set all bits.
constexpr bool Any(const Timpl &other) const
Test if any of the given values are set.
Iterator to iterate over all tiles belonging to a bitmaptilearea.
Common return value for all commands.
bool Succeeded() const
Did this command succeed?
void AddCost(const Money &cost)
Adds the given cost to the cost of the command.
Money GetCost() const
The costs as made up to this moment.
bool Failed() const
Did this command fail?
Iterate a range of enum values.
Flat set implementation that uses a sorted vector for storage.
std::pair< const_iterator, bool > insert(const Tkey &key)
Insert a key into the set, if it does not already exist.
uint GetFlow() const
Get the sum of all flows from this FlowStatMap.
void PassOnFlow(StationID origin, StationID via, uint amount)
Pass on some flow, remembering it as invalid, for later subtraction from locally consumed flow.
std::vector< StationID > DeleteFlows(StationID via)
Delete all flows at a station for specific cargo and destination.
void AddFlow(StationID origin, StationID via, uint amount)
Add some flow from "origin", going via "via".
uint GetFlowFrom(StationID from) const
Get the sum of flows from a specific station from this FlowStatMap.
void FinalizeLocalConsumption(StationID self)
Subtract invalid flows from locally consumed flow.
void ReleaseFlows(StationID via)
Release all flows at a station for specific cargo and destination.
uint GetFlowFromVia(StationID from, StationID via) const
Get the flow from a specific station via a specific other station.
uint GetFlowVia(StationID via) const
Get the sum of flows via a specific station from this FlowStatMap.
void RestrictFlows(StationID via)
Restrict all flows at a station for specific cargo and destination.
Flow statistics telling how much flow should be sent along a link.
static const SharesMap empty_sharesmap
Static instance of FlowStat::SharesMap.
void ScaleToMonthly(uint runtime)
Scale all shares from link graph's runtime to monthly values.
void RestrictShare(StationID st)
Restrict a flow by moving it to the end of the map and decreasing the amount of unrestricted flow.
uint GetShare(StationID st) const
Get flow for a station.
StationID GetVia() const
Get a station a package can be routed to.
const SharesMap * GetShares() const
Get the actual shares as a const pointer so that they can be iterated over.
SharesMap shares
Shares of flow to be sent via specified station (or consumed locally).
void ReleaseShare(StationID st)
Release ("unrestrict") a flow by moving it to the begin of the map and increasing the amount of unres...
void ChangeShare(StationID st, int flow)
Change share for specified station.
void AppendShare(StationID st, uint flow, bool restricted=false)
Add some flow to the end of the shares map.
void Invalidate()
Reduce all flows to minimum capacity so that they don't get in the way of link usage statistics too m...
uint unrestricted
Limit for unrestricted shares.
An interval timer will fire every interval, and will continue to fire until it is deleted.
void Insert(const T &element)
Insert a single element in the tree.
static LinkGraphSchedule instance
Static instance of LinkGraphSchedule.
void Queue(LinkGraph *lg)
Queue a link graph for execution.
A connected component of a link graph.
void Merge(LinkGraph *other)
Merge a link graph with another one.
TimerGameEconomy::Date LastCompression() const
Get date of last compression.
NodeID AddNode(const Station *st)
Add a node to the component and create empty edges associated with it.
NodeID Size() const
Get the current size of the component.
static const uint MIN_TIMEOUT_DISTANCE
Minimum effective distance for timeout calculation.
static constexpr TimerGameEconomy::Date STALE_LINK_DEPOT_TIMEOUT
Number of days before deleting links served only by vehicles stopped in depot.
static constexpr TimerGameEconomy::Date COMPRESSION_INTERVAL
Minimum number of days between subsequent compressions of a LG.
static void Run(Vehicle *v, bool allow_merge=true, bool is_full_loading=false)
Refresh all links the given vehicle will visit.
const Tspec * GetSpec(uint index) const
Get a spec from the class at a given index.
uint GetSpecCount() const
Get the number of allocated specs within the class.
static NewGRFClass * Get(StationClassID class_index)
static uint GetClassCount()
StringID name
Name of this class.
const RailStationTileLayout & stl
Station tile layout being iterated.
uint position
Position within iterator.
StationGfx operator*() const
Dereference operator.
uint length
Length of platforms.
std::span< const StationGfx > layout
Predefined tile layout.
This struct contains all the info that is needed to draw and construct tracks.
SpriteID single_x
single piece of rail in X direction, without ground
uint16_t max_speed
Maximum speed for vehicles travelling on this rail type.
struct RailTypeInfo::@157247141350136173143103254227157213063052244122 strings
Strings associated with the rail type.
SpriteID single_y
single piece of rail in Y direction, without ground
StringID name
Name of this rail type.
uint8_t fallback_railtype
Original railtype number to use when drawing non-newgrf railtypes, or when drawing stations.
uint GetRailtypeSpriteOffset() const
Offset between the current railtype and normal rail.
struct RailTypeInfo::@332027037331076264023214171276243307073252216167 base_sprites
Struct containing the main sprites.
uint16_t max_speed
Maximum speed for vehicles travelling on this road type.
struct RoadTypeInfo::@070000167274302256150317022075324310363002361255 strings
Strings associated with the rail type.
StringID name
Name of this rail type.
Generate TileIndices around a center tile or tile area, with increasing distance.
Add dynamic register values to a sprite layout.
DrawTileSpriteSpan GetLayout() const
Returns the result spritelayout after preprocessing.
uint Reroute(uint max_move, StationCargoList *dest, StationID avoid, StationID avoid2, const GoodsEntry *ge)
Routes packets with station "avoid" as next hop to a different place.
void Append(CargoPacket *cp, StationID next)
Appends the given cargo packet to the range of packets with the same next station.
uint Truncate(uint max_move=UINT_MAX, StationCargoAmountMap *cargo_per_source=nullptr)
Truncates where each destination loses roughly the same percentage of its cargo.
const StationList & GetStations()
Run a tile loop to find stations around a tile, on demand.
static constexpr TimerGameTick::Ticks STATION_LINKGRAPH_TICKS
Cycle duration for cleaning dead links.
static constexpr TimerGameTick::Ticks STATION_ACCEPTANCE_TICKS
Cycle duration for updating station acceptance.
static constexpr TimerGameTick::Ticks STATION_RATING_TICKS
Cycle duration for updating station rating.
Base class for tile iterators.
Wrapper class to abstract away the way the tiles are stored.
static Date date
Current date in days (day counter).
static constexpr TimerGame< struct Economy >::Date INVALID_DATE
static Date date
Current date in days (day counter).
static TickCounter counter
Monotonic counter, in ticks, since start of game.
StrongType::Typedef< int32_t, DateTag< struct Economy >, StrongType::Compare, StrongType::Integer > Date
Iterate over all vehicles on a tile.
void DrawClearLandTile(const TileInfo *ti, uint8_t density)
Draw a ClearGround::Grass tile.
Functions related to clear (TileType::Clear) land.
CommandCost CommandCostWithParam(StringID str, uint64_t value)
Return an error status, with string and parameter.
Functions related to commands.
static const CommandCost CMD_ERROR
Define a default return value for a failed command.
@ Auto
don't allow building on structures
@ Execute
execute the given command
@ Bankrupt
company bankrupts, skip money check, skip vehicle on tile check in some cases
Commands
List of commands.
EnumBitSet< DoCommandFlag, uint16_t > DoCommandFlags
Bitset of DoCommandFlag elements.
Definition of stuff that is very close to a company, like the company struct itself.
PaletteID GetCompanyPalette(CompanyID company)
Get the palette for recolouring with a company colour.
CommandCost CheckOwnership(Owner owner, TileIndex tile)
Check whether the current owner owns something.
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
CompanyID _current_company
Company currently doing an action.
void DirtyCompanyInfrastructureWindows(CompanyID company)
Redraw all windows with company infrastructure counts.
GUI Functions related to companies.
static constexpr Owner OWNER_END
Last + 1 owner.
static constexpr Owner OWNER_TOWN
A town owns the tile, or a town is expanding.
static constexpr Owner OWNER_NONE
The tile has no ownership.
static constexpr Owner INVALID_OWNER
An invalid owner.
static constexpr Owner OWNER_WATER
The tile/execution is done by "water".
Some simple functions to help with accessing containers.
bool include(Container &container, typename Container::const_reference &item)
Helper function to append an item to a container if it is not already contained.
Functions related to debugging.
#define Debug(facility, severity, format_string,...)
Output a line of debugging information.
@ Misc
Misc message facility.
@ Critical
Critical, user should know about this.
bool CanBuildDepotByTileh(DiagDirection direction, Slope tileh)
Find out if the slope of the tile is suitable to build a depot of given direction.
void ShowDepotWindow(TileIndex tile, VehicleType type)
Opens a depot window.
bool IsValidAxis(Axis d)
Checks if an integer value is a valid Axis.
DiagDirection ReverseDiagDir(DiagDirection d)
Returns the reverse direction of the given DiagDirection.
DiagDirections AxisToDiagDirs(Axis a)
Converts an Axis to DiagDirections.
bool IsValidDiagDirection(DiagDirection d)
Checks if an integer value is a valid DiagDirection.
DiagDirection AxisToDiagDir(Axis a)
Converts an Axis to a DiagDirection.
Axis OtherAxis(Axis a)
Select the other axis as provided.
Axis DiagDirToAxis(DiagDirection d)
Convert a DiagDirection to the axis.
DiagDirection DirToDiagDir(Direction dir)
Convert a Direction to a DiagDirection.
EnumIndexArray< T, DiagDirection, DiagDirection::End > DiagDirectionIndexArray
Array with DiagDirection as index.
Direction
Defines the 8 directions on the map.
Axis
Enumeration for the two axis X and Y.
DiagDirection
Enumeration for diagonal directions.
@ Invalid
Flag for an invalid DiagDirection.
@ End
Used for iterations.
EnumBitSet< DiagDirection, uint8_t > DiagDirections
Bitset of DiagDirection elements.
Prices _price
Prices and also the fractional part.
static const uint ROAD_STOP_TRACKBIT_FACTOR
Multiplier for how many regular track bits a bay stop counts.
@ Construction
Construction costs.
Price
Enumeration of all base prices for use with Prices.
@ BuildStationTruck
Price for building lorry stations.
@ ClearStationBus
Price for destroying bus stops.
@ BuildStationBus
Price for building bus stops.
@ ClearStationAirport
Price for destroying airports.
@ ClearStationTruck
Price for destroying lorry stations.
@ BuildStationAirport
Price for building airports.
@ ClearStationDock
Price for destroying docks.
@ ClearStationRail
Price for destroying rail stations.
@ BuildStationRailLength
Additional price for building rail stations dependent on their length.
@ BuildFoundation
Price for building foundation under other constructions e.g. roads, rails, depots,...
@ BuildStationRail
Price for building rail stations.
@ BuildStationDock
Price for building docks.
@ ClearWaypointRail
Price for destroying rail waypoints.
@ ClearRail
Price for destroying rails.
void DrawRailCatenary(const TileInfo *ti)
Draws overhead wires and pylons for electric railways.
Header file for electrified rail specific functions.
bool HasRailCatenaryDrawn(RailType rt)
Test if we should draw rail catenary.
#define T
Climate temperate.
constexpr std::underlying_type_t< enum_type > to_underlying(enum_type e)
Implementation of std::to_underlying (from C++23).
EnumClassIndexContainer< std::array< T, to_underlying(N)>, Index > EnumIndexArray
A typedef for EnumClassIndexContainer using std::array as the backing container type.
Flat set container implementation.
void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub, ZoomLevel zoom)
Draw a sprite, not in a viewport.
uint32_t SpriteID
The number of a sprite, without mapping bits and colourtables.
uint32_t PaletteID
The number of the palette.
uint8_t GetSnowLine()
Get the current snow line, either variable or static.
void MarkTilesDirty(bool cargo_change) const
Marks the tiles of the station as dirty.
void MarkTileDirtyByTile(TileIndex tile, int bridge_level_offset, int tile_height_override)
Mark a tile given by its index dirty for repaint.
static const SpriteID SPR_RAIL_TRACK_Y
static const SpriteID SPR_MONO_TRACK_X_SNOW
static const SpriteID SPR_MGLV_TRACK_Y_SNOW
static const SpriteID SPR_MONO_TRACK_Y
static const SpriteID SPR_MONO_TRACK_Y_SNOW
static const SpriteID SPR_MONO_TRACK_X
static const SpriteID SPR_RAIL_TRACK_X_SNOW
static const SpriteID SPR_MGLV_TRACK_X
static const SpriteID SPR_RAIL_TRACK_Y_SNOW
static const SpriteID SPR_MGLV_TRACK_X_SNOW
static const SpriteID SPR_MGLV_TRACK_Y
static const SpriteID SPR_RAIL_TRACK_X
HouseZone
Concentric rings of zoning around the centre of a town.
@ TownEdge
Edge of the town; roads without pavement.
bool IsTileForestIndustry(TileIndex tile)
Check whether the tile is a forest.
const IndustrySpec * GetIndustrySpec(IndustryType thistype)
Accessor for array _industry_specs.
IndustryType GetIndustryType(Tile tile)
Retrieve the type for this industry.
IndustryID GetIndustryIndex(Tile t)
Get the industry ID of the given tile.
static const IndustryType NUM_INDUSTRYTYPES
total number of industry types, new and old; limited to 240 because we need some special ids like IT_...
const TileTypeProcs _tile_type_station_procs
TileTypeProcs definitions for TileType::Station tiles.
void ChangeTileOwner(TileIndex tile, Owner old_owner, Owner new_owner)
Change the owner of a tile.
void DrawFoundation(TileInfo *ti, Foundation f)
Draw foundation f at tile ti.
uint GetFoundationSpriteBlock(TileIndex tile)
Get the sprite block to use for a foundation.
uint ApplyPixelFoundationToSlope(Foundation f, Slope &s)
Applies a foundation to a slope.
Point RemapCoords2(int x, int y)
Map 3D world or tile coordinate to equivalent 2D coordinate as used in the viewports and smallmap.
Command definitions related to landscape (slopes etc.).
@ Arctic
Landscape with snow levels.
@ Tropic
Landscape with distinct rainforests and deserts,.
Some typedefs for the main game.
EnumBitSet< EdgeUpdateMode, uint8_t > EdgeUpdateModes
Bitset of EdgeUpdateMode elements.
@ Increase
Increase capacity.
@ Manual
Manual distribution. No link graph calculations are run.
#define Point
Macro that prevents name conflicts between included headers.
uint DistanceFromEdge(TileIndex tile)
Param the minimum distance to an edge.
uint DistanceMax(TileIndex t0, TileIndex t1)
Gets the biggest distance component (x or y) between the two given tiles.
TileIndex TileAddWrap(TileIndex tile, int addx, int addy)
This function checks if we add addx/addy to tile, if we do wrap around the edges.
uint DistanceManhattan(TileIndex t0, TileIndex t1)
Gets the Manhattan distance between the two given tiles.
TileIndexDiff ToTileIndexDiff(TileIndexDiffC tidc)
Return the offset between two tiles from a TileIndexDiffC struct.
TileIndexDiff TileDiffXY(int x, int y)
Calculates an offset for the given coordinate(-offset).
TileIndexDiff TileOffsByAxis(Axis axis)
Convert an Axis to a TileIndexDiff.
static TileIndex TileXY(uint x, uint y)
Returns the TileIndex of a coordinate.
static uint TileY(TileIndex tile)
Get the Y component of a tile.
static uint TileX(TileIndex tile)
Get the X component of a tile.
TileIndexDiff TileOffsByDiagDir(DiagDirection dir)
Convert a DiagDirection to a TileIndexDiff.
int32_t TileIndexDiff
An offset value between two tiles.
constexpr bool IsInsideBS(const T x, const size_t base, const size_t size)
Checks if a value is between a window started at some base point.
constexpr bool IsInsideMM(const size_t x, const size_t min, const size_t max) noexcept
Checks if a value is in an interval.
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
constexpr uint ClampU(const uint a, const uint min, const uint max)
Clamp an unsigned integer between an interval.
constexpr To ClampTo(From value)
Clamp the given value down to lie within the requested type.
@ Buoy
Buoy without underlying water.
@ RoadStops
Road stops feature.
@ Stations
Stations feature.
@ Airports
Airports feature.
@ AirportTiles
Airport tiles feature.
uint8_t StationGfx
Copy from station_map.h.
StationGfx GetTranslatedAirportTileID(StationGfx gfx)
Do airporttile gfx ID translation for NewGRFs.
NewGRF handling of airport tiles.
@ NoAnimation
There is no animation.
@ DrawTileLayout
Use callback to select a tile layout to use when drawing.
@ Avail
Availability of station in construction window.
@ SlopeCheck
Check slope of new station tiles.
@ StationRatingCalc
custom station rating for this cargo type
@ CBID_STATION_BUILD_TILE_LAYOUT
Called when building a station to customize the tile layout.
@ CBID_STATION_DRAW_TILE_LAYOUT
Choose a tile layout to draw, instead of the standard range.
@ CBID_CARGO_STATION_RATING_CALC
Called to calculate part of a station rating.
@ CBID_STATION_AVAILABILITY
Determine whether a newstation should be made available to build.
static const uint CALLBACK_FAILED
Different values for Callback result evaluations.
@ Avail
Availability of road stop in construction window.
SpriteID GetCanalSprite(CanalFeature feature, TileIndex tile)
Lookup the base sprite to use for a canal.
Handling of NewGRF canals.
Cargo support for NewGRFs.
bool Convert8bitBooleanCallback(const GRFFile *grffile, uint16_t cbid, uint16_t cb_res)
Converts a callback result into a boolean.
void ErrorUnknownCallbackResult(GrfID grfid, uint16_t cbid, uint16_t cb_res)
Record that a NewGRF returned an unknown/invalid callback result.
GRFConfig * GetGRFConfig(GrfID grfid, uint32_t mask)
Retrieve a NewGRF from the current config by its grfid.
Functions/types related to NewGRF debugging.
void DeleteNewGRFInspectWindow(GrfSpecFeature feature, uint index)
Delete inspect window for a given feature and index.
void TriggerHouseAnimation_WatchedCargoAccepted(TileIndex tile, CargoTypes trigger_cargoes)
Run watched cargo accepted callback for a house.
Functions related to NewGRF houses.
SpriteID GetCustomRailSprite(const RailTypeInfo *rti, TileIndex tile, RailSpriteType rtsg, TileContext context, uint *num_results)
Get the sprite to draw for the given tile.
NewGRF handling of rail types.
void TriggerRoadStopRandomisation(BaseStation *st, TileIndex tile, StationRandomTrigger trigger, CargoType cargo_type)
Trigger road stop randomisation.
void DeallocateSpecFromRoadStop(BaseStation *st, uint8_t specindex)
Deallocate a RoadStopSpec from a Station.
std::optional< uint8_t > AllocateSpecToRoadStop(const RoadStopSpec *spec, BaseStation *st)
Allocate a RoadStopSpec to a Station.
void AssignSpecToRoadStop(const RoadStopSpec *spec, BaseStation *st, uint8_t specindex)
Assign a previously allocated RoadStopSpec specindex to a Station.
NewGRF definitions and structures for road stops.
@ Overlay
Drive-through stops: Draw the road overlay, e.g. pavement.
@ WaypGround
Waypoints: Draw the sprite layout ground tile (on top of the road).
@ Road
Bay stops: Draw the road itself.
bool IsWaypointClass(const RoadStopClass &cls)
Test if a RoadStopClass is the waypoint class.
PoolID< uint16_t, struct RoadStopClassIDTag, UINT16_MAX, UINT16_MAX > RoadStopClassID
Class IDs for stations.
EnumBitSet< RoadStopDrawMode, uint8_t > RoadStopDrawModes
Bitset of RoadStopDrawMode elements.
@ ROADSTOPTYPE_FREIGHT
This RoadStop is for freight (truck) stops.
@ ROADSTOPTYPE_ALL
This RoadStop is for both types of station road stops.
@ ROADSTOPTYPE_PASSENGER
This RoadStop is for passenger (bus) stops.
@ NoCatenary
Do not show catenary.
@ DriveThroughOnly
Stop is drive-through only.
@ DrawModeRegister
Read draw mode from register 0x100.
SpriteID GetCustomRoadSprite(const RoadTypeInfo *rti, TileIndex tile, RoadSpriteType rtsg, TileContext context, uint *num_results)
Get the sprite to draw for the given tile.
NewGRF handling of road types.
SpriteID GetCustomStationRelocation(const StationSpec *statspec, BaseStation *st, TileIndex tile, uint32_t var10)
Resolve sprites for drawing a station tile.
SpriteID GetCustomStationFoundationRelocation(const StationSpec *statspec, BaseStation *st, TileIndex tile, uint layout, uint edge_info)
Resolve the sprites for custom station foundations.
void AssignSpecToStation(const StationSpec *spec, BaseStation *st, uint8_t specindex)
Assign a previously allocated StationSpec specindex to a Station.
void DeallocateSpecFromStation(BaseStation *st, uint8_t specindex)
Deallocate a StationSpec from a Station.
void TriggerStationRandomisation(BaseStation *st, TileIndex trigger_tile, StationRandomTrigger trigger, CargoType cargo_type)
Trigger station randomisation.
CommandCost PerformStationTileSlopeCheck(TileIndex north_tile, TileIndex cur_tile, const StationSpec *statspec, Axis axis, uint8_t plat_len, uint8_t numtracks)
Check the slope of a tile of a new station.
uint32_t GetPlatformInfo(StationGfx gfx, int platforms, int length, int platform, int position, bool centred)
Evaluate a tile's position within a station, and return the result in a bit-stuffed format.
std::optional< uint8_t > AllocateSpecToStation(const StationSpec *spec, BaseStation *st)
Allocate a StationSpec to a Station.
Header file for NewGRF stations.
@ CustomFoundations
Draw custom foundations.
@ SeparateGround
Use different sprite set for ground sprites.
@ ExtendedFoundations
Extended foundation block instead of simple.
NewGRFClass< StationSpec, StationClassID > StationClass
Class containing information relating to station classes.
PoolID< uint16_t, struct StationClassIDTag, UINT16_MAX, UINT16_MAX > StationClassID
Class IDs for stations.
Functions related to news.
void AddNewsItem(EncodedString &&headline, NewsType type, NewsStyle style, NewsFlags flags, NewsReference ref1={}, NewsReference ref2={}, std::unique_ptr< NewsAllocatedData > &&data=nullptr, AdviceType advice_type=AdviceType::Invalid)
Add a new newsitem to be shown.
@ Acceptance
A type of cargo is (no longer) accepted.
@ Small
Small news item. (Information window with text and viewport).
@ InColour
News item is shown in colour (otherwise it is shown in black & white).
@ LinkGraph
A game paused due to the link graph schedule lagging.
@ Editor
In the scenario editor.
Functions related to order backups.
Train * GetTrainForReservation(TileIndex tile, Track track)
Find the train which has reserved a specific path.
void SetRailStationPlatformReservation(TileIndex start, DiagDirection dir, bool b)
Set the reservation for a complete station platform.
bool ValParamRailType(const RailType rail)
Validate functions for rail building.
@ Ground
Main group of ground images.
@ Overlay
Images for overlaying track.
Money RailBuildCost(RailType railtype)
Returns the cost of building the specified railtype.
bool HasPowerOnRail(RailType enginetype, RailType tiletype)
Checks if an engine of the given RailType got power on a tile with a given RailType.
const RailTypeInfo * GetRailTypeInfo(RailType railtype)
Returns a pointer to the Railtype information for a given railtype.
RailTrackOffset
Offsets for sprites within an overlay/underlay set.
@ RTO_Y
Piece of rail in Y direction.
@ RTO_X
Piece of rail in X direction.
Command definitions for rail.
RailType GetRailType(Tile t)
Gets the rail type of the given tile.
TrackBits GetTrackBits(Tile tile)
Gets the track bits of the given tile.
static bool IsPlainRailTile(Tile t)
Checks whether the tile is a rail tile or rail tile with signals.
void MakeRailNormal(Tile t, Owner o, TrackBits b, RailType r)
Make the given tile a normal rail.
TrackBits GetRailReservationTrackBits(Tile t)
Returns the reserved track bits of the tile.
bool HasSignals(Tile t)
Checks if a rail tile has signals.
RailType
Enumeration for all possible railtypes.
@ INVALID_RAILTYPE
Flag for invalid railtype.
Pseudo random number generator.
uint32_t RandomRange(uint32_t limit, const std::source_location location=std::source_location::current())
Pick a random number between 0 and limit - 1, inclusive.
Declaration of link refreshing utility.
bool ValParamRoadType(RoadType roadtype)
Validate functions for rail building.
bool HasPowerOnRoad(RoadType enginetype, RoadType tiletype)
Checks if an engine of the given RoadType got power on a tile with a given RoadType.
const RoadTypeInfo * GetRoadTypeInfo(RoadType roadtype)
Returns a pointer to the Roadtype information for a given roadtype.
@ Roadstop
Required: Bay stop surface.
@ Ground
Required: Main group of ground images.
@ Overlay
Optional: Images for overlaying track.
Money RoadBuildCost(RoadType roadtype)
Returns the cost of building the specified roadtype.
void DrawRoadGroundSprites(const TileInfo *ti, RoadBits road, RoadBits tram, const RoadTypeInfo *road_rti, const RoadTypeInfo *tram_rti, Roadside roadside, bool snow_or_desert)
Draw road ground sprites.
void DrawRoadCatenary(const TileInfo *ti)
Draws the catenary for the given tile.
void UpdateCompanyRoadInfrastructure(RoadType rt, Owner o, int count)
Update road infrastructure counts for a company.
CommandCost CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, Owner owner, RoadTramType rtt, DoCommandFlags flags, bool town_check)
Is it allowed to remove the given road bits from the given tile?
void DrawRoadOverlays(const TileInfo *ti, PaletteID pal, const RoadTypeInfo *road_rti, const RoadTypeInfo *tram_rti, uint road_offset, uint tram_offset, bool draw_underlay)
Draw road underlay and overlay sprites.
Functions related to roads.
RoadBits AxisToRoadBits(Axis a)
Create the road-part which belongs to the given Axis.
Functions used internally by the roads.
bool MayHaveRoad(Tile t)
Test whether a tile can have road/tram types.
RoadBits GetAnyRoadBits(Tile tile, RoadTramType rtt, bool straight_tunnel_bridge_entrance)
Returns the RoadBits on an arbitrary tile Special behaviour:
void SetRoadOwner(Tile t, RoadTramType rtt, Owner o)
Set the owner of a specific road type.
RoadType GetRoadTypeRoad(Tile t)
Get the road type for RoadTramType being RoadTramType::Road.
RoadBits GetRoadBits(Tile t, RoadTramType rtt)
Get the present road bits for a specific road type.
DisallowedRoadDirections GetDisallowedRoadDirections(Tile t)
Gets the disallowed directions.
bool HasTileRoadType(Tile t, RoadTramType rtt)
Check if a tile has a road or a tram road type.
RoadType GetRoadTypeTram(Tile t)
Get the road type for RoadTramType being RoadTramType::Tram.
void MakeRoadNormal(Tile t, RoadBits bits, RoadType road_rt, RoadType tram_rt, TownID town, Owner road, Owner tram)
Make a normal road tile.
RoadBits GetAllRoadBits(Tile tile)
Get all set RoadBits on the given tile.
RoadType GetRoadType(Tile t, RoadTramType rtt)
Get the road type for the given RoadTramType.
static bool IsNormalRoadTile(Tile t)
Return whether a tile is a normal road tile.
Owner GetRoadOwner(Tile t, RoadTramType rtt)
Get the owner of a specific road type.
Roadside
The possible road side decorations.
@ Paved
Road with paved sidewalks.
@ Barren
Road on barren land.
static constexpr RoadBits ROAD_X
Full road along the x-axis (south-west + north-east).
EnumBitSet< RoadBit, uint8_t > RoadBits
Bitset of RoadBit elements.
static constexpr RoadBits ROAD_Y
Full road along the y-axis (north-west + south-east).
static constexpr RoadTramTypes ROADTRAMTYPES_ALL
All possible RoadTramTypes.
RoadType
The different roadtypes we support.
@ INVALID_ROADTYPE
flag for invalid roadtype
RoadTramType
The different types of road type.
Base class for roadstops.
@ RVSB_IN_ROAD_STOP
The vehicle is in a road stop.
@ RVSB_ROAD_STOP_TRACKDIR_MASK
Only bits 0 and 3 are used to encode the trackdir for road stops.
@ RVS_IN_DT_ROAD_STOP
The vehicle is in a drive-through road stop.
A number of safeguards to prevent using unsafe methods.
GameSettings _settings_game
Game settings of a running game or the scenario editor.
ClientSettings _settings_client
The current settings for this game.
bool IsShipDestinationTile(TileIndex tile, StationID station)
Test if a tile is a docking tile for the given station.
void AddTrackToSignalBuffer(TileIndex tile, Track track, Owner owner)
Add track to signal update buffer.
@ Enter
signal entering the block found
static constexpr int GetSlopeMaxZ(Slope s)
Returns the height of the highest corner of a slope relative to TileZ (= minimal height).
static constexpr bool IsSteepSlope(Slope s)
Checks if a slope is steep.
Foundation FlatteningFoundation(Slope s)
Returns the foundation needed to flatten a slope.
DiagDirection GetInclinedSlopeDirection(Slope s)
Returns the direction of an inclined slope.
Slope
Enumeration for the slope-type.
@ Leveled
The tile is leveled up to a flat slope.
void DrawRailTileSeqInGUI(int x, int y, const DrawTileSprites *dts, int32_t total_offset, uint32_t newgrf_offset, PaletteID default_palette)
Draw tile sprite sequence in GUI with railroad specifics.
void DrawRailTileSeq(const struct TileInfo *ti, const DrawTileSprites *dts, TransparencyOption to, int32_t total_offset, uint32_t newgrf_offset, PaletteID default_palette)
Draw tile sprite sequence on tile with railroad specifics.
PaletteID GroundSpritePaletteTransform(SpriteID image, PaletteID pal, PaletteID default_pal)
Applies PALETTE_MODIFIER_COLOUR to a palette entry of a ground sprite.
static const SpriteID SPR_TRAMWAY_TRAM
static const PaletteID PALETTE_CRASH
Recolour sprite greying of crashed vehicles.
static const SpriteID SPR_FLAT_SNOW_DESERT_TILE
static const PaletteID PALETTE_TO_GREY
static const SpriteID SPR_IMG_BUOY
static const SpriteID SPR_FLAT_GRASS_TILE
static constexpr uint8_t SPRITE_MODIFIER_CUSTOM_SPRITE
these masks change the colours of the palette for a sprite.
static constexpr uint8_t SPRITE_WIDTH
number of bits for the sprite number
static constexpr uint8_t PALETTE_MODIFIER_COLOUR
this bit is set when a recolouring process is in action
CommandCost CheckStationSpread(TileArea area, const TileArea &new_area)
Check if adding a new area to a station will exceed the maximum station spread.
Base classes/functions for stations.
void ForAllStationsAroundTiles(const TileArea &ta, Func func)
Call a function on all stations that have any part of the requested area within their catchment.
static CommandCost RemoveRoadStop(TileIndex tile, DoCommandFlags flags, int replacement_spec_index=-1)
Remove a bus station/truck stop.
std::tuple< CommandCost, StationID > CmdMoveStationName(DoCommandFlags flags, StationID station_id, TileIndex tile)
Move a station name.
static StringID GetBridgeTooLowMessageForStationType(StationType type)
Get station-type-specific string for a bridge that is too low.
static void GetTileDesc_Station(TileIndex tile, TileDesc &td)
Tile callback function signature for obtaining a tile description.
static CommandCost BuildStationPart(Station **st, DoCommandFlags flags, bool reuse, TileArea area, StationNaming name_class)
Common part of building various station parts and possibly attaching them to an existing one.
static void MakeStationSpreadAreaSmaller(BaseStation *st)
Make the spread area of a station as small as possible.
static CommandCost RemoveRailWaypoint(TileIndex tile, DoCommandFlags flags)
Remove a rail waypoint.
void CcMoveStationName(Commands, const CommandCost &result, StationID station_id)
Callback function that is called after a name is moved.
CommandCost IsRailStationBridgeAboveOk(TileIndex tile, const StationSpec *spec, StationType type, StationGfx layout)
Test if a rail station can be built below a bridge.
uint8_t GetAirportNoiseLevelForDistance(const AirportSpec *as, uint distance)
Get a possible noise reduction factor based on distance from town center.
static constexpr DiagDirectionIndexArray< uint8_t > _dock_w_chk
X dimension of dock for each direction.
static CommandCost TerraformTile_Station(TileIndex tile, DoCommandFlags flags, int z_new, Slope tileh_new)
Tile callback function signature of the terraforming callback.
CommandCost RemoveFromRailBaseStation(TileArea ta, std::vector< T * > &affected_stations, DoCommandFlags flags, Money removal_cost, bool keep_rail)
Remove a number of tiles from any rail station within the area.
static CommandCost CalculateRailStationCost(TileArea tile_area, DoCommandFlags flags, Axis axis, StationID *station, RailType rt, std::vector< Train * > &affected_vehicles, StationClassID spec_class, uint16_t spec_index, uint8_t plat_len, uint8_t numtracks)
Calculates cost of new rail stations within the area.
static StringID GenerateStationName(Station *st, TileIndex tile, StationNaming name_class)
Generate a station name for the given station at the given location.
void ClearDockingTilesCheckingNeighbours(TileIndex tile)
Clear docking tile status from tiles around a removed dock, if the tile has no neighbours which would...
bool(* CMSAMatcher)(TileIndex tile)
Function to check whether the given tile matches some criterion.
CommandCost IsRoadStationBridgeAboveOk(TileIndex tile, const RoadStopSpec *spec, StationType type, StationGfx layout)
Test if a road station can be built below a bridge.
bool IsHangar(Tile t)
Check whether the given tile is a hangar.
static Station * GetClosestDeletedStation(TileIndex tile)
Find the closest deleted station of the current company.
CommandCost CmdRenameStation(DoCommandFlags flags, StationID station_id, const std::string &text)
Rename a station.
std::pair< CargoArray, CargoTypes > GetAcceptanceAroundTiles(TileIndex center_tile, int w, int h, int rad)
Get the acceptance of cargoes around the tile in 1/8.
static CommandCost RemoveAirport(TileIndex tile, DoCommandFlags flags)
Remove an airport.
static void TileLoop_Station(TileIndex tile)
Tile callback function signature for running periodic tile updates.
static bool CMSAMine(TileIndex tile)
Check whether the tile is a mine.
void IncreaseStats(Station *st, CargoType cargo, StationID next_station_id, uint capacity, uint usage, uint32_t time, EdgeUpdateModes modes)
Increase capacity for a link stat given by station cargo and next hop.
static CommandCost CheckFlatLandRoadStop(TileIndex cur_tile, int &allowed_z, const RoadStopSpec *spec, DoCommandFlags flags, DiagDirections invalid_dirs, bool is_drive_through, StationType station_type, Axis axis, StationID *station, RoadType rt)
Checks if a road stop can be built at the given tile.
static CommandCost RemoveGenericRoadStop(DoCommandFlags flags, const TileArea &roadstop_area, bool road_waypoint, bool remove_road)
Remove a tile area of road stop or road waypoints.
static void TruncateCargo(const CargoSpec *cs, GoodsEntry *ge, uint amount=UINT_MAX)
Truncate the cargo by a specific amount.
CommandCost CmdRemoveFromRailWaypoint(DoCommandFlags flags, TileIndex start, TileIndex end, bool keep_rail)
Remove a single tile from a waypoint.
StationNaming
Station types a station could be named after.
@ Oilrig
Heliport of an oilrig.
@ Heliport
Standalone heliport.
@ Airport
Airport for fixed wing aircraft.
CommandCost FindJoiningWaypoint(StationID existing_waypoint, StationID waypoint_to_join, bool adjacent, TileArea ta, Waypoint **wp, bool is_road)
Find a nearby waypoint that joins this waypoint.
CommandCost CmdBuildDock(DoCommandFlags flags, TileIndex tile, StationID station_to_join, bool adjacent)
Build a dock/haven.
CommandCost IsBuoyBridgeAboveOk(TileIndex tile)
Test if a buoy can be built below a bridge.
static CommandCost CheckFlatLandAirport(AirportTileTableIterator tile_iter, DoCommandFlags flags)
Checks if an airport can be built at the given location and clear the area.
CommandCost RemoveRoadWaypointStop(TileIndex tile, DoCommandFlags flags, int replacement_spec_index=-1)
Remove a road waypoint.
CommandCost GetStationAround(TileArea ta, StationID closest_station, CompanyID company, T **st, F filter)
Look for a station owned by the given company around the given tile area.
CommandCost CmdRemoveRoadStop(DoCommandFlags flags, TileIndex tile, uint8_t width, uint8_t height, RoadStopType stop_type, bool remove_road)
Remove bus or truck stops.
static VehicleEnterTileStates VehicleEnterTile_Station(Vehicle *v, TileIndex tile, int x, int y)
Tile callback function for a vehicle entering a tile.
static void ChangeTileOwner_Station(TileIndex tile, Owner old_owner, Owner new_owner)
Tile callback function signature for changing the owner of a tile.
bool HasStationInUse(StationID station, bool include_company, CompanyID company)
Tests whether the company's vehicles have this station in orders.
static int CountMapSquareAround(TileIndex tile, CMSAMatcher cmp)
Counts the numbers of tiles matching a specific type in the area around.
CommandCost CmdBuildRoadStop(DoCommandFlags flags, TileIndex tile, uint8_t width, uint8_t length, RoadStopType stop_type, bool is_drive_through, DiagDirection ddir, RoadType rt, RoadStopClassID spec_class, uint16_t spec_index, StationID station_to_join, bool adjacent)
Build a bus or truck stop.
static StationSpec::TileFlags GetStationTileFlags(StationGfx gfx, const StationSpec *statspec)
Get station tile flags for the given StationGfx.
static CommandCost IsDockBridgeAboveOk(TileIndex tile, StationGfx layout)
Test if a dock can be built below a bridge.
static bool DrawCustomStationFoundations(const StationSpec *statspec, BaseStation *st, TileInfo *ti, StationGfx gfx)
Draw custom station foundations for a NewGRF station if provided.
const DrawTileSprites * GetStationTileLayout(StationType st, uint8_t gfx)
Get station tile layout for a station type and its station gfx.
CommandCost CmdRemoveFromRoadWaypoint(DoCommandFlags flags, TileIndex start, TileIndex end)
Remove road waypoints.
void RerouteCargo(Station *st, CargoType cargo, StationID avoid, StationID avoid2)
Reroute cargo of type c at station st or in any vehicles unloading there.
static constexpr DiagDirectionIndexArray< TileIndexDiffC > _dock_tileoffs_chkaround
Offset of northern-most dock tile for each direction.
CommandCost ClearTile_Station(TileIndex tile, DoCommandFlags flags)
Tile callback function signature for clearing a tile.
static std::pair< CargoArray, CargoTypes > GetAcceptanceAroundStation(const Station *st)
Get the acceptance of cargoes around the station in.
static void UpdateStationRating(Station *st)
Periodic update of a station's rating.
static TrackStatus GetTileTrackStatus_Station(TileIndex tile, TransportType mode, RoadTramType sub_mode, DiagDirection side)
Tile callback function signature for getting the possible tracks that can be taken on a given tile by...
void UpdateAllStationVirtCoords()
Update the virtual coords needed to draw the station sign for all stations.
static void DrawTile_Station(TileInfo *ti)
Tile callback function signature for drawing a tile and its contents to the screen.
static bool CMSAWater(TileIndex tile)
Check whether the tile is water.
CommandCost CmdBuildAirport(DoCommandFlags flags, TileIndex tile, uint8_t airport_type, uint8_t layout, StationID station_to_join, bool allow_adjacent)
Place an Airport.
void TriggerWatchedCargoCallbacks(Station *st)
Run the watched cargo callback for all houses in the catchment area.
static CommandCost CanRemoveRoadWithStop(TileIndex tile, DoCommandFlags flags)
Check if a drive-through road stop tile can be cleared.
static RoadStop ** FindRoadStopSpot(bool truck_station, Station *st)
CargoTypes GetAcceptanceMask(const Station *st)
Get a mask of the cargo types that the station accepts.
static void RestoreTrainReservation(Train *v)
Restore platform reservation during station building/removing.
void UpdateAirportsNoise()
Recalculate the noise generated by the airports of each town.
static std::span< const BridgeableTileInfo > GetStationBridgeableTileInfo(StationType type)
Get bridgeable tile information for a station type.
static bool CMSATree(TileIndex tile)
Check whether the tile is a tree.
void ModifyStationRatingAround(TileIndex tile, Owner owner, int amount, uint radius)
Forcibly modify station ratings near a given tile.
CommandCost RemoveRailStation(T *st, DoCommandFlags flags, Money removal_cost)
Remove a rail station/waypoint.
void UpdateStationAcceptance(Station *st, bool show_msg)
Update the acceptance for a station.
static CommandCost FindJoiningRoadStop(StationID existing_stop, StationID station_to_join, bool adjacent, TileArea ta, Station **st)
Find a nearby station that joins this road stop.
CommandCost CmdOpenCloseAirport(DoCommandFlags flags, StationID station_id)
Open/close an airport to incoming aircraft.
static const IntervalTimer< TimerGameEconomy > _economy_stations_monthly({TimerGameEconomy::Trigger::Month, TimerGameEconomy::Priority::Station}, [](auto) { for(Station *st :Station::Iterate()) { for(GoodsEntry &ge :st->goods) { ge.status.Set(GoodsEntry::State::LastMonth, ge.status.Test(GoodsEntry::State::CurrentMonth));ge.status.Reset(GoodsEntry::State::CurrentMonth);} } })
Economy monthly loop for stations.
static CommandCost CheckFlatLandRailStation(TileIndex tile_cur, TileIndex north_tile, int &allowed_z, DoCommandFlags flags, Axis axis, StationID *station, RailType rt, std::vector< Train * > &affected_vehicles, StationClassID spec_class, uint16_t spec_index, uint8_t plat_len, uint8_t numtracks)
Checks if a rail station can be built at the given tile.
static TileIndex FindDockLandPart(TileIndex t)
Find the part of a dock that is land-based.
static CommandCost CheckBuildAbove_Station(TileIndex tile, DoCommandFlags flags, Axis axis, int height)
Tile callback function signature to test if a bridge can be built above a tile.
static void FreeTrainReservation(Train *v)
Clear platform reservation during station building/removing.
static bool ClickTile_Station(TileIndex tile)
Tile callback function signature for clicking a tile.
void SetRailStationTileFlags(TileIndex tile, const StationSpec *statspec)
Set rail station tile flags for the given tile.
CommandCost CalculateRoadStopCost(TileArea tile_area, DoCommandFlags flags, bool is_drive_through, StationType station_type, const RoadStopSpec *roadstopspec, Axis axis, DiagDirection ddir, StationID *station, RoadType rt, Money unit_cost)
Calculates cost of new road stops within the area.
CargoTypes GetCargoWaitingMask(const Station *st)
Get a mask of the cargo types that have cargo waiting at the station.
static CommandCost RemoveDock(TileIndex tile, DoCommandFlags flags)
Remove a dock.
static void AnimateTile_Station(TileIndex tile)
Tile callback function signature for animating a tile.
bool SplitGroundSpriteForOverlay(const TileInfo *ti, SpriteID *ground, RailTrackOffset *overlay_offset)
Check whether a sprite is a track sprite, which can be replaced by a non-track ground sprite and a ra...
CargoArray GetProductionAroundTiles(TileIndex north_tile, int w, int h, int rad)
Get the cargo types being produced around the tile (in a rectangle).
CommandCost CmdRemoveFromRailStation(DoCommandFlags flags, TileIndex start, TileIndex end, bool keep_rail)
Remove a single tile from a rail station.
static CommandCost FindJoiningStation(StationID existing_station, StationID station_to_join, bool adjacent, TileArea ta, Station **st)
Find a nearby station that joins this station.
void DeleteStaleLinks(Station *from)
Check all next hops of cargo packets in this station for existence of a a valid link they may use to ...
static BridgePillarFlags GetStationBlockedPillars(std::span< const BridgeableTileInfo > bridgeable_info, uint8_t layout)
Get blocked pillar information for a station tile.
CommandCost CheckBuildableTile(TileIndex tile, DiagDirections invalid_dirs, int &allowed_z, bool allow_steep, bool check_bridge=true)
Checks if the given tile is buildable, flat and has a certain height.
CommandCost FindJoiningBaseStation(StringID error_message, StationID existing_station, StationID station_to_join, bool adjacent, TileArea ta, T **st, F filter)
Find a nearby station that joins this station.
static constexpr DiagDirectionIndexArray< uint8_t > _dock_h_chk
Y dimension of dock for each direction.
Town * AirportGetNearestTown(const AirportSpec *as, Direction rotation, TileIndex tile, TileIterator &&it, uint &mindist)
Finds the town nearest to given airport.
static bool StationHandleBigTick(BaseStation *st)
This function is called for each station once every 250 ticks.
static void ShowRejectOrAcceptNews(const Station *st, CargoTypes cargoes, bool reject)
Add news item for when a station changes which cargoes it accepts.
CommandCost CmdBuildRailStation(DoCommandFlags flags, TileIndex tile_org, RailType rt, Axis axis, uint8_t numtracks, uint8_t plat_len, StationClassID spec_class, uint16_t spec_index, StationID station_to_join, bool adjacent)
Build rail station.
static void DeleteStationIfEmpty(BaseStation *st)
This is called right after a station was deleted.
static CommandCost IsStationBridgeAboveOk(TileIndex tile, std::span< const BridgeableTileInfo > bridgeable_info, StationType type, StationGfx layout, int bridge_height, StringID disallowed_msg=INVALID_STRING_ID)
Test if a bridge can be built above a station.
Command definitions related to stations.
Functions related to stations.
void ShowStationViewWindow(StationID station)
Opens StationViewWindow for given station.
@ Count
by amount of cargo
Declarations for accessing the k-d tree of stations.
void ForAllStationsRadius(TileIndex center, uint radius, Func func)
Call a function on all stations whose sign is within a radius of a center tile.
Sprites to use and how to display them for station tiles.
Functions related to station layouts.
void MakeAirport(Tile t, Owner o, StationID sid, uint8_t section, WaterClass wc)
Make the given tile an airport tile.
StationType GetStationType(Tile t)
Get the station type of this tile.
StationGfx GetStationGfx(Tile t)
Get the station graphics of this tile.
void SetStationGfx(Tile t, StationGfx gfx)
Set the station graphics of this tile.
void MakeRoadStop(Tile t, Owner o, StationID sid, RoadStopType rst, RoadType road_rt, RoadType tram_rt, DiagDirection d)
Make the given tile a roadstop tile.
void SetCustomStationSpecIndex(Tile t, uint8_t specindex)
Set the custom station spec for this tile.
void SetStationTileHaveWires(Tile t, bool b)
Set the catenary wires state of the rail station.
bool IsAirport(Tile t)
Is this station tile an airport?
bool IsBayRoadStopTile(Tile t)
Is tile t a bay (non-drive through) road stop station?
uint GetCustomRoadStopSpecIndex(Tile t)
Get the custom road stop spec for this tile.
static const int GFX_DOCK_BASE_WATER_PART
The offset for the water parts.
bool IsBuoy(Tile t)
Is tile t a buoy tile?
bool IsCompatibleTrainStationTile(Tile test_tile, Tile station_tile)
Check if a tile is a valid continuation to a railstation tile.
bool IsRoadWaypoint(Tile t)
Is the station at t a road waypoint?
void MakeDriveThroughRoadStop(Tile t, Owner station, Owner road, Owner tram, StationID sid, StationType rst, RoadType road_rt, RoadType tram_rt, Axis a)
Make the given tile a drivethrough roadstop tile.
bool IsDriveThroughStopTile(Tile t)
Is tile t a drive through road stop station or waypoint?
static Roadside GetRoadWaypointRoadside(Tile tile)
Get the decorations of a road waypoint.
bool IsRailStationTile(Tile t)
Is this tile a station tile and a rail station?
Track GetRailStationTrack(Tile t)
Get the rail track of a rail station tile.
static void ToggleRoadWaypointOnSnowOrDesert(Tile t)
Toggle the snow/desert state of a road waypoint tile.
StationID GetStationIndex(Tile t)
Get StationID from a tile.
bool HasStationTileRail(Tile t)
Has this station tile a rail?
StationGfx GetAirportGfx(Tile t)
Get the station graphics of this airport tile.
uint GetCustomStationSpecIndex(Tile t)
Get the custom station spec for this tile.
bool IsRailWaypoint(Tile t)
Is this station tile a rail waypoint?
bool IsRailStation(Tile t)
Is this station tile a rail station?
bool IsDockTile(Tile t)
Is tile t a dock tile?
static void SetRoadWaypointRoadside(Tile tile, Roadside s)
Set the decorations of a road waypoint.
void SetStationTileRandomBits(Tile t, uint8_t random_bits)
Set the random bits for a station tile.
bool IsAnyRoadStop(Tile t)
Is the station at t a road station?
void MakeOilrig(Tile t, StationID sid, WaterClass wc)
Make the given tile an oilrig tile.
DiagDirection GetDockDirection(Tile t)
Get the direction of a dock.
Axis GetRailStationAxis(Tile t)
Get the rail direction of a rail station.
static bool IsRoadWaypointOnSnowOrDesert(Tile t)
Check if a road waypoint tile has snow/desert.
bool IsRoadWaypointTile(Tile t)
Is this tile a station tile and a road waypoint?
bool IsStationTileBlocked(Tile t)
Is tile t a blocked tile?
bool IsTruckStop(Tile t)
Is the station at t a truck stop?
bool IsStationRoadStop(Tile t)
Is the station at t a road station?
bool IsCustomStationSpecIndex(Tile t)
Is there a custom rail station spec on this tile?
bool HasStationRail(Tile t)
Has this station tile a rail?
static const int GFX_TRUCK_BUS_DRIVETHROUGH_OFFSET
The offset for the drive through parts.
Axis GetDriveThroughStopAxis(Tile t)
Gets the axis of the drive through stop.
void SetStationTileHavePylons(Tile t, bool b)
Set the catenary pylon state of the rail station.
bool IsOilRig(Tile t)
Is tile t part of an oilrig?
bool IsBuoyTile(Tile t)
Is tile t a buoy tile?
void MakeRailStation(Tile t, Owner o, StationID sid, Axis a, uint8_t section, RailType rt)
Make the given tile a rail station tile.
bool HasStationReservation(Tile t)
Get the reservation state of the rail station.
void MakeDock(Tile t, Owner o, StationID sid, DiagDirection d, WaterClass wc)
Make the given tile a dock tile.
DiagDirection GetBayRoadStopDir(Tile t)
Gets the direction the bay road stop entrance points towards.
bool IsDock(Tile t)
Is tile t a dock tile?
bool IsAnyRoadStopTile(Tile t)
Is tile t a road stop station?
void SetStationTileBlocked(Tile t, bool b)
Set the blocked state of the rail station.
RoadStopType GetRoadStopType(Tile t)
Get the road stop type of this tile.
void SetCustomRoadStopSpecIndex(Tile t, uint8_t specindex)
Set the custom road stop spec for this tile.
RoadStopType
Types of RoadStops.
@ Bus
A standard stop for buses.
@ Truck
A standard stop for trucks.
@ Dock
Station with a dock.
@ Waypoint
Station is a waypoint.
@ TruckStop
Station with truck stops.
@ Train
Station with train station.
@ Airport
Station with an airport.
@ BusStop
Station with bus stops.
StationType
Station types.
@ Rail
Railways/train station.
@ Bus
Road stop for busses.
@ Truck
Road stop for trucks.
@ RailWaypoint
Waypoint for trains.
@ Buoy
Waypoint for ships.
@ RoadWaypoint
Waypoint for trucks and busses.
@ Oilrig
Heliport on an oil rig.
@ Airport
Airports and heliports, excluding the ones on oil rigs.
@ NewCargo
Trigger station on new cargo arrival.
std::set< Station *, StationCompare > StationList
List of stations.
@ Built
Trigger tile when built.
@ TileLoop
Trigger in the periodic tile loop.
@ NewCargo
Trigger station on new cargo arrival.
@ AcceptanceTick
Trigger station every 250 ticks.
EnumBitSet< StationFacility, uint8_t > StationFacilities
Bitset of StationFacility elements.
static const uint MAX_LENGTH_STATION_NAME_CHARS
The maximum length of a station name in characters including '\0'.
@ Built
Triggered when the airport is built (for all tiles at the same time).
@ TileLoop
Triggered in the periodic tile loop.
@ NewCargo
Triggered when new cargo arrives at the station (for all tiles at the same time).
@ AcceptanceTick
Triggered every 250 ticks (for all tiles at the same time).
Definition of base types and functions in a cross-platform compatible way.
size_t Utf8StringLength(std::string_view str)
Get the length of an UTF-8 encoded string in number of characters and thus not the number of bytes th...
Functions related to low-level strings.
void GetStringWithArgs(StringBuilder &builder, StringID string, StringParameters &args, uint case_index, bool game_script)
Get a parsed string with most special stringcodes replaced by the string parameters.
EncodedString GetEncodedString(StringID str)
Encode a string with no parameters into an encoded string.
std::string GetString(StringID string)
Resolve the given StringID into a std::string with formatting but no parameters.
Functions related to OTTD's strings.
auto MakeParameters(Args &&... args)
Helper to create the StringParameters with its own buffer with the given parameter values.
StrongType::Typedef< uint32_t, struct StringIDTag, StrongType::Compare, StrongType::Integer > StringID
Numeric value that represents a string, independent of the selected language.
static constexpr StringID INVALID_STRING_ID
Constant representing an invalid string (16bit in case it is used in savegames).
Aircraft, helicopters, rotors and their shadows belong to this class.
@ Airplanes
Can planes land on this airport type?
Defines the data structure for an airport.
StringID name
name of this airport
SubstituteGRFFileProps grf_prop
Properties related to the grf file.
std::vector< AirportTileLayout > layouts
List of layouts composing the airport.
bool IsWithinMapBounds(uint8_t table, TileIndex index) const
Check if the airport would be within the map bounds at the given tile.
uint8_t size_y
size of airport in y direction
uint8_t size_x
size of airport in x direction
static const AirportSpec * Get(uint8_t type)
Retrieve airport spec for the given airport.
std::span< const HangarTileTable > depots
Position of the depots on the airports.
bool IsAvailable() const
Check whether this airport is available to build.
uint8_t noise_level
noise that this airport generates
Defines the data structure of each individual tile of an airport.
static const AirportTileSpec * Get(StationGfx gfx)
Retrieve airport tile spec for the given airport tile.
SubstituteGRFFileProps grf_prop
properties related the the grf file
StringID name
Tile Subname string, land information on this tile will give you "AirportName (TileSubname)".
static const AirportTileSpec * GetByTile(TileIndex tile)
Retrieve airport tile spec for the given airport tile.
All airport-related information.
AirportBlocks blocks
stores which blocks on the airport are taken. was 16 bit earlier on, then 32
TileIndex GetRotatedTileFromOffset(TileIndexDiffC tidc) const
Add the tileoffset to the base tile of this airport but rotate it first.
uint GetHangarNum(TileIndex tile) const
Get the hangar number of the hangar at a specific tile.
Direction rotation
How this airport is rotated.
uint8_t type
Type of this airport,.
PersistentStorage * psa
Persistent storage for NewGRF airports.
uint GetNumHangars() const
Get the number of hangars on this airport.
TileIndex GetHangarTile(uint hangar_num) const
Get the first tile of the given hangar.
const AirportSpec * GetSpec() const
Get the AirportSpec that from the airport type of this airport.
uint8_t layout
Airport layout number.
Base class for all station-ish types.
StringID string_id
Default name (town area) of station.
TileIndex xy
Base tile of the station.
virtual void MoveSign(TileIndex new_xy)
Move this station's main coordinate somewhere else.
std::vector< SpecMapping< StationSpec > > speclist
List of rail station specs of this station.
StationFacilities facilities
The facilities that this station has.
std::string cached_name
NOSAVE: Cache of the resolved name of the station, if not using a custom name.
TileArea train_station
Tile area the train 'station' part covers.
StationAnimationTriggers cached_anim_triggers
NOSAVE: Combined animation trigger bitmask, used to determine if trigger processing should happen.
Owner owner
The owner of this station.
virtual void UpdateVirtCoord()=0
Update the coordinated of the sign (as shown in the viewport).
uint8_t delete_ctr
Delete counter. If greater than 0 then it is decremented until it reaches 0; the waypoint is then is ...
StationAnimationTriggers cached_roadstop_anim_triggers
NOSAVE: Combined animation trigger bitmask for road stops, used to determine if trigger processing sh...
bool IsInUse() const
Check whether the base station currently is in use; in use means that it is not scheduled for deletio...
Town * town
The town this station is associated with.
static BaseStation * GetByTile(TileIndex tile)
Get the base station belonging to a specific tile.
virtual bool TileBelongsToRailStation(TileIndex tile) const =0
Check whether a specific tile belongs to this station.
TrackedViewportSign sign
NOSAVE: Dimensions of sign.
TimerGameCalendar::Date build_date
Date of construction.
std::string name
Custom name.
TileArea spread
NOSAVE: Station spread tile area.
VehicleType type
Type of vehicle.
Class for storing amounts of cargo.
Specification of a cargo type.
static CargoSpec * Get(size_t index)
Retrieve cargo details for the given cargo type.
CargoType Index() const
Determines index of this cargospec.
static IterateWrapper Iterate(size_t from=0)
Returns an iterable ensemble of all valid CargoSpec.
uint32_t station
Count of company owned station tiles.
std::array< uint32_t, RAILTYPE_END > rail
Count of company owned track bits for each rail type.
uint32_t water
Count of company owned track bits for canals.
CompanyInfrastructure infrastructure
NOSAVE: Counts of company owned infrastructure.
Ground palette sprite of a tile, together with its sprite layout.
Ground palette sprite of a tile, together with its sprite layout.
PalSpriteID ground
Palette and sprite for the ground.
std::string GetName() const
Get the name of this grf.
GrfID grfid
grfid that introduced this entity.
const struct GRFFile * grffile
grf file that introduced this entity
bool HasGrfFile() const
Test if this entity was introduced by NewGRF.
StationSettings station
settings related to station management
FlowStatMap flows
Planned flows through this station.
StationCargoList cargo
The cargo packets of cargo waiting in this station.
Stores station stats for a single cargo.
uint max_waiting_cargo
Max cargo from this station waiting at any station.
bool HasRating() const
Does this cargo have a rating at this station?
uint8_t last_speed
Maximum speed (up to 255) of the last vehicle that tried to load this cargo.
uint8_t last_age
Age in years (up to 255) of the last vehicle that tried to load this cargo.
uint8_t time_since_pickup
Number of rating-intervals (up to 255) since the last vehicle tried to load this cargo.
States status
Status of this cargo, see State.
NodeID node
ID of node in link graph referring to this goods entry.
@ LastMonth
Set when cargo was delivered for final delivery last month.
@ Acceptance
Set when the station accepts the cargo currently for final deliveries.
@ Rating
This indicates whether a cargo has a rating at the station.
@ AcceptedBigtick
Set when cargo was delivered for final delivery during the current STATION_ACCEPTANCE_TICKS interval.
@ CurrentMonth
Set when cargo was delivered for final delivery this month.
const GoodsEntryData & GetData() const
Get optional cargo packet/flow data.
uint8_t amount_fract
Fractional part of the amount in the cargo list.
LinkGraphID link_graph
Link graph this station belongs to.
bool HasVehicleEverTriedLoading() const
Reports whether a vehicle has ever tried to load the cargo at this station.
uint8_t rating
Station rating for this cargo.
bool HasData() const
Test if this goods entry has optional cargo packet/flow data.
GoodsEntryData & GetOrCreateData()
Get optional cargo packet/flow data.
uint AvailableCount() const
Returns sum of cargo still available for loading at the station.
StationID GetVia(StationID source) const
Get the best next hop for a cargo packet from station source.
Defines the data structure for constructing industry.
SubstituteGRFFileProps grf_prop
properties related to the grf file
StringID name
Displayed name of the industry.
StringID station_name
Default name for nearby station.
bool enabled
entity still available (by default true).newgrf can disable it, though
IndustryLifeTypes life_type
This is also known as Industry production flag, in newgrf specs.
Defines the internal data of a functional industry.
IndustryType type
type of industry.
ProducedCargoes produced
produced cargo slots
Owner owner
owner of the industry. Which SHOULD always be (imho) OWNER_NONE
static Industry * GetByTile(TileIndex tile)
Get the industry of the given tile.
TileArea location
Location of the industry.
Station * neutral_station
Associated neutral station.
StationList stations_near
NOSAVE: List of nearby stations.
static uint SizeX()
Get the size of the map along the X.
static uint SizeY()
Get the size of the map along the Y.
static uint Size()
Get the size of the map.
Tindex class_index
Class index of this spec, invalid until class is allocated.
NewGRF supplied spritelayout.
static void Reset(TileIndex tile=INVALID_TILE, bool from_gui=true)
Reset the OrderBackups from GUI/game logic.
Shared order list linking together the linked list of orders and the list of vehicles sharing this or...
If you change this, keep in mind that it is also saved in 2 other places:
bool IsType(OrderType type) const
Check whether this order is of the given type.
bool ShouldStopAtStation(const Vehicle *v, StationID station) const
Check whether the given vehicle should stop at the given station based on this order and the non-stop...
bool Contains(TileIndex tile) const
Does this tile area contain a tile?
uint16_t w
The width of the area.
void Add(TileIndex to_add)
Add a single tile to a tile area; enlarge if needed.
void Clear()
Clears the 'tile area', i.e.
TileIndex tile
The base tile of the area.
bool IsEmpty() const
Test if this tile area is empty.
uint16_t h
The height of the area.
OrthogonalTileArea & Expand(int rad)
Expand a tile area by rad tiles in each direction, keeping within map bounds.
SpriteID sprite
The 'real' sprite.
PaletteID pal
The palette (use PAL_NONE) if not needed).
static Pool::IterateWrapper< BaseStation > Iterate(size_t from=0)
static T * Create(Targs &&... args)
static Industry * Get(auto index)
static size_t GetNumItems()
static bool CanAllocateItem(size_t n=1)
static bool IsValidID(auto index)
static LinkGraph * GetIfValid(auto index)
Money GetBuildCost(Price category) const
Get the cost for building a road stop of this type.
std::array< BridgeableTileInfo, 6 > bridgeable_info
Per tile layout bridge information.
CargoGRFFileProps grf_prop
Link to NewGRF.
Money GetClearCost(Price category) const
Get the cost for clearing a road stop of this type.
A Stop for a Road Vehicle.
RoadStop * next
Next stop of the given type at this station.
static RoadStop * GetByTile(TileIndex tile, RoadStopType type)
Find a roadstop at given tile.
void MakeDriveThrough()
Join this road stop to another 'base' road stop if possible; fill all necessary data to become an act...
void ClearDriveThrough()
Prepare for removal of this stop; update other neighbouring stops if needed.
Buses, trucks and trams belong to this class.
All ships have this type.
static bool IsValidID(auto index)
static Station * Create(Targs &&... args)
static bool IsExpected(const BaseStation *st)
static Pool::IterateWrapper< Station > Iterate(size_t from=0)
static Station * Get(auto index)
static Station * GetIfValid(auto index)
static Station * From(BaseStation *st)
static RoadVehicle * From(Vehicle *v)
T * Last()
Get the last vehicle in the chain.
bool HasSpriteGroups() const
Check whether the entity has sprite groups.
bool serve_neutral_industries
company stations can serve industries with attached neutral stations
std::vector< BridgeableTileInfo > bridgeable_info
Per tile layout bridge information.
uint8_t disallowed_lengths
Bitmask of platform lengths available for the station.
StringID name
Name of this station.
uint8_t disallowed_platforms
Bitmask of number of platforms available for the station.
CargoGRFFileProps grf_prop
Link to NewGRF.
std::vector< TileFlags > tileflags
List of tile flags.
std::vector< NewGRFSpriteLayout > renderdata
Number of tile layouts.
EnumBitSet< TileFlag, uint8_t > TileFlags
Bitset of TileFlag elements.
StationCallbackMasks callback_mask
Bitmask of station callbacks that have to be called.
@ NoWires
Tile should NOT contain catenary wires.
@ Pylons
Tile should contain catenary pylons.
@ Blocked
Tile is blocked to vehicles.
StationSpecFlags flags
Bitmask of flags, bit 0: use different sprite set; bit 1: divide cargo about by station size.
TileArea GetTileArea(StationType type) const override
Get the tile area for a given station type.
RoadStop * bus_stops
All the road stops.
TileArea ship_station
Tile area the ship 'station' part covers.
IndustryType indtype
Industry type to get the name from.
TileArea docking_station
Tile area the docking tiles cover.
CargoTypes always_accepted
Bitmask of always accepted cargo types (by houses, HQs, industry tiles when industry doesn't accept c...
Industry * industry
NOSAVE: Associated industry for neutral stations. (Rebuilt on load from Industry->st).
void MoveSign(TileIndex new_xy) override
Move the station main coordinate somewhere else.
std::array< GoodsEntry, NUM_CARGO > goods
Goods at this station.
TileArea bus_station
Tile area the bus 'station' part covers.
BitmapTileArea catchment_tiles
NOSAVE: Set of individual tiles covered by catchment area.
void RecomputeCatchment(bool no_clear_nearby_lists=false)
Recompute tiles covered in our catchment area.
void AfterStationTileSetChange(bool adding, StationType type)
After adding/removing tiles to station, update some station-related stuff.
Airport airport
Tile area the airport covers.
void UpdateVirtCoord() override
Update the virtual coords needed to draw the station sign.
TileArea truck_station
Tile area the truck 'station' part covers.
RoadStop * truck_stops
All the truck stops.
void AddFacility(StationFacility new_facility_bit, TileIndex facil_xy)
Called when new facility is built on the station.
uint16_t subst_id
The id of the entity to replace.
Tile description for the 'land area information' tool.
uint16_t rail_speed
Speed limit of rail (bridges and track).
std::optional< std::string > grf
newGRF used for the tile contents
StringID station_name
Type of station within the class.
StringID str
Description of the tile.
TimerGameCalendar::Date build_date
Date of construction of tile contents.
std::array< Owner, 4 > owner
Name of the owner(s).
StringID airport_class
Name of the airport class.
StringID airport_name
Name of the airport.
uint16_t tram_speed
Speed limit of tram (bridges and track).
StringID roadtype
Type of road on the tile.
StringID tramtype
Type of tram on the tile.
StringID railtype
Type of rail on the tile.
uint16_t road_speed
Speed limit of road (bridges and track).
std::array< StringID, 4 > owner_type
Type of each owner.
StringID airport_tile_name
Name of the airport tile.
StringID station_class
Class of station.
Tile information, used while rendering the tile.
Slope tileh
Slope of the tile.
TileIndex tile
Tile index.
CompanyMask statues
which companies have a statue?
TileIndex xy
town center tile
uint16_t noise_reached
level of noise that all the airports are generating
uint16_t MaxTownNoise() const
Calculate the max town noise.
CompanyID exclusivity
which company has exclusivity
uint8_t exclusive_counter
months till the exclusivity expires
'Train' is either a loco or a wagon.
Trackdir GetVehicleTrackdir() const override
Get the tracks of the train vehicle.
Direction GetMovingDirection() const
Get the moving direction of this vehicle chain.
bool IsStoppedInDepot() const
Check whether the vehicle is in the depot and stopped.
bool IsMovingFront() const
Is this vehicle the moving front of the vehicle chain?
TimerGameEconomy::Date date_of_last_service
Last economy date the vehicle had a service at a depot.
virtual void SetDestTile(TileIndex tile)
Set the destination of this vehicle.
VehStates vehstatus
Status.
Vehicle * First() const
Get the first vehicle of this vehicle chain.
virtual TileIndex GetOrderStationLocation(StationID station)
Determine the location for the station where the vehicle goes to next.
Order current_order
The current order (+ status, like: loading).
Vehicle * Next() const
Get the next vehicle of this vehicle.
Vehicle * NextShared() const
Get the next vehicle of the shared vehicle chain.
uint16_t cur_speed
current speed
bool IsFrontEngine() const
Check if the vehicle is a front engine.
TileIndex tile
Current tile index.
TileIndex dest_tile
Heading for this tile.
Owner owner
Which company owns the vehicle?
Representation of a waypoint.
TileArea road_waypoint_area
Tile area the road waypoint part covers.
uint16_t waypoint_flags
Waypoint flags, see WaypointFlags.
void UpdateVirtCoord() override
Update the virtual coords needed to draw the waypoint sign.
@ Source
town/industry is source of subsidised path
@ EnteredStation
The vehicle entered a station.
@ CannotEnter
The vehicle cannot enter the tile.
void AddProducedCargo(TileIndex tile, CargoArray &produced)
Obtain the produced cargo of a tile.
EnumBitSet< VehicleEnterTileState, uint8_t > VehicleEnterTileStates
Bitset of VehicleEnterTileState elements.
void AddAcceptedCargo(TileIndex tile, CargoArray &acceptance, CargoTypes &always_accepted)
Obtain cargo acceptance of a tile.
bool IsTileFlat(TileIndex tile, int *h)
Check if a given tile is flat.
std::tuple< Slope, int > GetTileSlopeZ(TileIndex tile)
Return the slope of a given tile inside the map.
int GetTileMaxZ(TileIndex t)
Get top height of the tile inside the map.
int GetTileZ(TileIndex tile)
Get bottom height of the tile.
static bool IsTileType(Tile tile, TileType type)
Checks if a tile is a given tiletype.
bool IsTileOwner(Tile tile, Owner owner)
Checks if a tile belongs to the given owner.
Owner GetTileOwner(Tile tile)
Returns the owner of a tile.
void SetTileOwner(Tile tile, Owner owner)
Sets the owner of a tile.
int GetTileMaxPixelZ(TileIndex tile)
Get top height of the tile.
uint8_t GetAnimationFrame(Tile t)
Get the current animation frame.
bool IsValidTile(Tile tile)
Checks if a tile is valid.
TropicZone GetTropicZone(Tile tile)
Get the tropic zone.
void SetAnimationFrame(Tile t, uint8_t frame)
Set a new animation frame.
Slope GetTileSlope(TileIndex tile)
Return the slope of a given tile inside the map.
StrongType::Typedef< uint32_t, struct TileIndexTag, StrongType::Compare, StrongType::Integer, StrongType::Compatible< int32_t >, StrongType::Compatible< int64_t > > TileIndex
The index/ID of a Tile.
constexpr TileIndex INVALID_TILE
The very nice invalid tile marker.
static constexpr uint TILE_SIZE
Tile size in world coordinates.
static constexpr uint TILE_HEIGHT
Height of a height level in world coordinate AND in pixels in ZOOM_BASE.
@ Station
A tile of a station or airport.
@ Industry
Part of an industry.
@ Trees
Tile with one or more trees.
@ House
A house by a town.
@ Road
A tile with road and/or tram tracks.
OrthogonalTileArea TileArea
Shorthand for the much more common orthogonal tile area.
Functions related to tile highlights.
void ResetObjectToPlace()
Reset the cursor and mouse mode handling back to default (normal cursor, only clicking in windows).
Definition of Interval and OneShot timers.
Definition of the game-calendar-timer.
Definition of the game-economy-timer.
Definition of the tick-based game-timer.
Town * ClosestTownFromTile(TileIndex tile, uint threshold)
Return the town closest (in distance or ownership) to a given tile, within a given threshold.
Town * CalcClosestTownFromTile(TileIndex tile, uint threshold=UINT_MAX)
Return the town closest to the given tile within threshold.
HouseZone GetTownRadiusGroup(const Town *t, TileIndex tile)
Returns the bit corresponding to the town zone of the specified tile.
CommandCost CheckIfAuthorityAllowsNewStation(TileIndex tile, DoCommandFlags flags)
Checks whether the local authority allows construction of a new station (rail, road,...
TrackdirBits TrackBitsToTrackdirBits(TrackBits bits)
Converts TrackBits to TrackdirBits while allowing both directions.
bool IsReversingRoadTrackdir(Trackdir dir)
Checks whether the trackdir means that we are reversing.
Trackdir ReverseTrackdir(Trackdir trackdir)
Maps a trackdir to the reverse trackdir.
Track AxisToTrack(Axis a)
Convert an Axis to the corresponding Track Axis::X -> Track::X Axis::Y -> Track::Y Uses the fact that...
DiagDirection TrackdirToExitdir(Trackdir trackdir)
Maps a trackdir to the (4-way) direction the tile is exited when following that trackdir.
Track DiagDirToDiagTrack(DiagDirection diagdir)
Maps a DiagDirection to the associated diagonal Track.
static constexpr TrackBits TRACK_BIT_3WAY_NE
"Arrow" to the north-east
EnumBitSet< Track, uint8_t > TrackBits
Bitset of Track elements.
static constexpr TrackBits TRACK_BIT_ALL
All possible tracks.
Trackdir
Enumeration for tracks and directions.
Track
These are used to specify a single track.
@ Upper
Track in the upper corner of the tile (north).
@ Y
Track along the y-axis (north-west to south-east).
@ Left
Track in the left corner of the tile (west).
Base for the train class.
bool TryPathReserve(Train *v, bool mark_as_stuck=false, bool first_tile_okay=false)
Try to reserve a path to a safe position.
int GetTrainStopLocation(StationID station_id, TileIndex tile, const Train *moving_front, int *station_ahead, int *station_length)
Get the stop location of (the center) of the front vehicle of a train at a platform of a station.
void FreeTrainTrackReservation(const Train *v)
Free the reserved path in front of a vehicle.
@ Buildings
company buildings - depots, stations, HQ, ...
TransportType
Available types of transport.
@ Water
Transport over water.
@ Rail
Transport by train.
@ Road
Transport by road vehicle.
Functions that have tunnels and bridges in common.
CommandCost EnsureNoVehicleOnGround(TileIndex tile)
Ensure there is no vehicle at the ground at the given position.
@ TrainSlowing
Train is slowing down.
Functions related to vehicles.
@ Invalid
Non-existing type of vehicle.
@ Aircraft
Aircraft vehicle type.
@ Train
Train vehicle type.
Functions and type for generating vehicle lists.
void FindVehiclesWithOrder(VehiclePredicate veh_pred, OrderPredicate ord_pred, VehicleFunc veh_func)
Find vehicles matching an order.
void OffsetGroundSprite(int x, int y)
Called when a foundation has been drawn for the current tile.
void SetViewportStationRect(const Station *st, bool sel)
Select or deselect station for rectangle area highlight.
void StartSpriteCombine()
Starts a block of sprites, which are "combined" into a single bounding box.
void AddSortableSpriteToDraw(SpriteID image, PaletteID pal, int x, int y, int z, const SpriteBounds &bounds, bool transparent, const SubSprite *sub)
Draw a (transparent) sprite at given coordinates with a given bounding box.
void EndSpriteCombine()
Terminates a block of sprites started by StartSpriteCombine.
void DrawGroundSprite(SpriteID image, PaletteID pal, const SubSprite *sub, int extra_offs_x, int extra_offs_y)
Draws a ground sprite for the current tile.
Functions related to (drawing on) viewports.
static const int TILE_HEIGHT_STEP
One Z unit tile height difference is displayed as 50m.
Declarations for accessing the k-d tree of viewports.
Functions related to water management.
void TileLoop_Water(TileIndex tile)
Tile callback function signature for running periodic tile updates.
void CheckForDockingTile(TileIndex t)
Mark the supplied tile as a docking tile if it is suitable for docking.
bool IsPossibleDockingTile(Tile t)
Check whether it is feasible that the given tile could be a docking tile.
bool HasTileWaterGround(Tile t)
Checks whether the tile has water at the ground.
bool IsTileOnWater(Tile t)
Tests if the tile was built on water.
WaterClass
classes of water (for WaterTileType::Clear water tile type).
@ Invalid
Used for industry tiles on land (also for oilrig if newgrf says so).
bool HasTileWaterClass(Tile t)
Checks whether the tile has an waterclass associated.
WaterClass GetWaterClass(Tile t)
Get the water class at a tile.
bool IsDockingTile(Tile t)
Checks whether the tile is marked as a dockling tile.
void SetDockingTile(Tile t, bool b)
Set the docking tile state of a tile.
bool IsWater(Tile t)
Is it a plain water tile?
bool IsWaterTile(Tile t)
Is it a water tile with plain water?
@ WPF_ROAD
This is a road waypoint.
CommandCost RemoveBuoy(TileIndex tile, DoCommandFlags flags)
Remove a buoy.
Command definitions related to waypoints.
Functions related to waypoints.
void ShowWaypointWindow(const Waypoint *wp)
Show the window for the given waypoint.
void CloseWindowById(WindowClass cls, WindowNumber number, bool force, int data)
Close a window by its class and window number (if it is open).
void SetWindowClassesDirty(WindowClass cls)
Mark all windows of a particular class as dirty (in need of repainting).
void InvalidateWindowData(WindowClass cls, WindowNumber number, int data, bool gui_scope)
Mark window data of the window of a given class and specific window number as invalid (in need of re-...
void SetWindowWidgetDirty(WindowClass cls, WindowNumber number, WidgetID widget_index)
Mark a particular widget in a particular window as dirty (in need of repainting).
void SetWindowDirty(WindowClass cls, WindowNumber number)
Mark window as dirty (in need of repainting).
void InvalidateWindowClassesData(WindowClass cls, int data, bool gui_scope)
Mark window data of all windows of a given class as invalid (in need of re-computing) Note that by de...
Entry point for OpenTTD to YAPF's cache.
void YapfNotifyTrackLayoutChange(TileIndex tile, Track track)
Use this function to notify YAPF that track layout (or signal configuration) has change.
@ Station
station encountered (could be a target next time)