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

Orb of Stone over water produces bridges now. You can use Orb of Matter over temporary bridge again to create a wall. Fixed some ways of producing permanent land in the Whirlpool.

This commit is contained in:
Zeno Rogue 2017-09-03 12:01:31 +02:00
parent 606bcf23bd
commit 3e0e789434
7 changed files with 124 additions and 109 deletions

View File

@ -1221,7 +1221,7 @@ enum eItem { itNone, itDiamond, itGold, itSpice, itRuby, itElixir, itShard, itBo
// --- wall types ---
const int walltypes = 98;
const int walltypes = 100;
struct walltype {
char glyph;
@ -1402,6 +1402,8 @@ walltype winf[walltypes] = {
{ '.', 0xFFFF00, "Reptile bridge", reptiledesc},
{ '.', 0xFFFF00, "invisible floor", NODESCYET},
{ '#', 0xC0C0FF, "mirror wall", mirroreddesc},
{ '.', 0xE0E0E0, "stepping stones", "A petrified creature."},
{ '#', 0x309060, "temporary wall", twdesc},
};
enum eWall { waNone, waIcewall, waBarrier, waFloorA, waFloorB, waCavewall, waCavefloor, waDeadTroll, waDune,
@ -1431,7 +1433,9 @@ enum eWall { waNone, waIcewall, waBarrier, waFloorA, waFloorB, waCavewall, waCav
waBigBush, waSmallBush,
waReptile, waReptileBridge,
waInvisibleFloor,
waMirrorWall
waMirrorWall,
waPetrifiedBridge,
waTempBridgeBlocked
};
// --- land types ---

View File

@ -1052,7 +1052,7 @@ namespace mirror {
c->wall == waGiantRug || c->wall == waCIsland || c->wall == waCIsland2 ||
c->wall == waGargoyleFloor || c->wall == waRubble ||
c->wall == waGargoyleBridge || c->wall == waTempFloor || c->wall == waTempBridge ||
c->wall == waMirrorWall;
c->wall == waMirrorWall || c->wall == waPetrifiedBridge;
}
void destroyKilled() {
@ -1999,48 +1999,49 @@ void livecaves() {
c->aitmp = 0;
if(c->monst == moDarkTroll) c->monst = moTroll;
if(c->item || c->monst || c->cpdist == 0) continue;
for(int j=0; j<c->type; j++) if(c->mov[j]) {
if(c->mov[j]->wall == waDeadfloor) c->aitmp++, bringlife.push_back(c->mov[j]);
else if(c->mov[j]->wall == waDeadwall || (c->mov[j]->wall == waDeadfloor2 && !c->mov[j]->monst))
c->aitmp--, bringlife.push_back(c->mov[j]);
else if(c->mov[j]->wall == waCavefloor) c->aitmp++;
else if(c->mov[j]->wall == waCavewall) c->aitmp--;
else if(c->mov[j]->wall == waRubble) c->aitmp--;
else if(c->mov[j]->wall == waGargoyle) c->aitmp--;
else if(c->mov[j]->wall == waGargoyleFloor) c->aitmp--;
else if(c->mov[j]->wall == waGargoyleBridge) c->aitmp--;
else if(c->mov[j]->wall == waDeadTroll) c->aitmp -= 5;
else if(c->mov[j]->wall == waDeadTroll2) c->aitmp -= 3;
else if(c->mov[j]->wall == waPetrified) c->aitmp -= 2;
else if(c->mov[j]->wall == waVinePlant) c->aitmp--;
else if(chaosmode && c->mov[j]->land != laCaves && c->mov[j]->land != laEmerald) ;
else if(c->mov[j]->land == laTrollheim) ; // trollheim floor does not count
else if(c->mov[j]->wall != waBarrier) c->aitmp += 5;
forCellEx(c2, c) {
eWall w = c2->wall;
if(w == waDeadfloor) c->aitmp++, bringlife.push_back(c2);
else if(w == waDeadwall || (w == waDeadfloor2 && !c2->monst))
c->aitmp--, bringlife.push_back(c2);
else if(w == waCavefloor) c->aitmp++;
else if(w == waCavewall) c->aitmp--;
else if(w == waRubble) c->aitmp--;
else if(w == waGargoyle) c->aitmp--;
else if(w == waGargoyleFloor) c->aitmp--;
else if(w == waGargoyleBridge) c->aitmp--;
else if(w == waDeadTroll) c->aitmp -= 5;
else if(w == waDeadTroll2) c->aitmp -= 3;
else if(w == waPetrified || w == waPetrifiedBridge) c->aitmp -= 2;
else if(w == waVinePlant) c->aitmp--;
else if(chaosmode && c2->land != laCaves && c2->land != laEmerald) ;
else if(c2->land == laTrollheim) ; // trollheim floor does not count
else if(w != waBarrier) c->aitmp += 5;
if(sword::at(c)) c->aitmp += 500;
if(c->mov[j]->cpdist == 0 && markOrb(itOrbDigging)) c->aitmp+=100;
if(items[itOrbEmpathy] && isFriendly(c->mov[j]) && markEmpathy(itOrbDigging))
if(c2->cpdist == 0 && markOrb(itOrbDigging)) c->aitmp+=100;
if(items[itOrbEmpathy] && isFriendly(c2) && markEmpathy(itOrbDigging))
c->aitmp+=100;
if(c->mov[j]->wall == waThumperOn) c->aitmp+=100;
if(c->mov[j]->wall == waFire) c->aitmp+=100;
if(c->mov[j]->wall == waBigStatue) c->aitmp-=100;
if(c->mov[j]->item && !peace::on) c->aitmp+=2;
if(c->mov[j]->monst == moZombie) c->aitmp += 10;
if(c->mov[j]->monst == moGhost) c->aitmp += 10;
if(c->mov[j]->monst == moTentacleGhost) c->aitmp += 10;
if(c->mov[j]->monst == moFriendlyGhost) c->aitmp += 10;
if(c->mov[j]->monst == moSkeleton) c->aitmp ++;
if(c->mov[j]->monst == moGargoyle) c->aitmp--;
if(c->mov[j]->monst == moDraugr) c->aitmp--;
if(isDragon(c->mov[j]->monst)) c->aitmp++;
if(c->mov[j]->monst == moNecromancer) c->aitmp += 10;
if(c->mov[j]->monst == moWormtail) c->aitmp++;
if(c->mov[j]->monst == moTentacletail) c->aitmp-=2;
if(isIvy(c->mov[j])) c->aitmp--;
if(isDemon(c->mov[j])) c->aitmp-=3;
// if(c->mov[j]->monst) c->tmp++;
// if(c->mov[j]->monst == moTroll) c->tmp -= 3;
if(w == waThumperOn) c->aitmp+=100;
if(w == waFire) c->aitmp+=100;
if(w == waBigStatue) c->aitmp-=100;
if(c2->item && !peace::on) c->aitmp+=2;
if(c2->monst == moZombie) c->aitmp += 10;
if(c2->monst == moGhost) c->aitmp += 10;
if(c2->monst == moTentacleGhost) c->aitmp += 10;
if(c2->monst == moFriendlyGhost) c->aitmp += 10;
if(c2->monst == moSkeleton) c->aitmp ++;
if(c2->monst == moGargoyle) c->aitmp--;
if(c2->monst == moDraugr) c->aitmp--;
if(isDragon(c2->monst)) c->aitmp++;
if(c2->monst == moNecromancer) c->aitmp += 10;
if(c2->monst == moWormtail) c->aitmp++;
if(c2->monst == moTentacletail) c->aitmp-=2;
if(isIvy(c2)) c->aitmp--;
if(isDemon(c2)) c->aitmp-=3;
// if(c2->monst) c->tmp++;
// if(c2->monst == moTroll) c->tmp -= 3;
}
}
else if(c->land == laLivefjord) {
@ -2057,11 +2058,11 @@ void livecaves() {
cell *c2 = c->mov[j];
if(c2->wall == waNone || c2->wall == waStrandedBoat)
c->aitmp -= (c2->land == laLivefjord ? 1 : 100);
if(c2->wall == waTempFloor || c2->wall == waTempBridge)
if(c2->wall == waTempFloor || c2->wall == waTempBridge || c2->wall == waTempBridgeBlocked)
;
else if(c2->wall == waDeadTroll || c2->wall == waDeadTroll2 || c2->wall == waThumperOn || isFire(c2) || snakelevel(c2))
c->aitmp -= 10;
else if(c2->wall == waPetrified)
else if(c2->wall == waPetrified || c2->wall == waPetrifiedBridge)
c->aitmp -= 10;
if(c2->wall == waBigStatue)
c->aitmp -= 10;

View File

@ -62,7 +62,8 @@ bool isActivable(cell *c) {
bool hasTimeout(cell *c) {
return c->wall == waThumperOn || c->wall == waFire || c->wall == waPartialFire ||
c->wall == waTempWall || c->wall == waTempFloor || c->wall == waTempBridge;
c->wall == waTempWall || c->wall == waTempFloor || c->wall == waTempBridge ||
c->wall == waTempBridgeBlocked;
}
bool isMimic(eMonster m) {
@ -294,7 +295,8 @@ bool realred(eWall w) {
int snakelevel(eWall w) {
if(w == waRed1 || w == waDeadfloor2 || w == waRubble || w == waGargoyleFloor ||
w == waGargoyleBridge || w == waTempFloor || w == waTempBridge || w == waRoundTable)
w == waGargoyleBridge || w == waTempFloor || w == waTempBridge || w == waRoundTable ||
w == waPetrifiedBridge)
return 1;
if(w == waRed2) return 2;
if(w == waRed3) return 3;
@ -309,7 +311,7 @@ bool isWall(cell *w) {
w->wall == waCavefloor || w->wall == waFrozenLake || w->wall == waVineHalfA ||
w->wall == waVineHalfB || w->wall == waDeadfloor || w->wall == waDeadfloor2 ||
w->wall == waRubble || w->wall == waGargoyleFloor || w->wall == waGargoyleBridge ||
w->wall == waTempFloor || w->wall == waTempBridge ||
w->wall == waTempFloor || w->wall == waTempBridge || w->wall == waPetrifiedBridge ||
w->wall == waBoat || w->wall == waCIsland || w->wall == waCIsland2 ||
w->wall == waRed1 || w->wall == waRed2 || w->wall == waRed3 ||
w->wall == waMineUnknown || w->wall == waMineMine || w->wall == waMineOpen ||

114
game.cpp
View File

@ -814,7 +814,7 @@ void useup(cell *c) {
drawParticles(c, c->wall == waFire ? 0xC00000 : winf[c->wall].color, 10, 50);
if(c->wall == waTempFloor)
c->wall = waChasm;
else if(c->wall == waTempBridge)
else if(c->wall == waTempBridge || c->wall == waTempBridgeBlocked)
placeWater(c, c);
else
c->wall = c->land == laCaribbean ? waCIsland2 : waNone;
@ -1278,10 +1278,41 @@ int monstersnear(cell *c, cell *nocount, eMonster who, cell *pushto, cell *comef
stalemate::moves.pop_back();
return b;
}
void petrify(cell *c, eWall walltype, eMonster m) {
destroyHalfvine(c);
playSound(c, "die-troll");
if(isWateryOrBoat(c) && c->land == laWhirlpool) {
c->wall = waSea;
return;
}
if(walltype == waGargoyle && cellUnstableOrChasm(c))
walltype = waGargoyleFloor;
else if(walltype == waGargoyle && isWatery(c))
walltype = waGargoyleBridge;
else if(walltype == waPetrified && isWatery(c))
walltype = waPetrifiedBridge;
else if((c->wall == waTempBridge || c->wall == waTempBridgeBlocked) && c->land == laWhirlpool) {
c->wall = waTempBridgeBlocked;
return;
}
else if(!doesnotFall(c)) {
fallingFloorAnimation(c, walltype, m);
return;
}
if(isReptile(c->wall)) kills[moReptile]++;
destroyHalfvine(c);
c->wall = walltype;
c->wparam = m;
c->item = itNone;
}
void killIvy(cell *c, eMonster who) {
if(c->monst == moIvyDead) return;
if(checkOrb(who, itOrbStone)) c->wall = waPetrified, c->wparam = c->monst;
if(checkOrb(who, itOrbStone)) petrify(c, waPetrified, c->monst);
c->monst = moIvyDead; // NEWYEARFIX
for(int i=0; i<c->type; i++) if(c->mov[i])
if(isIvy(c->mov[i]) && c->mov[i]->mondir == c->spn(i))
@ -1307,6 +1338,8 @@ void prespill(cell* c, eWall t, int rad, cell *from) {
c->wall = waPalace;
return;
}
// no slime in Whirlpool
if(c->land == laWhirlpool) return;
// these walls block spilling completely
if(c->wall == waIcewall || c->wall == waBarrier || c->wall == waWarpGate ||
c->wall == waDeadTroll || c->wall == waDeadTroll2 ||
@ -1318,7 +1351,7 @@ void prespill(cell* c, eWall t, int rad, cell *from) {
c->wall == waTower ||
c->wall == waPalace ||
c->wall == waPlatform || c->wall == waStone || c->wall == waTempWall ||
c->wall == waTempFloor || c->wall == waTempBridge ||
c->wall == waTempFloor || c->wall == waTempBridge || c->wall == waPetrifiedBridge || c->wall == waTempBridgeBlocked ||
c->wall == waSandstone || c->wall == waCharged || c->wall == waGrounded ||
c->wall == waMetal || c->wall == waSaloon || c->wall == waFan ||
c->wall == waBarrowDig || c->wall == waBarrowWall ||
@ -1331,7 +1364,7 @@ void prespill(cell* c, eWall t, int rad, cell *from) {
c->wall == waVinePlant || isFire(c) || c->wall == waBonfireOff || c->wall == waVineHalfA || c->wall == waVineHalfB ||
c->wall == waCamelotMoat || c->wall == waSea || c->wall == waCTree ||
c->wall == waRubble || c->wall == waGargoyleFloor || c->wall == waGargoyle ||
c->wall == waRose || c->wall == waPetrified)
c->wall == waRose || c->wall == waPetrified || c->wall == waPetrifiedBridge)
t = waTemporary;
if(c->wall == waSulphur) {
@ -1484,7 +1517,8 @@ bool snakepile(cell *c, eMonster m) {
c->wall = waDeadwall;
}
else if(c->wall == waRubble || c->wall == waGargoyleFloor || c->wall == waGargoyleBridge ||
c->wall == waTempFloor || c->wall == waTempBridge) {
c->wall == waTempFloor || c->wall == waTempBridge || c->wall == waPetrifiedBridge) {
if(c->land == laWhirlpool) return false;
c->wall = waRed2;
if(m == moDarkTroll) c->wall = waDeadwall;
}
@ -1576,6 +1610,9 @@ void explodeMine(cell *c) {
c2->wall = waNone;
makeflame(c2, 10, false);
}
else if(c2->wall == waPetrifiedBridge || c2->wall == waGargoyleBridge) {
placeWater(c, c);
}
else if(c2->wall == waPalace || c2->wall == waOpenGate || c2->wall == waClosedGate ||
c2->wall == waSandstone || c2->wall == waMetal || c2->wall == waSaloon) {
c2->wall = waNone;
@ -1654,7 +1691,8 @@ void minerEffect(cell *c) {
else if(isReptile(c->wall))
c->wparam = 1; // wake up next turn
else if(c->wall == waTempFloor) c->wall = waChasm;
else if(c->wall == waTempBridge) placeWater(c, NULL);
else if(c->wall == waTempBridge || c->wall == waPetrifiedBridge || c->wall == waTempBridgeBlocked)
placeWater(c, NULL);
else if(doesFall(c))
ow = waNone;
else
@ -1667,7 +1705,7 @@ bool isRatling(eMonster m) {
}
void killMutantIvy(cell *c, eMonster who) {
if(checkOrb(who, itOrbStone)) c->wall = waPetrified, c->wparam = moMutant;
if(checkOrb(who, itOrbStone)) petrify(c, waPetrified, moMutant);
removeIvy(c);
for(int i=0; i<c->type; i++)
if(c->mov[i]->mondir == c->spn(i) && (isMutantIvy(c->mov[i]) || c->mov[i]->monst == moFriendlyIvy))
@ -1776,27 +1814,11 @@ void killMonster(cell *c, eMonster who, flagtype deathflags) {
}
}
if(connected) {
pcount = 0;
playSound(c, "die-troll");
destroyHalfvine(c);
if(cellUnstableOrChasm(c)) c->wall = waGargoyleFloor;
else if(isWatery(c)) c->wall = waGargoyleBridge;
else c->wall = waGargoyle;
c->item = itNone;
}
if(connected) petrify(c, waGargoyle, m), pcount = 0;
}
if(m == moTroll) {
destroyHalfvine(c);
if(doesnotFall(c)) {
pcount = 0;
playSound(c, "die-troll");
if(isReptile(c->wall)) kills[moReptile]++;
c->wall = waDeadTroll;
}
else fallingFloorAnimation(c, waDeadTroll, m), pcount = 0;
c->item = itNone;
petrify(c, waDeadTroll, m); pcount = 0;
for(int i=0; i<c->type; i++) if(c->mov[i]) {
c->mov[i]->item = itNone;
if(c->mov[i]->wall == waDeadwall || c->mov[i]->wall == waDeadfloor2) c->mov[i]->wall = waCavewall;
@ -1804,16 +1826,7 @@ void killMonster(cell *c, eMonster who, flagtype deathflags) {
}
}
if(m == moFjordTroll || m == moForestTroll || m == moStormTroll) {
destroyHalfvine(c);
if(doesnotFall(c)) {
if(isReptile(c->wall)) kills[moReptile]++;
c->wall = waDeadTroll2;
pcount = 0;
playSound(c, "die-troll");
}
else fallingFloorAnimation(c, waDeadTroll2, m), pcount = 0;
c->wparam = m;
c->item = itNone;
petrify(c, waDeadTroll2, m);
}
if(m == moMiner) {
pcount = 32;
@ -1847,17 +1860,8 @@ void killMonster(cell *c, eMonster who, flagtype deathflags) {
if(m == moPrincess) {
playSound(c, princessgender() ? "die-princess" : "die-prince");
}
if(m == moVineBeast) {
destroyHalfvine(c);
if(doesnotFall(c)) {
if(isReptile(c->wall)) kills[moReptile]++;
c->wall = waVinePlant;
pcount = 0;
playSound(c, "die-vinebeast");
}
else fallingFloorAnimation(c, waVinePlant, m), pcount = 0;
c->item = itNone;
}
if(m == moVineBeast)
petrify(c, waVinePlant, m), pcount = 0;
if(isBird(m)) moveEffect(c, c, moDeadBird);
if(m == moBomberbird || m == moTameBomberbird) {
pcount = 0;
@ -1869,7 +1873,7 @@ void killMonster(cell *c, eMonster who, flagtype deathflags) {
c->wall == waStrandedBoat || c->wall == waRed1 || c->wall == waGiantRug) {
c->wall = waMineMine;
if(c->item) explodeMine(c);
else if(c->land == laMinefield) c->landparam |= 1;
else if(c->land == laMinefield) c->landparam = 1;
}
else if(c->wall == waFrozenLake)
c->wall = waLake;
@ -1918,18 +1922,8 @@ void killMonster(cell *c, eMonster who, flagtype deathflags) {
if(isFire(c) && itemBurns(c->item))
c->item = itNone;
}
if(checkOrb(who, itOrbStone)) {
destroyHalfvine(c);
if(doesnotFall(c)) {
if(isReptile(c->wall)) kills[moReptile]++;
c->wall = waPetrified;
pcount = 0;
playSound(c, "die-troll");
}
else fallingFloorAnimation(c, waPetrified, m), pcount = 0;
c->wparam = m;
c->item = itNone;
}
if(checkOrb(who, itOrbStone))
petrify(c, waPetrified, m), pcount = 0;
if(m == moFireFairy) {
drawFireParticles(c, 16); pcount = 0;
playSound(c, "die-fairy");
@ -3587,7 +3581,7 @@ void explodeAround(cell *c) {
if(c2->wall == waPetrified) c2->wall = waNone;
if(c2->wall == waDeadfloor2) c2->wall = waDeadfloor;
if(c2->wall == waGargoyleFloor) c2->wall = waChasm;
if(c2->wall == waGargoyleBridge) placeWater(c2, c2);
if(c2->wall == waGargoyleBridge || c2->wall == waPetrifiedBridge) placeWater(c2, c2);
if(c2->wall == waRubble) c2->wall = waNone;
if(c2->wall == waPlatform) c2->wall = waNone;
if(c2->wall == waStone) c2->wall = waNone;

View File

@ -2557,9 +2557,9 @@ void setcolors(cell *c, int& wcol, int &fcol) {
fcol = wcol;
}
if(c->wall == waDeadTroll2 || c->wall == waPetrified) {
if(c->wall == waDeadTroll2 || c->wall == waPetrified || c->wall == waPetrifiedBridge) {
eMonster m = eMonster(c->wparam);
if(c->wall == waPetrified)
if(c->wall == waPetrified || c->wall == waPetrifiedBridge)
wcol = gradient(wcol, minf[m].color, 0, .2, 1);
if(c->wall == waPetrified || isTroll(m)) if(!(m == moForestTroll && c->land == laOvergrown))
wcol = gradient(wcol, minf[m].color, 0, .4, 1);
@ -2845,6 +2845,7 @@ int shallow(cell *c) {
c->wall == waGargoyleBridge ||
c->wall == waTempFloor ||
c->wall == waTempBridge ||
c->wall == waPetrifiedBridge ||
c->wall == waFrozenLake)
return 5;
return 7;
@ -2983,6 +2984,12 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
// int col = 0xFFFFFF - 0x20 * c->maxdist - 0x2000 * c->cpdist;
if(!buggyGeneration && c->mpdist > 8 && !cheater) return; // not yet generated
/* if(!buggyGeneration && c->mpdist > 7 && !cheater) {
int cd = c->mpdist;
string label = its(cd);
int dc = distcolors[cd&7];
queuestr(V, (cd > 9 ? .6 : 1) * .2, label, 0xFF000000 + dc, 1);
} */
if(c->land == laNone && (cmode & sm::MAP)) {
queuepoly(V, shTriangle, 0xFF0000FF);

View File

@ -5886,3 +5886,5 @@ S(
N("Kraken", GEN_M, "Kraken", "Krakeny", "Krakena", "Krakenem")
N("Kraken Tentacle", GEN_F, "Macka Krakena", "Macki Krakena", "Mackę Krakena", "Macką Krakena")
S(" (killing increases treasure spawn)", " (pokonywanie zwiększa częstość skarbów)");
N("stepping stones", GEN_O, "Bród", "Brody", "Bród", "Brodem")

View File

@ -774,7 +774,8 @@ void summonAt(cell *dest) {
bool tempWallPossibleAt(cell *dest) {
if(dest->monst || (dest->item && !itemHidden(dest))) return false;
return dest->wall == waChasm || isWatery(dest) || dest->wall == waNone;
return dest->wall == waChasm || isWatery(dest) || dest->wall == waNone ||
dest->wall == waTempBridge;
}
void tempWallAt(cell *dest) {
@ -782,6 +783,10 @@ void tempWallAt(cell *dest) {
dest->wall = waTempFloor;
else if(dest->wall == waNone)
dest->wall = waTempWall;
else if(dest->wall == waTempBridge) {
dest->wall = waTempBridgeBlocked;
return;
}
else if(isWatery(dest))
dest->wall = waTempBridge;
int len = (items[itOrbMatter]+1) / 2;