|
|
|
@ -44,6 +44,18 @@ RailtypeInfo _railtypes[RAILTYPE_END];
|
|
|
|
|
|
|
|
|
|
assert_compile(sizeof(_original_railtypes) <= sizeof(_railtypes));
|
|
|
|
|
|
|
|
|
|
/** Enum holding the signal offset in the sprite sheet according to the side it is representing. */
|
|
|
|
|
enum SignalOffsets {
|
|
|
|
|
SIGNAL_TO_SOUTHWEST,
|
|
|
|
|
SIGNAL_TO_NORTHEAST,
|
|
|
|
|
SIGNAL_TO_SOUTHEAST,
|
|
|
|
|
SIGNAL_TO_NORTHWEST,
|
|
|
|
|
SIGNAL_TO_EAST,
|
|
|
|
|
SIGNAL_TO_WEST,
|
|
|
|
|
SIGNAL_TO_SOUTH,
|
|
|
|
|
SIGNAL_TO_NORTH,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Reset all rail type information to its default values.
|
|
|
|
|
*/
|
|
|
|
@ -74,6 +86,24 @@ void ResolveRailTypeGUISprites(RailtypeInfo *rti)
|
|
|
|
|
rti->cursor.tunnel = cursors_base + 14;
|
|
|
|
|
rti->cursor.convert = cursors_base + 15;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Array of default GUI signal sprite numbers. */
|
|
|
|
|
const SpriteID _signal_lookup[2][SIGTYPE_END] = {
|
|
|
|
|
{SPR_IMG_SIGNAL_ELECTRIC_NORM, SPR_IMG_SIGNAL_ELECTRIC_ENTRY, SPR_IMG_SIGNAL_ELECTRIC_EXIT,
|
|
|
|
|
SPR_IMG_SIGNAL_ELECTRIC_COMBO, SPR_IMG_SIGNAL_ELECTRIC_PBS, SPR_IMG_SIGNAL_ELECTRIC_PBS_OWAY},
|
|
|
|
|
|
|
|
|
|
{SPR_IMG_SIGNAL_SEMAPHORE_NORM, SPR_IMG_SIGNAL_SEMAPHORE_ENTRY, SPR_IMG_SIGNAL_SEMAPHORE_EXIT,
|
|
|
|
|
SPR_IMG_SIGNAL_SEMAPHORE_COMBO, SPR_IMG_SIGNAL_SEMAPHORE_PBS, SPR_IMG_SIGNAL_SEMAPHORE_PBS_OWAY},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
for (SignalType type = SIGTYPE_NORMAL; type < SIGTYPE_END; type = (SignalType)(type + 1)) {
|
|
|
|
|
for (SignalVariant var = SIG_ELECTRIC; var <= SIG_SEMAPHORE; var = (SignalVariant)(var + 1)) {
|
|
|
|
|
SpriteID red = GetCustomSignalSprite(rti, INVALID_TILE, type, var, SIGNAL_STATE_RED, true);
|
|
|
|
|
SpriteID green = GetCustomSignalSprite(rti, INVALID_TILE, type, var, SIGNAL_STATE_GREEN, true);
|
|
|
|
|
rti->gui_sprites.signals[type][var][0] = (red != 0) ? red + SIGNAL_TO_SOUTH : _signal_lookup[var][type];
|
|
|
|
|
rti->gui_sprites.signals[type][var][1] = (green != 0) ? green + SIGNAL_TO_SOUTH : _signal_lookup[var][type] + 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -1798,7 +1828,7 @@ static uint GetSaveSlopeZ(uint x, uint y, Track track)
|
|
|
|
|
return GetSlopePixelZ(x, y);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void DrawSingleSignal(TileIndex tile, Track track, byte condition, uint image, uint pos)
|
|
|
|
|
static void DrawSingleSignal(TileIndex tile, const RailtypeInfo *rti, Track track, SignalState condition, SignalOffsets image, uint pos)
|
|
|
|
|
{
|
|
|
|
|
bool side;
|
|
|
|
|
switch (_settings_game.construction.train_signal_side) {
|
|
|
|
@ -1823,17 +1853,16 @@ static void DrawSingleSignal(TileIndex tile, Track track, byte condition, uint i
|
|
|
|
|
uint x = TileX(tile) * TILE_SIZE + SignalPositions[side][pos].x;
|
|
|
|
|
uint y = TileY(tile) * TILE_SIZE + SignalPositions[side][pos].y;
|
|
|
|
|
|
|
|
|
|
SpriteID sprite;
|
|
|
|
|
|
|
|
|
|
SignalType type = GetSignalType(tile, track);
|
|
|
|
|
SignalVariant variant = GetSignalVariant(tile, track);
|
|
|
|
|
|
|
|
|
|
if (type == SIGTYPE_NORMAL && variant == SIG_ELECTRIC) {
|
|
|
|
|
/* Normal electric signals are picked from original sprites. */
|
|
|
|
|
sprite = SPR_ORIGINAL_SIGNALS_BASE + image + condition;
|
|
|
|
|
SpriteID sprite = GetCustomSignalSprite(rti, tile, type, variant, condition);
|
|
|
|
|
if (sprite != 0) {
|
|
|
|
|
sprite += image;
|
|
|
|
|
} else {
|
|
|
|
|
/* All other signals are picked from add on sprites. */
|
|
|
|
|
sprite = SPR_SIGNALS_BASE + (type - 1) * 16 + variant * 64 + image + condition + (type > SIGTYPE_LAST_NOPBS ? 64 : 0);
|
|
|
|
|
/* Normal electric signals are stored in a different sprite block than all other signals. */
|
|
|
|
|
sprite = (type == SIGTYPE_NORMAL && variant == SIG_ELECTRIC) ? SPR_ORIGINAL_SIGNALS_BASE : SPR_SIGNALS_BASE - 16;
|
|
|
|
|
sprite += type * 16 + variant * 64 + image * 2 + condition + (type > SIGTYPE_LAST_NOPBS ? 64 : 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AddSortableSpriteToDraw(sprite, PAL_NONE, x, y, 1, 1, BB_HEIGHT_UNDER_BRIDGE, GetSaveSlopeZ(x, y, track));
|
|
|
|
@ -2277,27 +2306,9 @@ static void DrawTrackBits(TileInfo *ti, TrackBits track)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Enums holding the offsets from base signal sprite,
|
|
|
|
|
* according to the side it is representing.
|
|
|
|
|
* The addtion of 2 per enum is necessary in order to "jump" over the
|
|
|
|
|
* green state sprite, all signal sprites being in pair,
|
|
|
|
|
* starting with the off-red state
|
|
|
|
|
*/
|
|
|
|
|
enum SignalOffsets {
|
|
|
|
|
SIGNAL_TO_SOUTHWEST = 0,
|
|
|
|
|
SIGNAL_TO_NORTHEAST = 2,
|
|
|
|
|
SIGNAL_TO_SOUTHEAST = 4,
|
|
|
|
|
SIGNAL_TO_NORTHWEST = 6,
|
|
|
|
|
SIGNAL_TO_EAST = 8,
|
|
|
|
|
SIGNAL_TO_WEST = 10,
|
|
|
|
|
SIGNAL_TO_SOUTH = 12,
|
|
|
|
|
SIGNAL_TO_NORTH = 14,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static void DrawSignals(TileIndex tile, TrackBits rails)
|
|
|
|
|
static void DrawSignals(TileIndex tile, TrackBits rails, const RailtypeInfo *rti)
|
|
|
|
|
{
|
|
|
|
|
#define MAYBE_DRAW_SIGNAL(x, y, z, t) if (IsSignalPresent(tile, x)) DrawSingleSignal(tile, t, GetSingleSignalState(tile, x), y, z)
|
|
|
|
|
#define MAYBE_DRAW_SIGNAL(x, y, z, t) if (IsSignalPresent(tile, x)) DrawSingleSignal(tile, rti, t, GetSingleSignalState(tile, x), y, z)
|
|
|
|
|
|
|
|
|
|
if (!(rails & TRACK_BIT_Y)) {
|
|
|
|
|
if (!(rails & TRACK_BIT_X)) {
|
|
|
|
@ -2342,7 +2353,7 @@ static void DrawTile_Track(TileInfo *ti)
|
|
|
|
|
|
|
|
|
|
if (HasCatenaryDrawn(GetRailType(ti->tile))) DrawCatenary(ti);
|
|
|
|
|
|
|
|
|
|
if (HasSignals(ti->tile)) DrawSignals(ti->tile, rails);
|
|
|
|
|
if (HasSignals(ti->tile)) DrawSignals(ti->tile, rails, rti);
|
|
|
|
|
} else {
|
|
|
|
|
/* draw depot */
|
|
|
|
|
const DrawTileSprites *dts;
|
|
|
|
|