(svn r20351) -Codechange: Uncouple water lock and depot drawing.

This commit is contained in:
michi_cc 2010-08-03 17:47:43 +00:00
parent 80eea10a48
commit 80943c5ec7

View File

@ -573,30 +573,22 @@ struct LocksDrawTileStruct {
#include "table/water_land.h"
static void DrawWaterStuff(const TileInfo *ti, const WaterDrawTileStruct *wdts,
PaletteID palette, uint base, bool draw_ground)
/**
* Draw a build sprite sequence for water tiles.
* If buildings are invisible, nothing will be drawn.
* @param ti Tile info.
* @param wdts Sprite sequence to draw.
* @param base Base sprite.
* @param offset Additional sprite offset.
* @param palette Palette to use.
*/
static void DrawWaterTileStruct(const TileInfo *ti, const WaterDrawTileStruct *wdts, SpriteID base, uint offset, PaletteID palette)
{
SpriteID water_base = GetCanalSprite(CF_WATERSLOPE, ti->tile);
SpriteID locks_base = GetCanalSprite(CF_LOCKS, ti->tile);
/* If no custom graphics, use defaults */
if (water_base == 0) water_base = SPR_CANALS_BASE;
if (locks_base == 0) {
locks_base = SPR_LOCK_BASE;
} else {
/* If using custom graphics, ignore the variation on height */
base = 0;
}
SpriteID image = wdts++->image;
if (image < 4) image += water_base;
if (draw_ground) DrawGroundSprite(image, PAL_NONE);
/* End now if buildings are invisible */
/* Don't draw if buildings are invisible. */
if (IsInvisibilitySet(TO_BUILDINGS)) return;
for (; wdts->delta_x != 0x80; wdts++) {
AddSortableSpriteToDraw(wdts->image + base + ((wdts->image < 24) ? locks_base : 0), palette,
AddSortableSpriteToDraw(base + wdts->image + offset, palette,
ti->x + wdts->delta_x, ti->y + wdts->delta_y,
wdts->size_x, wdts->size_y,
wdts->size_z, ti->z + wdts->delta_z,
@ -604,6 +596,40 @@ static void DrawWaterStuff(const TileInfo *ti, const WaterDrawTileStruct *wdts,
}
}
/** Draw a lock tile. */
static void DrawWaterLock(const TileInfo *ti)
{
const WaterDrawTileStruct *wdts = _lock_display_seq[GetSection(ti->tile)];
/* Draw ground sprite. */
SpriteID water_base = GetCanalSprite(CF_WATERSLOPE, ti->tile);
if (water_base == 0) water_base = SPR_CANALS_BASE;
SpriteID image = wdts++->image;
if (image < 4) image += water_base;
DrawGroundSprite(image, PAL_NONE);
/* Draw structures. */
uint zoffs = 0;
SpriteID base = GetCanalSprite(CF_LOCKS, ti->tile);
if (base == 0) {
/* If no custom graphics, use defaults. */
base = SPR_LOCK_BASE;
zoffs = ti->z > wdts[3].delta_y ? 24 : 0;
}
DrawWaterTileStruct(ti, wdts, base, zoffs, PAL_NONE);
}
/** Draw a ship depot tile. */
static void DrawWaterDepot(const TileInfo *ti)
{
DrawWaterClassGround(ti);
/* Skip first entry in _shipdepot_display_seq as this is the ground sprite. */
DrawWaterTileStruct(ti, _shipdepot_display_seq[GetSection(ti->tile)] + 1, 0, 0, COMPANY_SPRITE_COLOUR(GetTileOwner(ti->tile)));
}
static void DrawRiverWater(const TileInfo *ti)
{
SpriteID image = SPR_FLAT_WATER_TILE;
@ -677,15 +703,12 @@ static void DrawTile_Water(TileInfo *ti)
break;
}
case WATER_TILE_LOCK: {
const WaterDrawTileStruct *t = _lock_display_seq[GetSection(ti->tile)];
DrawWaterStuff(ti, t, 0, ti->z > t[3].delta_y ? 24 : 0, true);
case WATER_TILE_LOCK:
DrawWaterLock(ti);
break;
}
case WATER_TILE_DEPOT:
DrawWaterClassGround(ti);
DrawWaterStuff(ti, _shipdepot_display_seq[GetSection(ti->tile)], COMPANY_SPRITE_COLOUR(GetTileOwner(ti->tile)), 0, false);
DrawWaterDepot(ti);
break;
}
}