mirror of https://github.com/OpenTTD/OpenTTD
Compare commits
4 Commits
fe5d8c0fcb
...
1acecc376d
Author | SHA1 | Date |
---|---|---|
|
1acecc376d | |
|
10eeba86a6 | |
|
d99dad9e9e | |
|
643dcefc8f |
|
@ -134,7 +134,7 @@ bool DriverFactoryBase::SelectDriverImpl(const std::string &name, Driver::Type t
|
|||
Debug(driver, 1, "Probing {} driver '{}' skipped due to earlier crash", GetDriverTypeName(type), d->name);
|
||||
|
||||
_video_hw_accel = false;
|
||||
ErrorMessageData msg(GetEncodedString(STR_VIDEO_DRIVER_ERROR), GetEncodedString(STR_VIDEO_DRIVER_ERROR_HARDWARE_ACCELERATION_CRASH), true);
|
||||
ErrorMessageData msg(GetEncodedString(STR_VIDEO_DRIVER_ERROR), GetEncodedString(STR_VIDEO_DRIVER_ERROR_HARDWARE_ACCELERATION_CRASH), WL_CRITICAL);
|
||||
ScheduleErrorMessage(std::move(msg));
|
||||
continue;
|
||||
}
|
||||
|
@ -158,7 +158,7 @@ bool DriverFactoryBase::SelectDriverImpl(const std::string &name, Driver::Type t
|
|||
|
||||
if (type == Driver::DT_VIDEO && _video_hw_accel && d->UsesHardwareAcceleration()) {
|
||||
_video_hw_accel = false;
|
||||
ErrorMessageData msg(GetEncodedString(STR_VIDEO_DRIVER_ERROR), GetEncodedString(STR_VIDEO_DRIVER_ERROR_NO_HARDWARE_ACCELERATION), true);
|
||||
ErrorMessageData msg(GetEncodedString(STR_VIDEO_DRIVER_ERROR), GetEncodedString(STR_VIDEO_DRIVER_ERROR_NO_HARDWARE_ACCELERATION), WL_CRITICAL);
|
||||
ScheduleErrorMessage(std::move(msg));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@ enum WarningLevel : uint8_t {
|
|||
/** The data of the error message. */
|
||||
class ErrorMessageData {
|
||||
protected:
|
||||
bool is_critical; ///< Whether the error message is critical.
|
||||
WarningLevel level; ///< Level of the error message (e.g. whether it's a critical error).
|
||||
EncodedString summary_msg; ///< General error message showed in first line. Must be valid.
|
||||
EncodedString detailed_msg; ///< Detailed error message showed in second line. Can be #INVALID_STRING_ID.
|
||||
EncodedString extra_msg; ///< Extra error message shown in third line. Can be #INVALID_STRING_ID.
|
||||
|
@ -38,7 +38,7 @@ protected:
|
|||
CompanyID company; ///< Company belonging to the face being shown. #CompanyID::Invalid() if no face present.
|
||||
|
||||
public:
|
||||
ErrorMessageData(EncodedString &&summary_msg, EncodedString &&detailed_msg, bool is_critical = false, int x = 0, int y = 0, EncodedString &&extra_msg = {}, CompanyID company = CompanyID::Invalid());
|
||||
ErrorMessageData(EncodedString &&summary_msg, EncodedString &&detailed_msg, WarningLevel level = WL_ERROR, int x = 0, int y = 0, EncodedString &&extra_msg = {}, CompanyID company = CompanyID::Invalid());
|
||||
|
||||
/** Check whether error window shall display a company manager face */
|
||||
bool HasFace() const { return company != CompanyID::Invalid(); }
|
||||
|
|
|
@ -35,10 +35,10 @@
|
|||
|
||||
static constexpr NWidgetPart _nested_errmsg_widgets[] = {
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_CLOSEBOX, COLOUR_RED),
|
||||
NWidget(WWT_CLOSEBOX, COLOUR_RED, WID_EM_CLOSEBOX),
|
||||
NWidget(WWT_CAPTION, COLOUR_RED, WID_EM_CAPTION), SetStringTip(STR_ERROR_MESSAGE_CAPTION),
|
||||
EndContainer(),
|
||||
NWidget(WWT_PANEL, COLOUR_RED),
|
||||
NWidget(WWT_PANEL, COLOUR_RED, WID_EM_PANEL),
|
||||
NWidget(WWT_EMPTY, INVALID_COLOUR, WID_EM_MESSAGE), SetPadding(WidgetDimensions::unscaled.modalpopup), SetFill(1, 0), SetMinimalSize(236, 0),
|
||||
EndContainer(),
|
||||
};
|
||||
|
@ -52,10 +52,10 @@ static WindowDesc _errmsg_desc(
|
|||
|
||||
static constexpr NWidgetPart _nested_errmsg_face_widgets[] = {
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_CLOSEBOX, COLOUR_RED),
|
||||
NWidget(WWT_CLOSEBOX, COLOUR_RED, WID_EM_CLOSEBOX),
|
||||
NWidget(WWT_CAPTION, COLOUR_RED, WID_EM_CAPTION),
|
||||
EndContainer(),
|
||||
NWidget(WWT_PANEL, COLOUR_RED),
|
||||
NWidget(WWT_PANEL, COLOUR_RED, WID_EM_PANEL),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_EMPTY, INVALID_COLOUR, WID_EM_FACE), SetPadding(2, 0, 2, 2), SetFill(0, 1), SetMinimalSize(92, 119),
|
||||
NWidget(WWT_EMPTY, INVALID_COLOUR, WID_EM_MESSAGE), SetPadding(WidgetDimensions::unscaled.modalpopup), SetFill(1, 1), SetMinimalSize(236, 0),
|
||||
|
@ -74,13 +74,13 @@ static WindowDesc _errmsg_face_desc(
|
|||
* Display an error message in a window.
|
||||
* @param summary_msg General error message showed in first line. Must be valid.
|
||||
* @param detailed_msg Detailed error message showed in second line. Can be empty.
|
||||
* @param is_critical Whether the error is critical. Critical messages never go away on their own.
|
||||
* @param level Warning/error level of the message. NOTE: critical messages never go away on their own.
|
||||
* @param x World X position (TileVirtX) of the error location. Set both x and y to 0 to just center the message when there is no related error tile.
|
||||
* @param y World Y position (TileVirtY) of the error location. Set both x and y to 0 to just center the message when there is no related error tile.
|
||||
* @param extra_msg Extra error message showed in third line. Can be empty.
|
||||
*/
|
||||
ErrorMessageData::ErrorMessageData(EncodedString &&summary_msg, EncodedString &&detailed_msg, bool is_critical, int x, int y, EncodedString &&extra_msg, CompanyID company) :
|
||||
is_critical(is_critical),
|
||||
ErrorMessageData::ErrorMessageData(EncodedString &&summary_msg, EncodedString &&detailed_msg, WarningLevel level, int x, int y, EncodedString &&extra_msg, CompanyID company) :
|
||||
level(level),
|
||||
summary_msg(std::move(summary_msg)),
|
||||
detailed_msg(std::move(detailed_msg)),
|
||||
extra_msg(std::move(extra_msg)),
|
||||
|
@ -113,8 +113,15 @@ public:
|
|||
{
|
||||
this->InitNested();
|
||||
|
||||
Colours window_colour = COLOUR_RED;
|
||||
if (level == WL_INFO) window_colour = COLOUR_GREEN;
|
||||
if (level == WL_WARNING) window_colour = COLOUR_ORANGE;
|
||||
this->GetWidget<NWidgetCore>(WID_EM_CAPTION)->colour = window_colour;
|
||||
this->GetWidget<NWidgetCore>(WID_EM_CLOSEBOX)->colour = window_colour;
|
||||
this->GetWidget<NWidgetCore>(WID_EM_PANEL)->colour = window_colour;
|
||||
|
||||
/* Only start the timeout if the message is not critical. */
|
||||
if (!this->is_critical) {
|
||||
if (this->level != WL_CRITICAL) {
|
||||
this->display_timeout.Reset();
|
||||
}
|
||||
}
|
||||
|
@ -225,7 +232,7 @@ public:
|
|||
void OnMouseLoop() override
|
||||
{
|
||||
/* Disallow closing the window too easily, if timeout is disabled */
|
||||
if (_right_button_down && !this->is_critical) this->Close();
|
||||
if (_right_button_down && this->level != WL_CRITICAL) this->Close();
|
||||
}
|
||||
|
||||
void Close([[maybe_unused]] int data = 0) override
|
||||
|
@ -241,7 +248,7 @@ public:
|
|||
*/
|
||||
bool IsCritical()
|
||||
{
|
||||
return this->is_critical;
|
||||
return this->level == WL_CRITICAL;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -281,7 +288,7 @@ void UnshowCriticalError()
|
|||
|
||||
/**
|
||||
* Display an error message in a window.
|
||||
* Note: CommandCost errors are always severity level WL_INFO.
|
||||
* Note: CommandCost errors are always severity level WL_ERROR.
|
||||
* @param summary_msg General error message showed in first line. Must be valid.
|
||||
* @param x World X position (TileVirtX) of the error location. Set both x and y to 0 to just center the message when there is no related error tile.
|
||||
* @param y World Y position (TileVirtY) of the error location. Set both x and y to 0 to just center the message when there is no related error tile.
|
||||
|
@ -292,7 +299,7 @@ void ShowErrorMessage(EncodedString &&summary_msg, int x, int y, CommandCost &cc
|
|||
EncodedString error = std::move(cc.GetEncodedMessage());
|
||||
if (error.empty()) error = GetEncodedStringIfValid(cc.GetErrorMessage());
|
||||
|
||||
ShowErrorMessage(std::move(summary_msg), std::move(error), WL_INFO, x, y,
|
||||
ShowErrorMessage(std::move(summary_msg), std::move(error), WL_ERROR, x, y,
|
||||
GetEncodedStringIfValid(cc.GetExtraErrorMessage()), cc.GetErrorOwner());
|
||||
}
|
||||
|
||||
|
@ -323,12 +330,10 @@ void ShowErrorMessage(EncodedString &&summary_msg, EncodedString &&detailed_msg,
|
|||
IConsolePrint(wl == WL_WARNING ? CC_WARNING : CC_ERROR, message);
|
||||
}
|
||||
|
||||
bool is_critical = wl == WL_CRITICAL;
|
||||
|
||||
if (_game_mode == GM_BOOTSTRAP) return;
|
||||
if (_settings_client.gui.errmsg_duration == 0 && !is_critical) return;
|
||||
if (_settings_client.gui.errmsg_duration == 0 && wl != WL_CRITICAL) return;
|
||||
|
||||
ErrorMessageData data(std::move(summary_msg), std::move(detailed_msg), is_critical, x, y, std::move(extra_msg), company);
|
||||
ErrorMessageData data(std::move(summary_msg), std::move(detailed_msg), wl, x, y, std::move(extra_msg), company);
|
||||
|
||||
ErrmsgWindow *w = dynamic_cast<ErrmsgWindow *>(FindWindowById(WC_ERRMSG, 0));
|
||||
if (w != nullptr) {
|
||||
|
|
|
@ -36,10 +36,15 @@
|
|||
# define MW(a) {a, PALETTE_TO_STRUCT_WHITE}
|
||||
# define MC(a) {a, PALETTE_TO_STRUCT_CONCRETE}
|
||||
|
||||
static const PalSpriteID _aqueduct_sprites[] = {
|
||||
{ SPR_AQUEDUCT_MIDDLE_X, PAL_NONE }, { 0x0, PAL_NONE }, { SPR_AQUEDUCT_PILLAR_X, PAL_NONE }, { 0x0, PAL_NONE },
|
||||
{ SPR_AQUEDUCT_MIDDLE_Y, PAL_NONE }, { 0x0, PAL_NONE }, { SPR_AQUEDUCT_PILLAR_Y, PAL_NONE }, { 0x0, PAL_NONE },
|
||||
{ SPR_AQUEDUCT_RAMP_SW, PAL_NONE }, { SPR_AQUEDUCT_RAMP_SE, PAL_NONE }, { SPR_AQUEDUCT_RAMP_NE, PAL_NONE }, { SPR_AQUEDUCT_RAMP_NW, PAL_NONE },
|
||||
/* Sprite table for middle part of aqueduct. */
|
||||
static const PalSpriteID _aqueduct_sprite_table_middle[] = {
|
||||
{SPR_AQUEDUCT_MIDDLE_X, PAL_NONE}, {0x0, PAL_NONE}, {SPR_AQUEDUCT_PILLAR_X, PAL_NONE}, {0x0, PAL_NONE}, // AXIS_X
|
||||
{SPR_AQUEDUCT_MIDDLE_Y, PAL_NONE}, {0x0, PAL_NONE}, {SPR_AQUEDUCT_PILLAR_Y, PAL_NONE}, {0x0, PAL_NONE}, // AIXS_Y
|
||||
};
|
||||
|
||||
/* Sprite table for head part of aqueduct. */
|
||||
static const PalSpriteID _aqueduct_sprite_table_heads[] = {
|
||||
{SPR_AQUEDUCT_RAMP_SW, PAL_NONE}, {SPR_AQUEDUCT_RAMP_SE, PAL_NONE}, {SPR_AQUEDUCT_RAMP_NE, PAL_NONE}, {SPR_AQUEDUCT_RAMP_NW, PAL_NONE},
|
||||
};
|
||||
|
||||
static const PalSpriteID _bridge_sprite_table_4_0[] = {
|
||||
|
|
|
@ -138,15 +138,58 @@ bool HasBridgeFlatRamp(Slope tileh, Axis axis)
|
|||
return (tileh != SLOPE_FLAT);
|
||||
}
|
||||
|
||||
static inline std::span<const PalSpriteID> GetBridgeSpriteTable(int index, BridgePieces table)
|
||||
/**
|
||||
* Get the sprite table for a rail/road bridge piece.
|
||||
* @param bridge_type Bridge type.
|
||||
* @param piece Bridge piece.
|
||||
* @return Sprite table for the bridge piece.
|
||||
*/
|
||||
static std::span<const PalSpriteID> GetBridgeSpriteTable(BridgeType bridge_type, BridgePieces piece)
|
||||
{
|
||||
const BridgeSpec *bridge = GetBridgeSpec(index);
|
||||
assert(table < NUM_BRIDGE_PIECES);
|
||||
if (table < bridge->sprite_table.size() && !bridge->sprite_table[table].empty()) return bridge->sprite_table[table];
|
||||
assert(piece < NUM_BRIDGE_PIECES);
|
||||
|
||||
return _bridge_sprite_table[index][table];
|
||||
const BridgeSpec *bridge = GetBridgeSpec(bridge_type);
|
||||
if (piece < bridge->sprite_table.size() && !bridge->sprite_table[piece].empty()) return bridge->sprite_table[piece];
|
||||
|
||||
return _bridge_sprite_table[bridge_type][piece];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the sprite table transport type base offset for a rail/road bridge.
|
||||
* @param transport_type Transport type of bridge.
|
||||
* @param ramp Tile of bridge ramp.
|
||||
* @return Offset for transport type.
|
||||
*/
|
||||
static uint8_t GetBridgeSpriteTableBaseOffset(TransportType transport_type, TileIndex ramp)
|
||||
{
|
||||
switch (transport_type) {
|
||||
case TRANSPORT_RAIL: return GetRailTypeInfo(GetRailType(ramp))->bridge_offset;
|
||||
case TRANSPORT_ROAD: return 8;
|
||||
default: NOT_REACHED();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get bridge sprite table base offset for the ramp part of bridge.
|
||||
* @param diagdir Direction of ramp.
|
||||
* @return Offset for direction.
|
||||
*/
|
||||
static uint8_t GetBridgeRampDirectionBaseOffset(DiagDirection diagdir)
|
||||
{
|
||||
/* Bridge ramps are ordered SW, SE, NE, NW instead of NE, SE, SW, NW. */
|
||||
static constexpr uint8_t ramp_offsets[DIAGDIR_END] = {2, 1, 0, 3};
|
||||
return ramp_offsets[diagdir];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get bridge sprite table base offset for the middle part of bridge.
|
||||
* @param axis Axis of bridge.
|
||||
* @return Offset for axis.
|
||||
*/
|
||||
static uint8_t GetBridgeMiddleAxisBaseOffset(Axis axis)
|
||||
{
|
||||
return axis == AXIS_X ? 0 : 4;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines the foundation for the bridge head, and tests if the resulting slope is valid.
|
||||
|
@ -1017,10 +1060,10 @@ static CommandCost ClearTile_TunnelBridge(TileIndex tile, DoCommandFlags flags)
|
|||
* @param h Bounding box size in Y direction
|
||||
* @param subsprite Optional subsprite for drawing halfpillars
|
||||
*/
|
||||
static inline void DrawPillar(const PalSpriteID *psid, int x, int y, int z, uint8_t w, uint8_t h, const SubSprite *subsprite)
|
||||
static inline void DrawPillar(const PalSpriteID &psid, int x, int y, int z, uint8_t w, uint8_t h, const SubSprite *subsprite)
|
||||
{
|
||||
static const int PILLAR_Z_OFFSET = TILE_HEIGHT - BRIDGE_Z_START; ///< Start offset of pillar wrt. bridge (downwards)
|
||||
AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, z, {{0, 0, -PILLAR_Z_OFFSET}, {w, h, BB_HEIGHT_UNDER_BRIDGE}, {0, 0, PILLAR_Z_OFFSET}}, IsTransparencySet(TO_BRIDGES), subsprite);
|
||||
AddSortableSpriteToDraw(psid.sprite, psid.pal, x, y, z, {{0, 0, -PILLAR_Z_OFFSET}, {w, h, BB_HEIGHT_UNDER_BRIDGE}, {0, 0, PILLAR_Z_OFFSET}}, IsTransparencySet(TO_BRIDGES), subsprite);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1034,7 +1077,7 @@ static inline void DrawPillar(const PalSpriteID *psid, int x, int y, int z, uint
|
|||
* @param h Bounding box size in Y direction
|
||||
* @return Reached Z at the bottom
|
||||
*/
|
||||
static int DrawPillarColumn(int z_bottom, int z_top, const PalSpriteID *psid, int x, int y, int w, int h)
|
||||
static int DrawPillarColumn(int z_bottom, int z_top, const PalSpriteID &psid, int x, int y, int w, int h)
|
||||
{
|
||||
int cur_z;
|
||||
for (cur_z = z_top; cur_z >= z_bottom; cur_z -= TILE_HEIGHT) {
|
||||
|
@ -1054,7 +1097,7 @@ static int DrawPillarColumn(int z_bottom, int z_top, const PalSpriteID *psid, in
|
|||
* @param y Sprite Y position of front pillar.
|
||||
* @param z_bridge Absolute height of bridge bottom.
|
||||
*/
|
||||
static void DrawBridgePillars(const PalSpriteID *psid, const TileInfo *ti, Axis axis, bool drawfarpillar, int x, int y, int z_bridge)
|
||||
static void DrawBridgePillars(const PalSpriteID &psid, const TileInfo *ti, Axis axis, bool drawfarpillar, int x, int y, int z_bridge)
|
||||
{
|
||||
static const int bounding_box_size[2] = {16, 2}; ///< bounding box size of pillars along bridge direction
|
||||
static const int back_pillar_offset[2] = { 0, 9}; ///< sprite position offset of back facing pillar
|
||||
|
@ -1065,7 +1108,7 @@ static void DrawBridgePillars(const PalSpriteID *psid, const TileInfo *ti, Axis
|
|||
{ { -INF, -INF, 15, INF }, { 16, -INF, INF, INF } }, // Y axis, north and south
|
||||
};
|
||||
|
||||
if (psid->sprite == 0) return;
|
||||
if (psid.sprite == 0) return;
|
||||
|
||||
/* Determine ground height under pillars */
|
||||
DiagDirection south_dir = AxisToDiagDir(axis);
|
||||
|
@ -1404,34 +1447,20 @@ static void DrawTile_TunnelBridge(TileInfo *ti)
|
|||
|
||||
DrawBridgeMiddle(ti);
|
||||
} else { // IsBridge(ti->tile)
|
||||
const PalSpriteID *psid;
|
||||
int base_offset;
|
||||
bool ice = HasTunnelBridgeSnowOrDesert(ti->tile);
|
||||
|
||||
if (transport_type == TRANSPORT_RAIL) {
|
||||
base_offset = GetRailTypeInfo(GetRailType(ti->tile))->bridge_offset;
|
||||
assert(base_offset != 8); // This one is used for roads
|
||||
} else {
|
||||
base_offset = 8;
|
||||
}
|
||||
|
||||
/* as the lower 3 bits are used for other stuff, make sure they are clear */
|
||||
assert( (base_offset & 0x07) == 0x00);
|
||||
|
||||
DrawFoundation(ti, GetBridgeFoundation(ti->tileh, DiagDirToAxis(tunnelbridge_direction)));
|
||||
|
||||
/* HACK Wizardry to convert the bridge ramp direction into a sprite offset */
|
||||
base_offset += (6 - tunnelbridge_direction) % 4;
|
||||
|
||||
/* Table number BRIDGE_PIECE_HEAD always refers to the bridge heads for any bridge type */
|
||||
uint base_offset = GetBridgeRampDirectionBaseOffset(tunnelbridge_direction);
|
||||
std::span<const PalSpriteID> psid;
|
||||
if (transport_type != TRANSPORT_WATER) {
|
||||
if (ti->tileh == SLOPE_FLAT) base_offset += 4; // sloped bridge head
|
||||
psid = &GetBridgeSpriteTable(GetBridgeType(ti->tile), BRIDGE_PIECE_HEAD)[base_offset];
|
||||
base_offset += GetBridgeSpriteTableBaseOffset(transport_type, ti->tile);
|
||||
psid = GetBridgeSpriteTable(GetBridgeType(ti->tile), BRIDGE_PIECE_HEAD);
|
||||
} else {
|
||||
psid = _aqueduct_sprites + base_offset;
|
||||
psid = _aqueduct_sprite_table_heads;
|
||||
}
|
||||
psid = psid.subspan(base_offset, 1);
|
||||
|
||||
if (!ice) {
|
||||
if (!HasTunnelBridgeSnowOrDesert(ti->tile)) {
|
||||
TileIndex next = ti->tile + TileOffsByDiagDir(tunnelbridge_direction);
|
||||
if (ti->tileh != SLOPE_FLAT && ti->z == 0 && HasTileWaterClass(next) && GetWaterClass(next) == WATER_CLASS_SEA) {
|
||||
DrawShoreTile(ti->tileh);
|
||||
|
@ -1451,7 +1480,7 @@ static void DrawTile_TunnelBridge(TileInfo *ti)
|
|||
* it doesn't disappear behind it
|
||||
*/
|
||||
/* Bridge heads are drawn solid no matter how invisibility/transparency is set */
|
||||
AddSortableSpriteToDraw(psid->sprite, psid->pal, *ti, {{}, {TILE_SIZE, TILE_SIZE, static_cast<uint8_t>(ti->tileh == SLOPE_FLAT ? 0 : TILE_HEIGHT)}, {}});
|
||||
AddSortableSpriteToDraw(psid[0].sprite, psid[0].pal, *ti, {{}, {TILE_SIZE, TILE_SIZE, static_cast<uint8_t>(ti->tileh == SLOPE_FLAT ? 0 : TILE_HEIGHT)}, {}});
|
||||
|
||||
if (transport_type == TRANSPORT_ROAD) {
|
||||
uint offset = tunnelbridge_direction;
|
||||
|
@ -1572,33 +1601,21 @@ void DrawBridgeMiddle(const TileInfo *ti)
|
|||
TileIndex rampnorth = GetNorthernBridgeEnd(ti->tile);
|
||||
TileIndex rampsouth = GetSouthernBridgeEnd(ti->tile);
|
||||
TransportType transport_type = GetTunnelBridgeTransportType(rampsouth);
|
||||
|
||||
Axis axis = GetBridgeAxis(ti->tile);
|
||||
BridgePieces piece = CalcBridgePiece(
|
||||
GetTunnelBridgeLength(ti->tile, rampnorth) + 1,
|
||||
GetTunnelBridgeLength(ti->tile, rampsouth) + 1
|
||||
);
|
||||
|
||||
const PalSpriteID *psid;
|
||||
uint base_offset = GetBridgeMiddleAxisBaseOffset(axis);
|
||||
std::span<const PalSpriteID> psid;
|
||||
bool drawfarpillar;
|
||||
if (transport_type != TRANSPORT_WATER) {
|
||||
BridgeType type = GetBridgeType(rampsouth);
|
||||
drawfarpillar = !HasBit(GetBridgeSpec(type)->flags, 0);
|
||||
|
||||
uint base_offset;
|
||||
if (transport_type == TRANSPORT_RAIL) {
|
||||
base_offset = GetRailTypeInfo(GetRailType(rampsouth))->bridge_offset;
|
||||
} else {
|
||||
base_offset = 8;
|
||||
}
|
||||
|
||||
psid = &GetBridgeSpriteTable(type, piece)[base_offset];
|
||||
BridgeType bridge_type = GetBridgeType(rampsouth);
|
||||
drawfarpillar = !HasBit(GetBridgeSpec(bridge_type)->flags, 0);
|
||||
base_offset += GetBridgeSpriteTableBaseOffset(transport_type, rampsouth);
|
||||
psid = GetBridgeSpriteTable(bridge_type, CalcBridgePiece(GetTunnelBridgeLength(ti->tile, rampnorth) + 1, GetTunnelBridgeLength(ti->tile, rampsouth) + 1));
|
||||
} else {
|
||||
drawfarpillar = true;
|
||||
psid = _aqueduct_sprites;
|
||||
psid = _aqueduct_sprite_table_middle;
|
||||
}
|
||||
|
||||
if (axis != AXIS_X) psid += 4;
|
||||
psid = psid.subspan(base_offset, 3);
|
||||
|
||||
int x = ti->x;
|
||||
int y = ti->y;
|
||||
|
@ -1614,14 +1631,12 @@ void DrawBridgeMiddle(const TileInfo *ti)
|
|||
/* Draw floor and far part of bridge*/
|
||||
if (!IsInvisibilitySet(TO_BRIDGES)) {
|
||||
if (axis == AXIS_X) {
|
||||
AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, z, {{0, 0, BRIDGE_Z_START}, {TILE_SIZE, 1, 40}, {0, 0, -BRIDGE_Z_START}}, IsTransparencySet(TO_BRIDGES));
|
||||
AddSortableSpriteToDraw(psid[0].sprite, psid[0].pal, x, y, z, {{0, 0, BRIDGE_Z_START}, {TILE_SIZE, 1, 40}, {0, 0, -BRIDGE_Z_START}}, IsTransparencySet(TO_BRIDGES));
|
||||
} else {
|
||||
AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, z, {{0, 0, BRIDGE_Z_START}, {1, TILE_SIZE, 40}, {0, 0, -BRIDGE_Z_START}}, IsTransparencySet(TO_BRIDGES));
|
||||
AddSortableSpriteToDraw(psid[0].sprite, psid[0].pal, x, y, z, {{0, 0, BRIDGE_Z_START}, {1, TILE_SIZE, 40}, {0, 0, -BRIDGE_Z_START}}, IsTransparencySet(TO_BRIDGES));
|
||||
}
|
||||
}
|
||||
|
||||
psid++;
|
||||
|
||||
if (transport_type == TRANSPORT_ROAD) {
|
||||
/* DrawBridgeRoadBits() calls EndSpriteCombine() and StartSpriteCombine() */
|
||||
DrawBridgeRoadBits(rampsouth, x, y, bridge_z, axis ^ 1, false);
|
||||
|
@ -1654,10 +1669,10 @@ void DrawBridgeMiddle(const TileInfo *ti)
|
|||
if (!IsInvisibilitySet(TO_BRIDGES)) {
|
||||
if (axis == AXIS_X) {
|
||||
y += 12;
|
||||
if (psid->sprite & SPRITE_MASK) AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, z, {{0, 3, BRIDGE_Z_START}, {TILE_SIZE, 1, 40}, {0, -3, -BRIDGE_Z_START}}, IsTransparencySet(TO_BRIDGES));
|
||||
if (psid[1].sprite & SPRITE_MASK) AddSortableSpriteToDraw(psid[1].sprite, psid[1].pal, x, y, z, {{0, 3, BRIDGE_Z_START}, {TILE_SIZE, 1, 40}, {0, -3, -BRIDGE_Z_START}}, IsTransparencySet(TO_BRIDGES));
|
||||
} else {
|
||||
x += 12;
|
||||
if (psid->sprite & SPRITE_MASK) AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, z, {{3, 0, BRIDGE_Z_START}, {1, TILE_SIZE, 40}, {-3, 0, -BRIDGE_Z_START}}, IsTransparencySet(TO_BRIDGES));
|
||||
if (psid[1].sprite & SPRITE_MASK) AddSortableSpriteToDraw(psid[1].sprite, psid[1].pal, x, y, z, {{3, 0, BRIDGE_Z_START}, {1, TILE_SIZE, 40}, {-3, 0, -BRIDGE_Z_START}}, IsTransparencySet(TO_BRIDGES));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1667,8 +1682,7 @@ void DrawBridgeMiddle(const TileInfo *ti)
|
|||
/* Do not draw anything more if bridges are invisible */
|
||||
if (IsInvisibilitySet(TO_BRIDGES)) return;
|
||||
|
||||
psid++;
|
||||
DrawBridgePillars(psid, ti, axis, drawfarpillar, x, y, z);
|
||||
DrawBridgePillars(psid[2], ti, axis, drawfarpillar, x, y, z);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -12,9 +12,11 @@
|
|||
|
||||
/** Widgets of the #ErrmsgWindow class. */
|
||||
enum ErrorMessageWidgets : WidgetID {
|
||||
WID_EM_CAPTION, ///< Caption of the window.
|
||||
WID_EM_FACE, ///< Error title.
|
||||
WID_EM_MESSAGE, ///< Error message.
|
||||
WID_EM_CAPTION, ///< Caption of the window.
|
||||
WID_EM_FACE, ///< Error title.
|
||||
WID_EM_MESSAGE, ///< Error message.
|
||||
WID_EM_CLOSEBOX, ///< Close box button.
|
||||
WID_EM_PANEL, ///< Coloured background panel.
|
||||
};
|
||||
|
||||
#endif /* WIDGETS_ERROR_WIDGET_H */
|
||||
|
|
Loading…
Reference in New Issue