diff --git a/src/citymania/cm_highlight.cpp b/src/citymania/cm_highlight.cpp index 4a2ee2bcf8..130306b4ef 100644 --- a/src/citymania/cm_highlight.cpp +++ b/src/citymania/cm_highlight.cpp @@ -2416,6 +2416,11 @@ void ResetActivePreview() { _ap.tiles = {}; } +const up &GetActivePreview() { + return _ap.preview; +} + + void UpdateActivePreview() { if (_ap.preview == nullptr) return; Point pt = GetTileBelowCursor(); diff --git a/src/citymania/cm_highlight.hpp b/src/citymania/cm_highlight.hpp index 1cf709c895..cbe31b3447 100644 --- a/src/citymania/cm_highlight.hpp +++ b/src/citymania/cm_highlight.hpp @@ -60,6 +60,8 @@ void ResetRotateAutodetection(); void ResetActivePreview(); void SetActivePreview(up &&preview); void UpdateActivePreview(); +const up &GetActivePreview(); + bool HandlePlacePushButton(Window *w, WidgetID widget, up preview); bool HandleMouseMove(); diff --git a/src/citymania/cm_station_gui.cpp b/src/citymania/cm_station_gui.cpp index 61ac04d633..ee870662b4 100644 --- a/src/citymania/cm_station_gui.cpp +++ b/src/citymania/cm_station_gui.cpp @@ -33,6 +33,8 @@ #include "cm_type.hpp" #include "generated/cm_gen_commands.hpp" +#include +#include #include #include @@ -619,7 +621,11 @@ CargoArray GetProductionAroundTiles(TileIndex tile, int w, int h, int rad) return produced; } -std::string GetStationCoverageProductionText(TileIndex tile, int w, int h, int rad, StationCoverageType sct) { +std::optional GetStationCoverageAreaText(TileIndex tile, int w, int h, int rad, StationCoverageType sct, bool supplies) { + auto sp = dynamic_cast(GetActivePreview().get()); + if (sp != nullptr) + return sp->GetStationCoverageAreaText(rad, sct, supplies); + if (!supplies) return std::nullopt; auto production = citymania::GetProductionAroundTiles(tile, w, h, rad); std::ostringstream s; @@ -909,7 +915,7 @@ up DockPreview::GetRemoveCommand() const { } bool DockPreview::Execute(up cmd, bool remove_mode) const { - cmd->post(&CcBuildDocks); + return cmd->post(&CcBuildDocks); } void DockPreview::AddPreviewTiles(HighlightMap &hlmap, SpriteID palette) const { @@ -1028,6 +1034,32 @@ void StationPreviewBase::HandleMouseRelease() { } } +std::optional StationPreviewBase::GetStationCoverageAreaText(int rad, StationCoverageType sct, bool supplies) { + auto params = this->type->GetOverlayParams(); + if (params.area.tile == INVALID_TILE) return std::nullopt; + + CargoArray cargoes; + if (supplies) { + cargoes = ::GetProductionAroundTiles(params.area.tile, params.area.w, params.area.h, params.radius); + } else { + cargoes = ::GetAcceptanceAroundTiles(params.area.tile, params.area.w, params.area.h, params.radius); + } + + CargoTypes cargo_mask = 0; + /* Convert cargo counts to a set of cargo bits, and draw the result. */ + for (CargoID i = 0; i < NUM_CARGO; i++) { + switch (sct) { + case SCT_PASSENGERS_ONLY: if (!IsCargoInClass(i, CC_PASSENGERS)) continue; break; + case SCT_NON_PASSENGERS_ONLY: if (IsCargoInClass(i, CC_PASSENGERS)) continue; break; + case SCT_ALL: break; + default: NOT_REACHED(); + } + if (cargoes[i] >= (supplies ? 1U : 8U)) SetBit(cargo_mask, i); + } + SetDParam(0, cargo_mask); + return GetString(supplies ? STR_STATION_BUILD_SUPPLIES_CARGO : STR_STATION_BUILD_ACCEPTS_CARGO); +} + std::vector> StationPreviewBase::GetOverlayData() { if (this->remove_mode) return {}; diff --git a/src/citymania/cm_station_gui.hpp b/src/citymania/cm_station_gui.hpp index 2a7adbce78..05f80d8992 100644 --- a/src/citymania/cm_station_gui.hpp +++ b/src/citymania/cm_station_gui.hpp @@ -51,7 +51,7 @@ void MarkCoverageHighlightDirty(); bool CheckRedrawStationCoverage(); void AbortStationPlacement(); -std::string GetStationCoverageProductionText(TileIndex tile, int w, int h, int rad, StationCoverageType sct); +std::optional GetStationCoverageAreaText(TileIndex tile, int w, int h, int rad, StationCoverageType sct, bool supplies); bool CheckDriveThroughRoadStopDirection(TileArea area, RoadBits r); DiagDirection AutodetectRoadObjectDirection(TileIndex tile, Point pt, RoadType roadtype); @@ -160,6 +160,7 @@ public: void Update(Point pt, TileIndex tile) override; bool HandleMousePress() override; void HandleMouseRelease() override; + std::optional GetStationCoverageAreaText(int rad, StationCoverageType sct, bool supplies); std::vector> GetOverlayData(); }; diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 0f291deee0..7a936b7c7f 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -681,11 +681,13 @@ struct BuildRailToolbarWindow : Window { if (!was_open || dragdrop != _settings_client.gui.station_dragdrop) { _settings_client.gui.station_dragdrop = dragdrop; if (citymania::HandleStationPlacePushButton(this, WID_RAT_BUILD_STATION, std::make_shared())) + // if (HandlePlacePushButton(this, WID_RAT_BUILD_STATION, SPR_CURSOR_BRIDGE, HT_RECT, DDSP_BUILD_STATION)) ShowStationBuilder(this); } this->last_user_action = WID_RAT_BUILD_STATION; } else { /* button */ if (citymania::HandleStationPlacePushButton(this, WID_RAT_BUILD_STATION, std::make_shared())) { + // if (HandlePlacePushButton(this, WID_RAT_BUILD_STATION, SPR_CURSOR_BRIDGE, HT_RECT, DDSP_BUILD_STATION)) { ShowStationBuilder(this); this->last_user_action = WID_RAT_BUILD_STATION; } diff --git a/src/station_gui.cpp b/src/station_gui.cpp index a30caa71f4..025638f153 100644 --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -58,15 +58,16 @@ int DrawStationCoverageAreaText(int left, int right, int top, StationCoverageType sct, int rad, bool supplies) { TileIndex tile = TileVirtXY(_thd.pos.x, _thd.pos.y); + + /* CityMania code begin */ + auto s = citymania::GetStationCoverageAreaText(tile, _thd.size.x / TILE_SIZE, _thd.size.y / TILE_SIZE, rad, sct, supplies); + if (s.has_value()) { + return DrawStringMultiLine(left, right, top, INT32_MAX, s.value()); + } + /* CityMania code end */ + CargoTypes cargo_mask = 0; if (_thd.drawstyle == HT_RECT && tile < Map::Size()) { - /* CityMania code begin */ - if (supplies) { - auto s = citymania::GetStationCoverageProductionText(tile, _thd.size.x / TILE_SIZE, _thd.size.y / TILE_SIZE, rad, sct); - return DrawStringMultiLine(left, right, top, INT32_MAX, s.c_str()); - } - /* CityMania code end */ - CargoArray cargoes; if (supplies) { cargoes = GetProductionAroundTiles(tile, _thd.size.x / TILE_SIZE, _thd.size.y / TILE_SIZE, rad);