diff --git a/geometry.cpp b/geometry.cpp index 17870b04..cecd195b 100644 --- a/geometry.cpp +++ b/geometry.cpp @@ -268,7 +268,7 @@ namespace geom3 { LEG0, LEG1, LEG, LEG3, GROIN, GROIN1, GHOST, BODY, BODY1, BODY2, BODY3, NECK1, NECK, NECK3, HEAD, HEAD1, HEAD2, HEAD3, - ALEG0, ALEG, ABODY, AHEAD, BIRD, LOWSKY, SKY; + ALEG0, ALEG, ABODY, AHEAD, BIRD, LOWSKY, SKY, HIGH, HIGH2; string invalid; @@ -382,6 +382,8 @@ namespace geom3 { HELLSPIKE = lev_to_factor(-(lake_top+lake_bottom)/2); BOTTOM = lev_to_factor(-lake_bottom); LOWSKY = lev_to_factor((1 + rock_wall_ratio) * wh); + HIGH = LOWSKY; + HIGH2 = lev_to_factor((2 + rock_wall_ratio) * wh); SKY = LOWSKY - 5; } } diff --git a/graph.cpp b/graph.cpp index 2b999835..f0922ff5 100644 --- a/graph.cpp +++ b/graph.cpp @@ -4560,7 +4560,6 @@ int ceiling_category(cell *c) { case laHive: case laCamelot: case laTemple: - case laPalace: case laPrincessQuest: case laIvoryTower: case laEFire: @@ -4580,6 +4579,7 @@ int ceiling_category(cell *c) { case laVariant: return 3; + case laPalace: default: return 4; } @@ -4661,6 +4661,35 @@ void draw_ceiling(cell *c, const transmatrix& V, int fd, color_t& fcol, color_t& } return; } + + case 4: { + auto ispal = [&] (cell *c0) { return c0->land == laPalace && among(c0->wall, waPalace, waClosedGate, waOpenGate); }; + color_t wcol2 = 0xFFD500; + if(ispal(c)) { + forCellIdEx(c2, i, c) if(!ispal(c2)) + placeSidewall(c, i, SIDE_HIGH, V, darkena(wcol2, fd, 0xFF)); + } + else { + bool window = false; + forCellIdEx(c2, i, c) if(c2->wall == waPalace && ispal(c->modmove(i+1)) && ispal(c->modmove(i-1))) window = true; + if(!window) draw_shapevec(c, V, qfi.fshape->levels[SIDE_HIGH], darkena(fcol, fd, 0xFF), PPR::WALL); + if(window) + forCellIdEx(c2, i, c) + placeSidewall(c, i, SIDE_HIGH2, V, darkena(wcol2, fd, 0xFF)); + } + if(among(c->wall, waClosedGate, waOpenGate)) draw_shapevec(c, V, qfi.fshape->levels[SIDE_WALL], 0x202020FF, PPR::WALL); + + if(true) { + auto &star = queuepolyat(V * zpush(geom3::SKY+0.5), shNightStar, 0xFFFFFFFF, PPR::SKY); + star.tinf = NULL; + star.flags |= POLY_INTENSE; + } + int sk = get_skybrightness(); + if(sk > 0) { + auto sky = draw_shapevec(c, V, shFullFloor.levels[SIDE_SKY], 0x000000FF + 0x100 * (sk/17), PPR::SKY); + if(sky) sky->tinf = NULL, sky->flags |= POLY_INTENSE; + } + } } } diff --git a/hyper.h b/hyper.h index e542d813..da97d0c6 100644 --- a/hyper.h +++ b/hyper.h @@ -4254,7 +4254,9 @@ void set_blizzard_frame(cell *c, int frameid); #define SIDE_LTOB 6 #define SIDE_BTOI 7 #define SIDE_SKY 8 -#define SIDEPARS 9 +#define SIDE_HIGH 9 +#define SIDE_HIGH2 10 +#define SIDEPARS 11 #if CAP_SHAPES struct floorshape { diff --git a/polygons.cpp b/polygons.cpp index 5b38e2ba..f3ad89da 100644 --- a/polygons.cpp +++ b/polygons.cpp @@ -2060,6 +2060,8 @@ void make_sidewalls() { dfloor_table[SIDE_LAKE] = geom3::LAKE; dfloor_table[SIDE_LTOB] = geom3::BOTTOM; dfloor_table[SIDE_BTOI] = geom3::INFDEEP; + dfloor_table[SIDE_HIGH] = geom3::HIGH; + dfloor_table[SIDE_HIGH2] = geom3::HIGH2; dfloor_table[SIDE_SKY ] = geom3::SKY; // sidewall parameters for the 3D mode @@ -2070,6 +2072,8 @@ void make_sidewalls() { else if(k==SIDE_LTOB) dlow = geom3::BOTTOM, dhi = geom3::LAKE; else if(k==SIDE_BTOI) dlow = geom3::INFDEEP, dhi = geom3::BOTTOM; else if(k==SIDE_WTS3) dlow = geom3::SLEV[3], dhi = geom3::WALL; + else if(k==SIDE_HIGH) dlow = geom3::WALL, dhi = geom3::HIGH; + else if(k==SIDE_HIGH2) dlow = geom3::HIGH, dhi = geom3::HIGH2; else if(k==SIDE_SKY) dlow = geom3::WALL, dhi = geom3::LOWSKY; else dlow = geom3::SLEV[k-SIDE_SLEV], dhi = geom3::SLEV[k-SIDE_SLEV+1]; dlow_table[k] = dlow;