1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2024-12-24 17:10:36 +00:00

nicer bridges over mercury

This commit is contained in:
Zeno Rogue 2017-10-17 12:54:59 +02:00
parent 60527aea29
commit 9dc49fa297
3 changed files with 93 additions and 28 deletions

103
graph.cpp
View File

@ -3031,6 +3031,53 @@ bool allemptynear(cell *c) {
static const int trapcol[4] = {0x904040, 0xA02020, 0xD00000, 0x303030};
static const int terracol[8] = {0xD000, 0xE25050, 0xD0D0D0, 0x606060, 0x303030, 0x181818, 0x0080, 0x8080};
// how much to darken
int getfd(cell *c) {
switch(c->land) {
case laRedRock:
case laReptile:
case laCanvas:
return 0;
case laTerracotta:
case laMercuryRiver:
return c->wall == waMercury ? 0 : 1;
case laKraken:
case laBurial:
case laIvoryTower:
case laDungeon:
case laMountain:
case laEndorian:
case laCaribbean:
case laWhirlwind:
case laRose:
case laWarpSea:
case laTortoise:
case laDragon:
case laHalloween:
case laHunting:
case laOcean:
case laLivefjord:
case laWhirlpool:
case laAlchemist:
case laIce:
case laGraveyard:
case laBlizzard:
case laRlyeh:
case laTemple:
case laWineyard:
case laDeadCaves:
case laPalace:
case laCA:
return 1;
case laTrollheim:
default:
return 2;
}
}
void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
qfi.shape = NULL; qfi.special = false;
@ -3304,32 +3351,7 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
chasmg = chasmgraph(c);
int fd =
c->land == laRedRock ? 0 :
(c->land == laOcean || c->land == laLivefjord || c->land == laWhirlpool) ? 1 :
c->land == laAlchemist || c->land == laIce || c->land == laGraveyard || c->land == laBlizzard ||
c->land == laRlyeh || c->land == laTemple || c->land == laWineyard ||
c->land == laDeadCaves || c->land == laPalace || c->land == laCA ? 1 :
c->land == laCanvas ? 0 :
c->land == laKraken ? 1 :
c->land == laBurial ? 1 :
c->land == laIvoryTower ? 1 :
c->land == laDungeon ? 1 :
c->land == laMountain ? 1 :
c->land == laEndorian ? 1 :
c->land == laCaribbean ? 1 :
c->land == laWhirlwind ? 1 :
c->land == laRose ? 1 :
c->land == laWarpSea ? 1 :
c->land == laTortoise ? 1 :
c->land == laDragon ? 1 :
c->land == laHalloween ? 1 :
c->land == laTrollheim ? 2 :
c->land == laReptile ? 0 :
c->land == laHunting ? 1 :
c->land == laTerracotta ? 1 :
c->land == laMercuryRiver ? 0 :
2;
int fd = getfd(c);
if(c->wall == waMagma) fd = 0;
@ -3726,9 +3748,36 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
else if(c->land == laRedRock)
qfloor(c, Vf, eoh ? shFloor[ct6] : shDesertFloor[ct6], darkena(fcol, fd, 0xFF));
else if(c->land == laPalace || c->land == laTerracotta || c->land == laMercuryRiver)
else if(c->land == laPalace || c->land == laTerracotta)
qfloor(c, Vf, (eoh?shFloor:shPalaceFloor)[ct6], darkena(fcol, fd, 0xFF));
else if(c->land == laMercuryRiver) {
if(eoh)
qfloor(c, Vf, shFloor[ct6], darkena(fcol, fd, 0xFF));
else {
int bridgedir = -1;
if(c->type == 6) {
for(int i=1; i<c->type; i+=2)
if(pseudohept(c->mov[(i+5)%6]) && c->mov[(i+5)%6]->land == laMercuryRiver)
if(pseudohept(c->mov[(i+1)%6]) && c->mov[(i+1)%6]->land == laMercuryRiver)
bridgedir = i;
}
if(bridgedir == -1)
qfloor(c, Vf, (eoh?shFloor:shPalaceFloor)[ct6], darkena(fcol, fd, 0xFF));
else {
transmatrix bspin = ddspin(c, bridgedir);
qfloor(c, Vf, bspin, shMercuryBridge[0], darkena(fcol, fd, 0xFF));
// only needed in one direction
if(c < c->mov[bridgedir]) {
bspin = Vf * bspin;
queuepoly(bspin, shMercuryBridge[1], darkena(fcol, fd+1, 0xFF));
queuepolyat(mscale(bspin, geom3::LAKE), shMercuryBridge[1], darkena(gradient(0, winf[waMercury].color, 0, 0.8,1), 0, 0x80), PPR_LAKELEV);
queuepolyat(mscale(bspin, geom3::BOTTOM), shMercuryBridge[1], darkena(0x202020, 0, 0xFF), PPR_LAKEBOTTOM);
}
}
}
}
else {
qfloor(c, Vf, shFloor[ct6], darkena(fcol, fd, 0xFF));
}

View File

@ -821,6 +821,13 @@ void giantLandSwitch(cell *c, int d, cell *from) {
c->landparam--;
}
}
if(d == 7) {
int nearriver = 0;
forCellEx(c2, c)
if(c2->wall == waMercury && pseudohept(c2))
nearriver++;
if(nearriver == 2) c->land = laMercuryRiver;
}
ONEMPTY {
bool nearwarrior = false;
forCellEx(c2, c) if(c2->wall == waTerraWarrior) nearwarrior = true;

View File

@ -642,6 +642,7 @@ hpcshape
shSemiFloor[2], shSemiBFloor[2], shSemiFloorShadow,
shDesertFloor[2], shRedRockFloor[3][2],
shPalaceFloor[2], shNewFloor[2], shTrollFloor[2],
shMercuryBridge[2],
shLeafFloor[2],
shBarrowFloor[3],
shTriheptaFloor[11], shTriheptaFloor2[2], shTriheptaEuc[3],
@ -1359,6 +1360,10 @@ void buildpolys() {
bshape(shTriheptaEucShadow[2], PPR_FLOOR, scalef*SHADMUL, 44);
bshape(shPalaceFloor[0], PPR_FLOOR, scalef*spzoom6, 45);
bshape(shPalaceFloor[1], PPR_FLOOR, scalef*spzoomd7, 46);
bshape(shMercuryBridge[0], PPR_FLOOR, scalef*spzoom6, 365);
bshape(shMercuryBridge[1], PPR_FLOOR, scalef*spzoomd7, 366);
bshape(shPalaceGate, PPR_STRUCT1, scalef, 47);
bshape(shSemiFeatherFloor[0], PPR_FLOOR, scalef*spzoom6, 48);
bshape(shSemiFeatherFloor[1], PPR_FLOOR, scalef*spzoom6, 49);
@ -2851,6 +2856,10 @@ NEWSHAPE, 362, 1, 1, -0.098710,-0.040954, -0.120861,-0.011561, -0.169793,0.00105
NEWSHAPE, 363, 1, 2, -0.252495,0.014545, -0.330447,0.029660, -0.319594,0.016402, -0.419249,0.040217, -0.457189,-0.013336,
NEWSHAPE, 364, 1, 2, -0.486619,0.002830, -0.418060,0.040577, -0.427473,0.022591, -0.408958,0.019603, -0.426031,0.010325, -0.407739,0.001037,
NEWSHAPE, 365, 1, 2, -0.236444,-0.000864, -0.300824,-0.142089, 0.027603,-0.331178, 0.117026,-0.205327,
NEWSHAPE, 366, 1, 2, 0.120242,0.202432, 0.476077,0.202192,
NEWSHAPE
};