diff options
Diffstat (limited to 'src/train_cmd.cpp')
-rw-r--r-- | src/train_cmd.cpp | 78 |
1 files changed, 40 insertions, 38 deletions
diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index a1a378602..84ad087c9 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -467,59 +467,61 @@ void UpdateTrainAcceleration(Vehicle *v) v->acceleration = Clamp(power / weight * 4, 1, 255); } -int Train::GetImage(Direction direction) const +SpriteID Train::GetImage(Direction direction) const { - int img = this->spritenum; - int base; + uint8 spritenum = this->spritenum; + SpriteID sprite; if (HasBit(this->u.rail.flags, VRF_REVERSE_DIRECTION)) direction = ReverseDir(direction); - if (is_custom_sprite(img)) { - base = GetCustomVehicleSprite(this, (Direction)(direction + 4 * IS_CUSTOM_SECONDHEAD_SPRITE(img))); - if (base != 0) return base; - img = _orig_rail_vehicle_info[this->engine_type].image_index; + if (is_custom_sprite(spritenum)) { + sprite = GetCustomVehicleSprite(this, (Direction)(direction + 4 * IS_CUSTOM_SECONDHEAD_SPRITE(spritenum))); + if (sprite != 0) return sprite; + + spritenum = _orig_rail_vehicle_info[this->engine_type].image_index; } - base = _engine_sprite_base[img] + ((direction + _engine_sprite_add[img]) & _engine_sprite_and[img]); + sprite = _engine_sprite_base[spritenum] + ((direction + _engine_sprite_add[spritenum]) & _engine_sprite_and[spritenum]); + + if (this->cargo.Count() >= this->cargo_cap / 2U) sprite += _wagon_full_adder[spritenum]; - if (this->cargo.Count() >= this->cargo_cap / 2U) base += _wagon_full_adder[img]; - return base; + return sprite; } -void DrawTrainEngine(int x, int y, EngineID engine, SpriteID pal) +static SpriteID GetRailIcon(EngineID engine, bool rear_head, int &y) { - const RailVehicleInfo *rvi = RailVehInfo(engine); - - int img = rvi->image_index; - SpriteID image = 0; + Direction dir = rear_head ? DIR_E : DIR_W; + uint8 spritenum = RailVehInfo(engine)->image_index; - if (is_custom_sprite(img)) { - image = GetCustomVehicleIcon(engine, DIR_W); - if (image == 0) { - img = _orig_rail_vehicle_info[engine].image_index; - } else { - y += _traininfo_vehicle_pitch; + if (is_custom_sprite(spritenum)) { + SpriteID sprite = GetCustomVehicleIcon(engine, dir); + if (sprite != 0) { + y += _traininfo_vehicle_pitch; // TODO Make this per-GRF + return sprite; } - } - if (image == 0) { - image = (6 & _engine_sprite_and[img]) + _engine_sprite_base[img]; + + spritenum = _orig_rail_vehicle_info[engine].image_index; } - if (rvi->railveh_type == RAILVEH_MULTIHEAD) { - DrawSprite(image, pal, x - 14, y); - x += 15; - image = 0; - if (is_custom_sprite(img)) { - image = GetCustomVehicleIcon(engine, DIR_E); - if (image == 0) img = _orig_rail_vehicle_info[engine].image_index; - } - if (image == 0) { - image = - ((6 + _engine_sprite_add[img + 1]) & _engine_sprite_and[img + 1]) + - _engine_sprite_base[img + 1]; - } + if (rear_head) spritenum++; + + return ((6 + _engine_sprite_add[spritenum]) & _engine_sprite_and[spritenum]) + _engine_sprite_base[spritenum]; +} + +void DrawTrainEngine(int x, int y, EngineID engine, SpriteID pal) +{ + if (RailVehInfo(engine)->railveh_type == RAILVEH_MULTIHEAD) { + int yf = y; + int yr = y; + + SpriteID spritef = GetRailIcon(engine, false, yf); + SpriteID spriter = GetRailIcon(engine, true, yr); + DrawSprite(spritef, pal, x - 14, yf); + DrawSprite(spriter, pal, x + 15, yr); + } else { + SpriteID sprite = GetRailIcon(engine, false, y); + DrawSprite(sprite, pal, x, y); } - DrawSprite(image, pal, x, y); } static CommandCost CmdBuildRailWagon(EngineID engine, TileIndex tile, uint32 flags) |