summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfrosch <frosch@openttd.org>2010-01-03 20:55:00 +0000
committerfrosch <frosch@openttd.org>2010-01-03 20:55:00 +0000
commita9d4147eb28618727c7f8ad013146d04350d3ffe (patch)
tree7e12fcbfcc09072b26c37158cb1a123b2a4571ae
parent8a50a4112c4cf425b3d47c189f80c4e053c047bc (diff)
downloadopenttd-a9d4147eb28618727c7f8ad013146d04350d3ffe.tar.xz
(svn r18702) -Fix [FS#3467]: Enable DrawGroundSpriteAt() to deal with foundations as DrawGroundSprite() does, and use this for drawing one-way-road-signs and clear-land-fences.
-rw-r--r--src/clear_cmd.cpp11
-rw-r--r--src/dummy_land.cpp2
-rw-r--r--src/road_cmd.cpp2
-rw-r--r--src/tunnelbridge_cmd.cpp2
-rw-r--r--src/viewport.cpp35
-rw-r--r--src/viewport_func.h2
6 files changed, 33 insertions, 21 deletions
diff --git a/src/clear_cmd.cpp b/src/clear_cmd.cpp
index 43f820d6b..e3d1e3137 100644
--- a/src/clear_cmd.cpp
+++ b/src/clear_cmd.cpp
@@ -63,19 +63,14 @@ void DrawHillyLandTile(const TileInfo *ti)
void DrawClearLandFence(const TileInfo *ti)
{
- byte z = ti->z;
-
- if (ti->tileh & SLOPE_S) {
- z += TILE_HEIGHT;
- if (ti->tileh == SLOPE_STEEP_S) z += TILE_HEIGHT;
- }
+ int z = GetSlopeZInCorner(ti->tileh, CORNER_S);
if (GetFenceSW(ti->tile) != 0) {
- DrawGroundSpriteAt(_clear_land_fence_sprites[GetFenceSW(ti->tile) - 1] + _fence_mod_by_tileh_sw[ti->tileh], PAL_NONE, ti->x, ti->y, z);
+ DrawGroundSpriteAt(_clear_land_fence_sprites[GetFenceSW(ti->tile) - 1] + _fence_mod_by_tileh_sw[ti->tileh], PAL_NONE, 0, 0, z);
}
if (GetFenceSE(ti->tile) != 0) {
- DrawGroundSpriteAt(_clear_land_fence_sprites[GetFenceSE(ti->tile) - 1] + _fence_mod_by_tileh_se[ti->tileh], PAL_NONE, ti->x, ti->y, z);
+ DrawGroundSpriteAt(_clear_land_fence_sprites[GetFenceSE(ti->tile) - 1] + _fence_mod_by_tileh_se[ti->tileh], PAL_NONE, 0, 0, z);
}
}
diff --git a/src/dummy_land.cpp b/src/dummy_land.cpp
index 305be368c..0490fc293 100644
--- a/src/dummy_land.cpp
+++ b/src/dummy_land.cpp
@@ -19,7 +19,7 @@
static void DrawTile_Dummy(TileInfo *ti)
{
- DrawGroundSpriteAt(SPR_SHADOW_CELL, PAL_NONE, ti->x, ti->y, ti->z);
+ DrawGroundSprite(SPR_SHADOW_CELL, PAL_NONE);
}
diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp
index 4ef98fc5e..5a5e96257 100644
--- a/src/road_cmd.cpp
+++ b/src/road_cmd.cpp
@@ -1126,7 +1126,7 @@ static void DrawRoadBits(TileInfo *ti)
if (road != ROAD_NONE) {
DisallowedRoadDirections drd = GetDisallowedRoadDirections(ti->tile);
if (drd != DRD_NONE) {
- DrawRoadDetail(SPR_ONEWAY_BASE + drd - 1 + ((road == ROAD_X) ? 0 : 3), ti, 8, 8, 0);
+ DrawGroundSpriteAt(SPR_ONEWAY_BASE + drd - 1 + ((road == ROAD_X) ? 0 : 3), PAL_NONE, 8, 8, GetPartialZ(8, 8, ti->tileh));
}
}
diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp
index 42e18201b..0b199bb4e 100644
--- a/src/tunnelbridge_cmd.cpp
+++ b/src/tunnelbridge_cmd.cpp
@@ -1184,7 +1184,7 @@ void DrawBridgeMiddle(const TileInfo *ti)
pal = PALETTE_TO_TRANSPARENT;
}
- DrawGroundSpriteAt(image, pal, x, y, z);
+ DrawGroundSpriteAt(image, pal, x - ti->x, y - ti->y, z - ti->z);
}
} else if (_settings_client.gui.bridge_pillars) {
/* draw pillars below for high bridges */
diff --git a/src/viewport.cpp b/src/viewport.cpp
index 2e7753b44..7b417f942 100644
--- a/src/viewport.cpp
+++ b/src/viewport.cpp
@@ -467,7 +467,7 @@ void HandleZoomMessage(Window *w, const ViewPort *vp, byte widget_zoom_in, byte
}
/**
- * Draws a ground sprite at a specific world-coordinate.
+ * Shedules a tile sprite for drawing.
*
* @param image the image to draw.
* @param pal the provided palette.
@@ -477,9 +477,8 @@ void HandleZoomMessage(Window *w, const ViewPort *vp, byte widget_zoom_in, byte
* @param sub Only draw a part of the sprite.
* @param extra_offs_x Pixel X offset for the sprite position.
* @param extra_offs_y Pixel Y offset for the sprite position.
- *
*/
-void DrawGroundSpriteAt(SpriteID image, SpriteID pal, int32 x, int32 y, byte z, const SubSprite *sub, int extra_offs_x, int extra_offs_y)
+static void AddTileSpriteToDraw(SpriteID image, SpriteID pal, int32 x, int32 y, int z, const SubSprite *sub = NULL, int extra_offs_x = 0, int extra_offs_y = 0)
{
assert((image & SPRITE_MASK) < MAX_SPRITES);
@@ -521,27 +520,45 @@ static void AddChildSpriteToFoundation(SpriteID image, SpriteID pal, const SubSp
}
/**
- * Draws a ground sprite for the current tile.
+ * Draws a ground sprite at a specific world-coordinate relative to the current tile.
* If the current tile is drawn on top of a foundation the sprite is added as child sprite to the "foundation"-ParentSprite.
*
* @param image the image to draw.
* @param pal the provided palette.
+ * @param x position x (world coordinates) of the sprite relative to current tile.
+ * @param y position y (world coordinates) of the sprite relative to current tile.
+ * @param z position z (world coordinates) of the sprite relative to current tile.
* @param sub Only draw a part of the sprite.
* @param extra_offs_x Pixel X offset for the sprite position.
* @param extra_offs_y Pixel Y offset for the sprite position.
*/
-void DrawGroundSprite(SpriteID image, SpriteID pal, const SubSprite *sub, int extra_offs_x, int extra_offs_y)
+void DrawGroundSpriteAt(SpriteID image, SpriteID pal, int32 x, int32 y, int z, const SubSprite *sub, int extra_offs_x, int extra_offs_y)
{
/* Switch to first foundation part, if no foundation was drawn */
if (_vd.foundation_part == FOUNDATION_PART_NONE) _vd.foundation_part = FOUNDATION_PART_NORMAL;
if (_vd.foundation[_vd.foundation_part] != -1) {
- AddChildSpriteToFoundation(image, pal, sub, _vd.foundation_part, extra_offs_x, extra_offs_y);
+ Point pt = RemapCoords(x, y, z);
+ AddChildSpriteToFoundation(image, pal, sub, _vd.foundation_part, pt.x + extra_offs_x, pt.y + extra_offs_y);
} else {
- DrawGroundSpriteAt(image, pal, _cur_ti->x, _cur_ti->y, _cur_ti->z, sub, extra_offs_x, extra_offs_y);
+ AddTileSpriteToDraw(image, pal, _cur_ti->x + x, _cur_ti->y + y, _cur_ti->z + z, sub, extra_offs_x, extra_offs_y);
}
}
+/**
+ * Draws a ground sprite for the current tile.
+ * If the current tile is drawn on top of a foundation the sprite is added as child sprite to the "foundation"-ParentSprite.
+ *
+ * @param image the image to draw.
+ * @param pal the provided palette.
+ * @param sub Only draw a part of the sprite.
+ * @param extra_offs_x Pixel X offset for the sprite position.
+ * @param extra_offs_y Pixel Y offset for the sprite position.
+ */
+void DrawGroundSprite(SpriteID image, SpriteID pal, const SubSprite *sub, int extra_offs_x, int extra_offs_y)
+{
+ DrawGroundSpriteAt(image, pal, 0, 0, 0, sub, extra_offs_x, extra_offs_y);
+}
/**
* Called when a foundation has been drawn for the current tile.
@@ -805,7 +822,7 @@ static void DrawSelectionSprite(SpriteID image, SpriteID pal, const TileInfo *ti
/* FIXME: This is not totally valid for some autorail highlights, that extent over the edges of the tile. */
if (_vd.foundation[foundation_part] == -1) {
/* draw on real ground */
- DrawGroundSpriteAt(image, pal, ti->x, ti->y, ti->z + z_offset);
+ AddTileSpriteToDraw(image, pal, ti->x, ti->y, ti->z + z_offset);
} else {
/* draw on top of foundation */
AddChildSpriteToFoundation(image, pal, NULL, foundation_part, 0, -z_offset);
@@ -1024,7 +1041,7 @@ static void ViewportAddLandscape()
if (x_cur == ((int)MapMaxX() - 1) * TILE_SIZE || y_cur == ((int)MapMaxY() - 1) * TILE_SIZE) {
uint maxh = max<uint>(TileHeight(tile), 1);
for (uint h = 0; h < maxh; h++) {
- DrawGroundSpriteAt(SPR_SHADOW_CELL, PAL_NONE, ti.x, ti.y, h * TILE_HEIGHT);
+ AddTileSpriteToDraw(SPR_SHADOW_CELL, PAL_NONE, ti.x, ti.y, h * TILE_HEIGHT);
}
}
diff --git a/src/viewport_func.h b/src/viewport_func.h
index f749e80ff..e025f1c8a 100644
--- a/src/viewport_func.h
+++ b/src/viewport_func.h
@@ -46,7 +46,7 @@ static inline void MaxZoomInOut(int how, Window *w)
void OffsetGroundSprite(int x, int y);
void DrawGroundSprite(SpriteID image, SpriteID pal, const SubSprite *sub = NULL, int extra_offs_x = 0, int extra_offs_y = 0);
-void DrawGroundSpriteAt(SpriteID image, SpriteID pal, int32 x, int32 y, byte z, const SubSprite *sub = NULL, int extra_offs_x = 0, int extra_offs_y = 0);
+void DrawGroundSpriteAt(SpriteID image, SpriteID pal, int32 x, int32 y, int z, const SubSprite *sub = NULL, int extra_offs_x = 0, int extra_offs_y = 0);
void AddSortableSpriteToDraw(SpriteID image, SpriteID pal, int x, int y, int w, int h, int dz, int z, bool transparent = false, int bb_offset_x = 0, int bb_offset_y = 0, int bb_offset_z = 0, const SubSprite *sub = NULL);
void AddChildSpriteScreen(SpriteID image, SpriteID pal, int x, int y, bool transparent = false, const SubSprite *sub = NULL);
void ViewportAddString(const DrawPixelInfo *dpi, ZoomLevel small_from, const ViewportSign *sign, StringID string_normal, StringID string_small, StringID string_small_shadow, uint64 params_1, uint64 params_2 = 0, Colours colour = INVALID_COLOUR);