From 882f06bf14416960ee15538c9d91fcd4eaa2e22f Mon Sep 17 00:00:00 2001 From: PeterN Date: Mon, 8 May 2023 19:09:33 +0100 Subject: [PATCH] Fix: Support more than 256 stations/waypoints/roadstops per class. (#10793) It was already possible to define more than 256 per class, but not possible to use them as the index used in GUI and passed through commands was limited to a byte. --- src/rail_gui.cpp | 18 +++++++++--------- src/road_cmd.h | 2 +- src/road_gui.cpp | 12 ++++++------ src/station_cmd.cpp | 8 ++++---- src/station_cmd.h | 4 ++-- src/waypoint_cmd.cpp | 2 +- src/waypoint_cmd.h | 2 +- 7 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 54e7443825..45e672ca0b 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -53,8 +53,8 @@ static RailType _cur_railtype; ///< Rail type of the current build-rail toolbar. static bool _remove_button_clicked; ///< Flag whether 'remove' toggle-button is currently enabled static DiagDirection _build_depot_direction; ///< Currently selected depot direction -static byte _waypoint_count = 1; ///< Number of waypoint types -static byte _cur_waypoint_type; ///< Currently selected waypoint type +static uint16_t _waypoint_count = 1; ///< Number of waypoint types +static uint16_t _cur_waypoint_type; ///< Currently selected waypoint type static bool _convert_signal_button; ///< convert signal button in the signal GUI pressed static SignalVariant _cur_signal_variant; ///< set the signal variant (for signal GUI) static SignalType _cur_signal_type; ///< set the signal type (for signal GUI) @@ -64,8 +64,8 @@ struct RailStationGUISettings { bool newstations; ///< Are custom station definitions available? StationClassID station_class; ///< Currently selected custom station class (if newstations is \c true ) - byte station_type; ///< %Station type within the currently selected custom station class (if newstations is \c true ) - byte station_count; ///< Number of custom stations (if newstations is \c true ) + uint16_t station_type; ///< %Station type within the currently selected custom station class (if newstations is \c true ) + uint16_t station_count; ///< Number of custom stations (if newstations is \c true ) }; static RailStationGUISettings _railstation; ///< Settings of the station builder GUI @@ -711,7 +711,7 @@ struct BuildRailToolbarWindow : Window { TileArea ta(start_tile, end_tile); Axis axis = select_method == VPM_X_LIMITED ? AXIS_X : AXIS_Y; bool adjacent = _ctrl_pressed; - byte waypoint_type = _cur_waypoint_type; + uint16_t waypoint_type = _cur_waypoint_type; auto proc = [=](bool test, StationID to_join) -> bool { if (test) { @@ -1290,7 +1290,7 @@ public: } case WID_BRAS_IMAGE: { - byte type = GB(widget, 16, 16); + uint16_t type = GB(widget, 16, 16); assert(type < _railstation.station_count); /* Check station availability callback */ const StationSpec *statspec = StationClass::Get(_railstation.station_class)->GetSpec(type); @@ -1478,7 +1478,7 @@ public: } case WID_BRAS_IMAGE: { - int y = GB(widget, 16, 16); + uint16_t y = GB(widget, 16, 16); if (y >= _railstation.station_count) return; /* Check station availability callback */ @@ -2041,7 +2041,7 @@ struct BuildRailWaypointWindow : PickerWindowBase { { switch (GB(widget, 0, 16)) { case WID_BRW_WAYPOINT: { - byte type = GB(widget, 16, 16); + uint16_t type = GB(widget, 16, 16); const StationSpec *statspec = StationClass::Get(STAT_CLASS_WAYP)->GetSpec(type); DrawPixelInfo tmp_dpi; @@ -2063,7 +2063,7 @@ struct BuildRailWaypointWindow : PickerWindowBase { { switch (GB(widget, 0, 16)) { case WID_BRW_WAYPOINT: { - byte type = GB(widget, 16, 16); + uint16_t type = GB(widget, 16, 16); this->GetWidget(WID_BRW_WAYPOINT_MATRIX)->SetClicked(_cur_waypoint_type); /* Check station availability callback */ diff --git a/src/road_cmd.h b/src/road_cmd.h index fbe05ef33d..ef3d8f364b 100644 --- a/src/road_cmd.h +++ b/src/road_cmd.h @@ -34,6 +34,6 @@ DEF_CMD_TRAIT(CMD_CONVERT_ROAD, CmdConvertRoad, 0, CommandCallback CcPlaySound_CONSTRUCTION_OTHER; CommandCallback CcBuildRoadTunnel; void CcRoadDepot(Commands cmd, const CommandCost &result, TileIndex tile, RoadType rt, DiagDirection dir); -void CcRoadStop(Commands cmd, const CommandCost &result, TileIndex tile, uint8 width, uint8 length, RoadStopType, bool is_drive_through, DiagDirection dir, RoadType, RoadStopClassID spec_class, byte spec_index, StationID, bool); +void CcRoadStop(Commands cmd, const CommandCost &result, TileIndex tile, uint8 width, uint8 length, RoadStopType, bool is_drive_through, DiagDirection dir, RoadType, RoadStopClassID spec_class, uint16_t spec_index, StationID, bool); #endif /* ROAD_CMD_H */ diff --git a/src/road_gui.cpp b/src/road_gui.cpp index 4731f2e606..a6147f7451 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -66,8 +66,8 @@ struct RoadStopGUISettings { DiagDirection orientation; RoadStopClassID roadstop_class; - byte roadstop_type; - byte roadstop_count; + uint16_t roadstop_type; + uint16_t roadstop_count; }; static RoadStopGUISettings _roadstop_gui_settings; @@ -181,7 +181,7 @@ void CcRoadDepot(Commands cmd, const CommandCost &result, TileIndex tile, RoadTy * @see CmdBuildRoadStop */ void CcRoadStop(Commands cmd, const CommandCost &result, TileIndex tile, uint8 width, uint8 length, RoadStopType, bool is_drive_through, - DiagDirection dir, RoadType, RoadStopClassID spec_class, byte spec_index, StationID, bool) + DiagDirection dir, RoadType, RoadStopClassID spec_class, uint16_t spec_index, StationID, bool) { if (result.Failed()) return; @@ -221,7 +221,7 @@ static void PlaceRoadStop(TileIndex start_tile, TileIndex end_tile, RoadStopType bool drive_through = ddir >= DIAGDIR_END; if (drive_through) ddir = static_cast(ddir - DIAGDIR_END); // Adjust picker result to actual direction. RoadStopClassID spec_class = _roadstop_gui_settings.roadstop_class; - byte spec_index = _roadstop_gui_settings.roadstop_type; + uint16_t spec_index = _roadstop_gui_settings.roadstop_type; auto proc = [=](bool test, StationID to_join) -> bool { if (test) { @@ -1459,7 +1459,7 @@ public: } case WID_BROS_IMAGE: { - byte type = GB(widget, 16, 16); + uint16_t type = GB(widget, 16, 16); assert(type < _roadstop_gui_settings.roadstop_count); const RoadStopSpec *spec = RoadStopClass::Get(_roadstop_gui_settings.roadstop_class)->GetSpec(type); @@ -1555,7 +1555,7 @@ public: } case WID_BROS_IMAGE: { - int y = GB(widget, 16, 16); + uint16_t y = GB(widget, 16, 16); if (y >= _roadstop_gui_settings.roadstop_count) return; const RoadStopSpec *spec = RoadStopClass::Get(_roadstop_gui_settings.roadstop_class)->GetSpec(y); diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 0ca841e26c..5d92b3c963 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -877,7 +877,7 @@ static CommandCost CheckFlatLandAirport(AirportTileTableIterator tile_iter, DoCo * @param numtracks Number of platforms. * @return The cost in case of success, or an error code if it failed. */ -static CommandCost CheckFlatLandRailStation(TileArea tile_area, DoCommandFlag flags, Axis axis, StationID *station, RailType rt, std::vector &affected_vehicles, StationClassID spec_class, byte spec_index, byte plat_len, byte numtracks) +static CommandCost CheckFlatLandRailStation(TileArea tile_area, DoCommandFlag flags, Axis axis, StationID *station, RailType rt, std::vector &affected_vehicles, StationClassID spec_class, uint16_t spec_index, byte plat_len, byte numtracks) { CommandCost cost(EXPENSES_CONSTRUCTION); int allowed_z = -1; @@ -1261,7 +1261,7 @@ static void RestoreTrainReservation(Train *v) * @param numtracks Number of platforms. * @return The cost in case of success, or an error code if it failed. */ -static CommandCost CalculateRailStationCost(TileArea tile_area, DoCommandFlag flags, Axis axis, StationID *station, RailType rt, std::vector &affected_vehicles, StationClassID spec_class, byte spec_index, byte plat_len, byte numtracks) +static CommandCost CalculateRailStationCost(TileArea tile_area, DoCommandFlag flags, Axis axis, StationID *station, RailType rt, std::vector &affected_vehicles, StationClassID spec_class, uint16_t spec_index, byte plat_len, byte numtracks) { CommandCost cost(EXPENSES_CONSTRUCTION); bool length_price_ready = true; @@ -1310,7 +1310,7 @@ static CommandCost CalculateRailStationCost(TileArea tile_area, DoCommandFlag fl * @param adjacent allow stations directly adjacent to other stations. * @return the cost of this operation or an error */ -CommandCost CmdBuildRailStation(DoCommandFlag flags, TileIndex tile_org, RailType rt, Axis axis, byte numtracks, byte plat_len, StationClassID spec_class, byte spec_index, StationID station_to_join, bool adjacent) +CommandCost CmdBuildRailStation(DoCommandFlag flags, TileIndex tile_org, RailType rt, Axis axis, byte numtracks, byte plat_len, StationClassID spec_class, uint16_t spec_index, StationID station_to_join, bool adjacent) { /* Does the authority allow this? */ CommandCost ret = CheckIfAuthorityAllowsNewStation(tile_org, flags); @@ -1917,7 +1917,7 @@ static CommandCost CalculateRoadStopCost(TileArea tile_area, DoCommandFlag flags * @return The cost of this operation or an error. */ CommandCost CmdBuildRoadStop(DoCommandFlag flags, TileIndex tile, uint8 width, uint8 length, RoadStopType stop_type, bool is_drive_through, - DiagDirection ddir, RoadType rt, RoadStopClassID spec_class, byte spec_index, StationID station_to_join, bool adjacent) + DiagDirection ddir, RoadType rt, RoadStopClassID spec_class, uint16_t spec_index, StationID station_to_join, bool adjacent) { if (!ValParamRoadType(rt) || !IsValidDiagDirection(ddir) || stop_type >= ROADSTOP_END) return CMD_ERROR; bool reuse = (station_to_join != NEW_STATION); diff --git a/src/station_cmd.h b/src/station_cmd.h index 50a08bbd24..9eb4277301 100644 --- a/src/station_cmd.h +++ b/src/station_cmd.h @@ -21,9 +21,9 @@ extern uint8 GetAirportNoiseLevelForDistance(const struct AirportSpec *as, uint CommandCost CmdBuildAirport(DoCommandFlag flags, TileIndex tile, byte airport_type, byte layout, StationID station_to_join, bool allow_adjacent); CommandCost CmdBuildDock(DoCommandFlag flags, TileIndex tile, StationID station_to_join, bool adjacent); -CommandCost CmdBuildRailStation(DoCommandFlag flags, TileIndex tile_org, RailType rt, Axis axis, byte numtracks, byte plat_len, StationClassID spec_class, byte spec_index, StationID station_to_join, bool adjacent); +CommandCost CmdBuildRailStation(DoCommandFlag flags, TileIndex tile_org, RailType rt, Axis axis, byte numtracks, byte plat_len, StationClassID spec_class, uint16_t spec_index, StationID station_to_join, bool adjacent); CommandCost CmdRemoveFromRailStation(DoCommandFlag flags, TileIndex start, TileIndex end, bool keep_rail); -CommandCost CmdBuildRoadStop(DoCommandFlag flags, TileIndex tile, uint8 width, uint8 length, RoadStopType stop_type, bool is_drive_through, DiagDirection ddir, RoadType rt, RoadStopClassID spec_class, byte spec_index, StationID station_to_join, bool adjacent); +CommandCost CmdBuildRoadStop(DoCommandFlag flags, TileIndex tile, uint8 width, uint8 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); CommandCost CmdRemoveRoadStop(DoCommandFlag flags, TileIndex tile, uint8 width, uint8 height, RoadStopType stop_type, bool remove_road); CommandCost CmdRenameStation(DoCommandFlag flags, StationID station_id, const std::string &text); CommandCost CmdOpenCloseAirport(DoCommandFlag flags, StationID station_id); diff --git a/src/waypoint_cmd.cpp b/src/waypoint_cmd.cpp index 35bcf978d8..e6e7291cb7 100644 --- a/src/waypoint_cmd.cpp +++ b/src/waypoint_cmd.cpp @@ -172,7 +172,7 @@ extern CommandCost CanExpandRailStation(const BaseStation *st, TileArea &new_ta, * @param adjacent allow waypoints directly adjacent to other waypoints. * @return the cost of this operation or an error */ -CommandCost CmdBuildRailWaypoint(DoCommandFlag flags, TileIndex start_tile, Axis axis, byte width, byte height, StationClassID spec_class, byte spec_index, StationID station_to_join, bool adjacent) +CommandCost CmdBuildRailWaypoint(DoCommandFlag flags, TileIndex start_tile, Axis axis, byte width, byte height, StationClassID spec_class, uint16_t spec_index, StationID station_to_join, bool adjacent) { if (!IsValidAxis(axis)) return CMD_ERROR; /* Check if the given station class is valid */ diff --git a/src/waypoint_cmd.h b/src/waypoint_cmd.h index 29855be2c8..213bd8d6c6 100644 --- a/src/waypoint_cmd.h +++ b/src/waypoint_cmd.h @@ -15,7 +15,7 @@ enum StationClassID : byte; -CommandCost CmdBuildRailWaypoint(DoCommandFlag flags, TileIndex start_tile, Axis axis, byte width, byte height, StationClassID spec_class, byte spec_index, StationID station_to_join, bool adjacent); +CommandCost CmdBuildRailWaypoint(DoCommandFlag flags, TileIndex start_tile, Axis axis, byte width, byte height, StationClassID spec_class, uint16_t spec_index, StationID station_to_join, bool adjacent); CommandCost CmdRemoveFromRailWaypoint(DoCommandFlag flags, TileIndex start, TileIndex end, bool keep_rail); CommandCost CmdBuildBuoy(DoCommandFlag flags, TileIndex tile); CommandCost CmdRenameWaypoint(DoCommandFlag flags, StationID waypoint_id, const std::string &text);