Partially fix station cargo acceptance/supply (without update)

This commit is contained in:
dP
2025-06-19 16:00:31 +05:00
parent 48f0a806a3
commit 0b76fe1692
6 changed files with 53 additions and 10 deletions

View File

@@ -2416,6 +2416,11 @@ void ResetActivePreview() {
_ap.tiles = {}; _ap.tiles = {};
} }
const up<Preview> &GetActivePreview() {
return _ap.preview;
}
void UpdateActivePreview() { void UpdateActivePreview() {
if (_ap.preview == nullptr) return; if (_ap.preview == nullptr) return;
Point pt = GetTileBelowCursor(); Point pt = GetTileBelowCursor();

View File

@@ -60,6 +60,8 @@ void ResetRotateAutodetection();
void ResetActivePreview(); void ResetActivePreview();
void SetActivePreview(up<Preview> &&preview); void SetActivePreview(up<Preview> &&preview);
void UpdateActivePreview(); void UpdateActivePreview();
const up<Preview> &GetActivePreview();
bool HandlePlacePushButton(Window *w, WidgetID widget, up<Preview> preview); bool HandlePlacePushButton(Window *w, WidgetID widget, up<Preview> preview);
bool HandleMouseMove(); bool HandleMouseMove();

View File

@@ -33,6 +33,8 @@
#include "cm_type.hpp" #include "cm_type.hpp"
#include "generated/cm_gen_commands.hpp" #include "generated/cm_gen_commands.hpp"
#include <cstdio>
#include <optional>
#include <sstream> #include <sstream>
#include <unordered_set> #include <unordered_set>
@@ -619,7 +621,11 @@ CargoArray GetProductionAroundTiles(TileIndex tile, int w, int h, int rad)
return produced; return produced;
} }
std::string GetStationCoverageProductionText(TileIndex tile, int w, int h, int rad, StationCoverageType sct) { std::optional<std::string> GetStationCoverageAreaText(TileIndex tile, int w, int h, int rad, StationCoverageType sct, bool supplies) {
auto sp = dynamic_cast<StationPreviewBase *>(GetActivePreview().get());
if (sp != nullptr)
return sp->GetStationCoverageAreaText(rad, sct, supplies);
if (!supplies) return std::nullopt;
auto production = citymania::GetProductionAroundTiles(tile, w, h, rad); auto production = citymania::GetProductionAroundTiles(tile, w, h, rad);
std::ostringstream s; std::ostringstream s;
@@ -909,7 +915,7 @@ up<Command> DockPreview::GetRemoveCommand() const {
} }
bool DockPreview::Execute(up<Command> cmd, bool remove_mode) const { bool DockPreview::Execute(up<Command> cmd, bool remove_mode) const {
cmd->post(&CcBuildDocks); return cmd->post(&CcBuildDocks);
} }
void DockPreview::AddPreviewTiles(HighlightMap &hlmap, SpriteID palette) const { void DockPreview::AddPreviewTiles(HighlightMap &hlmap, SpriteID palette) const {
@@ -1028,6 +1034,32 @@ void StationPreviewBase::HandleMouseRelease() {
} }
} }
std::optional<std::string> 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<std::pair<SpriteID, std::string>> StationPreviewBase::GetOverlayData() { std::vector<std::pair<SpriteID, std::string>> StationPreviewBase::GetOverlayData() {
if (this->remove_mode) return {}; if (this->remove_mode) return {};

View File

@@ -51,7 +51,7 @@ void MarkCoverageHighlightDirty();
bool CheckRedrawStationCoverage(); bool CheckRedrawStationCoverage();
void AbortStationPlacement(); void AbortStationPlacement();
std::string GetStationCoverageProductionText(TileIndex tile, int w, int h, int rad, StationCoverageType sct); std::optional<std::string> GetStationCoverageAreaText(TileIndex tile, int w, int h, int rad, StationCoverageType sct, bool supplies);
bool CheckDriveThroughRoadStopDirection(TileArea area, RoadBits r); bool CheckDriveThroughRoadStopDirection(TileArea area, RoadBits r);
DiagDirection AutodetectRoadObjectDirection(TileIndex tile, Point pt, RoadType roadtype); DiagDirection AutodetectRoadObjectDirection(TileIndex tile, Point pt, RoadType roadtype);
@@ -160,6 +160,7 @@ public:
void Update(Point pt, TileIndex tile) override; void Update(Point pt, TileIndex tile) override;
bool HandleMousePress() override; bool HandleMousePress() override;
void HandleMouseRelease() override; void HandleMouseRelease() override;
std::optional<std::string> GetStationCoverageAreaText(int rad, StationCoverageType sct, bool supplies);
std::vector<std::pair<SpriteID, std::string>> GetOverlayData(); std::vector<std::pair<SpriteID, std::string>> GetOverlayData();
}; };

View File

@@ -681,11 +681,13 @@ struct BuildRailToolbarWindow : Window {
if (!was_open || dragdrop != _settings_client.gui.station_dragdrop) { if (!was_open || dragdrop != _settings_client.gui.station_dragdrop) {
_settings_client.gui.station_dragdrop = dragdrop; _settings_client.gui.station_dragdrop = dragdrop;
if (citymania::HandleStationPlacePushButton(this, WID_RAT_BUILD_STATION, std::make_shared<citymania::RailStationPreview>())) if (citymania::HandleStationPlacePushButton(this, WID_RAT_BUILD_STATION, std::make_shared<citymania::RailStationPreview>()))
// if (HandlePlacePushButton(this, WID_RAT_BUILD_STATION, SPR_CURSOR_BRIDGE, HT_RECT, DDSP_BUILD_STATION))
ShowStationBuilder(this); ShowStationBuilder(this);
} }
this->last_user_action = WID_RAT_BUILD_STATION; this->last_user_action = WID_RAT_BUILD_STATION;
} else { /* button */ } else { /* button */
if (citymania::HandleStationPlacePushButton(this, WID_RAT_BUILD_STATION, std::make_shared<citymania::RailStationPreview>())) { if (citymania::HandleStationPlacePushButton(this, WID_RAT_BUILD_STATION, std::make_shared<citymania::RailStationPreview>())) {
// if (HandlePlacePushButton(this, WID_RAT_BUILD_STATION, SPR_CURSOR_BRIDGE, HT_RECT, DDSP_BUILD_STATION)) {
ShowStationBuilder(this); ShowStationBuilder(this);
this->last_user_action = WID_RAT_BUILD_STATION; this->last_user_action = WID_RAT_BUILD_STATION;
} }

View File

@@ -58,15 +58,16 @@
int DrawStationCoverageAreaText(int left, int right, int top, StationCoverageType sct, int rad, bool supplies) int DrawStationCoverageAreaText(int left, int right, int top, StationCoverageType sct, int rad, bool supplies)
{ {
TileIndex tile = TileVirtXY(_thd.pos.x, _thd.pos.y); 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; CargoTypes cargo_mask = 0;
if (_thd.drawstyle == HT_RECT && tile < Map::Size()) { 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; CargoArray cargoes;
if (supplies) { if (supplies) {
cargoes = GetProductionAroundTiles(tile, _thd.size.x / TILE_SIZE, _thd.size.y / TILE_SIZE, rad); cargoes = GetProductionAroundTiles(tile, _thd.size.x / TILE_SIZE, _thd.size.y / TILE_SIZE, rad);