diff --git a/src/newgrf.h b/src/newgrf.h index 9684597522..cf9bcba599 100644 --- a/src/newgrf.h +++ b/src/newgrf.h @@ -89,6 +89,7 @@ enum GrfSpecFeature { GSF_END, GSF_FAKE_TOWNS = GSF_END, ///< Fake town GrfSpecFeature for NewGRF debugging (parent scope) + GSF_FAKE_STATION_STRUCT, ///< Fake station struct GrfSpecFeature for NewGRF debugging GSF_FAKE_END, ///< End of the fake features GSF_INVALID = 0xFF, ///< An invalid spec feature diff --git a/src/station.cpp b/src/station.cpp index 3742f23fb1..0c9b8c44d6 100644 --- a/src/station.cpp +++ b/src/station.cpp @@ -31,6 +31,7 @@ #include "linkgraph/linkgraph.h" #include "linkgraph/linkgraphschedule.h" #include "tracerestrict.h" +#include "newgrf_debug.h" #include "table/strings.h" @@ -152,6 +153,7 @@ Station::~Station() } DeleteWindowById(WC_STATION_VIEW, index); + DeleteNewGRFInspectWindow(GSF_FAKE_STATION_STRUCT, this->index); /* Now delete all orders that go to the station */ RemoveOrderFromAllVehicles(OT_GOTO_STATION, this->index); diff --git a/src/station_gui.cpp b/src/station_gui.cpp index 5328c6213a..46805e1534 100644 --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -35,6 +35,7 @@ #include "zoom_func.h" #include "departures_gui.h" #include "zoning.h" +#include "newgrf_debug.h" #include "widgets/station_widget.h" @@ -747,6 +748,7 @@ static const NWidgetPart _nested_station_view_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_SV_CAPTION), SetDataTip(STR_STATION_VIEW_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), + NWidget(WWT_DEBUGBOX, COLOUR_GREY), NWidget(WWT_SHADEBOX, COLOUR_GREY), NWidget(WWT_DEFSIZEBOX, COLOUR_GREY), NWidget(WWT_STICKYBOX, COLOUR_GREY), @@ -2070,6 +2072,16 @@ struct StationViewWindow : public Window { } } } + + bool IsNewGRFInspectable() const override + { + return ::IsNewGRFInspectable(GSF_FAKE_STATION_STRUCT, this->window_number); + } + + void ShowNewGRFInspectWindow() const override + { + ::ShowNewGRFInspectWindow(GSF_FAKE_STATION_STRUCT, this->window_number); + } }; const StringID StationViewWindow::_sort_names[] = { diff --git a/src/table/newgrf_debug_data.h b/src/table/newgrf_debug_data.h index 08a9d99d9a..2bae76f53d 100644 --- a/src/table/newgrf_debug_data.h +++ b/src/table/newgrf_debug_data.h @@ -394,6 +394,27 @@ class NIHIndustry : public NIHelper { if (i->psa == nullptr) return nullptr; return (int32 *)(&i->psa->storage); } + + void ExtraInfo(uint index, std::function print) const override + { + char buffer[1024]; + print("Debug Info:"); + seprintf(buffer, lastof(buffer), " Index: %u", index); + print(buffer); + const Industry *ind = Industry::GetIfValid(index); + if (ind) { + if (ind->neutral_station) { + seprintf(buffer, lastof(buffer), " Neutral station: %u: %s", ind->neutral_station->index, ind->neutral_station->GetCachedName()); + print(buffer); + } + seprintf(buffer, lastof(buffer), " Nearby stations: %u", (uint) ind->stations_near.size()); + print(buffer); + for (const Station *st : ind->stations_near) { + seprintf(buffer, lastof(buffer), " %u: %s", st->index, st->GetCachedName()); + print(buffer); + } + } + } }; static const NIFeature _nif_industry = { @@ -602,6 +623,49 @@ static const NIFeature _nif_town = { new NIHTown(), }; +class NIHStationStruct : public NIHelper { + bool IsInspectable(uint index) const override { return BaseStation::IsValidID(index); } + bool ShowExtraInfoOnly(uint index) const override { return true; } + uint GetParent(uint index) const override { return UINT32_MAX; } + const void *GetInstance(uint index)const override { return nullptr; } + const void *GetSpec(uint index) const override { return nullptr; } + void SetStringParameters(uint index) const override { this->SetSimpleStringParameters(STR_STATION_NAME, index); } + uint32 GetGRFID(uint index) const override { return 0; } + + uint Resolve(uint index, uint var, uint param, bool *avail) const override + { + return 0; + } + + void ExtraInfo(uint index, std::function print) const override + { + char buffer[1024]; + print("Debug Info:"); + seprintf(buffer, lastof(buffer), " Index: %u", index); + print(buffer); + const Station *st = Station::GetIfValid(index); + if (st) { + if (st->industry) { + seprintf(buffer, lastof(buffer), " Neutral industry: %u: %s", st->industry->index, st->industry->GetCachedName()); + print(buffer); + } + seprintf(buffer, lastof(buffer), " Nearby industries: %u", (uint) st->industries_near.size()); + print(buffer); + for (const Industry *ind : st->industries_near) { + seprintf(buffer, lastof(buffer), " %u: %s", ind->index, ind->GetCachedName()); + print(buffer); + } + } + } +}; + +static const NIFeature _nif_station_struct = { + nullptr, + nullptr, + nullptr, + new NIHStationStruct(), +}; + /** Table with all NIFeatures. */ static const NIFeature * const _nifeatures[] = { &_nif_vehicle, // GSF_TRAINS @@ -623,5 +687,6 @@ static const NIFeature * const _nifeatures[] = { &_nif_railtype, // GSF_RAILTYPES &_nif_airporttile, // GSF_AIRPORTTILES &_nif_town, // GSF_FAKE_TOWNS + &_nif_station_struct, // GSF_FAKE_STATION_STRUCT }; assert_compile(lengthof(_nifeatures) == GSF_FAKE_END);