/** * Determines height at given coordinate of a slope * @param x x coordinate * @param y y coordinate * @param corners slope to examine * @return height of given point of given slope */ uint GetPartialPixelZ(int x, int y, Slope corners) { if (IsHalftileSlope(corners)) { switch (GetHalftileSlopeCorner(corners)) { case CORNER_W: if (x - y >= 0) return GetSlopeMaxPixelZ(corners); break; case CORNER_S: if (x - (y ^ 0xF) >= 0) return GetSlopeMaxPixelZ(corners); break; case CORNER_E: if (y - x >= 0) return GetSlopeMaxPixelZ(corners); break; case CORNER_N: if ((y ^ 0xF) - x >= 0) return GetSlopeMaxPixelZ(corners); break; default: NOT_REACHED(); } } int z = 0; switch (RemoveHalftileSlope(corners)) { case SLOPE_W: if (x - y >= 0) { z = (x - y) >> 1; } break; case SLOPE_S: y ^= 0xF; if ((x - y) >= 0) { z = (x - y) >> 1; }
static void DrawClearLandFence(const TileInfo *ti) { /* combine fences into one sprite object */ StartSpriteCombine(); int maxz = GetSlopeMaxPixelZ(ti->tileh); uint fence_nw = GetFence(ti->tile, DIAGDIR_NW); if (fence_nw != 0) { int z = GetSlopePixelZInCorner(ti->tileh, CORNER_W); SpriteID sprite = _clear_land_fence_sprites[fence_nw - 1] + _fence_mod_by_tileh_nw[ti->tileh]; AddSortableSpriteToDraw(sprite, PAL_NONE, ti->x, ti->y - 15, 16, 31, maxz - z + 4, ti->z + z, false, 0, 15, -z); } uint fence_ne = GetFence(ti->tile, DIAGDIR_NE); if (fence_ne != 0) { int z = GetSlopePixelZInCorner(ti->tileh, CORNER_E); SpriteID sprite = _clear_land_fence_sprites[fence_ne - 1] + _fence_mod_by_tileh_ne[ti->tileh]; AddSortableSpriteToDraw(sprite, PAL_NONE, ti->x - 15, ti->y, 31, 16, maxz - z + 4, ti->z + z, false, 15, 0, -z); } uint fence_sw = GetFence(ti->tile, DIAGDIR_SW); uint fence_se = GetFence(ti->tile, DIAGDIR_SE); if (fence_sw != 0 || fence_se != 0) { int z = GetSlopePixelZInCorner(ti->tileh, CORNER_S); if (fence_sw != 0) { SpriteID sprite = _clear_land_fence_sprites[fence_sw - 1] + _fence_mod_by_tileh_sw[ti->tileh]; AddSortableSpriteToDraw(sprite, PAL_NONE, ti->x, ti->y, 16, 16, maxz - z + 4, ti->z + z, false, 0, 0, -z); } if (fence_se != 0) { SpriteID sprite = _clear_land_fence_sprites[fence_se - 1] + _fence_mod_by_tileh_se[ti->tileh]; AddSortableSpriteToDraw(sprite, PAL_NONE, ti->x, ti->y, 16, 16, maxz - z + 4, ti->z + z, false, 0, 0, -z); } } EndSpriteCombine(); }
static void DrawClearLandFence(const TileInfo *ti) { /* combine fences into one sprite object */ StartSpriteCombine(); int maxz = GetSlopeMaxPixelZ(ti->tileh); bool fence_nw = GetFenceNW(ti->tile) != 0; if (fence_nw) { int z = GetSlopePixelZInCorner(ti->tileh, CORNER_W); SpriteID sprite = _clear_land_fence_sprites[GetFenceNW(ti->tile) - 1] + _fence_mod_by_tileh_nw[ti->tileh]; AddSortableSpriteToDraw(sprite, PAL_NONE, ti->x, ti->y - 15, 16, 31, maxz - z + 4, ti->z + z, false, 0, 15, -z); } bool fence_ne = GetFenceNE(ti->tile) != 0; if (fence_ne) { int z = GetSlopePixelZInCorner(ti->tileh, CORNER_E); SpriteID sprite = _clear_land_fence_sprites[GetFenceNE(ti->tile) - 1] + _fence_mod_by_tileh_ne[ti->tileh]; AddSortableSpriteToDraw(sprite, PAL_NONE, ti->x - 15, ti->y, 31, 16, maxz - z + 4, ti->z + z, false, 15, 0, -z); } bool fence_sw = GetFenceSW(ti->tile) != 0; bool fence_se = GetFenceSE(ti->tile) != 0; if (fence_sw || fence_se) { int z = GetSlopePixelZInCorner(ti->tileh, CORNER_S); if (fence_sw) { SpriteID sprite = _clear_land_fence_sprites[GetFenceSW(ti->tile) - 1] + _fence_mod_by_tileh_sw[ti->tileh]; AddSortableSpriteToDraw(sprite, PAL_NONE, ti->x, ti->y, 16, 16, maxz - z + 4, ti->z + z, false, 0, 0, -z); } if (fence_se) { SpriteID sprite = _clear_land_fence_sprites[GetFenceSE(ti->tile) - 1] + _fence_mod_by_tileh_se[ti->tileh]; AddSortableSpriteToDraw(sprite, PAL_NONE, ti->x, ti->y, 16, 16, maxz - z + 4, ti->z + z, false, 0, 0, -z); } } EndSpriteCombine(); }