mirror of https://github.com/OpenTTD/OpenTTD
Codechange: use std::vector/std::span over MallocT for NewGRF bridge sprites
parent
7121bc9f31
commit
b64e8c0aea
|
@ -50,7 +50,7 @@ struct BridgeSpec {
|
|||
PaletteID pal; ///< the palette which is used in the GUI
|
||||
StringID material; ///< the string that contains the bridge description
|
||||
StringID transport_name[2]; ///< description of the bridge, when built for road or rail
|
||||
PalSpriteID **sprite_table; ///< table of sprites for drawing the bridge
|
||||
std::vector<std::vector<PalSpriteID>> sprite_table; ///< table of sprites for drawing the bridge
|
||||
uint8_t flags; ///< bit 0 set: disable drawing of far pillars.
|
||||
};
|
||||
|
||||
|
|
|
@ -2376,10 +2376,11 @@ static ChangeInfoResult BridgeChangeInfo(uint first, uint last, int prop, ByteRe
|
|||
case 0x0D: { // Bridge sprite tables
|
||||
uint8_t tableid = buf.ReadByte();
|
||||
uint8_t numtables = buf.ReadByte();
|
||||
size_t size = tableid + numtables;
|
||||
|
||||
if (bridge->sprite_table == nullptr) {
|
||||
if (bridge->sprite_table.size() < size) {
|
||||
/* Allocate memory for sprite table pointers and zero out */
|
||||
bridge->sprite_table = CallocT<PalSpriteID*>(NUM_BRIDGE_PIECES);
|
||||
bridge->sprite_table.resize(std::min<size_t>(size, NUM_BRIDGE_PIECES));
|
||||
}
|
||||
|
||||
for (; numtables-- != 0; tableid++) {
|
||||
|
@ -2389,8 +2390,8 @@ static ChangeInfoResult BridgeChangeInfo(uint first, uint last, int prop, ByteRe
|
|||
continue;
|
||||
}
|
||||
|
||||
if (bridge->sprite_table[tableid] == nullptr) {
|
||||
bridge->sprite_table[tableid] = MallocT<PalSpriteID>(SPRITES_PER_BRIDGE_PIECE);
|
||||
if (bridge->sprite_table[tableid].empty()) {
|
||||
bridge->sprite_table[tableid].resize(SPRITES_PER_BRIDGE_PIECE);
|
||||
}
|
||||
|
||||
for (uint8_t sprite = 0; sprite < SPRITES_PER_BRIDGE_PIECE; sprite++) {
|
||||
|
|
|
@ -579,7 +579,7 @@ static const PalSpriteID _bridge_sprite_table_12_2[] = {
|
|||
{ 0xA1F, PALETTE_TO_STRUCT_CONCRETE }, { 0xA03, PALETTE_TO_STRUCT_CONCRETE }, { 0xA07, PALETTE_TO_STRUCT_CONCRETE }, { 0x0, PAL_NONE },
|
||||
};
|
||||
|
||||
static const PalSpriteID * const _bridge_sprite_table_archgirder[] = {
|
||||
static const std::span<const PalSpriteID> _bridge_sprite_table_archgirder[] = {
|
||||
_bridge_sprite_table_archgirder_middle,
|
||||
_bridge_sprite_table_archgirder_middle,
|
||||
_bridge_sprite_table_archgirder_middle,
|
||||
|
@ -589,7 +589,7 @@ static const PalSpriteID * const _bridge_sprite_table_archgirder[] = {
|
|||
_bridge_sprite_table_archgirder_heads,
|
||||
};
|
||||
|
||||
static const PalSpriteID * const _bridge_sprite_table_4[] = {
|
||||
static const std::span<const PalSpriteID> _bridge_sprite_table_4[] = {
|
||||
_bridge_sprite_table_4_0,
|
||||
_bridge_sprite_table_4_1,
|
||||
_bridge_sprite_table_4_2,
|
||||
|
@ -599,7 +599,7 @@ static const PalSpriteID * const _bridge_sprite_table_4[] = {
|
|||
_bridge_sprite_table_4_6,
|
||||
};
|
||||
|
||||
static const PalSpriteID * const _bridge_sprite_table_5[] = {
|
||||
static const std::span<const PalSpriteID> _bridge_sprite_table_5[] = {
|
||||
_bridge_sprite_table_5_0,
|
||||
_bridge_sprite_table_5_1,
|
||||
_bridge_sprite_table_5_2,
|
||||
|
@ -609,7 +609,7 @@ static const PalSpriteID * const _bridge_sprite_table_5[] = {
|
|||
_bridge_sprite_table_5_6,
|
||||
};
|
||||
|
||||
static const PalSpriteID * const _bridge_sprite_table_concrete_suspended[] = {
|
||||
static const std::span<const PalSpriteID> _bridge_sprite_table_concrete_suspended[] = {
|
||||
_bridge_sprite_table_concrete_suspended_A,
|
||||
_bridge_sprite_table_concrete_suspended_B,
|
||||
_bridge_sprite_table_concrete_suspended_C,
|
||||
|
@ -619,7 +619,7 @@ static const PalSpriteID * const _bridge_sprite_table_concrete_suspended[] = {
|
|||
_bridge_sprite_table_concrete_suspended_heads,
|
||||
};
|
||||
|
||||
static const PalSpriteID * const _bridge_sprite_table_6[] = {
|
||||
static const std::span<const PalSpriteID> _bridge_sprite_table_6[] = {
|
||||
_bridge_sprite_table_6_0,
|
||||
_bridge_sprite_table_6_1,
|
||||
_bridge_sprite_table_6_2,
|
||||
|
@ -629,7 +629,7 @@ static const PalSpriteID * const _bridge_sprite_table_6[] = {
|
|||
_bridge_sprite_table_6_3,
|
||||
};
|
||||
|
||||
static const PalSpriteID * const _bridge_sprite_table_7[] = {
|
||||
static const std::span<const PalSpriteID> _bridge_sprite_table_7[] = {
|
||||
_bridge_sprite_table_7_0,
|
||||
_bridge_sprite_table_7_1,
|
||||
_bridge_sprite_table_7_2,
|
||||
|
@ -639,7 +639,7 @@ static const PalSpriteID * const _bridge_sprite_table_7[] = {
|
|||
_bridge_sprite_table_7_3,
|
||||
};
|
||||
|
||||
static const PalSpriteID * const _bridge_sprite_table_8[] = {
|
||||
static const std::span<const PalSpriteID> _bridge_sprite_table_8[] = {
|
||||
_bridge_sprite_table_8_0,
|
||||
_bridge_sprite_table_8_1,
|
||||
_bridge_sprite_table_8_2,
|
||||
|
@ -649,7 +649,7 @@ static const PalSpriteID * const _bridge_sprite_table_8[] = {
|
|||
_bridge_sprite_table_8_3,
|
||||
};
|
||||
|
||||
static const PalSpriteID * const _bridge_sprite_table_wood[] = {
|
||||
static const std::span<const PalSpriteID> _bridge_sprite_table_wood[] = {
|
||||
_bridge_sprite_table_wood_middle,
|
||||
_bridge_sprite_table_wood_middle,
|
||||
_bridge_sprite_table_wood_middle,
|
||||
|
@ -659,7 +659,7 @@ static const PalSpriteID * const _bridge_sprite_table_wood[] = {
|
|||
_bridge_sprite_table_wood_heads,
|
||||
};
|
||||
|
||||
static const PalSpriteID * const _bridge_sprite_table_concrete[] = {
|
||||
static const std::span<const PalSpriteID> _bridge_sprite_table_concrete[] = {
|
||||
_bridge_sprite_table_concrete_middle,
|
||||
_bridge_sprite_table_concrete_middle,
|
||||
_bridge_sprite_table_concrete_middle,
|
||||
|
@ -669,7 +669,7 @@ static const PalSpriteID * const _bridge_sprite_table_concrete[] = {
|
|||
_bridge_sprite_table_concrete_heads,
|
||||
};
|
||||
|
||||
static const PalSpriteID * const _bridge_sprite_table_9[] = {
|
||||
static const std::span<const PalSpriteID> _bridge_sprite_table_9[] = {
|
||||
_bridge_sprite_table_9_0,
|
||||
_bridge_sprite_table_9_0,
|
||||
_bridge_sprite_table_9_0,
|
||||
|
@ -679,7 +679,7 @@ static const PalSpriteID * const _bridge_sprite_table_9[] = {
|
|||
_bridge_sprite_table_4_6,
|
||||
};
|
||||
|
||||
static const PalSpriteID * const _bridge_sprite_table_10[] = {
|
||||
static const std::span<const PalSpriteID> _bridge_sprite_table_10[] = {
|
||||
_bridge_sprite_table_10_0,
|
||||
_bridge_sprite_table_10_1,
|
||||
_bridge_sprite_table_10_2,
|
||||
|
@ -689,7 +689,7 @@ static const PalSpriteID * const _bridge_sprite_table_10[] = {
|
|||
_bridge_sprite_table_4_6,
|
||||
};
|
||||
|
||||
static const PalSpriteID * const _bridge_sprite_table_11[] = {
|
||||
static const std::span<const PalSpriteID> _bridge_sprite_table_11[] = {
|
||||
_bridge_sprite_table_11_0,
|
||||
_bridge_sprite_table_11_1,
|
||||
_bridge_sprite_table_11_2,
|
||||
|
@ -699,7 +699,7 @@ static const PalSpriteID * const _bridge_sprite_table_11[] = {
|
|||
_bridge_sprite_table_5_6,
|
||||
};
|
||||
|
||||
static const PalSpriteID * const _bridge_sprite_table_12[] = {
|
||||
static const std::span<const PalSpriteID> _bridge_sprite_table_12[] = {
|
||||
_bridge_sprite_table_12_0,
|
||||
_bridge_sprite_table_12_1,
|
||||
_bridge_sprite_table_12_2,
|
||||
|
@ -709,7 +709,7 @@ static const PalSpriteID * const _bridge_sprite_table_12[] = {
|
|||
_bridge_sprite_table_concrete_suspended_heads,
|
||||
};
|
||||
|
||||
static const PalSpriteID * const * const _bridge_sprite_table[MAX_BRIDGES] = {
|
||||
static const std::span<const std::span<const PalSpriteID>> _bridge_sprite_table[MAX_BRIDGES] = {
|
||||
_bridge_sprite_table_wood,
|
||||
_bridge_sprite_table_concrete,
|
||||
_bridge_sprite_table_archgirder,
|
||||
|
@ -739,7 +739,7 @@ static const PalSpriteID * const * const _bridge_sprite_table[MAX_BRIDGES] = {
|
|||
* @param nrd description of the road bridge in query tool
|
||||
*/
|
||||
#define MBR(y, mnl, mxl, p, mxs, spr, plt, dsc, nrl, nrd) \
|
||||
{TimerGameCalendar::Year{y}, mnl, mxl, p, mxs, spr, plt, dsc, { nrl, nrd }, nullptr, 0}
|
||||
{TimerGameCalendar::Year{y}, mnl, mxl, p, mxs, spr, plt, dsc, { nrl, nrd }, {}, 0}
|
||||
|
||||
const BridgeSpec _orig_bridge[] = {
|
||||
/*
|
||||
|
|
|
@ -85,18 +85,7 @@ void MarkBridgeDirty(TileIndex tile)
|
|||
/** Reset the data been eventually changed by the grf loaded. */
|
||||
void ResetBridges()
|
||||
{
|
||||
/* First, free sprite table data */
|
||||
for (BridgeType i = 0; i < MAX_BRIDGES; i++) {
|
||||
if (_bridge[i].sprite_table != nullptr) {
|
||||
for (BridgePieces j = BRIDGE_PIECE_NORTH; j < NUM_BRIDGE_PIECES; j++) free(_bridge[i].sprite_table[j]);
|
||||
free(_bridge[i].sprite_table);
|
||||
}
|
||||
}
|
||||
|
||||
/* Then, wipe out current bridges */
|
||||
memset(&_bridge, 0, sizeof(_bridge));
|
||||
/* And finally, reinstall default data */
|
||||
memcpy(&_bridge, &_orig_bridge, sizeof(_orig_bridge));
|
||||
std::ranges::copy(_orig_bridge, std::begin(_bridge));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -149,15 +138,13 @@ bool HasBridgeFlatRamp(Slope tileh, Axis axis)
|
|||
return (tileh != SLOPE_FLAT);
|
||||
}
|
||||
|
||||
static inline const PalSpriteID *GetBridgeSpriteTable(int index, BridgePieces table)
|
||||
static inline std::span<const PalSpriteID> GetBridgeSpriteTable(int index, BridgePieces table)
|
||||
{
|
||||
const BridgeSpec *bridge = GetBridgeSpec(index);
|
||||
assert(table < NUM_BRIDGE_PIECES);
|
||||
if (bridge->sprite_table == nullptr || bridge->sprite_table[table] == nullptr) {
|
||||
return _bridge_sprite_table[index][table];
|
||||
} else {
|
||||
return bridge->sprite_table[table];
|
||||
}
|
||||
if (table < bridge->sprite_table.size() && !bridge->sprite_table[table].empty()) return bridge->sprite_table[table];
|
||||
|
||||
return _bridge_sprite_table[index][table];
|
||||
}
|
||||
|
||||
|
||||
|
@ -1581,7 +1568,7 @@ void DrawBridgeMiddle(const TileInfo *ti)
|
|||
base_offset = 8;
|
||||
}
|
||||
|
||||
psid = base_offset + GetBridgeSpriteTable(type, piece);
|
||||
psid = &GetBridgeSpriteTable(type, piece)[base_offset];
|
||||
} else {
|
||||
drawfarpillar = true;
|
||||
psid = _aqueduct_sprites;
|
||||
|
|
Loading…
Reference in New Issue