From a7a194c4df25659ef71a2fd4c257a73428b4f837 Mon Sep 17 00:00:00 2001 From: peter1138 Date: Sat, 6 May 2006 20:48:40 +0000 Subject: [PATCH] (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints. --- newgrf_station.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ newgrf_station.h | 3 +++ waypoint.c | 36 +---------------------------- 3 files changed, 63 insertions(+), 35 deletions(-) diff --git a/newgrf_station.c b/newgrf_station.c index d15af4bf20..6a930ba619 100644 --- a/newgrf_station.c +++ b/newgrf_station.c @@ -5,8 +5,10 @@ #include "stdafx.h" #include "openttd.h" #include "variables.h" +#include "functions.h" #include "debug.h" #include "sprite.h" +#include "table/sprites.h" #include "table/strings.h" #include "station.h" #include "station_map.h" @@ -564,3 +566,60 @@ bool DeallocateSpecFromStation(Station *st, byte specindex) return freeable; } + +/** Draw representation of a station tile for GUI purposes. + * @param x, y Position of image. + * @param dir Direction. + * @param railtype Rail type. + * @param sclass, station Type of station. + * @return True if the tile was drawn (allows for fallback to default graphic) + */ +bool DrawStationTile(int x, int y, RailType railtype, Axis axis, StationClassID sclass, uint station) +{ + extern uint16 _custom_sprites_base; + + const StationSpec *statspec; + const DrawTileSprites *sprites; + const DrawTileSeqStruct *seq; + const RailtypeInfo *rti = GetRailTypeInfo(railtype); + SpriteID relocation; + PalSpriteID image; + PalSpriteID colourmod = SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player)); + uint tile = 2; + + statspec = GetCustomStationSpec(sclass, station); + if (statspec == NULL) return false; + + relocation = GetCustomStationRelocation(statspec, NULL, INVALID_TILE); + + if (HASBIT(statspec->callbackmask, CBM_CUSTOM_LAYOUT)) { + uint16 callback = GetStationCallback(CBID_STATION_SPRITE_LAYOUT, 0x2110000, 0, statspec, NULL, INVALID_TILE); + if (callback != CALLBACK_FAILED) tile = callback; + } + + if (statspec->renderdata == NULL) { + sprites = GetStationTileLayout(tile + axis); + relocation -= 0x42D; + } else { + sprites = &statspec->renderdata[(tile < statspec->tiles) ? tile + axis : axis]; + } + + image = sprites->ground_sprite; + image += (image < _custom_sprites_base) ? rti->total_offset : rti->custom_ground_offset; + + if (image & PALETTE_MODIFIER_COLOR) image &= SPRITE_MASK; + DrawSprite(image, x, y); + + foreach_draw_tile_seq(seq, sprites->seq) { + Point pt; + image = seq->image + relocation; + + if ((byte)seq->delta_z != 0x80) { + pt = RemapCoords(seq->delta_x, seq->delta_y, seq->delta_z); + DrawSprite((image & SPRITE_MASK) | colourmod, x + pt.x, y + pt.y); + } + } + + return true; +} + diff --git a/newgrf_station.h b/newgrf_station.h index cd3900d73f..50b4dc6ea7 100644 --- a/newgrf_station.h +++ b/newgrf_station.h @@ -107,4 +107,7 @@ int AllocateSpecToStation(const StationSpec *statspec, Station *st, bool exec); /* Deallocate a StationSpec from a Station. Called when removing a single station tile. */ bool DeallocateSpecFromStation(Station *st, byte specindex); +/* Draw representation of a station tile for GUI purposes. */ +bool DrawStationTile(int x, int y, RailType railtype, Axis axis, StationClassID sclass, uint station); + #endif /* NEWGRF_STATION_H */ diff --git a/waypoint.c b/waypoint.c index e4fef4ab7f..857c25af1f 100644 --- a/waypoint.c +++ b/waypoint.c @@ -15,7 +15,6 @@ #include "town.h" #include "waypoint.h" #include "variables.h" -#include "table/sprites.h" #include "table/strings.h" #include "vehicle.h" @@ -379,47 +378,14 @@ Station *ComposeWaypointStation(TileIndex tile) return &stat; } -extern uint16 _custom_sprites_base; - - /* Draw a waypoint */ void DrawWaypointSprite(int x, int y, int stat_id, RailType railtype) { - const StationSpec *statspec; - uint32 relocation; - const DrawTileSprites *cust; - DrawTileSeqStruct const *seq; - const RailtypeInfo *rti = GetRailTypeInfo(railtype); - uint32 ormod, img; - - ormod = SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player)); - x += 33; y += 17; - statspec = GetCustomStationSpec(STAT_CLASS_WAYP, stat_id); - if (statspec == NULL) { - // stat is NULL for default waypoints and when waypoint graphics are - // not loaded. + if (!DrawStationTile(x, y, railtype, AXIS_X, STAT_CLASS_WAYP, stat_id)) { DrawDefaultWaypointSprite(x, y, railtype); - return; - } - - relocation = GetCustomStationRelocation(statspec, NULL, INVALID_TILE); - // emulate station tile - open with building - // add 1 to get the other direction - cust = &statspec->renderdata[2]; - - img = cust->ground_sprite; - img += (img < _custom_sprites_base) ? rti->total_offset : rti->custom_ground_offset; - - if (img & PALETTE_MODIFIER_COLOR) img = (img & SPRITE_MASK); - DrawSprite(img, x, y); - - foreach_draw_tile_seq(seq, cust->seq) { - Point pt = RemapCoords(seq->delta_x, seq->delta_y, seq->delta_z); - uint32 image = seq->image + relocation; - DrawSprite((image & SPRITE_MASK) | ormod, x + pt.x, y + pt.y); } }