From 8626090b2463ae65db3975ef07f48c100ed7934a Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 4 May 2021 12:35:27 +0100 Subject: [PATCH 01/36] Codechange: Draw station acceptance text in its own widget. --- src/airport_gui.cpp | 22 ++++++++++------------ src/dock_gui.cpp | 17 ++++++++--------- src/rail_gui.cpp | 17 +++++++---------- src/road_gui.cpp | 24 +++++++++--------------- src/widgets/airport_widget.h | 1 + src/widgets/road_widget.h | 3 ++- 6 files changed, 37 insertions(+), 47 deletions(-) diff --git a/src/airport_gui.cpp b/src/airport_gui.cpp index 6700cd3bd0..2e146f440d 100644 --- a/src/airport_gui.cpp +++ b/src/airport_gui.cpp @@ -29,6 +29,7 @@ #include "command_func.h" #include "airport_cmd.h" #include "station_cmd.h" +#include "zoom_func.h" #include "widgets/airport_widget.h" @@ -423,11 +424,8 @@ public: { this->DrawWidgets(); - uint16 top = this->GetWidget(WID_AP_BTN_DOHILIGHT)->pos_y + this->GetWidget(WID_AP_BTN_DOHILIGHT)->current_y + WD_PAR_VSEP_NORMAL; - NWidgetBase *panel_nwi = this->GetWidget(WID_AP_BOTTOMPANEL); - - int right = panel_nwi->pos_x + panel_nwi->current_x; - int bottom = panel_nwi->pos_y + panel_nwi->current_y; + Rect r = this->GetWidget(WID_AP_ACCEPTANCE)->GetCurrentRect(); + int top = r.top + ScaleGUITrad(WD_PAR_VSEP_NORMAL); if (_selected_airport_index != -1) { const AirportSpec *as = AirportClass::Get(_selected_airport_class)->GetSpec(_selected_airport_index); @@ -437,20 +435,20 @@ public: if (_settings_game.economy.station_noise_level) { /* show the noise of the selected airport */ SetDParam(0, as->noise_level); - DrawString(panel_nwi->pos_x + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, STR_STATION_BUILD_NOISE); - top += FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL; + DrawString(r.left, r.right, top, STR_STATION_BUILD_NOISE); + top += FONT_HEIGHT_NORMAL + ScaleGUITrad(WD_PAR_VSEP_NORMAL); } /* strings such as 'Size' and 'Coverage Area' */ - top = DrawStationCoverageAreaText(panel_nwi->pos_x + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, SCT_ALL, rad, false) + WD_PAR_VSEP_NORMAL; - top = DrawStationCoverageAreaText(panel_nwi->pos_x + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, SCT_ALL, rad, true) + WD_PAR_VSEP_NORMAL; + top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, false) + ScaleGUITrad(WD_PAR_VSEP_NORMAL); + top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, true) + ScaleGUITrad(WD_PAR_VSEP_NORMAL); } /* Resize background if the window is too small. * Never make the window smaller to avoid oscillating if the size change affects the acceptance. * (This is the case, if making the window bigger moves the mouse into the window.) */ - if (top > bottom) { - ResizeWindow(this, 0, top - bottom, false); + if (top > r.bottom) { + ResizeWindow(this, 0, top - r.bottom, false); } } @@ -608,7 +606,7 @@ static const NWidgetPart _nested_build_airport_widgets[] = { EndContainer(), NWidget(NWID_SPACER), SetMinimalSize(14, 0), SetFill(1, 0), EndContainer(), - NWidget(NWID_SPACER), SetMinimalSize(0, 10), SetResize(0, 1), SetFill(1, 0), + NWidget(WWT_EMPTY, COLOUR_DARK_GREEN, WID_AP_ACCEPTANCE), SetPadding(0, WD_FRAMERECT_RIGHT, 0, WD_FRAMERECT_LEFT), SetResize(0, 1), SetFill(1, 0), EndContainer(), }; diff --git a/src/dock_gui.cpp b/src/dock_gui.cpp index 2ec10fe8ce..d86e3ad068 100644 --- a/src/dock_gui.cpp +++ b/src/dock_gui.cpp @@ -416,6 +416,7 @@ enum BuildDockStationWidgets { BDSW_LT_OFF, ///< 'Off' button of coverage high light. BDSW_LT_ON, ///< 'On' button of coverage high light. BDSW_INFO, ///< 'Coverage highlight' label. + BDSW_ACCEPTANCE, ///< Acceptance info. }; struct BuildDocksStationWindow : public PickerWindowBase { @@ -445,17 +446,15 @@ public: } /* strings such as 'Size' and 'Coverage Area' */ - int top = this->GetWidget(BDSW_LT_OFF)->pos_y + this->GetWidget(BDSW_LT_OFF)->current_y + WD_PAR_VSEP_NORMAL; - NWidgetBase *back_nwi = this->GetWidget(BDSW_BACKGROUND); - int right = back_nwi->pos_x + back_nwi->current_x; - int bottom = back_nwi->pos_y + back_nwi->current_y; - top = DrawStationCoverageAreaText(back_nwi->pos_x + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, SCT_ALL, rad, false) + WD_PAR_VSEP_NORMAL; - top = DrawStationCoverageAreaText(back_nwi->pos_x + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, SCT_ALL, rad, true) + WD_PAR_VSEP_NORMAL; + Rect r = this->GetWidget(BDSW_ACCEPTANCE)->GetCurrentRect(); + int top = r.top + ScaleGUITrad(WD_PAR_VSEP_NORMAL); + top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, false) + ScaleGUITrad(WD_PAR_VSEP_NORMAL); + top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, true) + ScaleGUITrad(WD_PAR_VSEP_NORMAL); /* Resize background if the window is too small. * Never make the window smaller to avoid oscillating if the size change affects the acceptance. * (This is the case, if making the window bigger moves the mouse into the window.) */ - if (top > bottom) { - ResizeWindow(this, 0, top - bottom, false); + if (top > r.bottom) { + ResizeWindow(this, 0, top - r.bottom, false); } } @@ -493,7 +492,7 @@ static const NWidgetPart _nested_build_dock_station_widgets[] = { NWidget(WWT_TEXTBTN, COLOUR_GREY, BDSW_LT_OFF), SetMinimalSize(40, 12), SetFill(1, 0), SetDataTip(STR_STATION_BUILD_COVERAGE_OFF, STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP), NWidget(WWT_TEXTBTN, COLOUR_GREY, BDSW_LT_ON), SetMinimalSize(40, 12), SetFill(1, 0), SetDataTip(STR_STATION_BUILD_COVERAGE_ON, STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP), EndContainer(), - NWidget(NWID_SPACER), SetMinimalSize(0, 20), SetResize(0, 1), + NWidget(WWT_EMPTY, COLOUR_GREY, BDSW_ACCEPTANCE), SetPadding(0, WD_FRAMERECT_RIGHT, 0, WD_FRAMERECT_LEFT), SetResize(0, 1), EndContainer(), }; diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 9a813407ba..b73e66da2b 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -1179,18 +1179,15 @@ public: if (this->IsShaded()) return; /* 'Accepts' and 'Supplies' texts. */ - NWidgetBase *cov = this->GetWidget(WID_BRAS_COVERAGE_TEXTS); - int top = cov->pos_y + WD_PAR_VSEP_NORMAL; - int left = cov->pos_x + WD_FRAMERECT_LEFT; - int right = cov->pos_x + cov->current_x - WD_FRAMERECT_RIGHT; - int bottom = cov->pos_y + cov->current_y; - top = DrawStationCoverageAreaText(left, right, top, SCT_ALL, rad, false) + WD_PAR_VSEP_NORMAL; - top = DrawStationCoverageAreaText(left, right, top, SCT_ALL, rad, true) + WD_PAR_VSEP_NORMAL; + Rect r = this->GetWidget(WID_BRAS_COVERAGE_TEXTS)->GetCurrentRect(); + int top = r.top + ScaleGUITrad(WD_PAR_VSEP_NORMAL); + top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, false) + ScaleGUITrad(WD_PAR_VSEP_NORMAL); + top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, true) + ScaleGUITrad(WD_PAR_VSEP_NORMAL); /* Resize background if the window is too small. * Never make the window smaller to avoid oscillating if the size change affects the acceptance. * (This is the case, if making the window bigger moves the mouse into the window.) */ - if (top > bottom) { - this->coverage_height += top - bottom; + if (top > r.bottom) { + this->coverage_height += top - r.bottom; this->ReInit(); } } @@ -1637,7 +1634,7 @@ static const NWidgetPart _nested_station_builder_widgets[] = { EndContainer(), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(WWT_EMPTY, INVALID_COLOUR, WID_BRAS_COVERAGE_TEXTS), SetPadding(2, 5, 0, 1), SetFill(1, 1), SetResize(1, 0), + NWidget(WWT_EMPTY, INVALID_COLOUR, WID_BRAS_COVERAGE_TEXTS), SetPadding(0, WD_FRAMERECT_RIGHT, 0, WD_FRAMERECT_LEFT), SetFill(1, 1), SetResize(1, 0), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_BRAS_SHOW_NEWST_RESIZE), NWidget(NWID_VERTICAL), NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetFill(0, 1), EndContainer(), diff --git a/src/road_gui.cpp b/src/road_gui.cpp index 80a8ed618c..e57d54b19b 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -1090,17 +1090,15 @@ struct BuildRoadStationWindow : public PickerWindowBase { /* 'Accepts' and 'Supplies' texts. */ StationCoverageType sct = (this->window_class == WC_BUS_STATION) ? SCT_PASSENGERS_ONLY : SCT_NON_PASSENGERS_ONLY; - int top = this->GetWidget(WID_BROS_LT_ON)->pos_y + this->GetWidget(WID_BROS_LT_ON)->current_y + WD_PAR_VSEP_NORMAL; - NWidgetBase *back_nwi = this->GetWidget(WID_BROS_BACKGROUND); - int right = back_nwi->pos_x + back_nwi->current_x; - int bottom = back_nwi->pos_y + back_nwi->current_y; - top = DrawStationCoverageAreaText(back_nwi->pos_x + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, sct, rad, false) + WD_PAR_VSEP_NORMAL; - top = DrawStationCoverageAreaText(back_nwi->pos_x + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, sct, rad, true) + WD_PAR_VSEP_NORMAL; + Rect r = this->GetWidget(WID_BROS_ACCEPTANCE)->GetCurrentRect(); + int top = r.top + ScaleGUITrad(WD_PAR_VSEP_NORMAL); + top = DrawStationCoverageAreaText(r.left, r.right, top, sct, rad, false) + ScaleGUITrad(WD_PAR_VSEP_NORMAL); + top = DrawStationCoverageAreaText(r.left, r.right, top, sct, rad, true) + ScaleGUITrad(WD_PAR_VSEP_NORMAL); /* Resize background if the window is too small. * Never make the window smaller to avoid oscillating if the size change affects the acceptance. * (This is the case, if making the window bigger moves the mouse into the window.) */ - if (top > bottom) { - ResizeWindow(this, 0, top - bottom, false); + if (top > r.bottom) { + ResizeWindow(this, 0, top - r.bottom, false); } } @@ -1194,7 +1192,7 @@ static const NWidgetPart _nested_road_station_picker_widgets[] = { SetDataTip(STR_STATION_BUILD_COVERAGE_ON, STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP), NWidget(NWID_SPACER), SetFill(1, 0), EndContainer(), - NWidget(NWID_SPACER), SetMinimalSize(0, 10), SetResize(0, 1), + NWidget(WWT_EMPTY, COLOUR_DARK_GREEN, WID_BROS_ACCEPTANCE), SetPadding(0, WD_FRAMERECT_RIGHT, 0, WD_FRAMERECT_LEFT), SetResize(0, 1), EndContainer(), }; @@ -1219,11 +1217,7 @@ static const NWidgetPart _nested_tram_station_picker_widgets[] = { NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_Y), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), NWidget(NWID_SPACER), SetFill(1, 0), EndContainer(), - NWidget(NWID_SPACER), SetMinimalSize(0, 1), - NWidget(NWID_HORIZONTAL), SetPIP(2, 0, 2), - NWidget(WWT_LABEL, COLOUR_DARK_GREEN, WID_BROS_INFO), SetMinimalSize(140, 14), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), - NWidget(NWID_SPACER), SetFill(1, 0), - EndContainer(), + NWidget(WWT_LABEL, COLOUR_DARK_GREEN, WID_BROS_INFO), SetPadding(WD_FRAMERECT_TOP, WD_FRAMERECT_RIGHT, WD_FRAMERECT_BOTTOM, WD_FRAMERECT_LEFT), SetMinimalSize(140, 14), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetFill(1, 0), NWidget(NWID_HORIZONTAL), SetPIP(2, 0, 2), NWidget(NWID_SPACER), SetFill(1, 0), NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BROS_LT_OFF), SetMinimalSize(60, 12), @@ -1232,7 +1226,7 @@ static const NWidgetPart _nested_tram_station_picker_widgets[] = { SetDataTip(STR_STATION_BUILD_COVERAGE_ON, STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP), NWidget(NWID_SPACER), SetFill(1, 0), EndContainer(), - NWidget(NWID_SPACER), SetMinimalSize(0, 10), SetResize(0, 1), + NWidget(WWT_EMPTY, COLOUR_DARK_GREEN, WID_BROS_ACCEPTANCE), SetPadding(0, WD_FRAMERECT_RIGHT, 0, WD_FRAMERECT_LEFT), SetResize(0, 1), EndContainer(), }; diff --git a/src/widgets/airport_widget.h b/src/widgets/airport_widget.h index da0770bcb9..75b805031c 100644 --- a/src/widgets/airport_widget.h +++ b/src/widgets/airport_widget.h @@ -30,6 +30,7 @@ enum AirportPickerWidgets { WID_AP_COVERAGE_LABEL, ///< Label if you want to see the coverage. WID_AP_BTN_DONTHILIGHT, ///< Don't show the coverage button. WID_AP_BTN_DOHILIGHT, ///< Show the coverage button. + WID_AP_ACCEPTANCE, ///< Acceptance info. }; #endif /* WIDGETS_AIRPORT_WIDGET_H */ diff --git a/src/widgets/road_widget.h b/src/widgets/road_widget.h index 3d49e9ae9d..425031e05b 100644 --- a/src/widgets/road_widget.h +++ b/src/widgets/road_widget.h @@ -51,7 +51,8 @@ enum BuildRoadStationWidgets { WID_BROS_STATION_Y, ///< Drive-through station in y-direction. WID_BROS_LT_OFF, ///< Turn off area highlight. WID_BROS_LT_ON, ///< Turn on area highlight. - WID_BROS_INFO, ///< Station acceptance info. + WID_BROS_INFO, ///< Station acceptance toggle. + WID_BROS_ACCEPTANCE, ///< Station acceptance. }; #endif /* WIDGETS_ROAD_WIDGET_H */ From af6c4d50ce32cbc38db7ed2cc13e076ae84d5636 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 26 Sep 2022 17:52:31 +0100 Subject: [PATCH 02/36] Change: Tidy up coverage area label widget layout. Label is now centered properly and uses standard spacing. --- src/airport_gui.cpp | 4 ++-- src/dock_gui.cpp | 9 ++++----- src/rail_gui.cpp | 2 +- src/road_gui.cpp | 6 +----- 4 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/airport_gui.cpp b/src/airport_gui.cpp index 2e146f440d..318844ac33 100644 --- a/src/airport_gui.cpp +++ b/src/airport_gui.cpp @@ -594,8 +594,8 @@ static const NWidgetPart _nested_build_airport_widgets[] = { NWidget(WWT_EMPTY, COLOUR_DARK_GREEN, WID_AP_EXTRA_TEXT), SetFill(1, 0), SetMinimalSize(150, 0), EndContainer(), /* Bottom panel. */ - NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_AP_BOTTOMPANEL), SetPIP(2, 2, 2), - NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetFill(1, 0), + NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_AP_BOTTOMPANEL), + NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetPadding(WD_FRAMERECT_TOP, WD_FRAMERECT_RIGHT, WD_FRAMERECT_BOTTOM, WD_FRAMERECT_LEFT), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetFill(1, 0), NWidget(NWID_HORIZONTAL), NWidget(NWID_SPACER), SetMinimalSize(14, 0), SetFill(1, 0), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), diff --git a/src/dock_gui.cpp b/src/dock_gui.cpp index d86e3ad068..f5149b8b07 100644 --- a/src/dock_gui.cpp +++ b/src/dock_gui.cpp @@ -486,11 +486,10 @@ static const NWidgetPart _nested_build_dock_station_widgets[] = { NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_STATION_BUILD_DOCK_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), EndContainer(), NWidget(WWT_PANEL, COLOUR_DARK_GREEN, BDSW_BACKGROUND), - NWidget(NWID_SPACER), SetMinimalSize(0, 3), - NWidget(WWT_LABEL, COLOUR_DARK_GREEN, BDSW_INFO), SetMinimalSize(148, 14), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), - NWidget(NWID_HORIZONTAL), SetPIP(14, 0, 14), - NWidget(WWT_TEXTBTN, COLOUR_GREY, BDSW_LT_OFF), SetMinimalSize(40, 12), SetFill(1, 0), SetDataTip(STR_STATION_BUILD_COVERAGE_OFF, STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP), - NWidget(WWT_TEXTBTN, COLOUR_GREY, BDSW_LT_ON), SetMinimalSize(40, 12), SetFill(1, 0), SetDataTip(STR_STATION_BUILD_COVERAGE_ON, STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP), + NWidget(WWT_LABEL, COLOUR_DARK_GREEN, BDSW_INFO), SetPadding(WD_FRAMERECT_TOP, WD_FRAMERECT_RIGHT, WD_FRAMERECT_BOTTOM, WD_FRAMERECT_LEFT), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetFill(1, 0), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(14, 0, 14), + NWidget(WWT_TEXTBTN, COLOUR_GREY, BDSW_LT_OFF), SetMinimalSize(60, 12), SetFill(1, 0), SetDataTip(STR_STATION_BUILD_COVERAGE_OFF, STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP), + NWidget(WWT_TEXTBTN, COLOUR_GREY, BDSW_LT_ON), SetMinimalSize(60, 12), SetFill(1, 0), SetDataTip(STR_STATION_BUILD_COVERAGE_ON, STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP), EndContainer(), NWidget(WWT_EMPTY, COLOUR_GREY, BDSW_ACCEPTANCE), SetPadding(0, WD_FRAMERECT_RIGHT, 0, WD_FRAMERECT_LEFT), SetResize(0, 1), EndContainer(), diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index b73e66da2b..8d7a0d1545 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -1609,7 +1609,7 @@ static const NWidgetPart _nested_station_builder_widgets[] = { NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAS_PLATFORM_DRAG_N_DROP), SetMinimalSize(75, 12), SetDataTip(STR_STATION_BUILD_DRAG_DROP, STR_STATION_BUILD_DRAG_DROP_TOOLTIP), NWidget(NWID_SPACER), SetMinimalSize(2, 0), SetFill(1, 0), EndContainer(), - NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetMinimalSize(144, 11), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetPadding(3, 2, 0, 0), + NWidget(WWT_LABEL, COLOUR_DARK_GREEN), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetPadding(WD_FRAMERECT_TOP, WD_FRAMERECT_RIGHT, WD_FRAMERECT_BOTTOM, WD_FRAMERECT_LEFT), SetFill(1, 0), NWidget(NWID_HORIZONTAL), NWidget(NWID_SPACER), SetMinimalSize(2, 0), SetFill(1, 0), NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAS_HIGHLIGHT_OFF), SetMinimalSize(60, 12), diff --git a/src/road_gui.cpp b/src/road_gui.cpp index e57d54b19b..b523ec3356 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -1179,11 +1179,7 @@ static const NWidgetPart _nested_road_station_picker_widgets[] = { NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_Y), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), NWidget(NWID_SPACER), SetFill(1, 0), EndContainer(), - NWidget(NWID_SPACER), SetMinimalSize(0, 1), - NWidget(NWID_HORIZONTAL), SetPIP(2, 0, 2), - NWidget(WWT_LABEL, COLOUR_DARK_GREEN, WID_BROS_INFO), SetMinimalSize(140, 14), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), - NWidget(NWID_SPACER), SetFill(1, 0), - EndContainer(), + NWidget(WWT_LABEL, COLOUR_DARK_GREEN, WID_BROS_INFO), SetPadding(WD_FRAMERECT_TOP, WD_FRAMERECT_RIGHT, WD_FRAMERECT_BOTTOM, WD_FRAMERECT_LEFT), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetFill(1, 0), NWidget(NWID_HORIZONTAL), SetPIP(2, 0, 2), NWidget(NWID_SPACER), SetFill(1, 0), NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BROS_LT_OFF), SetMinimalSize(60, 12), From c7f55a058be78841ffe63ba525f3d0879ffe480c Mon Sep 17 00:00:00 2001 From: Bouke Haarsma Date: Tue, 4 Oct 2022 11:58:58 +0200 Subject: [PATCH 03/36] Fix: link overlay line width on HiDPI displays (#10064) --- src/linkgraph/linkgraph_gui.cpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/linkgraph/linkgraph_gui.cpp b/src/linkgraph/linkgraph_gui.cpp index baeb2438cc..f1fb309c1f 100644 --- a/src/linkgraph/linkgraph_gui.cpp +++ b/src/linkgraph/linkgraph_gui.cpp @@ -14,6 +14,7 @@ #include "../company_gui.h" #include "../date_func.h" #include "../viewport_func.h" +#include "../zoom_func.h" #include "../smallmap_gui.h" #include "../core/geometry_func.hpp" #include "../widgets/link_graph_legend_widget.h" @@ -267,13 +268,14 @@ void LinkGraphOverlay::Draw(const DrawPixelInfo *dpi) */ void LinkGraphOverlay::DrawLinks(const DrawPixelInfo *dpi) const { + int width = ScaleGUITrad(this->scale); for (LinkMap::const_iterator i(this->cached_links.begin()); i != this->cached_links.end(); ++i) { if (!Station::IsValidID(i->first)) continue; Point pta = this->GetStationMiddle(Station::Get(i->first)); for (StationLinkMap::const_iterator j(i->second.begin()); j != i->second.end(); ++j) { if (!Station::IsValidID(j->first)) continue; Point ptb = this->GetStationMiddle(Station::Get(j->first)); - if (!this->IsLinkVisible(pta, ptb, dpi, this->scale + 2)) continue; + if (!this->IsLinkVisible(pta, ptb, dpi, width + 2)) continue; this->DrawContent(pta, ptb, j->second); } } @@ -289,20 +291,21 @@ void LinkGraphOverlay::DrawContent(Point pta, Point ptb, const LinkProperties &c { uint usage_or_plan = std::min(cargo.capacity * 2 + 1, std::max(cargo.usage, cargo.planned)); int colour = LinkGraphOverlay::LINK_COLOURS[_settings_client.gui.linkgraph_colours][usage_or_plan * lengthof(LinkGraphOverlay::LINK_COLOURS[0]) / (cargo.capacity * 2 + 2)]; - int dash = cargo.shared ? this->scale * 4 : 0; + int width = ScaleGUITrad(this->scale); + int dash = cargo.shared ? width * 4 : 0; /* Move line a bit 90° against its dominant direction to prevent it from * being hidden below the grey line. */ int side = _settings_game.vehicle.road_side ? 1 : -1; if (abs(pta.x - ptb.x) < abs(pta.y - ptb.y)) { - int offset_x = (pta.y > ptb.y ? 1 : -1) * side * this->scale; - GfxDrawLine(pta.x + offset_x, pta.y, ptb.x + offset_x, ptb.y, colour, this->scale, dash); + int offset_x = (pta.y > ptb.y ? 1 : -1) * side * width; + GfxDrawLine(pta.x + offset_x, pta.y, ptb.x + offset_x, ptb.y, colour, width, dash); } else { - int offset_y = (pta.x < ptb.x ? 1 : -1) * side * this->scale; - GfxDrawLine(pta.x, pta.y + offset_y, ptb.x, ptb.y + offset_y, colour, this->scale, dash); + int offset_y = (pta.x < ptb.x ? 1 : -1) * side * width; + GfxDrawLine(pta.x, pta.y + offset_y, ptb.x, ptb.y + offset_y, colour, width, dash); } - GfxDrawLine(pta.x, pta.y, ptb.x, ptb.y, _colour_gradient[COLOUR_GREY][1], this->scale); + GfxDrawLine(pta.x, pta.y, ptb.x, ptb.y, _colour_gradient[COLOUR_GREY][1], width); } /** @@ -311,13 +314,14 @@ void LinkGraphOverlay::DrawContent(Point pta, Point ptb, const LinkProperties &c */ void LinkGraphOverlay::DrawStationDots(const DrawPixelInfo *dpi) const { + int width = ScaleGUITrad(this->scale); for (StationSupplyList::const_iterator i(this->cached_stations.begin()); i != this->cached_stations.end(); ++i) { const Station *st = Station::GetIfValid(i->first); if (st == nullptr) continue; Point pt = this->GetStationMiddle(st); - if (!this->IsPointVisible(pt, dpi, 3 * this->scale)) continue; + if (!this->IsPointVisible(pt, dpi, 3 * width)) continue; - uint r = this->scale * 2 + this->scale * 2 * std::min(200U, i->second) / 200; + uint r = width * 2 + width * 2 * std::min(200U, i->second) / 200; LinkGraphOverlay::DrawVertex(pt.x, pt.y, r, _colour_gradient[st->owner != OWNER_NONE ? From 633b903f16e53f337a0556cf02c655467d38c3bf Mon Sep 17 00:00:00 2001 From: translators Date: Wed, 5 Oct 2022 19:06:12 +0000 Subject: [PATCH 04/36] Update: Translations from eints turkish: 7 changes by kgecmen --- src/lang/turkish.txt | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index b63eed6a52..39f7f8d586 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -226,9 +226,9 @@ STR_UNITS_HEIGHT_METRIC :{COMMA}{NBSP}m STR_UNITS_HEIGHT_SI :{COMMA}{NBSP}m # Common window strings -STR_LIST_FILTER_TITLE :{BLACK}Süzgeç metni: -STR_LIST_FILTER_OSKTITLE :{BLACK}Süzgeç metnini girin -STR_LIST_FILTER_TOOLTIP :{BLACK}Listeyi filtrelemek için bir anahtar sözcük girin +STR_LIST_FILTER_TITLE :{BLACK}Filtre: +STR_LIST_FILTER_OSKTITLE :{BLACK}Listeyi filtrelemek için anahtar sözcük girin +STR_LIST_FILTER_TOOLTIP :{BLACK}Listeyi filtrelemek için anahtar sözcük girin STR_TOOLTIP_GROUP_ORDER :{BLACK}Gruplama sırasını seç STR_TOOLTIP_SORT_ORDER :{BLACK}Sıralama türünü seçin (azalan/artan) @@ -1164,7 +1164,7 @@ STR_WARNING_NO_SUITABLE_AI :{WHITE}Uygun YZ # Settings tree window STR_CONFIG_SETTING_TREE_CAPTION :{WHITE}Ayarlar -STR_CONFIG_SETTING_FILTER_TITLE :{BLACK}Süzgeç metni: +STR_CONFIG_SETTING_FILTER_TITLE :{BLACK}Filtre: STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Tümünü genişlet STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Tümünü kısalt STR_CONFIG_SETTING_RESET_ALL :{BLACK}Tüm değerleri sıfırla @@ -3125,7 +3125,7 @@ STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Oyun Ayr STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Mevcut bilgi yok STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING} STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: {WHITE}{STRING} -STR_SAVELOAD_FILTER_TITLE :{BLACK}Süzgeç dizgesi: +STR_SAVELOAD_FILTER_TITLE :{BLACK}Filtre: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Dosya Üzerine Yaz STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Mevcut dosyanın üzerine yazmak istediğinizden emin misiniz? STR_SAVELOAD_DIRECTORY :{STRING} (Dizin) @@ -3217,7 +3217,7 @@ STR_NEWGRF_SETTINGS_INFO_TITLE :{WHITE}Ayrınt STR_NEWGRF_SETTINGS_ACTIVE_LIST :{WHITE}Aktif NewGRF dosyaları STR_NEWGRF_SETTINGS_INACTIVE_LIST :{WHITE}Aktif olmayan NewGRF dosyaları STR_NEWGRF_SETTINGS_SELECT_PRESET :{ORANGE}Önceden belirlenmiş ayar seçin: -STR_NEWGRF_FILTER_TITLE :{ORANGE}Süzgeç metni: +STR_NEWGRF_FILTER_TITLE :{ORANGE}Filtre: STR_NEWGRF_SETTINGS_PRESET_LIST_TOOLTIP :{BLACK}Seçili önayarı yükle STR_NEWGRF_SETTINGS_PRESET_SAVE :{BLACK}Önayarı kaydet STR_NEWGRF_SETTINGS_PRESET_SAVE_TOOLTIP :{BLACK}Şimdiki listeyi önayar olarak kaydet @@ -3642,6 +3642,7 @@ STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Kredi Fai STR_FINANCES_SECTION_OTHER :{GOLD}Diğer STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} +STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} STR_FINANCES_NET_PROFIT :{WHITE}Net Kâr STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Banka Hesabı From d0dcb6547e01c143c146407aab4b65d550cb3e5d Mon Sep 17 00:00:00 2001 From: Bouke Haarsma Date: Fri, 7 Oct 2022 12:56:45 +0200 Subject: [PATCH 05/36] Change: Don't strip symbols from bundles (#10071) --- cmake/InstallAndPackage.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/InstallAndPackage.cmake b/cmake/InstallAndPackage.cmake index f8f0d3ca5c..8deb439ff6 100644 --- a/cmake/InstallAndPackage.cmake +++ b/cmake/InstallAndPackage.cmake @@ -118,7 +118,7 @@ endif() set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README.md") set(CPACK_MONOLITHIC_INSTALL YES) set(CPACK_PACKAGE_EXECUTABLES "openttd;OpenTTD") -set(CPACK_STRIP_FILES YES) +set(CPACK_STRIP_FILES NO) set(CPACK_OUTPUT_FILE_PREFIX "bundles") if(APPLE) From c482f05616be509409451574bfb4590ce8dcbeec Mon Sep 17 00:00:00 2001 From: translators Date: Fri, 7 Oct 2022 19:02:50 +0000 Subject: [PATCH 06/36] Update: Translations from eints english (au): 7 changes by krysclarke --- src/lang/english_AU.txt | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 41ad55245c..417f8e81eb 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -225,9 +225,9 @@ STR_UNITS_HEIGHT_METRIC :{COMMA}{NBSP}m STR_UNITS_HEIGHT_SI :{COMMA}{NBSP}m # Common window strings -STR_LIST_FILTER_TITLE :{BLACK}Filter string: -STR_LIST_FILTER_OSKTITLE :{BLACK}Enter filter string -STR_LIST_FILTER_TOOLTIP :{BLACK}Enter a keyword to filter the list for +STR_LIST_FILTER_TITLE :{BLACK}Filter: +STR_LIST_FILTER_OSKTITLE :{BLACK}Enter one or more keywords to filter the list for +STR_LIST_FILTER_TOOLTIP :{BLACK}Enter one or more keywords to filter the list for STR_TOOLTIP_GROUP_ORDER :{BLACK}Select grouping order STR_TOOLTIP_SORT_ORDER :{BLACK}Select sorting order (descending/ascending) @@ -1163,7 +1163,7 @@ STR_WARNING_NO_SUITABLE_AI :{WHITE}No suita # Settings tree window STR_CONFIG_SETTING_TREE_CAPTION :{WHITE}Settings -STR_CONFIG_SETTING_FILTER_TITLE :{BLACK}Filter string: +STR_CONFIG_SETTING_FILTER_TITLE :{BLACK}Filter: STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Expand all STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Collapse all STR_CONFIG_SETTING_RESET_ALL :{BLACK}Reset all values @@ -3124,7 +3124,7 @@ STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Game Det STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}No information available STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING} STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: {WHITE}{STRING} -STR_SAVELOAD_FILTER_TITLE :{BLACK}Filter string: +STR_SAVELOAD_FILTER_TITLE :{BLACK}Filter: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Overwrite File STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Are you sure you want to overwrite the existing file? STR_SAVELOAD_DIRECTORY :{STRING} (Directory) @@ -3216,7 +3216,7 @@ STR_NEWGRF_SETTINGS_INFO_TITLE :{WHITE}Detailed STR_NEWGRF_SETTINGS_ACTIVE_LIST :{WHITE}Active NewGRF files STR_NEWGRF_SETTINGS_INACTIVE_LIST :{WHITE}Inactive NewGRF files STR_NEWGRF_SETTINGS_SELECT_PRESET :{ORANGE}Select preset: -STR_NEWGRF_FILTER_TITLE :{ORANGE}Filter string: +STR_NEWGRF_FILTER_TITLE :{ORANGE}Filter: STR_NEWGRF_SETTINGS_PRESET_LIST_TOOLTIP :{BLACK}Load the selected preset STR_NEWGRF_SETTINGS_PRESET_SAVE :{BLACK}Save preset STR_NEWGRF_SETTINGS_PRESET_SAVE_TOOLTIP :{BLACK}Save the current list as a preset @@ -3641,6 +3641,7 @@ STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Loan Inte STR_FINANCES_SECTION_OTHER :{GOLD}Other STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} +STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} STR_FINANCES_NET_PROFIT :{WHITE}Net Profit STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Bank Balance From 24f3022ee0ad8beb04138907861dbb53ee3ee994 Mon Sep 17 00:00:00 2001 From: Charles Pigott Date: Mon, 10 Oct 2022 11:23:09 +0100 Subject: [PATCH 07/36] Fix #10074: list_ai console commands and friends were missing help text --- src/console_cmds.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index 07c8f58792..61c0c331d9 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -1178,6 +1178,10 @@ static void PrintLineByLine(char *buf) DEF_CONSOLE_CMD(ConListAILibs) { + if (argc == 0) { + IConsolePrint(CC_HELP, "List installed AI libraries. Usage: 'list_ai_libs'."); + return true; + } char buf[4096]; AI::GetConsoleLibraryList(buf, lastof(buf)); @@ -1188,6 +1192,10 @@ DEF_CONSOLE_CMD(ConListAILibs) DEF_CONSOLE_CMD(ConListAI) { + if (argc == 0) { + IConsolePrint(CC_HELP, "List installed AIs. Usage: 'list_ai'."); + return true; + } char buf[4096]; AI::GetConsoleList(buf, lastof(buf)); @@ -1198,6 +1206,10 @@ DEF_CONSOLE_CMD(ConListAI) DEF_CONSOLE_CMD(ConListGameLibs) { + if (argc == 0) { + IConsolePrint(CC_HELP, "List installed Game Script libraries. Usage: 'list_game_libs'."); + return true; + } char buf[4096]; Game::GetConsoleLibraryList(buf, lastof(buf)); @@ -1208,6 +1220,10 @@ DEF_CONSOLE_CMD(ConListGameLibs) DEF_CONSOLE_CMD(ConListGame) { + if (argc == 0) { + IConsolePrint(CC_HELP, "List installed Game Scripts. Usage: 'list_game'."); + return true; + } char buf[4096]; Game::GetConsoleList(buf, lastof(buf)); From 9059215b3b06a07eb75b6d68e207c6d1de7cf445 Mon Sep 17 00:00:00 2001 From: Charles Pigott Date: Mon, 10 Oct 2022 12:19:58 +0100 Subject: [PATCH 08/36] Fix #10073: Stop truncating output of list_ai and friends commands --- src/ai/ai.hpp | 4 ++-- src/ai/ai_core.cpp | 8 +++---- src/console_cmds.cpp | 41 +++++++++++++++-------------------- src/game/game.hpp | 4 ++-- src/game/game_core.cpp | 8 +++---- src/openttd.cpp | 6 +++-- src/script/script_scanner.cpp | 9 ++++---- src/script/script_scanner.hpp | 2 +- 8 files changed, 39 insertions(+), 43 deletions(-) diff --git a/src/ai/ai.hpp b/src/ai/ai.hpp index 59886486fe..f9112fc177 100644 --- a/src/ai/ai.hpp +++ b/src/ai/ai.hpp @@ -139,9 +139,9 @@ public: static int GetStartNextTime(); /** Wrapper function for AIScanner::GetAIConsoleList */ - static char *GetConsoleList(char *p, const char *last, bool newest_only = false); + static std::string GetConsoleList(bool newest_only = false); /** Wrapper function for AIScanner::GetAIConsoleLibraryList */ - static char *GetConsoleLibraryList(char *p, const char *last); + static std::string GetConsoleLibraryList(); /** Wrapper function for AIScanner::GetAIInfoList */ static const ScriptInfoList *GetInfoList(); /** Wrapper function for AIScanner::GetUniqueAIInfoList */ diff --git a/src/ai/ai_core.cpp b/src/ai/ai_core.cpp index e45738776d..add76e0685 100644 --- a/src/ai/ai_core.cpp +++ b/src/ai/ai_core.cpp @@ -315,14 +315,14 @@ return DAYS_IN_YEAR; } -/* static */ char *AI::GetConsoleList(char *p, const char *last, bool newest_only) +/* static */ std::string AI::GetConsoleList(bool newest_only) { - return AI::scanner_info->GetConsoleList(p, last, newest_only); + return AI::scanner_info->GetConsoleList(newest_only); } -/* static */ char *AI::GetConsoleLibraryList(char *p, const char *last) +/* static */ std::string AI::GetConsoleLibraryList() { - return AI::scanner_library->GetConsoleList(p, last, true); + return AI::scanner_library->GetConsoleList(true); } /* static */ const ScriptInfoList *AI::GetInfoList() diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index 61c0c331d9..2936a8a147 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -45,6 +45,8 @@ #include "company_cmd.h" #include "misc_cmd.h" +#include + #include "safeguards.h" /* scriptfile handling */ @@ -1160,19 +1162,14 @@ DEF_CONSOLE_CMD(ConReload) /** * Print a text buffer line by line to the console. Lines are separated by '\n'. - * @param buf The buffer to print. - * @note All newlines are replace by '\0' characters. + * @param full_string The multi-line string to print. */ -static void PrintLineByLine(char *buf) -{ - char *p = buf; - /* Print output line by line */ - for (char *p2 = buf; *p2 != '\0'; p2++) { - if (*p2 == '\n') { - *p2 = '\0'; - IConsolePrint(CC_DEFAULT, p); - p = p2 + 1; - } +static void PrintLineByLine(const std::string &full_string) +{ + std::istringstream in(full_string); + std::string line; + while (std::getline(in, line)) { + IConsolePrint(CC_DEFAULT, line.c_str()); } } @@ -1182,10 +1179,9 @@ DEF_CONSOLE_CMD(ConListAILibs) IConsolePrint(CC_HELP, "List installed AI libraries. Usage: 'list_ai_libs'."); return true; } - char buf[4096]; - AI::GetConsoleLibraryList(buf, lastof(buf)); - PrintLineByLine(buf); + const std::string output_str = AI::GetConsoleLibraryList(); + PrintLineByLine(output_str); return true; } @@ -1196,10 +1192,9 @@ DEF_CONSOLE_CMD(ConListAI) IConsolePrint(CC_HELP, "List installed AIs. Usage: 'list_ai'."); return true; } - char buf[4096]; - AI::GetConsoleList(buf, lastof(buf)); - PrintLineByLine(buf); + const std::string output_str = AI::GetConsoleList(); + PrintLineByLine(output_str); return true; } @@ -1210,10 +1205,9 @@ DEF_CONSOLE_CMD(ConListGameLibs) IConsolePrint(CC_HELP, "List installed Game Script libraries. Usage: 'list_game_libs'."); return true; } - char buf[4096]; - Game::GetConsoleLibraryList(buf, lastof(buf)); - PrintLineByLine(buf); + const std::string output_str = Game::GetConsoleLibraryList(); + PrintLineByLine(output_str); return true; } @@ -1224,10 +1218,9 @@ DEF_CONSOLE_CMD(ConListGame) IConsolePrint(CC_HELP, "List installed Game Scripts. Usage: 'list_game'."); return true; } - char buf[4096]; - Game::GetConsoleList(buf, lastof(buf)); - PrintLineByLine(buf); + const std::string output_str = Game::GetConsoleList(); + PrintLineByLine(output_str); return true; } diff --git a/src/game/game.hpp b/src/game/game.hpp index 8381a6c148..c72b081be6 100644 --- a/src/game/game.hpp +++ b/src/game/game.hpp @@ -93,9 +93,9 @@ public: static void Load(int version); /** Wrapper function for GameScanner::GetConsoleList */ - static char *GetConsoleList(char *p, const char *last, bool newest_only = false); + static std::string GetConsoleList(bool newest_only = false); /** Wrapper function for GameScanner::GetConsoleLibraryList */ - static char *GetConsoleLibraryList(char *p, const char *last); + static std::string GetConsoleLibraryList(); /** Wrapper function for GameScanner::GetInfoList */ static const ScriptInfoList *GetInfoList(); /** Wrapper function for GameScanner::GetUniqueInfoList */ diff --git a/src/game/game_core.cpp b/src/game/game_core.cpp index 19d8bbf54e..32ca99e6a4 100644 --- a/src/game/game_core.cpp +++ b/src/game/game_core.cpp @@ -225,14 +225,14 @@ } } -/* static */ char *Game::GetConsoleList(char *p, const char *last, bool newest_only) +/* static */ std::string Game::GetConsoleList(bool newest_only) { - return Game::scanner_info->GetConsoleList(p, last, newest_only); + return Game::scanner_info->GetConsoleList(newest_only); } -/* static */ char *Game::GetConsoleLibraryList(char *p, const char *last) +/* static */ std::string Game::GetConsoleLibraryList() { - return Game::scanner_library->GetConsoleList(p, last, true); + return Game::scanner_library->GetConsoleList(true); } /* static */ const ScriptInfoList *Game::GetInfoList() diff --git a/src/openttd.cpp b/src/openttd.cpp index 1b5e7be0ce..4ba83620f9 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -227,12 +227,14 @@ static void ShowHelp() /* We need to initialize the AI, so it finds the AIs */ AI::Initialize(); - p = AI::GetConsoleList(p, lastof(buf), true); + const std::string ai_list = AI::GetConsoleList(true); + p = strecpy(p, ai_list.c_str(), lastof(buf)); AI::Uninitialize(true); /* We need to initialize the GameScript, so it finds the GSs */ Game::Initialize(); - p = Game::GetConsoleList(p, lastof(buf), true); + const std::string game_list = Game::GetConsoleList(true); + p = strecpy(p, game_list.c_str(), lastof(buf)); Game::Uninitialize(true); /* ShowInfo put output to stderr, but version information should go diff --git a/src/script/script_scanner.cpp b/src/script/script_scanner.cpp index 319a1c7fc0..3b76b7b651 100644 --- a/src/script/script_scanner.cpp +++ b/src/script/script_scanner.cpp @@ -145,15 +145,16 @@ void ScriptScanner::RegisterScript(ScriptInfo *info) } } -char *ScriptScanner::GetConsoleList(char *p, const char *last, bool newest_only) const +std::string ScriptScanner::GetConsoleList(bool newest_only) const { - p += seprintf(p, last, "List of %s:\n", this->GetScannerName()); + std::string p; + p += fmt::format("List of {}:\n", this->GetScannerName()); const ScriptInfoList &list = newest_only ? this->info_single_list : this->info_list; for (const auto &item : list) { ScriptInfo *i = item.second; - p += seprintf(p, last, "%10s (v%d): %s\n", i->GetName(), i->GetVersion(), i->GetDescription()); + p += fmt::format("{:>10} (v{:d}): {}\n", i->GetName(), i->GetVersion(), i->GetDescription()); } - p += seprintf(p, last, "\n"); + p += "\n"; return p; } diff --git a/src/script/script_scanner.hpp b/src/script/script_scanner.hpp index ca9068ca10..9781e07b69 100644 --- a/src/script/script_scanner.hpp +++ b/src/script/script_scanner.hpp @@ -57,7 +57,7 @@ public: /** * Get the list of registered scripts to print on the console. */ - char *GetConsoleList(char *p, const char *last, bool newest_only) const; + std::string GetConsoleList(bool newest_only) const; /** * Check whether we have a script with the exact characteristics as ci. From 887b760c88866a9a3e325bf94e71fa10a0dc7c1e Mon Sep 17 00:00:00 2001 From: Bouke Haarsma Date: Mon, 10 Oct 2022 14:42:54 +0200 Subject: [PATCH 09/36] Change: Strip symbols from bundles except macOS (#10072) --- cmake/InstallAndPackage.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmake/InstallAndPackage.cmake b/cmake/InstallAndPackage.cmake index 8deb439ff6..be37b9b745 100644 --- a/cmake/InstallAndPackage.cmake +++ b/cmake/InstallAndPackage.cmake @@ -118,10 +118,12 @@ endif() set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README.md") set(CPACK_MONOLITHIC_INSTALL YES) set(CPACK_PACKAGE_EXECUTABLES "openttd;OpenTTD") -set(CPACK_STRIP_FILES NO) +set(CPACK_STRIP_FILES YES) set(CPACK_OUTPUT_FILE_PREFIX "bundles") if(APPLE) + # Stripping would produce unreadable stacktraces. + set(CPACK_STRIP_FILES NO) set(CPACK_GENERATOR "Bundle") include(PackageBundle) From fc944829e1dcc47bbb630ae905ed65c1977e80d0 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 29 Sep 2022 13:49:45 +0100 Subject: [PATCH 10/36] Change: Don't use zero-sized plane for World Generation window. Use of zero-sized plane causes the window size calculation to change depending on which plane is displayed. Instead use an empty plane so that largest of the planes is taken into account for sizing. --- src/genworld_gui.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/genworld_gui.cpp b/src/genworld_gui.cpp index 2489105c23..4d238dc835 100644 --- a/src/genworld_gui.cpp +++ b/src/genworld_gui.cpp @@ -122,6 +122,7 @@ static const NWidgetPart _nested_generate_landscape_widgets[] = { NWidget(NWID_SELECTION, INVALID_COLOUR, WID_GL_CLIMATE_SEL_LABEL), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SNOW_COVERAGE, STR_NULL), SetFill(1, 1), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DESERT_COVERAGE, STR_NULL), SetFill(1, 1), + NWidget(NWID_SPACER), EndContainer(), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DATE, STR_NULL), SetFill(1, 1), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SMOOTHNESS, STR_NULL), SetFill(1, 1), @@ -142,6 +143,8 @@ static const NWidgetPart _nested_generate_landscape_widgets[] = { NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_TEXT), SetDataTip(STR_MAPGEN_DESERT_COVERAGE_TEXT, STR_NULL), SetFill(1, 0), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_UP), SetDataTip(SPR_ARROW_UP, STR_MAPGEN_DESERT_COVERAGE_UP), SetFill(0, 1), EndContainer(), + /* Temperate/Toyland spacer */ + NWidget(NWID_SPACER), EndContainer(), /* Starting date. */ NWidget(NWID_HORIZONTAL), @@ -244,6 +247,7 @@ static const NWidgetPart _nested_heightmap_load_widgets[] = { NWidget(NWID_SELECTION, INVALID_COLOUR, WID_GL_CLIMATE_SEL_LABEL), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SNOW_COVERAGE, STR_NULL), SetFill(1, 1), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DESERT_COVERAGE, STR_NULL), SetFill(1, 1), + NWidget(NWID_SPACER), EndContainer(), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DATE, STR_NULL), SetFill(1, 1), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_GAME_OPTIONS_TOWN_NAMES_FRAME, STR_NULL), SetFill(1, 1), @@ -265,6 +269,7 @@ static const NWidgetPart _nested_heightmap_load_widgets[] = { NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_TEXT), SetDataTip(STR_MAPGEN_DESERT_COVERAGE_TEXT, STR_NULL), SetFill(1, 0), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_UP), SetDataTip(SPR_ARROW_UP, STR_MAPGEN_DESERT_COVERAGE_UP), SetFill(0, 1), EndContainer(), + NWidget(NWID_SPACER), EndContainer(), NWidget(NWID_HORIZONTAL), NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_START_DATE_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD), SetFill(0, 1), @@ -499,10 +504,10 @@ struct GenerateLandscapeWindow : public Window { /* Set snow/rainforest selections */ int climate_plane = 0; switch (_settings_newgame.game_creation.landscape) { - case LT_TEMPERATE: climate_plane = SZSP_VERTICAL; break; - case LT_ARCTIC: climate_plane = 0; break; - case LT_TROPIC: climate_plane = 1; break; - case LT_TOYLAND: climate_plane = SZSP_VERTICAL; break; + case LT_TEMPERATE: climate_plane = 2; break; + case LT_ARCTIC: climate_plane = 0; break; + case LT_TROPIC: climate_plane = 1; break; + case LT_TOYLAND: climate_plane = 2; break; } this->GetWidget(WID_GL_CLIMATE_SEL_LABEL)->SetDisplayedPlane(climate_plane); this->GetWidget(WID_GL_CLIMATE_SEL_SELECTOR)->SetDisplayedPlane(climate_plane); From e8edecf6b18c7490686bdab267ff19857a6c9b42 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 2 Oct 2022 20:28:29 +0100 Subject: [PATCH 11/36] Change: Adjust layout of file windows to fix overlapping widgets. --- src/fios_gui.cpp | 114 +++++++++++++++++++++++++---------------------- 1 file changed, 61 insertions(+), 53 deletions(-) diff --git a/src/fios_gui.cpp b/src/fios_gui.cpp index de351680e3..95fcc41cfb 100644 --- a/src/fios_gui.cpp +++ b/src/fios_gui.cpp @@ -80,13 +80,15 @@ static const NWidgetPart _nested_load_dialog_widgets[] = { NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), /* Left side : filter box and available files */ - NWidget(WWT_PANEL, COLOUR_GREY), SetFill(1, 1), SetResize(1, 1), + NWidget(NWID_VERTICAL), /* Filter box with label */ - NWidget(NWID_HORIZONTAL), SetPadding(WD_FRAMERECT_TOP, 0, WD_FRAMERECT_BOTTOM, 0), - SetPIP(WD_FRAMETEXT_LEFT, WD_FRAMETEXT_RIGHT, 0), - NWidget(WWT_TEXT, COLOUR_GREY), SetFill(0, 1), SetDataTip(STR_SAVELOAD_FILTER_TITLE , STR_NULL), - NWidget(WWT_EDITBOX, COLOUR_GREY, WID_SL_FILTER), SetFill(1, 0), SetMinimalSize(50, 12), SetResize(1, 0), - SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP), + NWidget(WWT_PANEL, COLOUR_GREY), SetFill(1, 1), SetResize(1, 1), + NWidget(NWID_HORIZONTAL), SetPadding(WD_FRAMERECT_TOP, 0, WD_FRAMERECT_BOTTOM, 0), + SetPIP(WD_FRAMETEXT_LEFT, WD_FRAMETEXT_RIGHT, 0), + NWidget(WWT_TEXT, COLOUR_GREY), SetFill(0, 1), SetDataTip(STR_SAVELOAD_FILTER_TITLE , STR_NULL), + NWidget(WWT_EDITBOX, COLOUR_GREY, WID_SL_FILTER), SetFill(1, 0), SetMinimalSize(50, 12), SetResize(1, 0), + SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP), + EndContainer(), EndContainer(), /* Sort buttons */ NWidget(NWID_HORIZONTAL), @@ -97,22 +99,24 @@ static const NWidgetPart _nested_load_dialog_widgets[] = { NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SL_HOME_BUTTON), SetMinimalSize(12, 12), SetDataTip(SPR_HOUSE_ICON, STR_SAVELOAD_HOME_BUTTON), EndContainer(), /* Files */ - NWidget(WWT_PANEL, COLOUR_GREY, WID_SL_FILE_BACKGROUND), - NWidget(NWID_HORIZONTAL), - NWidget(WWT_INSET, COLOUR_GREY, WID_SL_DRIVES_DIRECTORIES_LIST), SetFill(1, 1), SetPadding(2, 1, 2, 2), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_PANEL, COLOUR_GREY, WID_SL_FILE_BACKGROUND), + NWidget(WWT_INSET, COLOUR_GREY, WID_SL_DRIVES_DIRECTORIES_LIST), SetFill(1, 1), SetPadding(2, 2, 2, 2), SetDataTip(0x0, STR_SAVELOAD_LIST_TOOLTIP), SetResize(1, 10), SetScrollbar(WID_SL_SCROLLBAR), EndContainer(), - NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_SL_SCROLLBAR), - EndContainer(), - NWidget(NWID_SELECTION, INVALID_COLOUR, WID_SL_CONTENT_DOWNLOAD_SEL), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SL_CONTENT_DOWNLOAD), SetResize(1, 0), - SetDataTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT), EndContainer(), + NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_SL_SCROLLBAR), + EndContainer(), + /* Online Content button */ + NWidget(NWID_SELECTION, INVALID_COLOUR, WID_SL_CONTENT_DOWNLOAD_SEL), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SL_CONTENT_DOWNLOAD), SetResize(1, 0), + SetDataTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT), EndContainer(), EndContainer(), /* Right side : game details */ - NWidget(WWT_PANEL, COLOUR_GREY), - NWidget(WWT_EMPTY, INVALID_COLOUR, WID_SL_DETAILS), SetResize(1, 1), SetFill(1, 1), + NWidget(NWID_VERTICAL), + NWidget(WWT_PANEL, COLOUR_GREY, WID_SL_DETAILS), SetResize(1, 1), SetFill(1, 1), + EndContainer(), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SL_MISSING_NEWGRFS), SetDataTip(STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_BUTTON, STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_TOOLTIP), SetFill(1, 0), SetResize(1, 0), NWidget(NWID_HORIZONTAL), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), @@ -135,37 +139,38 @@ static const NWidgetPart _nested_load_heightmap_dialog_widgets[] = { /* Current directory and free space */ NWidget(WWT_PANEL, COLOUR_GREY, WID_SL_BACKGROUND), SetFill(1, 0), SetResize(1, 0), EndContainer(), + /* Filter box with label */ NWidget(WWT_PANEL, COLOUR_GREY), SetFill(1, 1), SetResize(1, 1), - /* Filter box with label */ NWidget(NWID_HORIZONTAL), SetPadding(WD_FRAMERECT_TOP, 0, WD_FRAMERECT_BOTTOM, 0), SetPIP(WD_FRAMETEXT_LEFT, WD_FRAMETEXT_RIGHT, 0), NWidget(WWT_TEXT, COLOUR_GREY), SetFill(0, 1), SetDataTip(STR_SAVELOAD_FILTER_TITLE , STR_NULL), NWidget(WWT_EDITBOX, COLOUR_GREY, WID_SL_FILTER), SetFill(1, 0), SetMinimalSize(50, 12), SetResize(1, 0), SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP), EndContainer(), - /* Sort Buttons */ - NWidget(NWID_HORIZONTAL), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SL_SORT_BYNAME), SetDataTip(STR_SORT_BY_CAPTION_NAME, STR_TOOLTIP_SORT_ORDER), SetFill(1, 0), SetResize(1, 0), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SL_SORT_BYDATE), SetDataTip(STR_SORT_BY_CAPTION_DATE, STR_TOOLTIP_SORT_ORDER), SetFill(1, 0), SetResize(1, 0), - EndContainer(), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SL_HOME_BUTTON), SetMinimalSize(12, 12), SetDataTip(SPR_HOUSE_ICON, STR_SAVELOAD_HOME_BUTTON), + EndContainer(), + /* Sort Buttons */ + NWidget(NWID_HORIZONTAL), + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SL_SORT_BYNAME), SetDataTip(STR_SORT_BY_CAPTION_NAME, STR_TOOLTIP_SORT_ORDER), SetFill(1, 0), SetResize(1, 0), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SL_SORT_BYDATE), SetDataTip(STR_SORT_BY_CAPTION_DATE, STR_TOOLTIP_SORT_ORDER), SetFill(1, 0), SetResize(1, 0), EndContainer(), - /* Files */ + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SL_HOME_BUTTON), SetMinimalSize(12, 12), SetDataTip(SPR_HOUSE_ICON, STR_SAVELOAD_HOME_BUTTON), + EndContainer(), + /* Files */ + NWidget(NWID_HORIZONTAL), NWidget(WWT_PANEL, COLOUR_GREY, WID_SL_FILE_BACKGROUND), - NWidget(NWID_HORIZONTAL), - NWidget(WWT_INSET, COLOUR_GREY, WID_SL_DRIVES_DIRECTORIES_LIST), SetFill(1, 1), SetPadding(2, 1, 2, 2), - SetDataTip(0x0, STR_SAVELOAD_LIST_TOOLTIP), SetResize(1, 10), SetScrollbar(WID_SL_SCROLLBAR), EndContainer(), - NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_SL_SCROLLBAR), - EndContainer(), - NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SL_CONTENT_DOWNLOAD), SetResize(1, 0), SetFill(1, 0), - SetDataTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SL_LOAD_BUTTON), SetResize(1, 0), SetFill(1, 0), - SetDataTip(STR_SAVELOAD_LOAD_BUTTON, STR_SAVELOAD_LOAD_HEIGHTMAP_TOOLTIP), - NWidget(WWT_RESIZEBOX, COLOUR_GREY), - EndContainer(), + NWidget(WWT_INSET, COLOUR_GREY, WID_SL_DRIVES_DIRECTORIES_LIST), SetFill(1, 1), SetPadding(2, 2, 2, 2), + SetDataTip(0x0, STR_SAVELOAD_LIST_TOOLTIP), SetResize(1, 10), SetScrollbar(WID_SL_SCROLLBAR), EndContainer(), EndContainer(), + NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_SL_SCROLLBAR), + EndContainer(), + /* Online Content and Load button */ + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SL_CONTENT_DOWNLOAD), SetResize(1, 0), SetFill(1, 0), + SetDataTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SL_LOAD_BUTTON), SetResize(1, 0), SetFill(1, 0), + SetDataTip(STR_SAVELOAD_LOAD_BUTTON, STR_SAVELOAD_LOAD_HEIGHTMAP_TOOLTIP), + NWidget(WWT_RESIZEBOX, COLOUR_GREY), EndContainer(), }; @@ -180,13 +185,15 @@ static const NWidgetPart _nested_save_dialog_widgets[] = { NWidget(WWT_PANEL, COLOUR_GREY, WID_SL_BACKGROUND), SetFill(1, 0), SetResize(1, 0), EndContainer(), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), /* Left side : filter box and available files */ - NWidget(WWT_PANEL, COLOUR_GREY), SetFill(1, 1), SetResize(1, 1), + NWidget(NWID_VERTICAL), /* Filter box with label */ - NWidget(NWID_HORIZONTAL), SetPadding(WD_FRAMERECT_TOP, 0, WD_FRAMERECT_BOTTOM, 0), - SetPIP(WD_FRAMETEXT_LEFT, WD_FRAMETEXT_RIGHT, 0), - NWidget(WWT_TEXT, COLOUR_GREY), SetFill(0, 1), SetDataTip(STR_SAVELOAD_FILTER_TITLE , STR_NULL), - NWidget(WWT_EDITBOX, COLOUR_GREY, WID_SL_FILTER), SetFill(1, 0), SetMinimalSize(50, 12), SetResize(1, 0), - SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP), + NWidget(WWT_PANEL, COLOUR_GREY), SetFill(1, 1), SetResize(1, 1), + NWidget(NWID_HORIZONTAL), SetPadding(WD_FRAMERECT_TOP, 0, WD_FRAMERECT_BOTTOM, 0), + SetPIP(WD_FRAMETEXT_LEFT, WD_FRAMETEXT_RIGHT, 0), + NWidget(WWT_TEXT, COLOUR_GREY), SetFill(0, 1), SetDataTip(STR_SAVELOAD_FILTER_TITLE , STR_NULL), + NWidget(WWT_EDITBOX, COLOUR_GREY, WID_SL_FILTER), SetFill(1, 0), SetMinimalSize(50, 12), SetResize(1, 0), + SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP), + EndContainer(), EndContainer(), /* Sort buttons */ NWidget(NWID_HORIZONTAL), @@ -197,13 +204,15 @@ static const NWidgetPart _nested_save_dialog_widgets[] = { NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SL_HOME_BUTTON), SetMinimalSize(12, 12), SetDataTip(SPR_HOUSE_ICON, STR_SAVELOAD_HOME_BUTTON), EndContainer(), /* Files */ - NWidget(WWT_PANEL, COLOUR_GREY, WID_SL_FILE_BACKGROUND), - NWidget(NWID_HORIZONTAL), - NWidget(WWT_INSET, COLOUR_GREY, WID_SL_DRIVES_DIRECTORIES_LIST), SetPadding(2, 1, 0, 2), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_PANEL, COLOUR_GREY, WID_SL_FILE_BACKGROUND), + NWidget(WWT_INSET, COLOUR_GREY, WID_SL_DRIVES_DIRECTORIES_LIST), SetPadding(2, 2, 2, 2), SetDataTip(0x0, STR_SAVELOAD_LIST_TOOLTIP), SetResize(1, 10), SetScrollbar(WID_SL_SCROLLBAR), EndContainer(), - NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_SL_SCROLLBAR), EndContainer(), - NWidget(WWT_EDITBOX, COLOUR_GREY, WID_SL_SAVE_OSK_TITLE), SetPadding(3, 2, 2, 2), SetFill(1, 0), SetResize(1, 0), + NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_SL_SCROLLBAR), + EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY), + NWidget(WWT_EDITBOX, COLOUR_GREY, WID_SL_SAVE_OSK_TITLE), SetPadding(2, 2, 2, 2), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_SAVELOAD_OSKTITLE, STR_SAVELOAD_EDITBOX_TOOLTIP), EndContainer(), /* Save/delete buttons */ @@ -435,7 +444,7 @@ public: } case WID_SL_DRIVES_DIRECTORIES_LIST: { - GfxFillRect(r.left + 1, r.top + 1, r.right, r.bottom, PC_BLACK); + GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, PC_BLACK); uint y = r.top + WD_FRAMERECT_TOP; uint scroll_pos = this->vscroll->GetPosition(); @@ -449,9 +458,9 @@ public: const FiosItem *item = &this->fios_items[row]; if (item == this->selected) { - GfxFillRect(r.left + 1, y, r.right, y + this->resize.step_height, PC_DARK_BLUE); + GfxFillRect(r.left + 1, y, r.right - 1, y + this->resize.step_height - 1, PC_DARK_BLUE); } else if (item == this->highlighted) { - GfxFillRect(r.left + 1, y, r.right, y + this->resize.step_height, PC_VERY_DARK_BLUE); + GfxFillRect(r.left + 1, y, r.right - 1, y + this->resize.step_height - 1, PC_VERY_DARK_BLUE); } DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, item->title, _fios_colours[GetDetailedFileType(item->type)]); y += this->resize.step_height; @@ -461,8 +470,7 @@ public: } case WID_SL_DETAILS: { - GfxFillRect(r.left + WD_FRAMERECT_LEFT, r.top + WD_FRAMERECT_TOP, - r.right - WD_FRAMERECT_RIGHT, r.top + FONT_HEIGHT_NORMAL * 2 + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM, PC_GREY); + GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.top + FONT_HEIGHT_NORMAL * 2 + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM, PC_GREY); DrawString(r.left, r.right, r.top + FONT_HEIGHT_NORMAL / 2 + WD_FRAMERECT_TOP, STR_SAVELOAD_DETAIL_CAPTION, TC_FROMSTRING, SA_HOR_CENTER); if (this->selected == nullptr) break; From 686204ff1c9abb2fa4d9291077d964f5ad582ae5 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 1 Oct 2022 16:46:27 +0100 Subject: [PATCH 12/36] Change: Simplify widget layout of story book window. --- src/story_gui.cpp | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/story_gui.cpp b/src/story_gui.cpp index b456b39e9a..255b084bec 100644 --- a/src/story_gui.cpp +++ b/src/story_gui.cpp @@ -970,19 +970,15 @@ static const NWidgetPart _nested_story_book_widgets[] = { NWidget(WWT_STICKYBOX, COLOUR_BROWN), EndContainer(), NWidget(NWID_HORIZONTAL), SetFill(1, 1), - NWidget(NWID_VERTICAL), SetFill(1, 1), - NWidget(WWT_PANEL, COLOUR_BROWN, WID_SB_PAGE_PANEL), SetResize(1, 1), SetScrollbar(WID_SB_SCROLLBAR), EndContainer(), - NWidget(NWID_HORIZONTAL), - NWidget(WWT_TEXTBTN, COLOUR_BROWN, WID_SB_PREV_PAGE), SetMinimalSize(100, 0), SetFill(0, 0), SetDataTip(STR_STORY_BOOK_PREV_PAGE, STR_STORY_BOOK_PREV_PAGE_TOOLTIP), - NWidget(NWID_BUTTON_DROPDOWN, COLOUR_BROWN, WID_SB_SEL_PAGE), SetMinimalSize(93, 12), SetFill(1, 0), - SetDataTip(STR_BLACK_RAW_STRING, STR_STORY_BOOK_SEL_PAGE_TOOLTIP), SetResize(1, 0), - NWidget(WWT_TEXTBTN, COLOUR_BROWN, WID_SB_NEXT_PAGE), SetMinimalSize(100, 0), SetFill(0, 0), SetDataTip(STR_STORY_BOOK_NEXT_PAGE, STR_STORY_BOOK_NEXT_PAGE_TOOLTIP), - EndContainer(), - EndContainer(), - NWidget(NWID_VERTICAL), SetFill(0, 1), - NWidget(NWID_VSCROLLBAR, COLOUR_BROWN, WID_SB_SCROLLBAR), - NWidget(WWT_RESIZEBOX, COLOUR_BROWN), - EndContainer(), + NWidget(WWT_PANEL, COLOUR_BROWN, WID_SB_PAGE_PANEL), SetResize(1, 1), SetScrollbar(WID_SB_SCROLLBAR), EndContainer(), + NWidget(NWID_VSCROLLBAR, COLOUR_BROWN, WID_SB_SCROLLBAR), + EndContainer(), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_TEXTBTN, COLOUR_BROWN, WID_SB_PREV_PAGE), SetMinimalSize(100, 0), SetFill(0, 0), SetDataTip(STR_STORY_BOOK_PREV_PAGE, STR_STORY_BOOK_PREV_PAGE_TOOLTIP), + NWidget(NWID_BUTTON_DROPDOWN, COLOUR_BROWN, WID_SB_SEL_PAGE), SetMinimalSize(93, 12), SetFill(1, 0), + SetDataTip(STR_BLACK_RAW_STRING, STR_STORY_BOOK_SEL_PAGE_TOOLTIP), SetResize(1, 0), + NWidget(WWT_TEXTBTN, COLOUR_BROWN, WID_SB_NEXT_PAGE), SetMinimalSize(100, 0), SetFill(0, 0), SetDataTip(STR_STORY_BOOK_NEXT_PAGE, STR_STORY_BOOK_NEXT_PAGE_TOOLTIP), + NWidget(WWT_RESIZEBOX, COLOUR_BROWN), EndContainer(), }; From 33704269bd2496343024148264ad07de3ca4a682 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 2 Oct 2022 16:04:16 +0100 Subject: [PATCH 13/36] Change: Simplify widget layout of settings window. --- src/settings_gui.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index bc7eb98595..34bb961da0 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -2446,7 +2446,7 @@ static const NWidgetPart _nested_settings_selection_widgets[] = { NWidget(WWT_DEFSIZEBOX, COLOUR_MAUVE), EndContainer(), NWidget(WWT_PANEL, COLOUR_MAUVE), - NWidget(NWID_VERTICAL), SetPIP(0, WD_PAR_VSEP_NORMAL, 0), SetPadding(WD_TEXTPANEL_TOP, 0, WD_TEXTPANEL_BOTTOM, 0), + NWidget(NWID_VERTICAL), SetPIP(WD_TEXTPANEL_TOP, WD_PAR_VSEP_NORMAL, WD_TEXTPANEL_BOTTOM), NWidget(NWID_HORIZONTAL), SetPIP(WD_FRAMETEXT_LEFT, WD_FRAMETEXT_RIGHT, WD_FRAMETEXT_RIGHT), NWidget(WWT_TEXT, COLOUR_MAUVE, WID_GS_RESTRICT_CATEGORY), SetDataTip(STR_CONFIG_SETTING_RESTRICT_CATEGORY, STR_NULL), NWidget(WWT_DROPDOWN, COLOUR_MAUVE, WID_GS_RESTRICT_DROPDOWN), SetMinimalSize(100, 12), SetDataTip(STR_BLACK_STRING, STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT), SetFill(1, 0), SetResize(1, 0), @@ -2455,19 +2455,17 @@ static const NWidgetPart _nested_settings_selection_widgets[] = { NWidget(WWT_TEXT, COLOUR_MAUVE, WID_GS_RESTRICT_TYPE), SetDataTip(STR_CONFIG_SETTING_RESTRICT_TYPE, STR_NULL), NWidget(WWT_DROPDOWN, COLOUR_MAUVE, WID_GS_TYPE_DROPDOWN), SetMinimalSize(100, 12), SetDataTip(STR_BLACK_STRING, STR_CONFIG_SETTING_TYPE_DROPDOWN_HELPTEXT), SetFill(1, 0), SetResize(1, 0), EndContainer(), - EndContainer(), - NWidget(NWID_HORIZONTAL), SetPadding(0, 0, WD_TEXTPANEL_BOTTOM, 0), - SetPIP(WD_FRAMETEXT_LEFT, WD_FRAMETEXT_RIGHT, WD_FRAMETEXT_RIGHT), - NWidget(WWT_TEXT, COLOUR_MAUVE), SetFill(0, 1), SetDataTip(STR_CONFIG_SETTING_FILTER_TITLE, STR_NULL), - NWidget(WWT_EDITBOX, COLOUR_MAUVE, WID_GS_FILTER), SetFill(1, 0), SetMinimalSize(50, 12), SetResize(1, 0), - SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP), + NWidget(NWID_HORIZONTAL), SetPIP(WD_FRAMETEXT_LEFT, WD_FRAMETEXT_RIGHT, WD_FRAMETEXT_RIGHT), + NWidget(WWT_TEXT, COLOUR_MAUVE), SetFill(0, 1), SetDataTip(STR_CONFIG_SETTING_FILTER_TITLE, STR_NULL), + NWidget(WWT_EDITBOX, COLOUR_MAUVE, WID_GS_FILTER), SetMinimalSize(50, 12), SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP), SetFill(1, 0), SetResize(1, 0), + EndContainer(), EndContainer(), EndContainer(), NWidget(NWID_HORIZONTAL), NWidget(WWT_PANEL, COLOUR_MAUVE, WID_GS_OPTIONSPANEL), SetMinimalSize(400, 174), SetScrollbar(WID_GS_SCROLLBAR), EndContainer(), NWidget(NWID_VSCROLLBAR, COLOUR_MAUVE, WID_GS_SCROLLBAR), EndContainer(), - NWidget(WWT_PANEL, COLOUR_MAUVE), SetMinimalSize(400, 40), + NWidget(WWT_PANEL, COLOUR_MAUVE), NWidget(WWT_EMPTY, INVALID_COLOUR, WID_GS_HELP_TEXT), SetMinimalSize(300, 25), SetFill(1, 1), SetResize(1, 0), SetPadding(WD_FRAMETEXT_TOP, WD_FRAMETEXT_RIGHT, WD_FRAMETEXT_BOTTOM, WD_FRAMETEXT_LEFT), EndContainer(), From edbf99ed177279689e4978718fab0e657652beb0 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 2 Oct 2022 19:23:21 +0100 Subject: [PATCH 14/36] Change: Use standard sizing for AI competitor limit buttons. --- src/ai/ai_gui.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/ai/ai_gui.cpp b/src/ai/ai_gui.cpp index c4a8667620..b97e9f72ea 100644 --- a/src/ai/ai_gui.cpp +++ b/src/ai/ai_gui.cpp @@ -685,10 +685,10 @@ static const NWidgetPart _nested_ai_config_widgets[] = { NWidget(WWT_PANEL, COLOUR_MAUVE, WID_AIC_BACKGROUND), NWidget(NWID_VERTICAL), SetPIP(4, 4, 4), NWidget(NWID_HORIZONTAL), SetPIP(7, 0, 7), - NWidget(WWT_PUSHARROWBTN, COLOUR_YELLOW, WID_AIC_DECREASE), SetFill(0, 1), SetDataTip(AWV_DECREASE, STR_NULL), - NWidget(WWT_PUSHARROWBTN, COLOUR_YELLOW, WID_AIC_INCREASE), SetFill(0, 1), SetDataTip(AWV_INCREASE, STR_NULL), + NWidget(WWT_PUSHARROWBTN, COLOUR_YELLOW, WID_AIC_DECREASE), SetDataTip(AWV_DECREASE, STR_NULL), + NWidget(WWT_PUSHARROWBTN, COLOUR_YELLOW, WID_AIC_INCREASE), SetDataTip(AWV_INCREASE, STR_NULL), NWidget(NWID_SPACER), SetMinimalSize(6, 0), - NWidget(WWT_TEXT, COLOUR_MAUVE, WID_AIC_NUMBER), SetDataTip(STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS, STR_NULL), SetFill(1, 0), SetPadding(1, 0, 0, 0), + NWidget(WWT_TEXT, COLOUR_MAUVE, WID_AIC_NUMBER), SetDataTip(STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS, STR_NULL), SetFill(1, 0), EndContainer(), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(7, 0, 7), NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_MOVE_UP), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_AI_CONFIG_MOVE_UP, STR_AI_CONFIG_MOVE_UP_TOOLTIP), @@ -780,6 +780,11 @@ struct AIConfigWindow : public Window { void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override { switch (widget) { + case WID_AIC_DECREASE: + case WID_AIC_INCREASE: + *size = maxdim(*size, NWidgetScrollbar::GetHorizontalDimension()); + break; + case WID_AIC_GAMELIST: this->line_height = FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM; size->height = 1 * this->line_height; From ccb62c3a5588f7f3f096c7df173b7d89745e9c0f Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 2 Oct 2022 19:24:48 +0100 Subject: [PATCH 15/36] Change: Simplify industry-cargoes widgets. --- src/industry_gui.cpp | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index ee23373ac4..d69d6c0e0c 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -1869,22 +1869,18 @@ static const NWidgetPart _nested_industry_cargoes_widgets[] = { NWidget(WWT_STICKYBOX, COLOUR_BROWN), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(NWID_VERTICAL), - NWidget(WWT_PANEL, COLOUR_BROWN, WID_IC_PANEL), SetResize(1, 10), SetMinimalSize(200, 90), SetScrollbar(WID_IC_SCROLLBAR), EndContainer(), - NWidget(NWID_HORIZONTAL), - NWidget(WWT_TEXTBTN, COLOUR_BROWN, WID_IC_NOTIFY), - SetDataTip(STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP, STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP_TOOLTIP), - NWidget(WWT_PANEL, COLOUR_BROWN), SetFill(1, 0), SetResize(0, 0), EndContainer(), - NWidget(WWT_DROPDOWN, COLOUR_BROWN, WID_IC_IND_DROPDOWN), SetFill(0, 0), SetResize(0, 0), - SetDataTip(STR_INDUSTRY_CARGOES_SELECT_INDUSTRY, STR_INDUSTRY_CARGOES_SELECT_INDUSTRY_TOOLTIP), - NWidget(WWT_DROPDOWN, COLOUR_BROWN, WID_IC_CARGO_DROPDOWN), SetFill(0, 0), SetResize(0, 0), - SetDataTip(STR_INDUSTRY_CARGOES_SELECT_CARGO, STR_INDUSTRY_CARGOES_SELECT_CARGO_TOOLTIP), - EndContainer(), - EndContainer(), - NWidget(NWID_VERTICAL), - NWidget(NWID_VSCROLLBAR, COLOUR_BROWN, WID_IC_SCROLLBAR), - NWidget(WWT_RESIZEBOX, COLOUR_BROWN), - EndContainer(), + NWidget(WWT_PANEL, COLOUR_BROWN, WID_IC_PANEL), SetResize(1, 10), SetMinimalSize(200, 90), SetScrollbar(WID_IC_SCROLLBAR), EndContainer(), + NWidget(NWID_VSCROLLBAR, COLOUR_BROWN, WID_IC_SCROLLBAR), + EndContainer(), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_TEXTBTN, COLOUR_BROWN, WID_IC_NOTIFY), + SetDataTip(STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP, STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP_TOOLTIP), + NWidget(WWT_PANEL, COLOUR_BROWN), SetFill(1, 0), SetResize(0, 0), EndContainer(), + NWidget(WWT_DROPDOWN, COLOUR_BROWN, WID_IC_IND_DROPDOWN), SetFill(0, 0), SetResize(0, 0), + SetDataTip(STR_INDUSTRY_CARGOES_SELECT_INDUSTRY, STR_INDUSTRY_CARGOES_SELECT_INDUSTRY_TOOLTIP), + NWidget(WWT_DROPDOWN, COLOUR_BROWN, WID_IC_CARGO_DROPDOWN), SetFill(0, 0), SetResize(0, 0), + SetDataTip(STR_INDUSTRY_CARGOES_SELECT_CARGO, STR_INDUSTRY_CARGOES_SELECT_CARGO_TOOLTIP), + NWidget(WWT_RESIZEBOX, COLOUR_BROWN), EndContainer(), }; From 3e86f337a80ba56faaf1fb5ab55a84a4aa7bdd97 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 13 Sep 2022 18:11:00 +0100 Subject: [PATCH 16/36] Change: Simplify graph's company key window. --- src/graph_gui.cpp | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/graph_gui.cpp b/src/graph_gui.cpp index 4779f811a8..e5e09aa66b 100644 --- a/src/graph_gui.cpp +++ b/src/graph_gui.cpp @@ -110,14 +110,15 @@ struct GraphLegendWindow : Window { */ static NWidgetBase *MakeNWidgetCompanyLines(int *biggest_index) { - NWidgetVertical *vert = new NWidgetVertical(); + NWidgetVertical *vert = new NWidgetVertical(NC_EQUALSIZE); + vert->SetPadding(2, 2, 2, 2); uint sprite_height = GetSpriteSize(SPR_COMPANY_ICON, nullptr, ZOOM_LVL_OUT_4X).height; for (int widnum = WID_GL_FIRST_COMPANY; widnum <= WID_GL_LAST_COMPANY; widnum++) { NWidgetBackground *panel = new NWidgetBackground(WWT_PANEL, COLOUR_BROWN, widnum); - panel->SetMinimalSize(246, sprite_height); + panel->SetMinimalSize(246, sprite_height + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM); panel->SetMinimalTextLines(1, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM, FS_NORMAL); - panel->SetFill(1, 0); + panel->SetFill(1, 1); panel->SetDataTip(0x0, STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP); vert->Add(panel); } @@ -133,13 +134,7 @@ static const NWidgetPart _nested_graph_legend_widgets[] = { NWidget(WWT_STICKYBOX, COLOUR_BROWN), EndContainer(), NWidget(WWT_PANEL, COLOUR_BROWN, WID_GL_BACKGROUND), - NWidget(NWID_SPACER), SetMinimalSize(0, 2), - NWidget(NWID_HORIZONTAL), - NWidget(NWID_SPACER), SetMinimalSize(2, 0), - NWidgetFunction(MakeNWidgetCompanyLines), - NWidget(NWID_SPACER), SetMinimalSize(2, 0), - EndContainer(), - NWidget(NWID_SPACER), SetMinimalSize(0, 2), + NWidgetFunction(MakeNWidgetCompanyLines), EndContainer(), }; From db98cedb7e2a6028580fe9171542efb3422687c1 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Wed, 11 May 2022 18:52:38 -0600 Subject: [PATCH 17/36] Fix #9883: Show cost/income float over end tile of rail or road construction --- src/rail_cmd.cpp | 6 +++--- src/rail_gui.cpp | 4 ++-- src/road_cmd.cpp | 10 +++++----- src/road_gui.cpp | 4 ++-- src/script/api/script_rail.cpp | 4 ++-- src/script/api/script_road.cpp | 6 +++--- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index 6346730cc8..a0e0596042 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -922,8 +922,8 @@ static CommandCost CmdRailTrackHelper(DoCommandFlag flags, TileIndex tile, TileI * Build rail on a stretch of track. * Stub for the unified rail builder/remover * @param flags operation to perform - * @param tile start tile of drag * @param end_tile end tile of drag + * @param start_tile start tile of drag * @param railtype railroad type normal/maglev (0 = normal, 1 = mono, 2 = maglev), only used for building * @param track track-orientation * @param auto_remove_signals false = build up to an obstacle, true = fail if an obstacle is found (used for AIs). @@ -931,9 +931,9 @@ static CommandCost CmdRailTrackHelper(DoCommandFlag flags, TileIndex tile, TileI * @see CmdRailTrackHelper */ -CommandCost CmdBuildRailroadTrack(DoCommandFlag flags, TileIndex tile, TileIndex end_tile, RailType railtype, Track track, bool auto_remove_signals, bool fail_on_obstacle) +CommandCost CmdBuildRailroadTrack(DoCommandFlag flags, TileIndex end_tile, TileIndex start_tile, RailType railtype, Track track, bool auto_remove_signals, bool fail_on_obstacle) { - return CmdRailTrackHelper(flags, tile, end_tile, railtype, track, false, auto_remove_signals, fail_on_obstacle); + return CmdRailTrackHelper(flags, start_tile, end_tile, railtype, track, false, auto_remove_signals, fail_on_obstacle); } /** diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 8d7a0d1545..f5aad3b9b2 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -355,10 +355,10 @@ static void DoRailroadTrack(Track track) { if (_remove_button_clicked) { Command::Post(STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK, CcPlaySound_CONSTRUCTION_RAIL, - TileVirtXY(_thd.selstart.x, _thd.selstart.y), TileVirtXY(_thd.selend.x, _thd.selend.y), track); + TileVirtXY(_thd.selend.x, _thd.selend.y), TileVirtXY(_thd.selstart.x, _thd.selstart.y), track); } else { Command::Post(STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK, CcPlaySound_CONSTRUCTION_RAIL, - TileVirtXY(_thd.selstart.x, _thd.selstart.y), TileVirtXY(_thd.selend.x, _thd.selend.y), _cur_railtype, track, _settings_client.gui.auto_remove_signals, false); + TileVirtXY(_thd.selend.x, _thd.selend.y), TileVirtXY(_thd.selstart.x, _thd.selstart.y), _cur_railtype, track, _settings_client.gui.auto_remove_signals, false); } } diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index 7394075442..f5dc54332b 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -962,8 +962,8 @@ static bool CanConnectToRoad(TileIndex tile, RoadType rt, DiagDirection dir) /** * Build a long piece of road. * @param flags operation to perform - * @param start_tile start tile of drag (the building cost will appear over this tile) * @param end_tile end tile of drag + * @param start_tile start tile of drag * @param rt road type * @param axis direction * @param drd set road direction @@ -974,7 +974,7 @@ static bool CanConnectToRoad(TileIndex tile, RoadType rt, DiagDirection dir) * - true = Fail if an obstacle is found. Always take into account start_half and end_half. This behavior is used for scripts * @return the cost of this operation or an error */ -CommandCost CmdBuildLongRoad(DoCommandFlag flags, TileIndex start_tile, TileIndex end_tile, RoadType rt, Axis axis, DisallowedRoadDirections drd, bool start_half, bool end_half, bool is_ai) +CommandCost CmdBuildLongRoad(DoCommandFlag flags, TileIndex end_tile, TileIndex start_tile, RoadType rt, Axis axis, DisallowedRoadDirections drd, bool start_half, bool end_half, bool is_ai) { if (end_tile >= MapSize()) return CMD_ERROR; @@ -1062,15 +1062,15 @@ CommandCost CmdBuildLongRoad(DoCommandFlag flags, TileIndex start_tile, TileInde /** * Remove a long piece of road. * @param flags operation to perform - * @param start_tile start tile of drag * @param end_tile end tile of drag + * @param start_tile start tile of drag * @param rt road type * @param axis direction * @param start_half start tile starts in the 2nd half of tile * @param end_half end tile starts in the 2nd half of tile (p2 & 2) * @return the cost of this operation or an error */ -std::tuple CmdRemoveLongRoad(DoCommandFlag flags, TileIndex start_tile, TileIndex end_tile, RoadType rt, Axis axis, bool start_half, bool end_half) +std::tuple CmdRemoveLongRoad(DoCommandFlag flags, TileIndex end_tile, TileIndex start_tile, RoadType rt, Axis axis, bool start_half, bool end_half) { CommandCost cost(EXPENSES_CONSTRUCTION); @@ -1107,7 +1107,7 @@ std::tuple CmdRemoveLongRoad(DoCommandFlag flags, TileIndex if (flags & DC_EXEC) { money_spent += ret.GetCost(); if (money_spent > 0 && money_spent > money_available) { - return { cost, std::get<0>(Command::Do(flags & ~DC_EXEC, start_tile, end_tile, rt, axis, start_half, end_half)).GetCost() }; + return { cost, std::get<0>(Command::Do(flags & ~DC_EXEC, end_tile, start_tile, rt, axis, start_half, end_half)).GetCost() }; } RemoveRoad(tile, flags, bits, rtt, true, false); } diff --git a/src/road_gui.cpp b/src/road_gui.cpp index b523ec3356..cb49688d5d 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -642,10 +642,10 @@ struct BuildRoadToolbarWindow : Window { if (_remove_button_clicked) { Command::Post(this->rti->strings.err_remove_road, CcPlaySound_CONSTRUCTION_OTHER, - start_tile, end_tile, _cur_roadtype, _place_road_dir, start_half, _place_road_end_half); + end_tile, start_tile, _cur_roadtype, _place_road_dir, start_half, _place_road_end_half); } else { Command::Post(this->rti->strings.err_build_road, CcPlaySound_CONSTRUCTION_OTHER, - start_tile, end_tile, _cur_roadtype, _place_road_dir, _one_way_button_clicked ? DRD_NORTHBOUND : DRD_NONE, start_half, _place_road_end_half, false); + end_tile, start_tile, _cur_roadtype, _place_road_dir, _one_way_button_clicked ? DRD_NORTHBOUND : DRD_NONE, start_half, _place_road_end_half, false); } break; } diff --git a/src/script/api/script_rail.cpp b/src/script/api/script_rail.cpp index 462dc1311a..39f14cd0be 100644 --- a/src/script/api/script_rail.cpp +++ b/src/script/api/script_rail.cpp @@ -365,7 +365,7 @@ static Track SimulateDrag(TileIndex from, TileIndex tile, TileIndex *to) (::TileY(from) == ::TileY(tile) && ::TileY(tile) == ::TileY(to))); Track track = SimulateDrag(from, tile, &to); - return ScriptObject::Command::Do(tile, to, (::RailType)ScriptRail::GetCurrentRailType(), track, false, true); + return ScriptObject::Command::Do(to, tile, (::RailType)ScriptRail::GetCurrentRailType(), track, false, true); } /* static */ bool ScriptRail::RemoveRail(TileIndex from, TileIndex tile, TileIndex to) @@ -382,7 +382,7 @@ static Track SimulateDrag(TileIndex from, TileIndex tile, TileIndex *to) (::TileY(from) == ::TileY(tile) && ::TileY(tile) == ::TileY(to))); Track track = SimulateDrag(from, tile, &to); - return ScriptObject::Command::Do(tile, to, track); + return ScriptObject::Command::Do(to, tile, track); } /** diff --git a/src/script/api/script_road.cpp b/src/script/api/script_road.cpp index cae144a871..65ee83f5bb 100644 --- a/src/script/api/script_road.cpp +++ b/src/script/api/script_road.cpp @@ -496,7 +496,7 @@ static bool NeighbourHasReachableRoad(::RoadType rt, TileIndex start_tile, DiagD EnforcePrecondition(false, IsRoadTypeAvailable(GetCurrentRoadType())); Axis axis = ::TileY(start) != ::TileY(end) ? AXIS_Y : AXIS_X; - return ScriptObject::Command::Do(start, end, ScriptObject::GetRoadType(), axis, one_way ? DRD_NORTHBOUND : DRD_NONE, (start < end) == !full, (start < end) != !full, true); + return ScriptObject::Command::Do(end, start, ScriptObject::GetRoadType(), axis, one_way ? DRD_NORTHBOUND : DRD_NONE, (start < end) == !full, (start < end) != !full, true); } /* static */ bool ScriptRoad::BuildRoad(TileIndex start, TileIndex end) @@ -571,7 +571,7 @@ static bool NeighbourHasReachableRoad(::RoadType rt, TileIndex start_tile, DiagD EnforcePrecondition(false, ::TileX(start) == ::TileX(end) || ::TileY(start) == ::TileY(end)); EnforcePrecondition(false, IsRoadTypeAvailable(GetCurrentRoadType())); - return ScriptObject::Command::Do(start, end, ScriptObject::GetRoadType(), ::TileY(start) != ::TileY(end) ? AXIS_Y : AXIS_X, start < end, start >= end); + return ScriptObject::Command::Do(end, start, ScriptObject::GetRoadType(), ::TileY(start) != ::TileY(end) ? AXIS_Y : AXIS_X, start < end, start >= end); } /* static */ bool ScriptRoad::RemoveRoadFull(TileIndex start, TileIndex end) @@ -583,7 +583,7 @@ static bool NeighbourHasReachableRoad(::RoadType rt, TileIndex start_tile, DiagD EnforcePrecondition(false, ::TileX(start) == ::TileX(end) || ::TileY(start) == ::TileY(end)); EnforcePrecondition(false, IsRoadTypeAvailable(GetCurrentRoadType())); - return ScriptObject::Command::Do(start, end, ScriptObject::GetRoadType(), ::TileY(start) != ::TileY(end) ? AXIS_Y : AXIS_X, start >= end, start < end); + return ScriptObject::Command::Do(end, start, ScriptObject::GetRoadType(), ::TileY(start) != ::TileY(end) ? AXIS_Y : AXIS_X, start >= end, start < end); } /* static */ bool ScriptRoad::RemoveRoadDepot(TileIndex tile) From 296af146fb786db23c8daaac26aa815e46e8cf94 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 23 Sep 2022 22:47:50 +0100 Subject: [PATCH 18/36] Change: Default widget text colour to black. TC_FROMSTRING really means blue, and we almost never actually use blue text. --- src/network/network_chat_gui.cpp | 2 +- src/widget.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/network/network_chat_gui.cpp b/src/network/network_chat_gui.cpp index 8645c11da8..cbaf4b9163 100644 --- a/src/network/network_chat_gui.cpp +++ b/src/network/network_chat_gui.cpp @@ -508,7 +508,7 @@ static const NWidgetPart _nested_chat_window_widgets[] = { NWidget(WWT_CLOSEBOX, COLOUR_GREY, WID_NC_CLOSE), NWidget(WWT_PANEL, COLOUR_GREY, WID_NC_BACKGROUND), NWidget(NWID_HORIZONTAL), - NWidget(WWT_TEXT, COLOUR_GREY, WID_NC_DESTINATION), SetMinimalSize(62, 12), SetPadding(1, 0, 1, 0), SetTextColour(TC_BLACK), SetAlignment(SA_TOP | SA_RIGHT), SetDataTip(STR_NULL, STR_NULL), + NWidget(WWT_TEXT, COLOUR_GREY, WID_NC_DESTINATION), SetMinimalSize(62, 12), SetPadding(1, 0, 1, 0), SetAlignment(SA_TOP | SA_RIGHT), SetDataTip(STR_NULL, STR_NULL), NWidget(WWT_EDITBOX, COLOUR_GREY, WID_NC_TEXTBOX), SetMinimalSize(100, 12), SetPadding(1, 0, 1, 0), SetResize(1, 0), SetDataTip(STR_NETWORK_CHAT_OSKTITLE, STR_NULL), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_NC_SENDBUTTON), SetMinimalSize(62, 12), SetPadding(1, 0, 1, 0), SetDataTip(STR_NETWORK_CHAT_SEND, STR_NULL), diff --git a/src/widget.cpp b/src/widget.cpp index abd413ca28..acc18b15e3 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -940,7 +940,7 @@ NWidgetCore::NWidgetCore(WidgetType tp, Colours colour, uint fill_x, uint fill_y this->widget_data = widget_data; this->tool_tip = tool_tip; this->scrollbar_index = -1; - this->text_colour = TC_FROMSTRING; + this->text_colour = TC_BLACK; this->align = SA_CENTER; } From 0e3400894fda259dc358482d83fc584eaff31ee8 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 23 Sep 2022 22:55:17 +0100 Subject: [PATCH 19/36] Cleanup: Remove redundant WWT_PANEL SetDataTips. WWT_PANEL defaults to 0x0 data and no tooltip, so no need to declare the same in the widget tree. --- src/rail_gui.cpp | 2 +- src/station_gui.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index f5aad3b9b2..c67f007522 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -813,7 +813,7 @@ static const NWidgetPart _nested_build_rail_widgets[] = { NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_RAT_AUTORAIL), SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_AUTORAIL, STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL), - NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetMinimalSize(4, 22), SetDataTip(0x0, STR_NULL), EndContainer(), + NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetMinimalSize(4, 22), EndContainer(), NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_RAT_DEMOLISH), SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_DYNAMITE, STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC), diff --git a/src/station_gui.cpp b/src/station_gui.cpp index 9233878212..3e76b5fabc 100644 --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -754,12 +754,12 @@ static const NWidgetPart _nested_company_stations_widgets[] = { NWidgetFunction(CargoWidgets), NWidget(WWT_PANEL, COLOUR_GREY, WID_STL_NOCARGOWAITING), SetMinimalSize(14, 0), SetMinimalTextLines(1, 0), SetDataTip(0x0, STR_STATION_LIST_NO_WAITING_CARGO), SetFill(0, 1), EndContainer(), NWidget(WWT_PUSHBTN, COLOUR_GREY, WID_STL_CARGOALL), SetMinimalSize(14, 0), SetMinimalTextLines(1, 0), SetDataTip(0x0, STR_STATION_LIST_SELECT_ALL_TYPES), SetFill(0, 1), - NWidget(WWT_PANEL, COLOUR_GREY), SetDataTip(0x0, STR_NULL), SetResize(1, 0), SetFill(1, 1), EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0), SetFill(1, 1), EndContainer(), EndContainer(), NWidget(NWID_HORIZONTAL), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_STL_SORTBY), SetMinimalSize(81, 12), SetDataTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER), NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_STL_SORTDROPBTN), SetMinimalSize(163, 12), SetDataTip(STR_SORT_BY_NAME, STR_TOOLTIP_SORT_CRITERIA), // widget_data gets overwritten. - NWidget(WWT_PANEL, COLOUR_GREY), SetDataTip(0x0, STR_NULL), SetResize(1, 0), SetFill(1, 1), EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0), SetFill(1, 1), EndContainer(), EndContainer(), NWidget(NWID_HORIZONTAL), NWidget(WWT_PANEL, COLOUR_GREY, WID_STL_LIST), SetMinimalSize(346, 125), SetResize(1, 10), SetDataTip(0x0, STR_STATION_LIST_TOOLTIP), SetScrollbar(WID_STL_SCROLLBAR), EndContainer(), From dc1b84aa1ea9facb7b0e13b30a4905a6bc0cb973 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 23 Sep 2022 22:49:38 +0100 Subject: [PATCH 20/36] Cleanup: Text widgets are capable of drawing text without assistance. Remove custom text drawing of some widgets in favour of standard text widgets. --- src/genworld_gui.cpp | 13 ++--------- src/network/network_content_gui.cpp | 10 +-------- src/station_gui.cpp | 34 +++-------------------------- src/toolbar_gui.cpp | 17 +++++++++------ 4 files changed, 16 insertions(+), 58 deletions(-) diff --git a/src/genworld_gui.cpp b/src/genworld_gui.cpp index 4d238dc835..9e915304ea 100644 --- a/src/genworld_gui.cpp +++ b/src/genworld_gui.cpp @@ -225,7 +225,7 @@ static const NWidgetPart _nested_heightmap_load_widgets[] = { EndContainer(), /* Widgets at the right of the labels. */ NWidget(NWID_VERTICAL), SetPIP(0, 4, 0), - NWidget(WWT_EMPTY, COLOUR_ORANGE, WID_GL_HEIGHTMAP_NAME_TEXT), SetFill(1, 0), + NWidget(WWT_TEXT, COLOUR_ORANGE, WID_GL_HEIGHTMAP_NAME_TEXT), SetTextColour(TC_ORANGE), SetDataTip(STR_JUST_RAW_STRING, STR_EMPTY), SetFill(1, 0), NWidget(NWID_HORIZONTAL), SetPIP(0, 5, 0), NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0), NWidget(WWT_TEXT, COLOUR_ORANGE, WID_GL_HEIGHTMAP_SIZE_TEXT), SetDataTip(STR_MAPGEN_HEIGHTMAP_SIZE, STR_NULL), SetFill(1, 0), @@ -441,6 +441,7 @@ struct GenerateLandscapeWindow : public Window { } break; + case WID_GL_HEIGHTMAP_NAME_TEXT: SetDParamStr(0, this->name); break; case WID_GL_RIVER_PULLDOWN: SetDParam(0, _rivers[_settings_newgame.game_creation.amount_of_rivers]); break; case WID_GL_SMOOTHNESS_PULLDOWN: SetDParam(0, _smoothness[_settings_newgame.game_creation.tgen_smoothness]); break; case WID_GL_VARIETY_PULLDOWN: SetDParam(0, _variety[_settings_newgame.game_creation.variety]); break; @@ -624,16 +625,6 @@ struct GenerateLandscapeWindow : public Window { size->height = std::max(size->height, (uint)(FONT_HEIGHT_NORMAL + WD_DROPDOWNTEXT_TOP + WD_DROPDOWNTEXT_BOTTOM)); } - void DrawWidget(const Rect &r, int widget) const override - { - switch (widget) { - case WID_GL_HEIGHTMAP_NAME_TEXT: { - DrawString(r.left, r.right, r.top, this->name, TC_ORANGE); - break; - } - } - } - void OnClick(Point pt, int widget, int click_count) override { switch (widget) { diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp index 483e2b5273..9903bb2644 100644 --- a/src/network/network_content_gui.cpp +++ b/src/network/network_content_gui.cpp @@ -559,10 +559,6 @@ public: void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override { switch (widget) { - case WID_NCL_FILTER_CAPT: - *size = maxdim(*size, GetStringBoundingBox(STR_CONTENT_FILTER_TITLE)); - break; - case WID_NCL_CHECKBOX: size->width = this->checkbox_size.width + WD_MATRIX_RIGHT + WD_MATRIX_LEFT; break; @@ -587,10 +583,6 @@ public: void DrawWidget(const Rect &r, int widget) const override { switch (widget) { - case WID_NCL_FILTER_CAPT: - DrawString(r.left, r.right, r.top, STR_CONTENT_FILTER_TITLE, TC_FROMSTRING, SA_RIGHT); - break; - case WID_NCL_DETAILS: this->DrawDetails(r); break; @@ -1029,7 +1021,7 @@ static const NWidgetPart _nested_network_content_list_widgets[] = { NWidget(NWID_SPACER), SetMinimalSize(0, 7), SetResize(1, 0), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(8, 8, 8), /* Top */ - NWidget(WWT_EMPTY, COLOUR_LIGHT_BLUE, WID_NCL_FILTER_CAPT), SetFill(1, 0), SetResize(1, 0), + NWidget(WWT_TEXT, COLOUR_LIGHT_BLUE, WID_NCL_FILTER_CAPT), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_CONTENT_FILTER_TITLE, STR_NULL), SetAlignment(SA_RIGHT), NWidget(WWT_EDITBOX, COLOUR_LIGHT_BLUE, WID_NCL_FILTER), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP), EndContainer(), diff --git a/src/station_gui.cpp b/src/station_gui.cpp index 3e76b5fabc..965b7e04f2 100644 --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -403,16 +403,6 @@ public: this->rating_width = this->rating_width * 16 / 10; break; - case WID_STL_CARGOALL: - case WID_STL_FACILALL: - case WID_STL_NOCARGOWAITING: { - Dimension d = GetStringBoundingBox(widget == WID_STL_NOCARGOWAITING ? STR_ABBREV_NONE : STR_ABBREV_ALL); - d.width += padding.width + 2; - d.height += padding.height; - *size = maxdim(*size, d); - break; - } - default: if (widget >= WID_STL_CARGOSTART) { Dimension d = GetStringBoundingBox(_sorted_cargo_specs[widget - WID_STL_CARGOSTART]->abbrev); @@ -492,24 +482,6 @@ public: break; } - case WID_STL_NOCARGOWAITING: { - int cg_ofst = this->IsWidgetLowered(widget) ? 1 : 0; - DrawString(r.left + cg_ofst, r.right + cg_ofst, r.top + (r.bottom - r.top - FONT_HEIGHT_SMALL) / 2 + cg_ofst, STR_ABBREV_NONE, TC_BLACK, SA_HOR_CENTER); - break; - } - - case WID_STL_CARGOALL: { - int cg_ofst = this->IsWidgetLowered(widget) ? 1 : 0; - DrawString(r.left + cg_ofst, r.right + cg_ofst, r.top + (r.bottom - r.top - FONT_HEIGHT_SMALL) / 2 + cg_ofst, STR_ABBREV_ALL, TC_BLACK, SA_HOR_CENTER); - break; - } - - case WID_STL_FACILALL: { - int cg_ofst = this->IsWidgetLowered(widget) ? 1 : 0; - DrawString(r.left + cg_ofst, r.right + cg_ofst, r.top + (r.bottom - r.top - FONT_HEIGHT_SMALL) / 2 + cg_ofst, STR_ABBREV_ALL, TC_BLACK, SA_HOR_CENTER); - break; - } - default: if (widget >= WID_STL_CARGOSTART) { const CargoSpec *cs = _sorted_cargo_specs[widget - WID_STL_CARGOSTART]; @@ -749,11 +721,11 @@ static const NWidgetPart _nested_company_stations_widgets[] = { NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_STL_BUS), SetMinimalSize(14, 0), SetMinimalTextLines(1, 0), SetDataTip(STR_BUS, STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE), SetFill(0, 1), NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_STL_SHIP), SetMinimalSize(14, 0), SetMinimalTextLines(1, 0), SetDataTip(STR_SHIP, STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE), SetFill(0, 1), NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_STL_AIRPLANE), SetMinimalSize(14, 0), SetMinimalTextLines(1, 0), SetDataTip(STR_PLANE, STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE), SetFill(0, 1), - NWidget(WWT_PUSHBTN, COLOUR_GREY, WID_STL_FACILALL), SetMinimalSize(14, 0), SetMinimalTextLines(1, 0), SetDataTip(0x0, STR_STATION_LIST_SELECT_ALL_FACILITIES), SetFill(0, 1), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_STL_FACILALL), SetMinimalSize(14, 0), SetMinimalTextLines(1, 0), SetDataTip(STR_ABBREV_ALL, STR_STATION_LIST_SELECT_ALL_FACILITIES), SetFill(0, 1), NWidget(WWT_PANEL, COLOUR_GREY), SetMinimalSize(5, 0), SetFill(0, 1), EndContainer(), NWidgetFunction(CargoWidgets), - NWidget(WWT_PANEL, COLOUR_GREY, WID_STL_NOCARGOWAITING), SetMinimalSize(14, 0), SetMinimalTextLines(1, 0), SetDataTip(0x0, STR_STATION_LIST_NO_WAITING_CARGO), SetFill(0, 1), EndContainer(), - NWidget(WWT_PUSHBTN, COLOUR_GREY, WID_STL_CARGOALL), SetMinimalSize(14, 0), SetMinimalTextLines(1, 0), SetDataTip(0x0, STR_STATION_LIST_SELECT_ALL_TYPES), SetFill(0, 1), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_STL_NOCARGOWAITING), SetMinimalSize(14, 0), SetMinimalTextLines(1, 0), SetDataTip(STR_ABBREV_NONE, STR_STATION_LIST_NO_WAITING_CARGO), SetFill(0, 1), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_STL_CARGOALL), SetMinimalSize(14, 0), SetMinimalTextLines(1, 0), SetDataTip(STR_ABBREV_ALL, STR_STATION_LIST_SELECT_ALL_TYPES), SetFill(0, 1), NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0), SetFill(1, 1), EndContainer(), EndContainer(), NWidget(NWID_HORIZONTAL), diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index 8ccbc7b5bd..8c2db4d887 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -2336,14 +2336,18 @@ struct ScenarioEditorToolbarWindow : Window { this->DrawWidgets(); } - void DrawWidget(const Rect &r, int widget) const override + void SetStringParameters(int widget) const override { switch (widget) { case WID_TE_DATE: SetDParam(0, ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1)); - DrawString(r.left, r.right, (this->height - FONT_HEIGHT_NORMAL) / 2, STR_WHITE_DATE_LONG, TC_FROMSTRING, SA_HOR_CENTER); break; + } + } + void DrawWidget(const Rect &r, int widget) const override + { + switch (widget) { case WID_TE_SPACER: { int height = r.bottom - r.top; if (height > 2 * FONT_HEIGHT_NORMAL) { @@ -2367,7 +2371,6 @@ struct ScenarioEditorToolbarWindow : Window { case WID_TE_DATE: SetDParam(0, ConvertYMDToDate(MAX_YEAR, 0, 1)); *size = GetStringBoundingBox(STR_WHITE_DATE_LONG); - size->height = std::max(size->height, GetSpriteSize(SPR_IMG_SAVE).height + WD_IMGBTN_TOP + WD_IMGBTN_BOTTOM); break; } } @@ -2530,10 +2533,10 @@ static const NWidgetPart _nested_toolb_scen_inner_widgets[] = { NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_SPACER), EndContainer(), NWidget(NWID_SPACER), NWidget(WWT_PANEL, COLOUR_GREY, WID_TE_DATE_PANEL), - NWidget(NWID_HORIZONTAL), SetPIP(3, 2, 3), - NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_DATE_BACKWARD), SetDataTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD), - NWidget(WWT_EMPTY, COLOUR_GREY, WID_TE_DATE), SetDataTip(STR_NULL, STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE), - NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_DATE_FORWARD), SetDataTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD), + NWidget(NWID_HORIZONTAL), SetPIP(2, 2, 2), SetPadding(1), + NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_DATE_BACKWARD), SetDataTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD), SetFill(0, 1), + NWidget(WWT_TEXT, COLOUR_GREY, WID_TE_DATE), SetDataTip(STR_WHITE_DATE_LONG, STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE), SetAlignment(SA_CENTER), SetFill(0, 1), + NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_DATE_FORWARD), SetDataTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD), SetFill(0, 1), EndContainer(), EndContainer(), NWidget(NWID_SPACER), From ba94efba87955a3acd3fc1caa0ff6c9bdc70d767 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 2 Oct 2022 19:34:22 +0100 Subject: [PATCH 21/36] Change: Add flag to apply resize to largest resize step first. Resize step is normally allocated equally amongst all resizable widgets. With this flag, we allocate as much as possible from the largest resize step first. --- src/widget.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++-- src/widget_type.h | 2 ++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/widget.cpp b/src/widget.cpp index acc18b15e3..36c58748bf 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -1356,7 +1356,7 @@ void NWidgetHorizontal::AssignSizePosition(SizingType sizing, uint x, uint y, ui for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { uint hor_step = child_wid->GetHorizontalStepSize(sizing); if (hor_step > 0) { - num_changing_childs++; + if (!(flags & NC_BIGFIRST)) num_changing_childs++; biggest_stepsize = std::max(biggest_stepsize, hor_step); } else { child_wid->current_x = child_wid->smallest_x; @@ -1366,6 +1366,16 @@ void NWidgetHorizontal::AssignSizePosition(SizingType sizing, uint x, uint y, ui child_wid->current_y = ComputeMaxSize(child_wid->smallest_y, given_height - child_wid->padding_top - child_wid->padding_bottom, vert_step); } + /* First.5 loop: count how many children are of the biggest step size. */ + if ((flags & NC_BIGFIRST) && biggest_stepsize > 0) { + for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { + uint hor_step = child_wid->GetHorizontalStepSize(sizing); + if (hor_step == biggest_stepsize) { + num_changing_childs++; + } + } + } + /* Second loop: Allocate the additional horizontal space over the resizing children, starting with the biggest resize steps. */ while (biggest_stepsize > 0) { uint next_biggest_stepsize = 0; @@ -1383,6 +1393,16 @@ void NWidgetHorizontal::AssignSizePosition(SizingType sizing, uint x, uint y, ui next_biggest_stepsize = std::max(next_biggest_stepsize, hor_step); } biggest_stepsize = next_biggest_stepsize; + + if (num_changing_childs == 0 && (flags & NC_BIGFIRST) && biggest_stepsize > 0) { + /* Second.5 loop: count how many children are of the updated biggest step size. */ + for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { + uint hor_step = child_wid->GetHorizontalStepSize(sizing); + if (hor_step == biggest_stepsize) { + num_changing_childs++; + } + } + } } assert(num_changing_childs == 0); @@ -1512,7 +1532,7 @@ void NWidgetVertical::AssignSizePosition(SizingType sizing, uint x, uint y, uint for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { uint vert_step = child_wid->GetVerticalStepSize(sizing); if (vert_step > 0) { - num_changing_childs++; + if (!(flags & NC_BIGFIRST)) num_changing_childs++; biggest_stepsize = std::max(biggest_stepsize, vert_step); } else { child_wid->current_y = child_wid->smallest_y; @@ -1522,6 +1542,16 @@ void NWidgetVertical::AssignSizePosition(SizingType sizing, uint x, uint y, uint child_wid->current_x = ComputeMaxSize(child_wid->smallest_x, given_width - child_wid->padding_left - child_wid->padding_right, hor_step); } + /* First.5 loop: count how many children are of the biggest step size. */ + if ((this->flags & NC_BIGFIRST) && biggest_stepsize > 0) { + for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { + uint vert_step = child_wid->GetVerticalStepSize(sizing); + if (vert_step == biggest_stepsize) { + num_changing_childs++; + } + } + } + /* Second loop: Allocate the additional vertical space over the resizing children, starting with the biggest resize steps. */ while (biggest_stepsize > 0) { uint next_biggest_stepsize = 0; @@ -1539,6 +1569,16 @@ void NWidgetVertical::AssignSizePosition(SizingType sizing, uint x, uint y, uint next_biggest_stepsize = std::max(next_biggest_stepsize, vert_step); } biggest_stepsize = next_biggest_stepsize; + + if (num_changing_childs == 0 && (flags & NC_BIGFIRST) && biggest_stepsize > 0) { + /* Second.5 loop: count how many children are of the updated biggest step size. */ + for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { + uint vert_step = child_wid->GetVerticalStepSize(sizing); + if (vert_step == biggest_stepsize) { + num_changing_childs++; + } + } + } } assert(num_changing_childs == 0); diff --git a/src/widget_type.h b/src/widget_type.h index a5bd988492..4c812e42f1 100644 --- a/src/widget_type.h +++ b/src/widget_type.h @@ -458,9 +458,11 @@ public: /** Nested widget container flags, */ enum NWidContainerFlags { NCB_EQUALSIZE = 0, ///< Containers should keep all their (resizing) children equally large. + NCB_BIGFIRST = 1, ///< Allocate space to biggest resize first. NC_NONE = 0, ///< All flags cleared. NC_EQUALSIZE = 1 << NCB_EQUALSIZE, ///< Value of the #NCB_EQUALSIZE flag. + NC_BIGFIRST = 1 << NCB_BIGFIRST, ///< Value of the #NCB_BIGFIRST flag. }; DECLARE_ENUM_AS_BIT_SET(NWidContainerFlags) From 5cc1a48db7e0f725b5e416baa5cd62ce09136c87 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 2 Oct 2022 19:40:51 +0100 Subject: [PATCH 22/36] Change: Use NC_BIGFIRST in group window. This means we no longer need to manually calculate the size of other widgets in the window to determine how much space we need, as the widget system will automatically fill as much as possible. --- src/group_gui.cpp | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/src/group_gui.cpp b/src/group_gui.cpp index 503ddddd9e..197be9e2e7 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -48,7 +48,7 @@ static const NWidgetPart _nested_group_widgets[] = { EndContainer(), NWidget(NWID_HORIZONTAL), /* left part */ - NWidget(NWID_VERTICAL), + NWidget(NWID_VERTICAL, NC_BIGFIRST), NWidget(WWT_PANEL, COLOUR_GREY, WID_GL_ALL_VEHICLES), SetFill(1, 0), EndContainer(), NWidget(WWT_PANEL, COLOUR_GREY, WID_GL_DEFAULT_VEHICLES), SetFill(1, 0), EndContainer(), NWidget(NWID_HORIZONTAL), @@ -383,26 +383,11 @@ public: void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override { switch (widget) { - case WID_GL_LIST_GROUP: { + case WID_GL_LIST_GROUP: size->width = this->ComputeGroupInfoSize(); resize->height = this->tiny_step_height; - - /* Minimum height is the height of the list widget minus all and default vehicles... */ - size->height = 4 * GetVehicleListHeight(this->vli.vtype, this->tiny_step_height); - - /* ... minus the buttons at the bottom ... */ - uint max_icon_height = GetSpriteSize(this->GetWidget(WID_GL_CREATE_GROUP)->widget_data).height; - max_icon_height = std::max(max_icon_height, GetSpriteSize(this->GetWidget(WID_GL_RENAME_GROUP)->widget_data).height); - max_icon_height = std::max(max_icon_height, GetSpriteSize(this->GetWidget(WID_GL_DELETE_GROUP)->widget_data).height); - max_icon_height = std::max(max_icon_height, GetSpriteSize(this->GetWidget(WID_GL_REPLACE_PROTECTION)->widget_data).height); - - /* ... minus the height of the group info ... */ - max_icon_height += (FONT_HEIGHT_NORMAL * 3) + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; - - /* Get a multiple of tiny_step_height of that amount */ - size->height = Ceil(size->height - max_icon_height, tiny_step_height); + fill->height = this->tiny_step_height; break; - } case WID_GL_ALL_VEHICLES: case WID_GL_DEFAULT_VEHICLES: From f4e2a462fe92152b3079eacf62f4f334481500d3 Mon Sep 17 00:00:00 2001 From: frosch Date: Mon, 26 Sep 2022 17:09:30 +0200 Subject: [PATCH 23/36] Cleanup: Remove unused flag sprites. --- media/baseset/openttd.grf | Bin 510635 -> 508716 bytes media/baseset/openttd/flags.nfo | 43 ------------------------------ media/baseset/openttd/flags.png | Bin 1763 -> 0 bytes media/baseset/openttd/openttd.nfo | 1 - src/network/network_gui.cpp | 3 +-- src/newgrf.cpp | 2 +- src/table/sprites.h | 6 +---- 7 files changed, 3 insertions(+), 52 deletions(-) delete mode 100644 media/baseset/openttd/flags.nfo delete mode 100644 media/baseset/openttd/flags.png diff --git a/media/baseset/openttd.grf b/media/baseset/openttd.grf index 837e4b12d2553699331ad6ba878d38afda6aa109..e3ebf2dd675589b31cdab66116ae5db1d72520bf 100644 GIT binary patch delta 44 ycmZ2IRenvIJPQlM|DBC2tt^bKEKIE|%&jaeTUl7AvvMcJVUyDIowhTn$P9 delta 1979 zcmZ`)zi-q?6yEWSC+t2amPKR`=z!Iou3>eQX*nTLK_n#pfQzpHBorY|*PeAnxRg=M zt(=aIk)T*z6tAl#rK^?8>2AvRUxYWivrfQXOJ2=d@5lGP_q{it-`)N6?_D8!7yth) z4g@<8-hto;LYxWz{eHUDy9ge?-g|NH#oN6%FJJxs2k%|@+duu*W7nW(A09;!@>8-#UpP;B>c2dR|RKxln?o4*uo-m!N9QcgR2RtKqL;ZmqaDBai+E8 z#f(bYAiF4<&2;}9s<^&WLv_D~^HCR}{-QGEEHqFB8tR)h_~c&{dZ-8Ve}Hk9pCF46 zg=Z-tDlO!cO1IqT&dzaiXsWteA#uB&c_7P>IGE3q2(OheiS-W(^oS+OQu_^m=}KOL zd@{loh6`*iK^vM#7J4+YVbqY0xwEPQgPlXsg)EoSo$i!feA>0!?KIwRLYQ1*bpUxzX*@iRUCLlRso5Sep#po zW;E$?m%Nz)YN#vR^4zeqMt8NeV#qLU)UcNE6#=Wd6y))xF!D~NNrJLq)PVQpOKqnI z)DUAeDq~Jfsh+uxq*peKomeVo!SMQty@Wv(JJ448jXBpew z(v{Y#bVgI*MCx4Ei_~rb(vr^#1G=xlTsJoq91YiqC(BYd$JEkBNo!iVYz=bK!++-i zf(h_8n<=P={;_@Zj$T9Fs(6}+-M@A<5Sih}2OsT5PdB3Ih@M}JUxNv|$zMSu@*ItJ z`nnf7r)#QNSywL(CxGwdk-FQ>ALk1LMiAJz+N2_L4D>Bw*JQOxdv>!1eXFarenuAr u(I~U!O0^p`p2XGtqt4~cPft%9fZ^8a+Bh89{qRq|@6#)%`ToZH=U)MhzGTw? diff --git a/media/baseset/openttd/flags.nfo b/media/baseset/openttd/flags.nfo deleted file mode 100644 index 3c125ec79a..0000000000 --- a/media/baseset/openttd/flags.nfo +++ /dev/null @@ -1,43 +0,0 @@ -// This file is part of OpenTTD. -// OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. -// OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -// See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . -// - -1 * 0 0C "Flag graphics" - -1 * 3 05 14 24 - -1 sprites/flags.png 8bpp 34 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 50 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 66 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 82 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 98 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 114 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 130 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 146 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 162 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 178 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 194 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 210 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 226 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 242 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 258 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 274 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 290 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 306 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 322 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 338 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 354 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 370 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 386 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 402 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 418 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 434 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 450 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 466 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 482 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 498 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 514 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 530 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 546 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 562 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 578 8 11 8 0 0 normal - -1 sprites/flags.png 8bpp 594 8 11 8 0 0 normal diff --git a/media/baseset/openttd/flags.png b/media/baseset/openttd/flags.png deleted file mode 100644 index 2e0401ffce5ca5255c45c91e645da4e53e2649cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1763 zcmXX_eQ;8D7QG2<$|%+6h)N>HS7m0INENd$E@RpFl9Eayx=*DIt!S{)6fHYqq%AdU zg37E|iNOSG;$TCSsaUDf)>zs`jmjF<(ikI?(0o)hW|G)6-ybCT1r}%b&Y64e%(;J@ zxpVGuYRkr#=cLR5fR}S6;%xvlJU-(LTD*6@(cciKgoE2QX2X?6PG4LFN-E0%h+!Cp zL$#wC2AQX=88^xikcr3k; zXOWT)mC|cAb9rI`AtOl@Md?&3v&rOiyX%9&Fps4r`BpjUR!e<)dDx;x4l}BAAz*8O zYXZUn5-%u&Y<-8&+ADVr8GWcOj4)EkrZhaIp3s^oi$mwGw+A``L&!}KL4rVWsN~3M zKwbw5`O#Rvgr!yREn2b5qVl=SVZSHR4InchC!l&j z9e@x7%#3GNI7Jp(fc&@9YGAsU02l+Doa*;WbR(a4%B zO5zrg43HX-0gw%l8;}pkc$xtO0w77CD2T-X7i+l^9Z#y~QwD*|C{bBeCRb<-DUD9C z(h`fse$LpBUe(fPxHNRO=xIBKk=)j3sXt;Ad zzAuStjGvpE(Z_=9yqXM{gDStB-Pb)bajyJoFm|4KzL3|=yuA7L=FY5;oYFk_@jD_f zaqA#{_mv+`&AaVPJ>NZjwseYl^~@&V4L=;2I5B{mUNe7tIt!zdxH=hc-tw(2{zd3$=IOYED2Rlm&J|Fz* zSoepWhkmlP?rMLye02ZO=|!c#{X4(?tv!ZH{U?UPM{h6PUvuN0o?rfF_aGXb*!kWU zH~iNPq7|jPOWTIi9~CYAY_hDUp>lHnVD}$)iOdhajFuky`X%cH+B1DJ-tfj`?W!c_ z(g8khxZ|!Jg#&ZZ8d~$$Yb(F$p^c2B&$ZsHeKR^pwlRaqtHeyl+!7q9l-AAXW~z$ELlG&i|)W)JesL>67A~$EFz$x==ub1VheLe-aPBYzR||nyFJH5MgvVV zf8nwf)yzB7w@xyPSn1|Oe@nu08DSetMinimalSize(14 + GetSpriteSize(SPR_LOCK, nullptr, ZOOM_LVL_OUT_4X).width - + GetSpriteSize(SPR_BLOT, nullptr, ZOOM_LVL_OUT_4X).width - + GetSpriteSize(SPR_FLAGS_BASE, nullptr, ZOOM_LVL_OUT_4X).width, 12); + + GetSpriteSize(SPR_BLOT, nullptr, ZOOM_LVL_OUT_4X).width, 12); leaf->SetFill(0, 1); this->Add(leaf); diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 1bc05c49b0..f52e512a0b 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -6170,7 +6170,7 @@ static const Action5Type _action5_types[] = { /* 0x11 */ { A5BLOCK_ALLOW_OFFSET, SPR_ROADSTOP_BASE, 1, ROADSTOP_SPRITE_COUNT, "Road stop graphics" }, /* 0x12 */ { A5BLOCK_ALLOW_OFFSET, SPR_AQUEDUCT_BASE, 1, AQUEDUCT_SPRITE_COUNT, "Aqueduct graphics" }, /* 0x13 */ { A5BLOCK_ALLOW_OFFSET, SPR_AUTORAIL_BASE, 1, AUTORAIL_SPRITE_COUNT, "Autorail graphics" }, - /* 0x14 */ { A5BLOCK_ALLOW_OFFSET, SPR_FLAGS_BASE, 1, FLAGS_SPRITE_COUNT, "Flag graphics" }, + /* 0x14 */ { A5BLOCK_INVALID, 0, 1, 0, "Flag graphics" }, // deprecated, no longer used. /* 0x15 */ { A5BLOCK_ALLOW_OFFSET, SPR_OPENTTD_BASE, 1, OPENTTD_SPRITE_COUNT, "OpenTTD GUI graphics" }, /* 0x16 */ { A5BLOCK_ALLOW_OFFSET, SPR_AIRPORT_PREVIEW_BASE, 1, SPR_AIRPORT_PREVIEW_COUNT, "Airport preview graphics" }, /* 0x17 */ { A5BLOCK_ALLOW_OFFSET, SPR_RAILTYPE_TUNNEL_BASE, 1, RAILTYPE_TUNNEL_BASE_COUNT, "Railtype tunnel base" }, diff --git a/src/table/sprites.h b/src/table/sprites.h index b7bb910203..16240d4bbc 100644 --- a/src/table/sprites.h +++ b/src/table/sprites.h @@ -293,12 +293,8 @@ static const uint16 TRAMWAY_SPRITE_COUNT = 119; static const SpriteID SPR_ONEWAY_BASE = SPR_TRAMWAY_BASE + TRAMWAY_SPRITE_COUNT; static const uint16 ONEWAY_SPRITE_COUNT = 6; -/** Flags sprites (in same order as enum NetworkLanguage) */ -static const SpriteID SPR_FLAGS_BASE = SPR_ONEWAY_BASE + ONEWAY_SPRITE_COUNT; -static const uint16 FLAGS_SPRITE_COUNT = 36; - /** Tunnel sprites with grass only for custom railtype tunnel. */ -static const SpriteID SPR_RAILTYPE_TUNNEL_BASE = SPR_FLAGS_BASE + FLAGS_SPRITE_COUNT; +static const SpriteID SPR_RAILTYPE_TUNNEL_BASE = SPR_ONEWAY_BASE + ONEWAY_SPRITE_COUNT; static const uint16 RAILTYPE_TUNNEL_BASE_COUNT = 16; /* Not really a sprite, but an empty bounding box. Used to construct bounding boxes that help sorting the sprites, but do not have a sprite associated. */ From bda602f4b0a214d860653754df8c616c081df347 Mon Sep 17 00:00:00 2001 From: Bouke Haarsma Date: Tue, 27 Sep 2022 17:34:55 +0200 Subject: [PATCH 24/36] Fix: reduce framerate overhead on train ticks Tick() is a noop for all but front-engine / crashed vehicles. Starting a framerate is rather cheap, but not free, and introduces a lot of overhead for such close loops. --- src/train_cmd.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 983b5ccd1c..e84ac6b8ea 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -3910,11 +3910,11 @@ Money Train::GetRunningCost() const */ bool Train::Tick() { - PerformanceAccumulator framerate(PFE_GL_TRAINS); - this->tick_counter++; if (this->IsFrontEngine()) { + PerformanceAccumulator framerate(PFE_GL_TRAINS); + if (!(this->vehstatus & VS_STOPPED) || this->cur_speed > 0) this->running_ticks++; this->current_order_time++; From 45d98f689a35f7b534fef7d38f3992125410af53 Mon Sep 17 00:00:00 2001 From: Bouke Haarsma Date: Wed, 7 Sep 2022 22:17:10 +0200 Subject: [PATCH 25/36] Fix #9993: Handle DPI changes on macOS and Windows --- os/windows/openttd.manifest | 1 + src/gfx.cpp | 34 ++++++++++++++++++++++++++++++++++ src/gfx_func.h | 1 + src/video/cocoa/cocoa_wnd.mm | 4 ++++ src/video/win32_v.cpp | 22 ++++++++++++++++++++++ src/window.cpp | 15 +++++++++++++-- src/zoom_func.h | 11 +++++++++++ 7 files changed, 86 insertions(+), 2 deletions(-) diff --git a/os/windows/openttd.manifest b/os/windows/openttd.manifest index ee1c7ea224..cb536a819d 100644 --- a/os/windows/openttd.manifest +++ b/os/windows/openttd.manifest @@ -10,6 +10,7 @@ True/PM + PerMonitorV2,PerMonitor diff --git a/src/gfx.cpp b/src/gfx.cpp index cb9fb0651b..d96b2bdac4 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -17,10 +17,12 @@ #include "settings_type.h" #include "network/network.h" #include "network/network_func.h" +#include "window_gui.h" #include "window_func.h" #include "newgrf_debug.h" #include "thread.h" #include "core/backup_type.hpp" +#include "viewport_func.h" #include "table/palettes.h" #include "table/string_colours.h" @@ -2042,6 +2044,38 @@ void UpdateGUIZoom() } } +/** + * Resolve GUI zoom level and adjust GUI to new zoom, if auto-suggestion is requested. + * @returns true when the zoom level has changed, caller must call ReInitAllWindows(true) + * after resizing the application's window/buffer. + */ +bool AdjustGUIZoom() +{ + auto old_zoom = _gui_zoom; + UpdateGUIZoom(); + if (old_zoom == _gui_zoom) return false; + GfxClearSpriteCache(); + VideoDriver::GetInstance()->ClearSystemSprites(); + ClearFontCache(); + GfxClearSpriteCache(); + UpdateAllVirtCoords(); + + /* Adjust all window sizes to match the new zoom level, so that they don't appear + to move around when the application is moved to a screen with different DPI. */ + auto zoom_shift = old_zoom - _gui_zoom; + for (Window *w : Window::Iterate()) { + w->left = AdjustByZoom(w->left, zoom_shift); + w->top = AdjustByZoom(w->top, zoom_shift); + w->width = AdjustByZoom(w->width, zoom_shift); + w->height = AdjustByZoom(w->height, zoom_shift); + if (w->viewport != nullptr) { + w->viewport->zoom = Clamp(ZoomLevel(w->viewport->zoom - zoom_shift), _settings_client.gui.zoom_min, _settings_client.gui.zoom_max); + } + } + + return true; +} + void ChangeGameSpeed(bool enable_fast_forward) { if (enable_fast_forward) { diff --git a/src/gfx_func.h b/src/gfx_func.h index b811c089fe..4ebb85aed2 100644 --- a/src/gfx_func.h +++ b/src/gfx_func.h @@ -80,6 +80,7 @@ void DrawMouseCursor(); void ScreenSizeChanged(); void GameSizeChanged(); void UpdateGUIZoom(); +bool AdjustGUIZoom(); void UndrawMouseCursor(); /** Size of the buffer used for drawing strings. */ diff --git a/src/video/cocoa/cocoa_wnd.mm b/src/video/cocoa/cocoa_wnd.mm index af1bdcab99..36d010177d 100644 --- a/src/video/cocoa/cocoa_wnd.mm +++ b/src/video/cocoa/cocoa_wnd.mm @@ -1269,8 +1269,12 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel /** Screen the window is on changed. */ - (void)windowDidChangeBackingProperties:(NSNotification *)notification { + bool did_adjust = AdjustGUIZoom(); + /* Reallocate screen buffer if necessary. */ driver->AllocateBackingStore(); + + if (did_adjust) ReInitAllWindows(true); } /** Presentation options to use for full screen mode. */ diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp index 44368b2249..49c967bfa4 100644 --- a/src/video/win32_v.cpp +++ b/src/video/win32_v.cpp @@ -38,6 +38,10 @@ #define PM_QS_INPUT 0x20000 #endif +#ifndef WM_DPICHANGED +#define WM_DPICHANGED 0x02E0 +#endif + bool _window_maximize; static Dimension _bck_resolution; DWORD _imm_props; @@ -670,6 +674,24 @@ LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) return TRUE; } + case WM_DPICHANGED: { + auto did_adjust = AdjustGUIZoom(); + + /* Resize the window to match the new DPI setting. */ + RECT *prcNewWindow = (RECT *)lParam; + SetWindowPos(hwnd, + NULL, + prcNewWindow->left, + prcNewWindow->top, + prcNewWindow->right - prcNewWindow->left, + prcNewWindow->bottom - prcNewWindow->top, + SWP_NOZORDER | SWP_NOACTIVATE); + + if (did_adjust) ReInitAllWindows(true); + + return 0; + } + /* needed for wheel */ #if !defined(WM_MOUSEWHEEL) # define WM_MOUSEWHEEL 0x020A diff --git a/src/window.cpp b/src/window.cpp index 96cc5b3b97..603bca151f 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -3343,6 +3343,13 @@ void HideVitalWindows() CloseWindowById(WC_STATUS_BAR, 0); } +void ReInitWindow(Window *w, bool zoom_changed) +{ + if (w == nullptr) return; + if (zoom_changed) w->nested_root->AdjustPaddingForZoom(); + w->ReInit(); +} + /** Re-initialize all windows. */ void ReInitAllWindows(bool zoom_changed) { @@ -3352,9 +3359,13 @@ void ReInitAllWindows(bool zoom_changed) extern void InitDepotWindowBlockSizes(); InitDepotWindowBlockSizes(); + /* When _gui_zoom has changed, we need to resize toolbar and statusbar first, + * so EnsureVisibleCaption uses the updated size information. */ + ReInitWindow(FindWindowById(WC_MAIN_TOOLBAR, 0), zoom_changed); + ReInitWindow(FindWindowById(WC_STATUS_BAR, 0), zoom_changed); for (Window *w : Window::Iterate()) { - if (zoom_changed) w->nested_root->AdjustPaddingForZoom(); - w->ReInit(); + if (w->window_class == WC_MAIN_TOOLBAR || w->window_class == WC_STATUS_BAR) continue; + ReInitWindow(w, zoom_changed); } void NetworkReInitChatBoxSize(); diff --git a/src/zoom_func.h b/src/zoom_func.h index 485284a06c..0a5113186f 100644 --- a/src/zoom_func.h +++ b/src/zoom_func.h @@ -36,6 +36,17 @@ static inline int UnScaleByZoom(int value, ZoomLevel zoom) return (value + (1 << zoom) - 1) >> zoom; } +/** + * Adjust by zoom level; zoom < 0 shifts right, zoom >= 0 shifts left + * @param value value to shift + * @param zoom zoom level to shift to + * @return shifted value + */ +static inline int AdjustByZoom(int value, int zoom) +{ + return zoom < 0 ? UnScaleByZoom(value, ZoomLevel(-zoom)) : ScaleByZoom(value, ZoomLevel(zoom)); +} + /** * Scale by zoom level, usually shift left (when zoom > ZOOM_LVL_NORMAL) * @param value value to shift From 3dda8c9bad636b0f3379be47ef4fb1eae99d7f80 Mon Sep 17 00:00:00 2001 From: SamuXarick <43006711+SamuXarick@users.noreply.github.com> Date: Sun, 26 Jun 2022 20:49:08 +0100 Subject: [PATCH 26/36] Fix: ScriptRoad::HasRoadType really check for RoadType Script::HasRoadType was only checking if the tile had the same RoadTramType as that of the RoadType provided. Now it really checks RoadType against RoadType. --- bin/ai/compat_0.7.nut | 13 +++++++++++++ bin/ai/compat_1.0.nut | 13 +++++++++++++ bin/ai/compat_1.1.nut | 13 +++++++++++++ bin/ai/compat_1.10.nut | 13 +++++++++++++ bin/ai/compat_1.11.nut | 13 +++++++++++++ bin/ai/compat_1.2.nut | 13 +++++++++++++ bin/ai/compat_1.3.nut | 13 +++++++++++++ bin/ai/compat_1.4.nut | 13 +++++++++++++ bin/ai/compat_1.5.nut | 13 +++++++++++++ bin/ai/compat_1.6.nut | 13 +++++++++++++ bin/ai/compat_1.7.nut | 13 +++++++++++++ bin/ai/compat_1.8.nut | 13 +++++++++++++ bin/ai/compat_1.9.nut | 13 +++++++++++++ bin/ai/compat_12.nut | 13 +++++++++++++ bin/game/compat_1.10.nut | 13 +++++++++++++ bin/game/compat_1.11.nut | 13 +++++++++++++ bin/game/compat_1.2.nut | 13 +++++++++++++ bin/game/compat_1.3.nut | 13 +++++++++++++ bin/game/compat_1.4.nut | 12 ++++++++++++ bin/game/compat_1.5.nut | 13 +++++++++++++ bin/game/compat_1.6.nut | 13 +++++++++++++ bin/game/compat_1.7.nut | 13 +++++++++++++ bin/game/compat_1.8.nut | 13 +++++++++++++ bin/game/compat_1.9.nut | 13 +++++++++++++ bin/game/compat_12.nut | 13 +++++++++++++ src/script/api/ai_changelog.hpp | 3 +++ src/script/api/game_changelog.hpp | 3 +++ src/script/api/script_road.cpp | 2 +- 28 files changed, 331 insertions(+), 1 deletion(-) diff --git a/bin/ai/compat_0.7.nut b/bin/ai/compat_0.7.nut index c40308592c..341b543bd3 100644 --- a/bin/ai/compat_0.7.nut +++ b/bin/ai/compat_0.7.nut @@ -379,3 +379,16 @@ AIGroup.CreateGroup <- function(vehicle_type) { return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); } + +/* 13 really checks RoadType against RoadType */ +AIRoad._HasRoadType <- AIRoad.HasRoadType; +AIRoad.HasRoadType <- function(tile, road_type) +{ + local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (AIRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/ai/compat_1.0.nut b/bin/ai/compat_1.0.nut index b8da71a194..6b76f11534 100644 --- a/bin/ai/compat_1.0.nut +++ b/bin/ai/compat_1.0.nut @@ -131,3 +131,16 @@ AIGroup.CreateGroup <- function(vehicle_type) { return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); } + +/* 13 really checks RoadType against RoadType */ +AIRoad._HasRoadType <- AIRoad.HasRoadType; +AIRoad.HasRoadType <- function(tile, road_type) +{ + local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (AIRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/ai/compat_1.1.nut b/bin/ai/compat_1.1.nut index f1bda9c7fe..9c568a7006 100644 --- a/bin/ai/compat_1.1.nut +++ b/bin/ai/compat_1.1.nut @@ -68,3 +68,16 @@ AIGroup.CreateGroup <- function(vehicle_type) { return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); } + +/* 13 really checks RoadType against RoadType */ +AIRoad._HasRoadType <- AIRoad.HasRoadType; +AIRoad.HasRoadType <- function(tile, road_type) +{ + local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (AIRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/ai/compat_1.10.nut b/bin/ai/compat_1.10.nut index 2baaddb836..44bc2542ce 100644 --- a/bin/ai/compat_1.10.nut +++ b/bin/ai/compat_1.10.nut @@ -6,3 +6,16 @@ */ AILog.Info("1.10 API compatibility in effect."); + +/* 13 really checks RoadType against RoadType */ +AIRoad._HasRoadType <- AIRoad.HasRoadType; +AIRoad.HasRoadType <- function(tile, road_type) +{ + local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (AIRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/ai/compat_1.11.nut b/bin/ai/compat_1.11.nut index 887f3f7fd9..3d8370ffc6 100644 --- a/bin/ai/compat_1.11.nut +++ b/bin/ai/compat_1.11.nut @@ -6,3 +6,16 @@ */ AILog.Info("1.11 API compatibility in effect."); + +/* 13 really checks RoadType against RoadType */ +AIRoad._HasRoadType <- AIRoad.HasRoadType; +AIRoad.HasRoadType <- function(tile, road_type) +{ + local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (AIRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/ai/compat_1.2.nut b/bin/ai/compat_1.2.nut index 550f79969c..fc52b04935 100644 --- a/bin/ai/compat_1.2.nut +++ b/bin/ai/compat_1.2.nut @@ -20,3 +20,16 @@ AIGroup.CreateGroup <- function(vehicle_type) { return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); } + +/* 13 really checks RoadType against RoadType */ +AIRoad._HasRoadType <- AIRoad.HasRoadType; +AIRoad.HasRoadType <- function(tile, road_type) +{ + local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (AIRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/ai/compat_1.3.nut b/bin/ai/compat_1.3.nut index 6b2c7e8a71..a06e98d2dd 100644 --- a/bin/ai/compat_1.3.nut +++ b/bin/ai/compat_1.3.nut @@ -20,3 +20,16 @@ AIGroup.CreateGroup <- function(vehicle_type) { return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); } + +/* 13 really checks RoadType against RoadType */ +AIRoad._HasRoadType <- AIRoad.HasRoadType; +AIRoad.HasRoadType <- function(tile, road_type) +{ + local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (AIRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/ai/compat_1.4.nut b/bin/ai/compat_1.4.nut index a9ab5a4757..6de24bf80c 100644 --- a/bin/ai/compat_1.4.nut +++ b/bin/ai/compat_1.4.nut @@ -20,3 +20,16 @@ AIGroup.CreateGroup <- function(vehicle_type) { return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); } + +/* 13 really checks RoadType against RoadType */ +AIRoad._HasRoadType <- AIRoad.HasRoadType; +AIRoad.HasRoadType <- function(tile, road_type) +{ + local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (AIRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/ai/compat_1.5.nut b/bin/ai/compat_1.5.nut index 23944149f6..8ff5a39d15 100644 --- a/bin/ai/compat_1.5.nut +++ b/bin/ai/compat_1.5.nut @@ -20,3 +20,16 @@ AIGroup.CreateGroup <- function(vehicle_type) { return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); } + +/* 13 really checks RoadType against RoadType */ +AIRoad._HasRoadType <- AIRoad.HasRoadType; +AIRoad.HasRoadType <- function(tile, road_type) +{ + local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (AIRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/ai/compat_1.6.nut b/bin/ai/compat_1.6.nut index bcbe91455c..91744512a7 100644 --- a/bin/ai/compat_1.6.nut +++ b/bin/ai/compat_1.6.nut @@ -20,3 +20,16 @@ AIGroup.CreateGroup <- function(vehicle_type) { return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); } + +/* 13 really checks RoadType against RoadType */ +AIRoad._HasRoadType <- AIRoad.HasRoadType; +AIRoad.HasRoadType <- function(tile, road_type) +{ + local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (AIRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/ai/compat_1.7.nut b/bin/ai/compat_1.7.nut index 7c2fd9b825..584a970f60 100644 --- a/bin/ai/compat_1.7.nut +++ b/bin/ai/compat_1.7.nut @@ -20,3 +20,16 @@ AIGroup.CreateGroup <- function(vehicle_type) { return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); } + +/* 13 really checks RoadType against RoadType */ +AIRoad._HasRoadType <- AIRoad.HasRoadType; +AIRoad.HasRoadType <- function(tile, road_type) +{ + local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (AIRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/ai/compat_1.8.nut b/bin/ai/compat_1.8.nut index a118a63b57..f57a0eab27 100644 --- a/bin/ai/compat_1.8.nut +++ b/bin/ai/compat_1.8.nut @@ -20,3 +20,16 @@ AIGroup.CreateGroup <- function(vehicle_type) { return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); } + +/* 13 really checks RoadType against RoadType */ +AIRoad._HasRoadType <- AIRoad.HasRoadType; +AIRoad.HasRoadType <- function(tile, road_type) +{ + local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (AIRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/ai/compat_1.9.nut b/bin/ai/compat_1.9.nut index a3d0941327..0dde6dc6da 100644 --- a/bin/ai/compat_1.9.nut +++ b/bin/ai/compat_1.9.nut @@ -6,3 +6,16 @@ */ AILog.Info("1.9 API compatibility in effect."); + +/* 13 really checks RoadType against RoadType */ +AIRoad._HasRoadType <- AIRoad.HasRoadType; +AIRoad.HasRoadType <- function(tile, road_type) +{ + local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (AIRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/ai/compat_12.nut b/bin/ai/compat_12.nut index 2ff41f8b4f..d54895632f 100644 --- a/bin/ai/compat_12.nut +++ b/bin/ai/compat_12.nut @@ -6,3 +6,16 @@ */ AILog.Info("12 API compatibility in effect."); + +/* 13 really checks RoadType against RoadType */ +AIRoad._HasRoadType <- AIRoad.HasRoadType; +AIRoad.HasRoadType <- function(tile, road_type) +{ + local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (AIRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/game/compat_1.10.nut b/bin/game/compat_1.10.nut index 92cef84c53..2559ff0a9c 100644 --- a/bin/game/compat_1.10.nut +++ b/bin/game/compat_1.10.nut @@ -13,3 +13,16 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type) { return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID); } + +/* 13 really checks RoadType against RoadType */ +GSRoad._HasRoadType <- GSRoad.HasRoadType; +GSRoad.HasRoadType <- function(tile, road_type) +{ + local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (GSRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/game/compat_1.11.nut b/bin/game/compat_1.11.nut index fa240b5d2d..eac9a05d36 100644 --- a/bin/game/compat_1.11.nut +++ b/bin/game/compat_1.11.nut @@ -6,3 +6,16 @@ */ GSLog.Info("1.11 API compatibility in effect."); + +/* 13 really checks RoadType against RoadType */ +GSRoad._HasRoadType <- GSRoad.HasRoadType; +GSRoad.HasRoadType <- function(tile, road_type) +{ + local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (GSRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/game/compat_1.2.nut b/bin/game/compat_1.2.nut index 5fb29efedf..66e2ca5d62 100644 --- a/bin/game/compat_1.2.nut +++ b/bin/game/compat_1.2.nut @@ -35,3 +35,16 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type) { return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID); } + +/* 13 really checks RoadType against RoadType */ +GSRoad._HasRoadType <- GSRoad.HasRoadType; +GSRoad.HasRoadType <- function(tile, road_type) +{ + local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (GSRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/game/compat_1.3.nut b/bin/game/compat_1.3.nut index 7546e54c69..9986ea03e5 100644 --- a/bin/game/compat_1.3.nut +++ b/bin/game/compat_1.3.nut @@ -35,3 +35,16 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type) { return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID); } + +/* 13 really checks RoadType against RoadType */ +GSRoad._HasRoadType <- GSRoad.HasRoadType; +GSRoad.HasRoadType <- function(tile, road_type) +{ + local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (GSRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/game/compat_1.4.nut b/bin/game/compat_1.4.nut index c90b3e550b..b3ec5c45cb 100644 --- a/bin/game/compat_1.4.nut +++ b/bin/game/compat_1.4.nut @@ -28,3 +28,15 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type) return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID); } +/* 13 really checks RoadType against RoadType */ +GSRoad._HasRoadType <- GSRoad.HasRoadType; +GSRoad.HasRoadType <- function(tile, road_type) +{ + local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (GSRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/game/compat_1.5.nut b/bin/game/compat_1.5.nut index 0c62e56462..2d25d7acf0 100644 --- a/bin/game/compat_1.5.nut +++ b/bin/game/compat_1.5.nut @@ -20,3 +20,16 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type) { return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID); } + +/* 13 really checks RoadType against RoadType */ +GSRoad._HasRoadType <- GSRoad.HasRoadType; +GSRoad.HasRoadType <- function(tile, road_type) +{ + local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (GSRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/game/compat_1.6.nut b/bin/game/compat_1.6.nut index 198b863a77..d205832209 100644 --- a/bin/game/compat_1.6.nut +++ b/bin/game/compat_1.6.nut @@ -20,3 +20,16 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type) { return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID); } + +/* 13 really checks RoadType against RoadType */ +GSRoad._HasRoadType <- GSRoad.HasRoadType; +GSRoad.HasRoadType <- function(tile, road_type) +{ + local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (GSRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/game/compat_1.7.nut b/bin/game/compat_1.7.nut index 76dc424353..1108f41a7c 100644 --- a/bin/game/compat_1.7.nut +++ b/bin/game/compat_1.7.nut @@ -20,3 +20,16 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type) { return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID); } + +/* 13 really checks RoadType against RoadType */ +GSRoad._HasRoadType <- GSRoad.HasRoadType; +GSRoad.HasRoadType <- function(tile, road_type) +{ + local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (GSRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/game/compat_1.8.nut b/bin/game/compat_1.8.nut index b9d27458a9..139f91214b 100644 --- a/bin/game/compat_1.8.nut +++ b/bin/game/compat_1.8.nut @@ -20,3 +20,16 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type) { return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID); } + +/* 13 really checks RoadType against RoadType */ +GSRoad._HasRoadType <- GSRoad.HasRoadType; +GSRoad.HasRoadType <- function(tile, road_type) +{ + local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (GSRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/game/compat_1.9.nut b/bin/game/compat_1.9.nut index 32eec114af..053e377d4c 100644 --- a/bin/game/compat_1.9.nut +++ b/bin/game/compat_1.9.nut @@ -13,3 +13,16 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type) { return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID); } + +/* 13 really checks RoadType against RoadType */ +GSRoad._HasRoadType <- GSRoad.HasRoadType; +GSRoad.HasRoadType <- function(tile, road_type) +{ + local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (GSRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/bin/game/compat_12.nut b/bin/game/compat_12.nut index df08583914..a11cd04a23 100644 --- a/bin/game/compat_12.nut +++ b/bin/game/compat_12.nut @@ -6,3 +6,16 @@ */ GSLog.Info("12 API compatibility in effect."); + +/* 13 really checks RoadType against RoadType */ +GSRoad._HasRoadType <- GSRoad.HasRoadType; +GSRoad.HasRoadType <- function(tile, road_type) +{ + local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type)); + foreach (rt, _ in list) { + if (GSRoad._HasRoadType(tile, rt)) { + return true; + } + } + return false; +} diff --git a/src/script/api/ai_changelog.hpp b/src/script/api/ai_changelog.hpp index f728ab18fe..1e014266a3 100644 --- a/src/script/api/ai_changelog.hpp +++ b/src/script/api/ai_changelog.hpp @@ -20,6 +20,9 @@ * \li AIIndustryType::ResolveNewGRFID * \li AIObjectType::ResolveNewGRFID * + * Other changes: + * \li AIRoad::HasRoadType now correctly checks RoadType against RoadType + * * \b 12.0 * * API additions: diff --git a/src/script/api/game_changelog.hpp b/src/script/api/game_changelog.hpp index 159671807d..91dd0d22f5 100644 --- a/src/script/api/game_changelog.hpp +++ b/src/script/api/game_changelog.hpp @@ -20,6 +20,9 @@ * \li GSIndustryType::ResolveNewGRFID * \li GSObjectType::ResolveNewGRFID * + * Other changes: + * \li GSRoad::HasRoadType now correctly checks RoadType against RoadType + * * \b 12.0 * * API additions: diff --git a/src/script/api/script_road.cpp b/src/script/api/script_road.cpp index 65ee83f5bb..20e38398de 100644 --- a/src/script/api/script_road.cpp +++ b/src/script/api/script_road.cpp @@ -98,7 +98,7 @@ { if (!ScriptMap::IsValidTile(tile)) return false; if (!IsRoadTypeAvailable(road_type)) return false; - return ::GetAnyRoadBits(tile, ::GetRoadTramType((::RoadType)road_type), false) != ROAD_NONE; + return ::MayHaveRoad(tile) && HasBit(::GetPresentRoadTypes(tile), (::RoadType)road_type); } /* static */ bool ScriptRoad::AreRoadTilesConnected(TileIndex t1, TileIndex t2) From e604b76d18b5d762939b93316e2fcf7da454fae8 Mon Sep 17 00:00:00 2001 From: SamuXarick <43006711+SamuXarick@users.noreply.github.com> Date: Tue, 31 May 2022 14:44:05 +0100 Subject: [PATCH 27/36] Fix: List a max of four share owners instead of three An AI company may have four different share owners, but the company information window is limited to display a max of three. This commit increases that limit. --- src/company_gui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/company_gui.cpp b/src/company_gui.cpp index b8167d222a..fdcc7309df 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -2222,7 +2222,7 @@ static const NWidgetPart _nested_company_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_C_SELECT_DESC_OWNERS), NWidget(NWID_VERTICAL), SetPIP(5, 5, 4), - NWidget(WWT_EMPTY, INVALID_COLOUR, WID_C_DESC_OWNERS), SetMinimalTextLines(3, 0), + NWidget(WWT_EMPTY, INVALID_COLOUR, WID_C_DESC_OWNERS), SetMinimalTextLines(MAX_COMPANY_SHARE_OWNERS, 0), NWidget(NWID_SPACER), SetFill(0, 1), EndContainer(), EndContainer(), From bd357656ba53b50c2f75b8a9da412d0d85cbd437 Mon Sep 17 00:00:00 2001 From: Michael Lutz Date: Sun, 16 Oct 2022 17:05:50 +0200 Subject: [PATCH 28/36] Codechange: [NewGRF] Replace magic number for default object size by a constant. --- src/newgrf.cpp | 4 ++-- src/newgrf_object.h | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/newgrf.cpp b/src/newgrf.cpp index f52e512a0b..0a3dff80bb 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -4083,7 +4083,7 @@ static ChangeInfoResult ObjectChangeInfo(uint id, int numinfo, int prop, ByteRea if (*ospec == nullptr) { *ospec = CallocT(1); (*ospec)->views = 1; // Default for NewGRFs that don't set it. - (*ospec)->size = 0x11; // Default for NewGRFs that manage to not set it (1x1) + (*ospec)->size = OBJECT_SIZE_1X1; // Default for NewGRFs that manage to not set it (1x1) } /* Swap classid because we read it in BE. */ @@ -4111,7 +4111,7 @@ static ChangeInfoResult ObjectChangeInfo(uint id, int numinfo, int prop, ByteRea spec->size = buf->ReadByte(); if (GB(spec->size, 0, 4) == 0 || GB(spec->size, 4, 4) == 0) { grfmsg(0, "ObjectChangeInfo: Invalid object size requested (0x%x) for object id %u. Ignoring.", spec->size, id + i); - spec->size = 0x11; // 1x1 + spec->size = OBJECT_SIZE_1X1; } break; diff --git a/src/newgrf_object.h b/src/newgrf_object.h index 1776b760ab..fa48506ac2 100644 --- a/src/newgrf_object.h +++ b/src/newgrf_object.h @@ -40,6 +40,8 @@ enum ObjectFlags { }; DECLARE_ENUM_AS_BIT_SET(ObjectFlags) +static const uint8 OBJECT_SIZE_1X1 = 0x11; ///< The value of a NewGRF's size property when the object is 1x1 tiles: low nibble for X, high nibble for Y. + void ResetObjects(); /** Class IDs for objects. */ From 3d45bc4abec4e0d1e0e27911ae3b1346e43ef034 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Wed, 2 Feb 2022 17:24:52 -0700 Subject: [PATCH 29/36] Feature: Build objects by area --- src/command_type.h | 1 + src/company_base.h | 3 +- src/company_cmd.cpp | 14 +++--- src/lang/english.txt | 5 +- src/object_cmd.cpp | 68 ++++++++++++++++++++++++++- src/object_cmd.h | 2 + src/object_gui.cpp | 37 +++++++++++++-- src/settings_type.h | 2 + src/table/settings/world_settings.ini | 18 +++++++ src/viewport_type.h | 1 + 10 files changed, 137 insertions(+), 14 deletions(-) diff --git a/src/command_type.h b/src/command_type.h index 9a122dede0..85f5680aea 100644 --- a/src/command_type.h +++ b/src/command_type.h @@ -186,6 +186,7 @@ enum Commands : uint16 { CMD_REMOVE_SIGNALS, ///< remove a signal CMD_TERRAFORM_LAND, ///< terraform a tile CMD_BUILD_OBJECT, ///< build an object + CMD_BUILD_OBJECT_AREA, ///< build an area of objects CMD_BUILD_TUNNEL, ///< build a tunnel CMD_REMOVE_FROM_RAIL_STATION, ///< remove a (rectangle of) tiles from a rail station diff --git a/src/company_base.h b/src/company_base.h index 5e6d9a8c85..741d97be8d 100644 --- a/src/company_base.h +++ b/src/company_base.h @@ -87,6 +87,7 @@ struct CompanyProperties { uint32 terraform_limit; ///< Amount of tileheights we can (still) terraform (times 65536). uint32 clear_limit; ///< Amount of tiles we can (still) clear (times 65536). uint32 tree_limit; ///< Amount of trees we can (still) plant (times 65536). + uint32 build_object_limit; ///< Amount of tiles we can (still) build objects on (times 65536). /** * If \c true, the company is (also) controlled by the computer (a NoAI program). @@ -110,7 +111,7 @@ struct CompanyProperties { face(0), money(0), money_fraction(0), current_loan(0), colour(0), block_preview(0), location_of_HQ(0), last_build_coordinate(0), share_owners(), inaugurated_year(0), months_of_bankruptcy(0), bankrupt_asked(0), bankrupt_timeout(0), bankrupt_value(0), - terraform_limit(0), clear_limit(0), tree_limit(0), is_ai(false), engine_renew_list(nullptr) {} + terraform_limit(0), clear_limit(0), tree_limit(0), build_object_limit(0), is_ai(false), engine_renew_list(nullptr) {} }; struct Company : CompanyProperties, CompanyPool::PoolItem<&_company_pool> { diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index 229cd8f46e..681912f17c 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -63,9 +63,10 @@ Company::Company(uint16 name_1, bool is_ai) this->name_1 = name_1; this->location_of_HQ = INVALID_TILE; this->is_ai = is_ai; - this->terraform_limit = (uint32)_settings_game.construction.terraform_frame_burst << 16; - this->clear_limit = (uint32)_settings_game.construction.clear_frame_burst << 16; - this->tree_limit = (uint32)_settings_game.construction.tree_frame_burst << 16; + this->terraform_limit = (uint32)_settings_game.construction.terraform_frame_burst << 16; + this->clear_limit = (uint32)_settings_game.construction.clear_frame_burst << 16; + this->tree_limit = (uint32)_settings_game.construction.tree_frame_burst << 16; + this->build_object_limit = (uint32)_settings_game.construction.build_object_frame_burst << 16; std::fill(this->share_owners.begin(), this->share_owners.end(), INVALID_OWNER); InvalidateWindowData(WC_PERFORMANCE_DETAIL, 0, INVALID_COMPANY); @@ -267,9 +268,10 @@ void SubtractMoneyFromCompanyFract(CompanyID company, const CommandCost &cst) void UpdateLandscapingLimits() { for (Company *c : Company::Iterate()) { - c->terraform_limit = std::min((uint64)c->terraform_limit + _settings_game.construction.terraform_per_64k_frames, (uint64)_settings_game.construction.terraform_frame_burst << 16); - c->clear_limit = std::min((uint64)c->clear_limit + _settings_game.construction.clear_per_64k_frames, (uint64)_settings_game.construction.clear_frame_burst << 16); - c->tree_limit = std::min((uint64)c->tree_limit + _settings_game.construction.tree_per_64k_frames, (uint64)_settings_game.construction.tree_frame_burst << 16); + c->terraform_limit = std::min((uint64)c->terraform_limit + _settings_game.construction.terraform_per_64k_frames, (uint64)_settings_game.construction.terraform_frame_burst << 16); + c->clear_limit = std::min((uint64)c->clear_limit + _settings_game.construction.clear_per_64k_frames, (uint64)_settings_game.construction.clear_frame_burst << 16); + c->tree_limit = std::min((uint64)c->tree_limit + _settings_game.construction.tree_per_64k_frames, (uint64)_settings_game.construction.tree_frame_burst << 16); + c->build_object_limit = std::min((uint64)c->build_object_limit + _settings_game.construction.build_object_per_64k_frames, (uint64)_settings_game.construction.build_object_frame_burst << 16); } } diff --git a/src/lang/english.txt b/src/lang/english.txt index 07e0c5a615..e0ee6b9464 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -378,7 +378,7 @@ STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Road con STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Tramway construction STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Plant trees. Shift toggles building/showing cost estimate STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Place sign -STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Place object. Shift toggles building/showing cost estimate +STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Place object. Ctrl selects the area diagonally. Shift toggles building/showing cost estimate # Scenario editor file menu ###length 7 @@ -2816,7 +2816,7 @@ STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Purchase # Object construction window STR_OBJECT_BUILD_CAPTION :{WHITE}Object Selection -STR_OBJECT_BUILD_TOOLTIP :{BLACK}Select object to build. Shift toggles building/showing cost estimate +STR_OBJECT_BUILD_TOOLTIP :{BLACK}Select object to build. Ctrl selects the area diagonally. Shift toggles building/showing cost estimate STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Select class of the object to build STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Preview of the object STR_OBJECT_BUILD_SIZE :{BLACK}Size: {GOLD}{NUM} x {NUM} tiles @@ -4925,6 +4925,7 @@ STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}Object i STR_ERROR_COMPANY_HEADQUARTERS_IN :{WHITE}... company headquarters in the way STR_ERROR_CAN_T_PURCHASE_THIS_LAND :{WHITE}Can't purchase this land area... STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... you already own it! +STR_ERROR_BUILD_OBJECT_LIMIT_REACHED :{WHITE}... object construction limit reached # Group related errors STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Can't create group... diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp index dad4039461..41278ca81d 100644 --- a/src/object_cmd.cpp +++ b/src/object_cmd.cpp @@ -311,6 +311,7 @@ CommandCost CmdBuildObject(DoCommandFlag flags, TileIndex tile, ObjectType type, } int hq_score = 0; + uint build_object_size = 1; switch (type) { case OBJECT_TRANSMITTER: case OBJECT_LIGHTHOUSE: @@ -349,20 +350,85 @@ CommandCost CmdBuildObject(DoCommandFlag flags, TileIndex tile, ObjectType type, return CMD_ERROR; default: // i.e. NewGRF provided. + build_object_size = size_x * size_y; break; } + /* Don't allow building more objects if the company has reached its limit. */ + Company *c = Company::GetIfValid(_current_company); + if (c != nullptr && GB(c->build_object_limit, 16, 16) < build_object_size) { + return_cmd_error(STR_ERROR_BUILD_OBJECT_LIMIT_REACHED); + } + if (flags & DC_EXEC) { BuildObject(type, tile, _current_company == OWNER_DEITY ? OWNER_NONE : _current_company, nullptr, view); /* Make sure the HQ starts at the right size. */ if (type == OBJECT_HQ) UpdateCompanyHQ(tile, hq_score); + + /* Subtract the tile from the build limit. */ + if (c != nullptr) c->build_object_limit -= build_object_size << 16; } - cost.AddCost(ObjectSpec::Get(type)->GetBuildCost() * size_x * size_y); + cost.AddCost(spec->GetBuildCost() * build_object_size); return cost; } +/** + * Construct multiple objects in an area + * @param flags of operation to conduct + * @param tile end tile of area dragging + * @param start_tile start tile of area dragging + * @param type the object type to build + * @param view the view for the object + * @param diagonal Whether to use the Orthogonal (0) or Diagonal (1) iterator. + * @return the cost of this operation or an error + */ +CommandCost CmdBuildObjectArea(DoCommandFlag flags, TileIndex tile, TileIndex start_tile, ObjectType type, uint8 view, bool diagonal) +{ + if (start_tile >= MapSize()) return CMD_ERROR; + + if (type >= NUM_OBJECTS) return CMD_ERROR; + const ObjectSpec *spec = ObjectSpec::Get(type); + if (view >= spec->views) return CMD_ERROR; + + if (spec->size != OBJECT_SIZE_1X1) return CMD_ERROR; + + Money money = GetAvailableMoneyForCommand(); + CommandCost cost(EXPENSES_CONSTRUCTION); + CommandCost last_error = CMD_ERROR; + bool had_success = false; + + const Company *c = Company::GetIfValid(_current_company); + int limit = (c == nullptr ? INT32_MAX : GB(c->build_object_limit, 16, 16)); + + TileIterator *iter = diagonal ? (TileIterator *)new DiagonalTileIterator(tile, start_tile) : new OrthogonalTileIterator(tile, start_tile); + for (; *iter != INVALID_TILE; ++(*iter)) { + TileIndex t = *iter; + CommandCost ret = Command::Do(flags & ~DC_EXEC, t, type, view); + + /* If we've reached the limit, stop building (or testing). */ + if (c != nullptr && --limit <= 0) break; + + if (ret.Failed()) { + last_error = ret; + continue; + } + + had_success = true; + if (flags & DC_EXEC) { + money -= ret.GetCost(); + + /* If we run out of money, stop building. */ + if (ret.GetCost() > 0 && money < 0) break; + Command::Do(flags, t, type, view); + } + cost.AddCost(ret); + } + + delete iter; + return had_success ? cost : last_error; +} static Foundation GetFoundation_Object(TileIndex tile, Slope tileh); diff --git a/src/object_cmd.h b/src/object_cmd.h index ea7412544c..5a51102e8e 100644 --- a/src/object_cmd.h +++ b/src/object_cmd.h @@ -14,7 +14,9 @@ #include "object_type.h" CommandCost CmdBuildObject(DoCommandFlag flags, TileIndex tile, ObjectType type, uint8 view); +CommandCost CmdBuildObjectArea(DoCommandFlag flags, TileIndex tile, TileIndex start_tile, ObjectType type, uint8 view, bool diagonal); DEF_CMD_TRAIT(CMD_BUILD_OBJECT, CmdBuildObject, CMD_DEITY | CMD_NO_WATER | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION) +DEF_CMD_TRAIT(CMD_BUILD_OBJECT_AREA, CmdBuildObjectArea, CMD_DEITY | CMD_NO_WATER | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION) #endif /* OBJECT_CMD_H */ diff --git a/src/object_gui.cpp b/src/object_gui.cpp index 48dea3453d..53fb47323e 100644 --- a/src/object_gui.cpp +++ b/src/object_gui.cpp @@ -458,7 +458,7 @@ public: } if (_selected_object_index != -1) { - SetObjectToPlaceWnd(SPR_CURSOR_TRANSMITTER, PAL_NONE, HT_RECT, this); + SetObjectToPlaceWnd(SPR_CURSOR_TRANSMITTER, PAL_NONE, HT_RECT | HT_DIAGONAL, this); } this->UpdateButtons(_selected_object_class, _selected_object_index, _selected_object_view); @@ -543,9 +543,38 @@ public: void OnPlaceObject(Point pt, TileIndex tile) override { - ObjectClass *objclass = ObjectClass::Get(_selected_object_class); - Command::Post(STR_ERROR_CAN_T_BUILD_OBJECT, CcPlaySound_CONSTRUCTION_OTHER, - tile, objclass->GetSpec(_selected_object_index)->Index(), _selected_object_view); + const ObjectSpec *spec = ObjectClass::Get(_selected_object_class)->GetSpec(_selected_object_index); + + if (spec->size == OBJECT_SIZE_1X1) { + VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_BUILD_OBJECT); + } else { + Command::Post(STR_ERROR_CAN_T_BUILD_OBJECT, CcPlaySound_CONSTRUCTION_OTHER, tile, spec->Index(), _selected_object_view); + } + } + + void OnPlaceDrag(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt) override + { + VpSelectTilesWithMethod(pt.x, pt.y, select_method); + } + + void OnPlaceMouseUp(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt, TileIndex start_tile, TileIndex end_tile) override + { + if (pt.x == -1) return; + + switch (select_proc) { + default: NOT_REACHED(); + case DDSP_BUILD_OBJECT: + if (!_settings_game.construction.freeform_edges) { + /* When end_tile is MP_VOID, the error tile will not be visible to the + * user. This happens when terraforming at the southern border. */ + if (TileX(end_tile) == MapMaxX()) end_tile += TileDiffXY(-1, 0); + if (TileY(end_tile) == MapMaxY()) end_tile += TileDiffXY(0, -1); + } + const ObjectSpec *spec = ObjectClass::Get(_selected_object_class)->GetSpec(_selected_object_index); + Command::Post(STR_ERROR_CAN_T_BUILD_OBJECT, CcPlaySound_CONSTRUCTION_OTHER, + end_tile, start_tile, spec->Index(), _selected_object_view, (_ctrl_pressed ? true : false)); + break; + } } void OnPlaceObjectAbort() override diff --git a/src/settings_type.h b/src/settings_type.h index 65597154e2..a501ca5452 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -355,6 +355,8 @@ struct ConstructionSettings { uint16 clear_frame_burst; ///< how many tiles may, over a short period, be cleared? uint32 tree_per_64k_frames; ///< how many trees may, over a long period, be planted per 65536 frames? uint16 tree_frame_burst; ///< how many trees may, over a short period, be planted? + uint32 build_object_per_64k_frames; ///< how many tiles may, over a long period, have objects built on them per 65536 frames? + uint16 build_object_frame_burst; ///< how many tiles may, over a short period, have objects built on them? }; /** Settings related to the AI. */ diff --git a/src/table/settings/world_settings.ini b/src/table/settings/world_settings.ini index 5912f89f4c..de5ce376c7 100644 --- a/src/table/settings/world_settings.ini +++ b/src/table/settings/world_settings.ini @@ -415,6 +415,24 @@ max = 1 << 15 interval = 1 cat = SC_EXPERT +[SDT_VAR] +var = construction.build_object_per_64k_frames +type = SLE_UINT32 +def = 32 << 16 +min = 0 +max = 1 << 30 +interval = 1 +cat = SC_EXPERT + +[SDT_VAR] +var = construction.build_object_frame_burst +type = SLE_UINT16 +def = 2048 +min = 0 +max = 1 << 15 +interval = 1 +cat = SC_EXPERT + [SDT_BOOL] var = construction.autoslope from = SLV_75 diff --git a/src/viewport_type.h b/src/viewport_type.h index a317734b61..03374aef96 100644 --- a/src/viewport_type.h +++ b/src/viewport_type.h @@ -123,6 +123,7 @@ enum ViewportDragDropSelectionProcess { DDSP_CREATE_RIVER, ///< Create rivers DDSP_PLANT_TREES, ///< Plant trees DDSP_BUILD_BRIDGE, ///< Bridge placement + DDSP_BUILD_OBJECT, ///< Build an object /* Rail specific actions */ DDSP_PLACE_RAIL, ///< Rail placement From 8d0d45c4313bc05f3345021c94f8d42b3d955b95 Mon Sep 17 00:00:00 2001 From: SamuXarick <43006711+SamuXarick@users.noreply.github.com> Date: Wed, 22 Jun 2022 11:34:25 +0100 Subject: [PATCH 30/36] Add: ScriptCargo::GetWeight to get cargo weights --- src/script/api/ai_changelog.hpp | 2 ++ src/script/api/game_changelog.hpp | 2 ++ src/script/api/script_cargo.cpp | 6 ++++++ src/script/api/script_cargo.hpp | 10 ++++++++++ 4 files changed, 20 insertions(+) diff --git a/src/script/api/ai_changelog.hpp b/src/script/api/ai_changelog.hpp index 1e014266a3..6479393760 100644 --- a/src/script/api/ai_changelog.hpp +++ b/src/script/api/ai_changelog.hpp @@ -17,6 +17,8 @@ * * This version is not yet released. The following changes are not set in stone yet. * + * API additions: + * \li AICargo::GetWeight * \li AIIndustryType::ResolveNewGRFID * \li AIObjectType::ResolveNewGRFID * diff --git a/src/script/api/game_changelog.hpp b/src/script/api/game_changelog.hpp index 91dd0d22f5..592550ec1b 100644 --- a/src/script/api/game_changelog.hpp +++ b/src/script/api/game_changelog.hpp @@ -17,6 +17,8 @@ * * This version is not yet released. The following changes are not set in stone yet. * + * API additions: + * \li GSCargo::GetWeight * \li GSIndustryType::ResolveNewGRFID * \li GSObjectType::ResolveNewGRFID * diff --git a/src/script/api/script_cargo.cpp b/src/script/api/script_cargo.cpp index 5e092b52a0..e5a80023f7 100644 --- a/src/script/api/script_cargo.cpp +++ b/src/script/api/script_cargo.cpp @@ -81,3 +81,9 @@ if (!ScriptCargo::IsValidCargo(cargo_type)) return INVALID_DISTRIBUTION_TYPE; return (ScriptCargo::DistributionType)_settings_game.linkgraph.GetDistributionType(cargo_type); } + +/* static */ int64 ScriptCargo::GetWeight(CargoID cargo_type, uint32 amount) +{ + if (!IsValidCargo(cargo_type)) return -1; + return ::CargoSpec::Get(cargo_type)->weight * static_cast(amount) / 16; +} diff --git a/src/script/api/script_cargo.hpp b/src/script/api/script_cargo.hpp index 1bfd8c5531..67a54a3467 100644 --- a/src/script/api/script_cargo.hpp +++ b/src/script/api/script_cargo.hpp @@ -153,6 +153,16 @@ public: * @return The cargo distribution type for the given cargo. */ static DistributionType GetDistributionType(CargoID cargo_type); + + /** + * Get the weight in tonnes for the given amount of + * cargo for the specified type. + * @param cargo_type The cargo to check on. + * @param amount The quantity of cargo. + * @pre ScriptCargo::IsValidCargo(cargo_type). + * @return The weight in tonnes for that quantity of cargo. + */ + static int64 GetWeight(CargoID cargo_type, uint32 amount); }; #endif /* SCRIPT_CARGO_HPP */ From be7db7876768b3f19362895f55b30eca439a689f Mon Sep 17 00:00:00 2001 From: SamuXarick <43006711+SamuXarick@users.noreply.github.com> Date: Wed, 22 Jun 2022 14:04:42 +0100 Subject: [PATCH 31/36] Add: ScriptCargo::GetWeight regression tests --- regression/regression/main.nut | 1 + regression/regression/result.txt | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/regression/regression/main.nut b/regression/regression/main.nut index 9b68226953..05d6f275bd 100644 --- a/regression/regression/main.nut +++ b/regression/regression/main.nut @@ -341,6 +341,7 @@ function Regression::Cargo() print(" GetCargoIncome(10, 10): " + AICargo.GetCargoIncome(i, 10, 10)); print(" GetCargoIncome(100, 10): " + AICargo.GetCargoIncome(i, 100, 10)); print(" GetCargoIncome(10, 100): " + AICargo.GetCargoIncome(i, 10, 100)); + print(" GetWeight(100): " + AICargo.GetWeight(i, 100)); print(" GetRoadVehicleTypeForCargo(): " + AIRoad.GetRoadVehicleTypeForCargo(i)); } } diff --git a/regression/regression/result.txt b/regression/regression/result.txt index cca295fa01..27f90220dc 100644 --- a/regression/regression/result.txt +++ b/regression/regression/result.txt @@ -1118,6 +1118,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetCargoIncome(10, 10): -1 GetCargoIncome(100, 10): -1 GetCargoIncome(10, 100): -1 + GetWeight(100): -1 GetRoadVehicleTypeForCargo(): 1 Cargo 0 IsValidCargo(): true @@ -1130,6 +1131,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetCargoIncome(10, 10): 3 GetCargoIncome(100, 10): 38 GetCargoIncome(10, 100): 3 + GetWeight(100): 6 GetRoadVehicleTypeForCargo(): 0 Cargo 1 IsValidCargo(): true @@ -1142,6 +1144,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetCargoIncome(10, 10): 7 GetCargoIncome(100, 10): 71 GetCargoIncome(10, 100): 6 + GetWeight(100): 100 GetRoadVehicleTypeForCargo(): 1 Cargo 2 IsValidCargo(): true @@ -1154,6 +1157,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetCargoIncome(10, 10): 5 GetCargoIncome(100, 10): 55 GetCargoIncome(10, 100): 5 + GetWeight(100): 25 GetRoadVehicleTypeForCargo(): 1 Cargo 3 IsValidCargo(): true @@ -1166,6 +1170,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetCargoIncome(10, 10): 5 GetCargoIncome(100, 10): 53 GetCargoIncome(10, 100): 5 + GetWeight(100): 100 GetRoadVehicleTypeForCargo(): 1 Cargo 4 IsValidCargo(): true @@ -1178,6 +1183,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetCargoIncome(10, 10): 5 GetCargoIncome(100, 10): 52 GetCargoIncome(10, 100): 4 + GetWeight(100): 18 GetRoadVehicleTypeForCargo(): 1 Cargo 5 IsValidCargo(): true @@ -1190,6 +1196,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetCargoIncome(10, 10): 7 GetCargoIncome(100, 10): 74 GetCargoIncome(10, 100): 6 + GetWeight(100): 50 GetRoadVehicleTypeForCargo(): 1 Cargo 6 IsValidCargo(): true @@ -1202,6 +1209,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetCargoIncome(10, 10): 5 GetCargoIncome(100, 10): 58 GetCargoIncome(10, 100): 4 + GetWeight(100): 100 GetRoadVehicleTypeForCargo(): 1 Cargo 7 IsValidCargo(): true @@ -1214,6 +1222,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetCargoIncome(10, 10): 6 GetCargoIncome(100, 10): 60 GetCargoIncome(10, 100): 5 + GetWeight(100): 100 GetRoadVehicleTypeForCargo(): 1 Cargo 8 IsValidCargo(): true @@ -1226,6 +1235,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetCargoIncome(10, 10): 6 GetCargoIncome(100, 10): 62 GetCargoIncome(10, 100): 5 + GetWeight(100): 100 GetRoadVehicleTypeForCargo(): 1 Cargo 9 IsValidCargo(): true @@ -1238,6 +1248,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetCargoIncome(10, 10): 6 GetCargoIncome(100, 10): 69 GetCargoIncome(10, 100): 6 + GetWeight(100): 100 GetRoadVehicleTypeForCargo(): 1 Cargo 10 IsValidCargo(): true @@ -1250,6 +1261,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetCargoIncome(10, 10): 9 GetCargoIncome(100, 10): 90 GetCargoIncome(10, 100): 7 + GetWeight(100): 12 GetRoadVehicleTypeForCargo(): 1 Cargo 11 IsValidCargo(): false @@ -1262,6 +1274,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetCargoIncome(10, 10): -1 GetCargoIncome(100, 10): -1 GetCargoIncome(10, 100): -1 + GetWeight(100): -1 GetRoadVehicleTypeForCargo(): 1 Cargo 12 IsValidCargo(): false @@ -1274,6 +1287,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetCargoIncome(10, 10): -1 GetCargoIncome(100, 10): -1 GetCargoIncome(10, 100): -1 + GetWeight(100): -1 GetRoadVehicleTypeForCargo(): 1 Cargo 13 IsValidCargo(): false @@ -1286,6 +1300,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetCargoIncome(10, 10): -1 GetCargoIncome(100, 10): -1 GetCargoIncome(10, 100): -1 + GetWeight(100): -1 GetRoadVehicleTypeForCargo(): 1 Cargo 14 IsValidCargo(): false @@ -1298,6 +1313,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetCargoIncome(10, 10): -1 GetCargoIncome(100, 10): -1 GetCargoIncome(10, 100): -1 + GetWeight(100): -1 GetRoadVehicleTypeForCargo(): 1 --CargoList-- From c7505539afbeac4ad50ed555b496ae1aa9ba2fa6 Mon Sep 17 00:00:00 2001 From: SamuXarick <43006711+SamuXarick@users.noreply.github.com> Date: Tue, 24 May 2022 21:11:23 +0100 Subject: [PATCH 32/36] Fix #9869: remove docking tile when doing a clear square Terraforming through objects placed on water didn't properly remove docking tiles as expected. By moving some logic regarding removal of docking tiles into DoClearSquare, the issue is solved, while also simplifying code, avoiding repetition elsewhere. --- src/landscape.cpp | 3 +++ src/rail_cmd.cpp | 2 -- src/tunnelbridge_cmd.cpp | 7 ------- src/water_cmd.cpp | 4 ---- 4 files changed, 3 insertions(+), 13 deletions(-) diff --git a/src/landscape.cpp b/src/landscape.cpp index b921deef22..0ce190fe1b 100644 --- a/src/landscape.cpp +++ b/src/landscape.cpp @@ -32,6 +32,7 @@ #include "saveload/saveload.h" #include "framerate_type.h" #include "landscape_cmd.h" +#include "station_func.h" #include #include #include @@ -574,8 +575,10 @@ void DoClearSquare(TileIndex tile) /* If the tile can have animation and we clear it, delete it from the animated tile list. */ if (_tile_type_procs[GetTileType(tile)]->animate_tile_proc != nullptr) DeleteAnimatedTile(tile); + bool remove = IsDockingTile(tile); MakeClear(tile, CLEAR_GRASS, _generating_world ? 3 : 0); MarkTileDirtyByTile(tile); + if (remove) RemoveDockingTile(tile); } /** diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index a0e0596042..6ef44c1f96 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -1819,9 +1819,7 @@ static CommandCost ClearTile_Track(TileIndex tile, DoCommandFlag flags) /* The track was removed, and left a coast tile. Now also clear the water. */ if (flags & DC_EXEC) { - bool remove = IsDockingTile(tile); DoClearSquare(tile); - if (remove) RemoveDockingTile(tile); } cost.AddCost(_price[PR_CLEAR_WATER]); } diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index dc345c8fee..9d3868c86d 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -968,9 +968,6 @@ static CommandCost DoClearBridge(TileIndex tile, DoCommandFlag flags) if (v != nullptr) FreeTrainTrackReservation(v); } - bool removetile = false; - bool removeendtile = false; - /* Update company infrastructure counts. */ if (rail) { if (Company::IsValidID(owner)) Company::Get(owner)->infrastructure.rail[GetRailType(tile)] -= len * TUNNELBRIDGE_TRACKBIT_FACTOR; @@ -980,16 +977,12 @@ static CommandCost DoClearBridge(TileIndex tile, DoCommandFlag flags) UpdateCompanyRoadInfrastructure(GetRoadTypeTram(tile), GetRoadOwner(tile, RTT_TRAM), -(int)(len * 2 * TUNNELBRIDGE_TRACKBIT_FACTOR)); } else { // Aqueduct if (Company::IsValidID(owner)) Company::Get(owner)->infrastructure.water -= len * TUNNELBRIDGE_TRACKBIT_FACTOR; - removetile = IsDockingTile(tile); - removeendtile = IsDockingTile(endtile); } DirtyCompanyInfrastructureWindows(owner); DoClearSquare(tile); DoClearSquare(endtile); - if (removetile) RemoveDockingTile(tile); - if (removeendtile) RemoveDockingTile(endtile); for (TileIndex c = tile + delta; c != endtile; c += delta) { /* do not let trees appear from 'nowhere' after removing bridge */ if (IsNormalRoadTile(c) && GetRoadside(c) == ROADSIDE_TREES) { diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index 211e89b4a0..4f3ed30620 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -548,10 +548,8 @@ static CommandCost ClearTile_Water(TileIndex tile, DoCommandFlag flags) Company::Get(owner)->infrastructure.water--; DirtyCompanyInfrastructureWindows(owner); } - bool remove = IsDockingTile(tile); DoClearSquare(tile); MarkCanalsAndRiversAroundDirty(tile); - if (remove) RemoveDockingTile(tile); } return CommandCost(EXPENSES_CONSTRUCTION, base_cost); @@ -565,10 +563,8 @@ static CommandCost ClearTile_Water(TileIndex tile, DoCommandFlag flags) if (ret.Failed()) return ret; if (flags & DC_EXEC) { - bool remove = IsDockingTile(tile); DoClearSquare(tile); MarkCanalsAndRiversAroundDirty(tile); - if (remove) RemoveDockingTile(tile); } if (IsSlopeWithOneCornerRaised(slope)) { return CommandCost(EXPENSES_CONSTRUCTION, _price[PR_CLEAR_WATER]); From da1a0d042ed5d6dc54244cba724fd5b4044655fa Mon Sep 17 00:00:00 2001 From: glx22 Date: Tue, 27 Sep 2022 20:06:57 +0200 Subject: [PATCH 33/36] Fix: don't use animated SSE4 Draw() when animation is disabled --- src/blitter/32bpp_anim_sse4.cpp | 6 ++++++ src/blitter/32bpp_anim_sse4.hpp | 5 +++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/blitter/32bpp_anim_sse4.cpp b/src/blitter/32bpp_anim_sse4.cpp index 5089dce69f..efe8486dfd 100644 --- a/src/blitter/32bpp_anim_sse4.cpp +++ b/src/blitter/32bpp_anim_sse4.cpp @@ -367,6 +367,12 @@ IGNORE_UNINITIALIZED_WARNING_STOP */ void Blitter_32bppSSE4_Anim::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) { + if (_screen_disable_anim) { + /* This means our output is not to the screen, so we can't be doing any animation stuff, so use our parent Draw() */ + Blitter_32bppSSE4::Draw(bp, mode, zoom); + return; + } + const Blitter_32bppSSE_Base::SpriteFlags sprite_flags = ((const Blitter_32bppSSE_Base::SpriteData *) bp->sprite)->flags; switch (mode) { default: { diff --git a/src/blitter/32bpp_anim_sse4.hpp b/src/blitter/32bpp_anim_sse4.hpp index 8b740fd105..1b32e085c5 100644 --- a/src/blitter/32bpp_anim_sse4.hpp +++ b/src/blitter/32bpp_anim_sse4.hpp @@ -32,7 +32,7 @@ #define MARGIN_NORMAL_THRESHOLD 4 /** The SSE4 32 bpp blitter with palette animation. */ -class Blitter_32bppSSE4_Anim FINAL : public Blitter_32bppSSE2_Anim, public Blitter_32bppSSE_Base { +class Blitter_32bppSSE4_Anim FINAL : public Blitter_32bppSSE2_Anim, public Blitter_32bppSSE4 { private: public: @@ -43,13 +43,14 @@ public: return Blitter_32bppSSE_Base::Encode(sprite, allocator); } const char *GetName() override { return "32bpp-sse4-anim"; } + using Blitter_32bppSSE2_Anim::LookupColourInPalette; }; /** Factory for the SSE4 32 bpp blitter (with palette animation). */ class FBlitter_32bppSSE4_Anim: public BlitterFactory { public: FBlitter_32bppSSE4_Anim() : BlitterFactory("32bpp-sse4-anim", "32bpp SSE4 Blitter (palette animation)", HasCPUIDFlag(1, 2, 19)) {} - Blitter *CreateInstance() override { return new Blitter_32bppSSE4_Anim(); } + Blitter *CreateInstance() override { return static_cast(new Blitter_32bppSSE4_Anim()); } }; #endif /* WITH_SSE */ From f9cdb5b610c603dd5e2a5df940e19a37e59bd5f8 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Thu, 29 Sep 2022 00:46:31 +0100 Subject: [PATCH 34/36] Fix: Correctly set alpha of output in AlphaBlendTwoPixels Match alpha behaviour of ComposeColourRGBA --- src/blitter/32bpp_anim_sse4.cpp | 9 +++++---- src/blitter/32bpp_sse_func.hpp | 28 ++++++++++++++++++---------- src/blitter/32bpp_sse_type.h | 1 + 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/blitter/32bpp_anim_sse4.cpp b/src/blitter/32bpp_anim_sse4.cpp index efe8486dfd..93c9cb20c6 100644 --- a/src/blitter/32bpp_anim_sse4.cpp +++ b/src/blitter/32bpp_anim_sse4.cpp @@ -53,6 +53,7 @@ inline void Blitter_32bppSSE4_Anim::Draw(const Blitter::BlitterParams *bp, ZoomL const __m128i a_cm = ALPHA_CONTROL_MASK; const __m128i pack_low_cm = PACK_LOW_CONTROL_MASK; const __m128i tr_nom_base = TRANSPARENT_NOM_BASE; + const __m128i a_am = ALPHA_AND_MASK; for (int y = bp->height; y != 0; y--) { Colour *dst = dst_line; @@ -144,7 +145,7 @@ inline void Blitter_32bppSSE4_Anim::Draw(const Blitter::BlitterParams *bp, ZoomL /* Blend colours. */ bmno_alpha_blend: - srcABCD = AlphaBlendTwoPixels(srcABCD, dstABCD, a_cm, pack_low_cm); + srcABCD = AlphaBlendTwoPixels(srcABCD, dstABCD, a_cm, pack_low_cm, a_am); bmno_full_opacity: _mm_storel_epi64((__m128i *) dst, srcABCD); bmno_full_transparency: @@ -171,7 +172,7 @@ bmno_full_transparency: } else { srcABCD = _mm_cvtsi32_si128(src->data); } - dst->data = _mm_cvtsi128_si32(AlphaBlendTwoPixels(srcABCD, dstABCD, a_cm, pack_low_cm)); + dst->data = _mm_cvtsi128_si32(AlphaBlendTwoPixels(srcABCD, dstABCD, a_cm, pack_low_cm, a_am)); } } break; @@ -255,7 +256,7 @@ bmno_full_transparency: /* Blend colours. */ bmcr_alpha_blend: - srcABCD = AlphaBlendTwoPixels(srcABCD, dstABCD, a_cm, pack_low_cm); + srcABCD = AlphaBlendTwoPixels(srcABCD, dstABCD, a_cm, pack_low_cm, a_am); bmcr_full_opacity: _mm_storel_epi64((__m128i *) dst, srcABCD); bmcr_full_transparency: @@ -288,7 +289,7 @@ bmcr_full_transparency: if (src->a < 255) { bmcr_alpha_blend_single: __m128i dstABCD = _mm_cvtsi32_si128(dst->data); - srcABCD = AlphaBlendTwoPixels(srcABCD, dstABCD, a_cm, pack_low_cm); + srcABCD = AlphaBlendTwoPixels(srcABCD, dstABCD, a_cm, pack_low_cm, a_am); } dst->data = _mm_cvtsi128_si32(srcABCD); } diff --git a/src/blitter/32bpp_sse_func.hpp b/src/blitter/32bpp_sse_func.hpp index 4d04297e33..4771725dfc 100644 --- a/src/blitter/32bpp_sse_func.hpp +++ b/src/blitter/32bpp_sse_func.hpp @@ -65,27 +65,33 @@ static inline __m128i DistributeAlpha(const __m128i from, const __m128i &mask) { #if (SSE_VERSION == 2) __m128i alphaAB = _mm_shufflelo_epi16(from, 0x3F); // PSHUFLW, put alpha1 in front of each rgb1 - return _mm_shufflehi_epi16(alphaAB, 0x3F); // PSHUFHW, put alpha2 in front of each rgb2 + alphaAB = _mm_shufflehi_epi16(alphaAB, 0x3F); // PSHUFHW, put alpha2 in front of each rgb2 + alphaAB = _mm_or_si128(alphaAB, mask); // POR, set alpha fields to all 1 + return _mm_xor_si128(alphaAB, mask); // PXOR, set alpha fields to 0 #else return _mm_shuffle_epi8(from, mask); #endif } GNU_TARGET(SSE_TARGET) -static inline __m128i AlphaBlendTwoPixels(__m128i src, __m128i dst, const __m128i &distribution_mask, const __m128i &pack_mask) +static inline __m128i AlphaBlendTwoPixels(__m128i src, __m128i dst, const __m128i &distribution_mask, const __m128i &pack_mask, const __m128i &alpha_mask) { __m128i srcAB = _mm_unpacklo_epi8(src, _mm_setzero_si128()); // PUNPCKLBW, expand each uint8 into uint16 __m128i dstAB = _mm_unpacklo_epi8(dst, _mm_setzero_si128()); - __m128i alphaAB = _mm_cmpgt_epi16(srcAB, _mm_setzero_si128()); // PCMPGTW, if (alpha > 0) a++; - alphaAB = _mm_srli_epi16(alphaAB, 15); - alphaAB = _mm_add_epi16(alphaAB, srcAB); + __m128i alphaMaskAB = _mm_cmpgt_epi16(srcAB, _mm_setzero_si128()); // PCMPGTW (alpha > 0) ? 0xFFFF : 0 + __m128i alphaAB = _mm_srli_epi16(alphaMaskAB, 15); + alphaAB = _mm_add_epi16(alphaAB, srcAB); // if (alpha > 0) a++; alphaAB = DistributeAlpha(alphaAB, distribution_mask); srcAB = _mm_sub_epi16(srcAB, dstAB); // PSUBW, (r - Cr) srcAB = _mm_mullo_epi16(srcAB, alphaAB); // PMULLW, a*(r - Cr) srcAB = _mm_srli_epi16(srcAB, 8); // PSRLW, a*(r - Cr)/256 srcAB = _mm_add_epi16(srcAB, dstAB); // PADDW, a*(r - Cr)/256 + Cr + + alphaMaskAB = _mm_and_si128(alphaMaskAB, alpha_mask); // PAND, set non alpha fields to 0 + srcAB = _mm_or_si128(srcAB, alphaMaskAB); // POR, set alpha fields to 0xFFFF is src alpha was > 0 + return PackUnsaturated(srcAB, pack_mask); } @@ -227,9 +233,11 @@ inline void Blitter_32bppSSE4::Draw(const Blitter::BlitterParams *bp, ZoomLevel const MapValue *src_mv = src_mv_line; /* Load these variables into register before loop. */ + const __m128i alpha_and = ALPHA_AND_MASK; + #define ALPHA_BLEND_PARAM_3 alpha_and #if (SSE_VERSION == 2) const __m128i clear_hi = CLEAR_HIGH_BYTE_MASK; - #define ALPHA_BLEND_PARAM_1 clear_hi + #define ALPHA_BLEND_PARAM_1 alpha_and #define ALPHA_BLEND_PARAM_2 clear_hi #define DARKEN_PARAM_1 tr_nom_base #define DARKEN_PARAM_2 tr_nom_base @@ -275,7 +283,7 @@ inline void Blitter_32bppSSE4::Draw(const Blitter::BlitterParams *bp, ZoomLevel for (uint x = (uint) effective_width / 2; x > 0; x--) { __m128i srcABCD = _mm_loadl_epi64((const __m128i*) src); __m128i dstABCD = _mm_loadl_epi64((__m128i*) dst); - _mm_storel_epi64((__m128i*) dst, AlphaBlendTwoPixels(srcABCD, dstABCD, ALPHA_BLEND_PARAM_1, ALPHA_BLEND_PARAM_2)); + _mm_storel_epi64((__m128i*) dst, AlphaBlendTwoPixels(srcABCD, dstABCD, ALPHA_BLEND_PARAM_1, ALPHA_BLEND_PARAM_2, ALPHA_BLEND_PARAM_3)); src += 2; dst += 2; } @@ -283,7 +291,7 @@ inline void Blitter_32bppSSE4::Draw(const Blitter::BlitterParams *bp, ZoomLevel if ((bt_last == BT_NONE && effective_width & 1) || bt_last == BT_ODD) { __m128i srcABCD = _mm_cvtsi32_si128(src->data); __m128i dstABCD = _mm_cvtsi32_si128(dst->data); - dst->data = _mm_cvtsi128_si32(AlphaBlendTwoPixels(srcABCD, dstABCD, ALPHA_BLEND_PARAM_1, ALPHA_BLEND_PARAM_2)); + dst->data = _mm_cvtsi128_si32(AlphaBlendTwoPixels(srcABCD, dstABCD, ALPHA_BLEND_PARAM_1, ALPHA_BLEND_PARAM_2, ALPHA_BLEND_PARAM_3)); } break; @@ -328,7 +336,7 @@ inline void Blitter_32bppSSE4::Draw(const Blitter::BlitterParams *bp, ZoomLevel } /* Blend colours. */ - _mm_storel_epi64((__m128i *) dst, AlphaBlendTwoPixels(srcABCD, dstABCD, ALPHA_BLEND_PARAM_1, ALPHA_BLEND_PARAM_2)); + _mm_storel_epi64((__m128i *) dst, AlphaBlendTwoPixels(srcABCD, dstABCD, ALPHA_BLEND_PARAM_1, ALPHA_BLEND_PARAM_2, ALPHA_BLEND_PARAM_3)); dst += 2; src += 2; src_mv += 2; @@ -357,7 +365,7 @@ inline void Blitter_32bppSSE4::Draw(const Blitter::BlitterParams *bp, ZoomLevel if (src->a < 255) { bmcr_alpha_blend_single: __m128i dstABCD = _mm_cvtsi32_si128(dst->data); - srcABCD = AlphaBlendTwoPixels(srcABCD, dstABCD, ALPHA_BLEND_PARAM_1, ALPHA_BLEND_PARAM_2); + srcABCD = AlphaBlendTwoPixels(srcABCD, dstABCD, ALPHA_BLEND_PARAM_1, ALPHA_BLEND_PARAM_2, ALPHA_BLEND_PARAM_3); } dst->data = _mm_cvtsi128_si32(srcABCD); } diff --git a/src/blitter/32bpp_sse_type.h b/src/blitter/32bpp_sse_type.h index 33c76d9b4d..fe91b294be 100644 --- a/src/blitter/32bpp_sse_type.h +++ b/src/blitter/32bpp_sse_type.h @@ -51,6 +51,7 @@ typedef union ALIGN(16) um128i { #define OVERBRIGHT_VALUE_MASK _mm_setr_epi8(-1, 0, -1, 0, -1, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0) #define OVERBRIGHT_CONTROL_MASK _mm_setr_epi8( 0, 1, 0, 1, 0, 1, 7, 7, 2, 3, 2, 3, 2, 3, 7, 7) #define TRANSPARENT_NOM_BASE _mm_setr_epi16(256, 256, 256, 256, 256, 256, 256, 256) +#define ALPHA_AND_MASK _mm_setr_epi16( 0, 0, 0, -1, 0, 0, 0, -1) #endif /* WITH_SSE */ #endif /* BLITTER_32BPP_SSE_TYPE_H */ From 47456ac672681591a48c37188983ab82b592a5e4 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Thu, 29 Sep 2022 08:47:10 +0100 Subject: [PATCH 35/36] Change: Reduce number of instructions in AlphaBlendTwoPixels --- src/blitter/32bpp_sse_func.hpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/blitter/32bpp_sse_func.hpp b/src/blitter/32bpp_sse_func.hpp index 4771725dfc..e8d9c05061 100644 --- a/src/blitter/32bpp_sse_func.hpp +++ b/src/blitter/32bpp_sse_func.hpp @@ -66,8 +66,7 @@ static inline __m128i DistributeAlpha(const __m128i from, const __m128i &mask) #if (SSE_VERSION == 2) __m128i alphaAB = _mm_shufflelo_epi16(from, 0x3F); // PSHUFLW, put alpha1 in front of each rgb1 alphaAB = _mm_shufflehi_epi16(alphaAB, 0x3F); // PSHUFHW, put alpha2 in front of each rgb2 - alphaAB = _mm_or_si128(alphaAB, mask); // POR, set alpha fields to all 1 - return _mm_xor_si128(alphaAB, mask); // PXOR, set alpha fields to 0 + return _mm_andnot_si128(mask, alphaAB); // PANDN, set alpha fields to 0 #else return _mm_shuffle_epi8(from, mask); #endif @@ -80,8 +79,7 @@ static inline __m128i AlphaBlendTwoPixels(__m128i src, __m128i dst, const __m128 __m128i dstAB = _mm_unpacklo_epi8(dst, _mm_setzero_si128()); __m128i alphaMaskAB = _mm_cmpgt_epi16(srcAB, _mm_setzero_si128()); // PCMPGTW (alpha > 0) ? 0xFFFF : 0 - __m128i alphaAB = _mm_srli_epi16(alphaMaskAB, 15); - alphaAB = _mm_add_epi16(alphaAB, srcAB); // if (alpha > 0) a++; + __m128i alphaAB = _mm_sub_epi16(srcAB, alphaMaskAB); // if (alpha > 0) a++; alphaAB = DistributeAlpha(alphaAB, distribution_mask); srcAB = _mm_sub_epi16(srcAB, dstAB); // PSUBW, (r - Cr) From 3b071f47e4b1a17af7924f3b51f1a167e32a2d60 Mon Sep 17 00:00:00 2001 From: translators Date: Sun, 16 Oct 2022 18:54:39 +0000 Subject: [PATCH 36/36] Update: Translations from eints vietnamese: 1 change by KhoiCanDev --- src/lang/vietnamese.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index bfdb3d8153..ddbde25e00 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -4469,7 +4469,7 @@ STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Bảng l STR_TIMETABLE_STATUS_START_AT :{BLACK}Bảng lịch trình sẽ bắt đầu lúc {STRING} STR_TIMETABLE_STARTING_DATE :{BLACK}Ngày bắt đầu -STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Lựa chọn ngày bắt đầu trong bảng lịch trình này. Ctrl+Click chọn ngày bắt đầu trong bảng lịch trình và phân bổ nó cho tất cả các phương tiện chia sẻ lộ trình này, nếu như lộ trình đã lên lịch đầy đủ. +STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Lựa chọn ngày bắt đầu trong bảng lịch trình này. Ctrl+Click phân bổ cho tất cả các phương tiện chia sẻ lộ trình này bắt đầu từ ngày được chọn một cách đồng đều theo thứ tự tương đối giữa chúng, nếu như lộ trình đã lên lịch đầy đủ. STR_TIMETABLE_CHANGE_TIME :{BLACK}Đổi thời gian STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Thay đổi thời lượng của điểm lộ trình được phép sử dụng