mirror of
https://github.com/JGRennison/OpenTTD-patches.git
synced 2024-11-16 00:12:51 +00:00
Merge remote-tracking branch 'upstream/jgrpp' into jgrpp
This commit is contained in:
commit
7595e54329
@ -1,2 +1,2 @@
|
||||
jgrpp-0.7.0 27415 0 jgrpp-0.7.0
|
||||
788f8c0cf7000f20953ac49e57bb799b1c75c7774d9b7aeb9b188fe3e415a7c9 -
|
||||
jgrpp-0.7.1 27428 0 jgrpp-0.7.1
|
||||
60c05dd628290c02d39e5ade377ba82f949ab1da446e83903eb95ed57ea10c1a -
|
||||
|
@ -75,6 +75,8 @@ endif
|
||||
$(Q)cp "$(ROOT_DIR)/known-bugs.txt" "$(BUNDLE_DIR)/"
|
||||
$(Q)cp "$(ROOT_DIR)/docs/multiplayer.txt" "$(BUNDLE_DIR)/docs/"
|
||||
$(Q)cp "$(ROOT_DIR)/changelog.txt" "$(BUNDLE_DIR)/"
|
||||
$(Q)cp "$(ROOT_DIR)/README.md" "$(BUNDLE_DIR)/"
|
||||
$(Q)cp "$(ROOT_DIR)/jgrpp-changelog.md" "$(BUNDLE_DIR)/"
|
||||
ifdef MAN_DIR
|
||||
$(Q)mkdir -p "$(BUNDLE_DIR)/man/"
|
||||
$(Q)cp "$(ROOT_DIR)/docs/openttd.6" "$(BUNDLE_DIR)/man/"
|
||||
@ -90,7 +92,7 @@ ifdef MENU_DIR
|
||||
$(Q)sed s/=openttd/=$(BINARY_NAME)/g "$(BUNDLE_DIR)/media/openttd.desktop" > "$(ROOT_DIR)/media/openttd.desktop.install"
|
||||
endif
|
||||
ifeq ($(TTD), openttd.exe)
|
||||
$(Q)unix2dos "$(BUNDLE_DIR)/docs/"* "$(BUNDLE_DIR)/readme.txt" "$(BUNDLE_DIR)/COPYING" "$(BUNDLE_DIR)/changelog.txt" "$(BUNDLE_DIR)/known-bugs.txt"
|
||||
$(Q)unix2dos "$(BUNDLE_DIR)/docs/"* "$(BUNDLE_DIR)/readme.txt" "$(BUNDLE_DIR)/COPYING" "$(BUNDLE_DIR)/changelog.txt" "$(BUNDLE_DIR)/known-bugs.txt" "$(BUNDLE_DIR)/"*.md
|
||||
ifeq ($(OS), DOS)
|
||||
$(Q)cp "$(ROOT_DIR)/os/dos/cwsdpmi/cwsdpmi.txt" "$(BUNDLE_DIR)/docs/"
|
||||
ifndef STRIP
|
||||
@ -161,7 +163,7 @@ bundle_dmg: bundle
|
||||
bundle_exe: all
|
||||
@echo '[BUNDLE] Creating $(BUNDLE_NAME).exe'
|
||||
$(Q)mkdir -p "$(BUNDLES_DIR)"
|
||||
$(Q)unix2dos "$(ROOT_DIR)/docs/"*.txt "$(ROOT_DIR)/readme.txt" "$(ROOT_DIR)/COPYING" "$(ROOT_DIR)/changelog.txt" "$(ROOT_DIR)/known-bugs.txt"
|
||||
$(Q)unix2dos "$(ROOT_DIR)/docs/"*.txt "$(ROOT_DIR)/readme.txt" "$(ROOT_DIR)/COPYING" "$(ROOT_DIR)/changelog.txt" "$(ROOT_DIR)/known-bugs.txt" "$(ROOT_DIR)/"*.md
|
||||
$(Q)cd $(ROOT_DIR)/os/windows/installer && makensis.exe //DVERSION_INCLUDE=version_$(PLATFORM).txt install.nsi
|
||||
$(Q)mv $(ROOT_DIR)/os/windows/installer/*$(PLATFORM).exe "$(BUNDLES_DIR)/$(BUNDLE_NAME).exe"
|
||||
|
||||
@ -196,6 +198,7 @@ endif
|
||||
ifndef DO_NOT_INSTALL_CHANGELOG
|
||||
$(Q)install -d "$(INSTALL_DOC_DIR)"
|
||||
$(Q)install -m 644 "$(BUNDLE_DIR)/changelog.txt" "$(INSTALL_DOC_DIR)"
|
||||
$(Q)install -m 644 "$(BUNDLE_DIR)/jgrpp-changelog.md" "$(INSTALL_DOC_DIR)"
|
||||
endif
|
||||
ifndef DO_NOT_INSTALL_LICENSE
|
||||
$(Q)install -d "$(INSTALL_DOC_DIR)"
|
||||
|
18
README.md
18
README.md
@ -1,4 +1,4 @@
|
||||
## JGR's Patchpack version 0.7.0
|
||||
## JGR's Patchpack version 0.7.1
|
||||
|
||||
This is a collection of patches applied to [OpenTTD](http://www.openttd.org/)
|
||||
|
||||
@ -38,7 +38,8 @@ See [jgrpp-changelog.md](jgrpp-changelog.md) for changelog.
|
||||
|
||||
* Zoning: [imported](http://www.tt-forums.net/viewtopic.php?f=33&t=33701)
|
||||
This is modified to remove unimplemented modes, implement station ownership checks and implement station facility checks for industries.
|
||||
As of v0.6.0, add a mode to show restricted signals.
|
||||
As of v0.6.0, add a mode to show restricted signals.
|
||||
As of v0.7.1, fix adding/removing station tiles not redrawing affected surrounding tiles when in the station catchment or unserved building/industry modes.
|
||||
|
||||
* Departure boards: [imported](https://www.tt-forums.net/viewtopic.php?f=33&t=49956)
|
||||
* Fixed departure boards with orders with timetabled 0 travel times, e.g. those with depot service orders.
|
||||
@ -50,7 +51,8 @@ See [jgrpp-changelog.md](jgrpp-changelog.md) for changelog.
|
||||
|
||||
* Vehicles visible in tunnels (transparency setting): [imported](http://dev.openttdcoop.org/projects/clientpatches/repository/changes/VehicelsInTunnels.diff)
|
||||
|
||||
* Signals in tunnels and on bridges: [imported](http://www.tt-forums.net/viewtopic.php?f=33&t=41260)
|
||||
* Signals in tunnels and on bridges: [imported](http://www.tt-forums.net/viewtopic.php?f=33&t=41260)
|
||||
As of v0.7.1, fix various issues involving redrawing, updating of adjacent signals, and vehicles emitting smoke whilst stopped at a red signal.
|
||||
|
||||
* Measurement tools: [imported](http://www.tt-forums.net/viewtopic.php?f=33&t=49212)
|
||||
|
||||
@ -72,12 +74,13 @@ See [jgrpp-changelog.md](jgrpp-changelog.md) for changelog.
|
||||
* Auto separation: Fix handling of non-station orders (e.g. waypoints and depots). Add setting to scale vehicle lateness adjustments. No longer set vehicle lateness to 0 if separation fails, instead leave it as it was.
|
||||
* Timetable GUI: Allow clearing of timetable time fields which are at 0. Allow explicitly setting timetable time fields to 0 without clearing them.
|
||||
* Add a company setting to enable automatic timetabling for new vehicles (added in v0.4.0).
|
||||
* As of v0.7.0, the setting to scale vehicle lateness adjustments is a company setting.
|
||||
* As of v0.7.0, the setting to scale vehicle lateness adjustments is a company setting. As of v0.7.1 the default value has been changed to 40%.
|
||||
|
||||
* Vehicle repair cost: [imported](http://www.tt-forums.net/viewtopic.php?f=33&t=45642)
|
||||
|
||||
* Enhanced viewport: [imported](https://www.tt-forums.net/viewtopic.php?f=33&t=53394)
|
||||
Fixed crash when looking at aqueducts in viewport map mode.
|
||||
Fixed crash when looking at aqueducts in viewport map mode.
|
||||
As of v0.7.1, fix flicker and render errors of bridge/tunnels in viewport map mode, and rendering/clearing errors of vehicle route lines.
|
||||
|
||||
* Infrastructure sharing: [imported](http://www.tt-forums.net/viewtopic.php?f=33&t=42254)
|
||||
Fixed various issues with additions to the settings GUI.
|
||||
@ -145,9 +148,12 @@ See [jgrpp-changelog.md](jgrpp-changelog.md) for changelog.
|
||||
Enable stack traces on MinGW, try to demangle C++ symbol names, try to use libbfd for better symbol lookup, handle SIGSEGV while backtracing.
|
||||
|
||||
* Multiplayer desync fixes/changes
|
||||
* Fix YAPF pathfinder desync issue involving rail track type changes which where only passable by a subset of vehicles (trunk bug). (added in v0.6.0)
|
||||
* Fix YAPF pathfinder desync issue involving rail track type changes which where only passable by a subset of vehicles (trunk bug). (added in v0.6.0, fixed in trunk as of v0.7.1)
|
||||
* Logging: Various changes and improvements to desync-related logging and debugging, see changelog for details.
|
||||
|
||||
* Translations
|
||||
* German (by Auge): including vehicle group info, vehicle details window, and the zoning toolbar.
|
||||
|
||||
|
||||
#### Caveats for loading savegames from the [Spring 2013 Patch Pack](http://www.tt-forums.net/viewtopic.php?f=33&t=66892):
|
||||
* This is not guaranteed to be bug free
|
||||
|
@ -2,6 +2,22 @@
|
||||
|
||||
* * *
|
||||
|
||||
### v0.7.1 (2015-11-01)
|
||||
* Enhanced viewports:
|
||||
* Fix flicker and render errors of bridge/tunnels in viewport map mode.
|
||||
* Fix rendering, clearing and timely update issues of vehicle route lines.
|
||||
* Zoning: Fix adding/removing station tiles not redrawing affected surrounding tiles when in the station catchment or unserved building/industry modes.
|
||||
* Bridges on signals and tunnels:
|
||||
* Fix adjacent signals around bridge/tunnels not being updated when adding/updating (on the far side) and removing (on both sides) signals from the bridge/tunnel.
|
||||
* Fix middle of bridge not being redrawn when adding/updating/removing signals to bridges.
|
||||
* Fix vehicles continually emitting smoke when stopped at a red signal on a bridge.
|
||||
* Change the default for the auto timetable separation rate company setting to 40%. This is to improve jam-resistance by default.
|
||||
* Vehicle group info: make margins around text symmetric.
|
||||
* Fix compilation on some compilers/platforms
|
||||
* Add the changelog and readme to the bundle/install target.
|
||||
* Add German translations by Auge, including: vehicle group info, vehicle details window, and the zoning toolbar.
|
||||
* Bump trunk base from r27415 to r27428
|
||||
|
||||
### v0.7.0 (2015-10-29)
|
||||
* Fix timetable rounding depending on the client time display mode setting, which caused desyncs in multiplayer (departure boards patch bug).
|
||||
* Add reverse at waypoint orders.
|
||||
|
@ -1289,6 +1289,10 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL :Zeige die Einwo
|
||||
STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Zeige die Einwohneranzahl neben den Städtenamen auf der Karte an
|
||||
STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Linienstärke in Diagrammen: {STRING}
|
||||
STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Strichdicke der Linien in Diagrammen. Dünnere Linien sind genauer ablesbar, dickere Linien sind besser sichtbar und erlauben es, Farben leichter zu unterscheiden
|
||||
STR_CONFIG_SETTING_SHOW_TRAIN_LENGTH_IN_DETAILS :Zuglänge in den Fahrzeugdetails anzeigen: {STRING}
|
||||
STR_CONFIG_SETTING_SHOW_TRAIN_LENGTH_IN_DETAILS_HELPTEXT :Zeige die Zuglänge im Fenster für die Fahrzeugdetails an
|
||||
STR_CONFIG_SETTING_SHOW_VEHICLE_GROUP_IN_DETAILS :Gruppe in den Fahrzeugdetails anzeigen: {STRING}
|
||||
STR_CONFIG_SETTING_SHOW_VEHICLE_GROUP_IN_DETAILS_HELPTEXT :Zeige die Fahrzeuggruppe im Fenster für die Fahrzeugdetails an
|
||||
|
||||
STR_CONFIG_SETTING_LANDSCAPE :Landschaftstyp: {STRING}
|
||||
STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Landschaftstype definiert grundlegende Spielscenarien in Bezug auf verfügbare Fracht und Wachstumsvoraussetzungen für Städte. NewGRFs und Spielskripte erlauben weitgehendere Kontrolle dieser Parameter
|
||||
@ -3361,6 +3365,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Liste leeren
|
||||
|
||||
STR_GROUP_RENAME_CAPTION :{BLACK}Gruppe umbenennen
|
||||
|
||||
STR_GROUP_PROFIT_THIS_YEAR :Profit in diesem Jahr:
|
||||
STR_GROUP_PROFIT_LAST_YEAR :Profit im letzten Jahr:
|
||||
STR_GROUP_OCCUPANCY :Momentane Auslastung:
|
||||
STR_GROUP_OCCUPANCY_VALUE :{NUM}%
|
||||
|
||||
# Build vehicle window
|
||||
STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Neue Schienenfahrzeuge
|
||||
STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Neue elektrische Schienenfahrzeuge
|
||||
@ -3655,9 +3664,13 @@ STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Max. Ges
|
||||
STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Gewicht: {LTBLUE}{WEIGHT_SHORT} {BLACK}Leistung: {LTBLUE}{POWER}{BLACK} Max. Geschw.: {LTBLUE}{VELOCITY}
|
||||
STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Gewicht: {LTBLUE}{WEIGHT_SHORT} {BLACK}Leistung: {LTBLUE}{POWER}{BLACK} Max. Geschw.: {LTBLUE}{VELOCITY} {BLACK}Max. Zugkraft: {LTBLUE}{FORCE}
|
||||
|
||||
STR_VEHICLE_INFO_TRAIN_LENGTH :{BLACK}Zuglänge: {LTBLUE}{DECIMAL} Kachel{P "" n} {STRING}
|
||||
|
||||
STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Gewinn dieses Jahr: {LTBLUE}{CURRENCY_LONG} (letztes Jahr: {CURRENCY_LONG})
|
||||
STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Zuverlässigkeit: {LTBLUE}{COMMA}% {BLACK}Pannen seit der letzten Wartung: {LTBLUE}{COMMA}
|
||||
|
||||
STR_VEHICLE_INFO_GROUP :{BLACK}Gruppe: {LTBLUE}{GROUP}
|
||||
|
||||
STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Gebaut: {LTBLUE}{NUM}{BLACK} Wert: {LTBLUE}{CURRENCY_LONG}
|
||||
STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Kapazität: {LTBLUE}Keine{STRING}
|
||||
STR_VEHICLE_INFO_CAPACITY :{BLACK}Kapazität: {LTBLUE}{CARGO_LONG}{3:STRING}
|
||||
|
@ -1091,10 +1091,11 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1,
|
||||
}
|
||||
}
|
||||
}
|
||||
MarkTileDirtyByTile(tile);
|
||||
MarkTileDirtyByTile(tile_exit);
|
||||
MarkBridgeOrTunnelDirty(tile);
|
||||
AddSideToSignalBuffer(tile, INVALID_DIAGDIR, GetTileOwner(tile));
|
||||
AddSideToSignalBuffer(tile_exit, INVALID_DIAGDIR, GetTileOwner(tile));
|
||||
YapfNotifyTrackLayoutChange(tile, track);
|
||||
YapfNotifyTrackLayoutChange(tile_exit, track);
|
||||
}
|
||||
return cost;
|
||||
}
|
||||
@ -1545,10 +1546,11 @@ CommandCost CmdRemoveSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1
|
||||
ClrBitTunnelBridgeSignal(end);
|
||||
_m[tile].m2 = 0;
|
||||
_m[end].m2 = 0;
|
||||
MarkTileDirtyByTile(tile);
|
||||
MarkTileDirtyByTile(end);
|
||||
MarkBridgeOrTunnelDirty(tile);
|
||||
AddSideToSignalBuffer(tile, INVALID_DIAGDIR, GetTileOwner(tile));
|
||||
AddSideToSignalBuffer(end, INVALID_DIAGDIR, GetTileOwner(tile));
|
||||
YapfNotifyTrackLayoutChange(tile, track);
|
||||
YapfNotifyTrackLayoutChange(end, track);
|
||||
return CommandCost(EXPENSES_CONSTRUCTION, cost);
|
||||
}
|
||||
|
||||
|
@ -294,13 +294,11 @@ uint Station::GetCatchmentRadius() const
|
||||
* Determines catchment rectangle of this station
|
||||
* @return clamped catchment rectangle
|
||||
*/
|
||||
Rect Station::GetCatchmentRect() const
|
||||
Rect Station::GetCatchmentRectUsingRadius(uint catchment_radius) const
|
||||
{
|
||||
assert(!this->rect.IsEmpty());
|
||||
|
||||
/* Compute acceptance rectangle */
|
||||
int catchment_radius = this->GetCatchmentRadius();
|
||||
|
||||
Rect ret = {
|
||||
max<int>(this->rect.left - catchment_radius, 0),
|
||||
max<int>(this->rect.top - catchment_radius, 0),
|
||||
|
@ -489,7 +489,11 @@ public:
|
||||
static void RecomputeIndustriesNearForAll();
|
||||
|
||||
uint GetCatchmentRadius() const;
|
||||
Rect GetCatchmentRect() const;
|
||||
Rect GetCatchmentRectUsingRadius(uint radius) const;
|
||||
inline Rect GetCatchmentRect() const
|
||||
{
|
||||
return GetCatchmentRectUsingRadius(this->GetCatchmentRadius());
|
||||
}
|
||||
|
||||
/* virtual */ inline bool TileBelongsToRailStation(TileIndex tile) const
|
||||
{
|
||||
|
@ -53,6 +53,7 @@
|
||||
#include "linkgraph/linkgraph_base.h"
|
||||
#include "linkgraph/refresh.h"
|
||||
#include "widgets/station_widget.h"
|
||||
#include "zoning.h"
|
||||
|
||||
#include "table/strings.h"
|
||||
|
||||
@ -1425,6 +1426,7 @@ CommandCost CmdBuildRailStation(TileIndex tile_org, DoCommandFlag flags, uint32
|
||||
st->UpdateVirtCoord();
|
||||
UpdateStationAcceptance(st, false);
|
||||
st->RecomputeIndustriesNear();
|
||||
ZoningMarkDirtyStationCoverageArea(st);
|
||||
InvalidateWindowData(WC_SELECT_STATION, 0, 0);
|
||||
InvalidateWindowData(WC_STATION_LIST, st->owner, 0);
|
||||
SetWindowWidgetDirty(WC_STATION_VIEW, st->index, WID_SV_TRAINS);
|
||||
@ -1537,6 +1539,9 @@ CommandCost RemoveFromRailBaseStation(TileArea ta, SmallVector<T *, 4> &affected
|
||||
}
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
bool already_affected = affected_stations.Include(st);
|
||||
if (!already_affected) ZoningMarkDirtyStationCoverageArea(st);
|
||||
|
||||
/* read variables before the station tile is removed */
|
||||
uint specindex = GetCustomStationSpecIndex(tile);
|
||||
Track track = GetRailStationTrack(tile);
|
||||
@ -1571,8 +1576,6 @@ CommandCost RemoveFromRailBaseStation(TileArea ta, SmallVector<T *, 4> &affected
|
||||
|
||||
DeallocateSpecFromStation(st, specindex);
|
||||
|
||||
affected_stations.Include(st);
|
||||
|
||||
if (v != NULL) {
|
||||
/* Restore station reservation. */
|
||||
if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), true);
|
||||
@ -1716,6 +1719,9 @@ static CommandCost RemoveRailStation(TileIndex tile, DoCommandFlag flags)
|
||||
}
|
||||
|
||||
Station *st = Station::GetByTile(tile);
|
||||
|
||||
if (flags & DC_EXEC) ZoningMarkDirtyStationCoverageArea(st);
|
||||
|
||||
CommandCost cost = RemoveRailStation(st, flags, _price[PR_CLEAR_STATION_RAIL]);
|
||||
|
||||
if (flags & DC_EXEC) st->RecomputeIndustriesNear();
|
||||
@ -1905,6 +1911,7 @@ CommandCost CmdBuildRoadStop(TileIndex tile, DoCommandFlag flags, uint32 p1, uin
|
||||
|
||||
MarkTileDirtyByTile(cur_tile);
|
||||
}
|
||||
ZoningMarkDirtyStationCoverageArea(st);
|
||||
}
|
||||
|
||||
if (st != NULL) {
|
||||
@ -1975,6 +1982,7 @@ static CommandCost RemoveRoadStop(TileIndex tile, DoCommandFlag flags)
|
||||
}
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
ZoningMarkDirtyStationCoverageArea(st);
|
||||
if (*primary_stop == cur_stop) {
|
||||
/* removed the first stop in the list */
|
||||
*primary_stop = cur_stop->next;
|
||||
@ -2432,6 +2440,7 @@ CommandCost CmdBuildAirport(TileIndex tile, DoCommandFlag flags, uint32 p1, uint
|
||||
|
||||
UpdateStationAcceptance(st, false);
|
||||
st->RecomputeIndustriesNear();
|
||||
ZoningMarkDirtyStationCoverageArea(st);
|
||||
InvalidateWindowData(WC_SELECT_STATION, 0, 0);
|
||||
InvalidateWindowData(WC_STATION_LIST, st->owner, 0);
|
||||
InvalidateWindowData(WC_STATION_VIEW, st->index, -1);
|
||||
@ -2463,6 +2472,7 @@ static CommandCost RemoveAirport(TileIndex tile, DoCommandFlag flags)
|
||||
if (cost.Failed()) return cost;
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
ZoningMarkDirtyStationCoverageArea(st);
|
||||
const AirportSpec *as = st->airport.GetSpec();
|
||||
/* The noise level is the noise from the airport and reduce it to account for the distance to the town center.
|
||||
* And as for construction, always remove it, even if the setting is not set, in order to avoid the
|
||||
@ -2654,6 +2664,7 @@ CommandCost CmdBuildDock(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
|
||||
st->UpdateVirtCoord();
|
||||
UpdateStationAcceptance(st, false);
|
||||
st->RecomputeIndustriesNear();
|
||||
ZoningMarkDirtyStationCoverageArea(st);
|
||||
InvalidateWindowData(WC_SELECT_STATION, 0, 0);
|
||||
InvalidateWindowData(WC_STATION_LIST, st->owner, 0);
|
||||
SetWindowWidgetDirty(WC_STATION_VIEW, st->index, WID_SV_SHIPS);
|
||||
@ -2684,6 +2695,7 @@ static CommandCost RemoveDock(TileIndex tile, DoCommandFlag flags)
|
||||
if (ret.Failed()) return ret;
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
ZoningMarkDirtyStationCoverageArea(st);
|
||||
DoClearSquare(tile1);
|
||||
MarkTileDirtyByTile(tile1);
|
||||
MakeWaterKeepingClass(tile2, st->owner);
|
||||
@ -4023,11 +4035,13 @@ void BuildOilRig(TileIndex tile)
|
||||
st->UpdateVirtCoord();
|
||||
UpdateStationAcceptance(st, false);
|
||||
st->RecomputeIndustriesNear();
|
||||
ZoningMarkDirtyStationCoverageArea(st);
|
||||
}
|
||||
|
||||
void DeleteOilRig(TileIndex tile)
|
||||
{
|
||||
Station *st = Station::GetByTile(tile);
|
||||
ZoningMarkDirtyStationCoverageArea(st);
|
||||
|
||||
MakeWaterKeepingClass(tile, OWNER_NONE);
|
||||
|
||||
|
@ -16,6 +16,7 @@
|
||||
|
||||
void MarkBridgeDirty(TileIndex begin, TileIndex end, DiagDirection direction, uint bridge_height, const ZoomLevel mark_dirty_if_zoomlevel_is_below = ZOOM_LVL_END);
|
||||
void MarkBridgeDirty(TileIndex tile, const ZoomLevel mark_dirty_if_zoomlevel_is_below = ZOOM_LVL_END);
|
||||
void MarkBridgeOrTunnelDirty(TileIndex tile, const ZoomLevel mark_dirty_if_zoomlevel_is_below = ZOOM_LVL_END);
|
||||
|
||||
/**
|
||||
* Calculates the length of a tunnel or a bridge (without end tiles)
|
||||
|
@ -80,6 +80,20 @@ void MarkBridgeDirty(TileIndex tile, const ZoomLevel mark_dirty_if_zoomlevel_is_
|
||||
MarkBridgeDirty(tile, GetOtherTunnelBridgeEnd(tile), GetTunnelBridgeDirection(tile), GetBridgeHeight(tile), mark_dirty_if_zoomlevel_is_below);
|
||||
}
|
||||
|
||||
/**
|
||||
* Mark bridge or tunnel tiles dirty.
|
||||
* @param tile Bridge head or tunnel entrance.
|
||||
*/
|
||||
void MarkBridgeOrTunnelDirty(TileIndex tile, const ZoomLevel mark_dirty_if_zoomlevel_is_below)
|
||||
{
|
||||
if (IsBridge(tile)) {
|
||||
MarkBridgeDirty(tile, mark_dirty_if_zoomlevel_is_below);
|
||||
} else {
|
||||
MarkTileDirtyByTile(tile, mark_dirty_if_zoomlevel_is_below);
|
||||
MarkTileDirtyByTile(GetOtherTunnelBridgeEnd(tile), mark_dirty_if_zoomlevel_is_below);
|
||||
}
|
||||
}
|
||||
|
||||
/** Reset the data been eventually changed by the grf loaded. */
|
||||
void ResetBridges()
|
||||
{
|
||||
|
@ -1548,8 +1548,17 @@ static void ViewportMapStoreBridgeTunnel(const ViewPort * const vp, const TileIn
|
||||
|
||||
/* It's a new one, add it to the list */
|
||||
tbtm = tbtmv->Append();
|
||||
tbtm->from_tile = tile;
|
||||
tbtm->to_tile = GetOtherTunnelBridgeEnd(tile);
|
||||
TileIndex other_end = GetOtherTunnelBridgeEnd(tile);
|
||||
|
||||
/* ensure deterministic ordering, to avoid render flicker */
|
||||
if (other_end > tile) {
|
||||
tbtm->from_tile = other_end;
|
||||
tbtm->to_tile = tile;
|
||||
} else {
|
||||
tbtm->from_tile = tile;
|
||||
tbtm->to_tile = other_end;
|
||||
}
|
||||
|
||||
if (vp->map_type == VPMT_OWNER && _settings_client.gui.use_owner_colour_for_tunnelbridge && o < MAX_COMPANIES) {
|
||||
const uint8 colour = _legend_land_owners[_company_to_list_pos[o]].colour;
|
||||
tbtm->colour = tile_is_tunnel ? _darken_colour[colour] : _lighten_colour[colour];
|
||||
@ -2086,6 +2095,31 @@ static inline uint32 ViewportMapGetColourOwner(const TileIndex tile, TileType t,
|
||||
return colour;
|
||||
}
|
||||
|
||||
static inline void ViewportMapStoreBridgeAboveTile(const ViewPort * const vp, const TileIndex tile)
|
||||
{
|
||||
/* No need to bother for hidden things */
|
||||
if (!_settings_client.gui.show_bridges_on_map) return;
|
||||
|
||||
/* Check existing stored bridges */
|
||||
TunnelBridgeToMap *tbtm = _vd.tunnel_bridge_to_map.Begin();
|
||||
TunnelBridgeToMap *tbtm_end = _vd.tunnel_bridge_to_map.End();
|
||||
for (; tbtm != tbtm_end; ++tbtm) {
|
||||
if (!IsBridge(tbtm->from_tile)) continue;
|
||||
|
||||
TileIndex from = tbtm->from_tile;
|
||||
TileIndex to = tbtm->to_tile;
|
||||
if (TileX(from) == TileX(to) && TileX(from) == TileX(tile)) {
|
||||
if (TileY(from) > TileY(to)) std::swap(from, to);
|
||||
if (TileY(from) <= TileY(tile) && TileY(tile) <= TileY(to)) return; /* already covered */
|
||||
} else if (TileY(from) == TileY(to) && TileY(from) == TileY(tile)) {
|
||||
if (TileX(from) > TileX(to)) std::swap(from, to);
|
||||
if (TileX(from) <= TileX(tile) && TileX(tile) <= TileX(to)) return; /* already covered */
|
||||
}
|
||||
}
|
||||
|
||||
ViewportMapStoreBridgeTunnel(vp, GetSouthernBridgeEnd(tile));
|
||||
}
|
||||
|
||||
static inline TileIndex ViewportMapGetMostSignificantTileType(const ViewPort * const vp, const TileIndex from_tile, TileType * const tile_type)
|
||||
{
|
||||
if (vp->zoom <= ZOOM_LVL_OUT_128X || !_settings_client.gui.viewport_map_scan_surroundings) {
|
||||
@ -2093,6 +2127,7 @@ static inline TileIndex ViewportMapGetMostSignificantTileType(const ViewPort * c
|
||||
/* Store bridges and tunnels. */
|
||||
if (ttype != MP_TUNNELBRIDGE) {
|
||||
*tile_type = ttype;
|
||||
if (IsBridgeAbove(from_tile)) ViewportMapStoreBridgeAboveTile(vp, from_tile);
|
||||
} else {
|
||||
ViewportMapStoreBridgeTunnel(vp, from_tile);
|
||||
switch (GetTunnelBridgeTransportType(from_tile)) {
|
||||
@ -2119,6 +2154,9 @@ static inline TileIndex ViewportMapGetMostSignificantTileType(const ViewPort * c
|
||||
importance = tile_importance;
|
||||
result = tile;
|
||||
}
|
||||
if (ttype != MP_TUNNELBRIDGE && IsBridgeAbove(tile)) {
|
||||
ViewportMapStoreBridgeAboveTile(vp, tile);
|
||||
}
|
||||
}
|
||||
|
||||
/* Store bridges and tunnels. */
|
||||
@ -2303,7 +2341,7 @@ void ViewportMapDraw(const ViewPort * const vp)
|
||||
const TunnelBridgeToMap * const tbtm_end = _vd.tunnel_bridge_to_map.End();
|
||||
for (const TunnelBridgeToMap *tbtm = _vd.tunnel_bridge_to_map.Begin(); tbtm != tbtm_end; tbtm++) { // For each bridge or tunnel
|
||||
TileIndex tile = tbtm->from_tile;
|
||||
const int z = TileHeight(tile) * 4;
|
||||
const int z = (IsBridge(tile) ? GetBridgeHeight(tile) : GetTileZ(tile)) * TILE_HEIGHT;
|
||||
TileIndexDiff delta = TileOffsByDiagDir(GetTunnelBridgeDirection(tile));
|
||||
for (; tile != tbtm->to_tile; tile += delta) { // For each tile
|
||||
const Point pt = RemapCoords(TileX(tile) * TILE_SIZE, TileY(tile) * TILE_SIZE, z);
|
||||
|
@ -46,4 +46,7 @@ void DrawTileZoning(const TileInfo *ti);
|
||||
|
||||
void ShowZoningToolbar();
|
||||
|
||||
void ZoningMarkDirtyStationCoverageArea(const Station *st);
|
||||
inline void ZoningMarkDirtyStationCoverageArea(const Waypoint *st) { } // no-op
|
||||
|
||||
#endif /* ZONING_H */
|
||||
|
@ -348,3 +348,35 @@ void DrawTileZoning(const TileInfo *ti)
|
||||
DrawZoningSprites(SPR_ZONING_INNER_HIGHLIGHT_BASE, TileZoningSpriteEvaluation(ti->tile, _local_company, _zoning.inner), ti);
|
||||
}
|
||||
}
|
||||
|
||||
static uint GetZoningModeDependantStationCoverageRadius(const Station *st, ZoningEvaluationMode ev_mode)
|
||||
{
|
||||
switch (ev_mode) {
|
||||
case ZEM_STA_CATCH: return st->GetCatchmentRadius();
|
||||
case ZEM_BUL_UNSER: return st->GetCatchmentRadius();
|
||||
case ZEM_IND_UNSER: return st->GetCatchmentRadius() + 10; // this is to wholly update industries partially within the region
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Mark dirty the coverage area around a station if the current zoning mode depends on station coverage
|
||||
*
|
||||
* @param const Station *st
|
||||
* The station to use
|
||||
*/
|
||||
void ZoningMarkDirtyStationCoverageArea(const Station *st)
|
||||
{
|
||||
if (st->rect.IsEmpty()) return;
|
||||
|
||||
uint radius = max<uint>(GetZoningModeDependantStationCoverageRadius(st, _zoning.outer), GetZoningModeDependantStationCoverageRadius(st, _zoning.inner));
|
||||
|
||||
if (radius > 0) {
|
||||
Rect rect = st->GetCatchmentRectUsingRadius(radius);
|
||||
for (int x = rect.left; x <= rect.right; x++) {
|
||||
for (int y = rect.top; y <= rect.bottom; y++) {
|
||||
MarkTileDirtyByTile(TileXY(x, y));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user