Initial implementation of NewGRF custom signal styles

This commit is contained in:
Jonathan G Rennison
2022-06-18 23:37:35 +01:00
parent 098bb74ed2
commit 6e4c4b35e7
34 changed files with 536 additions and 75 deletions

View File

@@ -50,6 +50,7 @@
#include "station_func.h"
#include "tracerestrict.h"
#include "newgrf_roadstop.h"
#include "newgrf_newsignals.h"
#include "table/strings.h"
#include "table/bridge_land.h"
@@ -1438,8 +1439,14 @@ static CommandCost DoClearBridge(TileIndex tile, DoCommandFlag flags)
}
DirtyAllCompanyInfrastructureWindows();
if (IsTunnelBridgeSignalSimulationEntrance(tile)) ClearBridgeEntranceSimulatedSignals(tile);
if (IsTunnelBridgeSignalSimulationEntrance(endtile)) ClearBridgeEntranceSimulatedSignals(endtile);
if (IsTunnelBridgeSignalSimulationEntrance(tile)) {
ClearBridgeEntranceSimulatedSignals(tile);
SetBridgeSignalStyle(tile, 0);
}
if (IsTunnelBridgeSignalSimulationEntrance(endtile)) {
ClearBridgeEntranceSimulatedSignals(endtile);
SetBridgeSignalStyle(endtile, 0);
}
DoClearSquare(tile);
DoClearSquare(endtile);
@@ -1759,7 +1766,7 @@ static void DrawTunnelBridgeRampSingleSignal(const TileInfo *ti, bool is_green,
}
bool show_restricted = IsTunnelBridgeRestrictedSignal(ti->tile);
const TraceRestrictProgram *prog = show_restricted ? GetExistingTraceRestrictProgram(ti->tile, FindFirstTrack(GetAcrossTunnelBridgeTrackBits(ti->tile))) : nullptr;
const CustomSignalSpriteResult result = GetCustomSignalSprite(rti, ti->tile, type, variant, aspect, show_exit ? CSSC_TUNNEL_BRIDGE_EXIT : CSSC_TUNNEL_BRIDGE_ENTRANCE, prog);
const CustomSignalSpriteResult result = GetCustomSignalSprite(rti, ti->tile, type, variant, aspect, show_exit ? CSSC_TUNNEL_BRIDGE_EXIT : CSSC_TUNNEL_BRIDGE_ENTRANCE, GetTunnelBridgeSignalStyle(ti->tile), prog);
PalSpriteID sprite = result.sprite;
bool is_custom_sprite = (sprite.sprite != 0);
@@ -1887,7 +1894,7 @@ static void DrawBridgeSignalOnMiddlePart(const TileInfo *ti, TileIndex bridge_st
}
const RailtypeInfo *rti = GetRailTypeInfo(GetRailType(bridge_start_tile));
PalSpriteID sprite = GetCustomSignalSprite(rti, bridge_start_tile, SIGTYPE_NORMAL, variant, aspect, CSSC_BRIDGE_MIDDLE).sprite;
PalSpriteID sprite = GetCustomSignalSprite(rti, bridge_start_tile, SIGTYPE_NORMAL, variant, aspect, CSSC_BRIDGE_MIDDLE, GetBridgeSignalStyle(bridge_start_tile)).sprite;
if (sprite.sprite != 0) {
sprite.sprite += position;
@@ -2561,9 +2568,23 @@ static void GetTileDesc_TunnelBridge(TileIndex tile, TileDesc *td)
} else { // IsBridge(tile)
td->str = (tt == TRANSPORT_WATER) ? STR_LAI_BRIDGE_DESCRIPTION_AQUEDUCT : IsTunnelBridgeWithSignalSimulation(tile) ? STR_LAI_BRIDGE_DESCRIPTION_RAILROAD_SIGNAL : GetBridgeSpec(GetBridgeType(tile))->transport_name[tt];
}
if (IsTunnelBridgeWithSignalSimulation(tile) && IsTunnelBridgeRestrictedSignal(tile)) {
SetDParamX(td->dparam, 0, td->str);
td->str = STR_LAI_RAIL_DESCRIPTION_RESTRICTED_SIGNAL;
if (tt == TRANSPORT_RAIL) {
uint8 style = GetTunnelBridgeSignalStyle(tile);
if (style > 0) {
/* Add suffix about signal style */
SetDParamX(td->dparam, 0, td->str);
td->dparam[1] = style == 0 ? STR_BUILD_SIGNAL_DEFAULT_STYLE : _new_signal_styles[style - 1].name;
td->str = STR_LAI_RAIL_DESCRIPTION_TRACK_SIGNAL_STYLE;
}
if (IsTunnelBridgeWithSignalSimulation(tile) && IsTunnelBridgeRestrictedSignal(tile)) {
td->dparam[3] = td->dparam[2];
td->dparam[2] = td->dparam[1];
td->dparam[1] = td->dparam[0];
SetDParamX(td->dparam, 0, td->str);
SetDParamX(td->dparam, 0, td->str);
td->str = STR_LAI_RAIL_DESCRIPTION_RESTRICTED_SIGNAL;
}
}
td->owner[0] = GetTileOwner(tile);
@@ -2915,6 +2936,16 @@ void SubtractRailTunnelBridgeInfrastructure(TileIndex begin, TileIndex end) {
UpdateRailTunnelBridgeInfrastructure(Company::GetIfValid(GetTileOwner(begin)), begin, end, false);
}
void SetTunnelBridgeSignalStyleExtended(TileIndex t, TileIndex end, uint8 style)
{
if (IsTunnel(t)) {
SetTunnelSignalStyle(t, end, style);
} else {
SetBridgeSignalStyle(t, style);
SetBridgeSignalStyle(end, style);
}
}
static void ChangeTileOwner_TunnelBridge(TileIndex tile, Owner old_owner, Owner new_owner)
{
const TileIndex other_end = GetOtherTunnelBridgeEnd(tile);