1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-10-24 02:17:40 +00:00

new Crossroads variant: Crossroads VI (Cursed Crossroads)

This commit is contained in:
Zeno Rogue
2025-07-07 11:49:25 +02:00
parent fc63e540f0
commit 26d99c1423
7 changed files with 31 additions and 8 deletions

View File

@@ -623,6 +623,12 @@ EX void extendBarrier(cell *c) {
if(buildBarrier6(cw, c->barright, c->barleft)) return; if(buildBarrier6(cw, c->barright, c->barleft)) return;
} }
if(among(laCrossroads6, c->barleft, c->barright) && hrand(100) < 80) {
cellwalker cw(c, c->bardir);
cw = cw + wstep + 3 + wstep - 1;
if(buildBarrier6(cw, c->barright, c->barleft)) return;
}
if(barrier_cross(c->barleft, c->barright) || (firstmirror && hrand(100) < 60)) { if(barrier_cross(c->barleft, c->barright) || (firstmirror && hrand(100) < 60)) {
cellwalker cw(c, c->bardir); cellwalker cw(c, c->bardir);
@@ -839,7 +845,12 @@ EX bool buildBarrier6(cellwalker cw, eLand m0, eLand m1) {
setland((b[d+1]-2).cpeek(), m1); setland((b[d+1]-2).cpeek(), m1);
setland((b[d+1]+2).cpeek(), m0); setland((b[d+1]+2).cpeek(), m0);
} }
if(hrand(100) < curse_percentage) { int cp = curse_percentage;
if(m0 == laCrossroads6 || m1 == laCrossroads6) {
cp = 25;
if(m0 == laCursed || m1 == laCursed) cp = 100;
}
if(hrand(100) < cp) {
setland(cw.at, laCursed); setland(cw.at, laCursed);
cw.at->wall = waRubble; cw.at->wall = waRubble;
cw.at->monst = moHexer; cw.at->monst = moHexer;

View File

@@ -1564,6 +1564,7 @@ EX int wallchance(cell *c, bool deepOcean) {
l == laCrossroads2 ? 10000 : l == laCrossroads2 ? 10000 :
l == laCrossroads5 ? 10000 : l == laCrossroads5 ? 10000 :
l == laCrossroads4 ? 5000 : l == laCrossroads4 ? 5000 :
l == laCrossroads6 ? 5000 :
(l == laMirror && !yendor::generating) ? 2500 : (l == laMirror && !yendor::generating) ? 2500 :
tactic::on ? 0 : tactic::on ? 0 :
racing::on ? 0 : racing::on ? 0 :

View File

@@ -183,7 +183,7 @@ void celldrawer::setcolors() {
// floor colors for all the lands // floor colors for all the lands
else switch(c->land) { else switch(c->land) {
case laBurial: case laTrollheim: case laBarrier: case laOceanWall: case laBurial: case laTrollheim: case laBarrier: case laOceanWall:
case laCrossroads2: case laCrossroads3: case laCrossroads4: case laCrossroads5: case laCrossroads2: case laCrossroads3: case laCrossroads4: case laCrossroads5: case laCrossroads6:
case laRose: case laPower: case laWildWest: case laHalloween: case laRedRock: case laRose: case laPower: case laWildWest: case laHalloween: case laRedRock:
case laDragon: case laStorms: case laTerracotta: case laMercuryRiver: case laDragon: case laStorms: case laTerracotta: case laMercuryRiver:
case laDesert: case laKraken: case laDocks: case laDesert: case laKraken: case laDocks:

View File

@@ -1186,7 +1186,7 @@ LAND( 0xFFFF00, "Land of Power", laPower, ZERO, itPower, RESERVED,
LAND( 0xD0D0D0, "Camelot", laCamelot, ZERO | LF_CYCLIC, itHolyGrail, RESERVED, camelothelp ) LAND( 0xD0D0D0, "Camelot", laCamelot, ZERO | LF_CYCLIC, itHolyGrail, RESERVED, camelothelp )
NATIVE((m == moKnight || m == moHedge || m == moFlailer || m == moLancer) ? 1 : 0) NATIVE((m == moKnight || m == moHedge || m == moFlailer || m == moLancer) ? 1 : 0)
REQ(ITEMS(itEmerald, U5) ACCONLY3(laCrossroads, laCrossroads3, laCrossroads4)) REQ(ITEMS(itEmerald, U5) ACCONLY4(laCrossroads, laCrossroads3, laCrossroads4, laCrossroads6))
LAND( 0xD000D0, "Temple of Cthulhu", laTemple, ZERO | LF_CYCLIC, itGrimoire, RESERVED, templehelp ) LAND( 0xD000D0, "Temple of Cthulhu", laTemple, ZERO | LF_CYCLIC, itGrimoire, RESERVED, templehelp )
NATIVE((m == moTentacle || m == moCultist || m == moPyroCultist || m == moCultistLeader) ? 1 : 0) NATIVE((m == moTentacle || m == moCultist || m == moPyroCultist || m == moCultistLeader) ? 1 : 0)
@@ -1452,6 +1452,10 @@ LAND( 0xC000C0, "Crossroads V", laCrossroads5, ZERO, itHyperstone, RESERVED, "Ex
NATIVE(0) NATIVE(0)
REQ(GOLD(R300)) REQ(GOLD(R300))
LAND( 0x7030A0, "Crossroads VI", laCrossroads6, ZERO, itHyperstone, RESERVED, "A cursed Crossroads layout.\n")
NATIVE(0)
REQ(ITEMS(itCursed, 5))
LAND( 0xC0C0C0, "Cellular Automaton", laCA, ZERO | LF_TECHNICAL, itNone, RESERVED, cadesc) LAND( 0xC0C0C0, "Cellular Automaton", laCA, ZERO | LF_TECHNICAL, itNone, RESERVED, cadesc)
NATIVE(0) NATIVE(0)
REQ(ALWAYS) REQ(ALWAYS)
@@ -1796,6 +1800,8 @@ MONSTER( '*', 0, "vertex", moRogueviz, ZERO | CF_TECHNICAL, RESERVED, moN
#undef ACCONLY #undef ACCONLY
#undef ACCONLY2 #undef ACCONLY2
#undef ACCONLY3 #undef ACCONLY3
#undef ACCONLY4
#undef ACCONLY5
#undef ACCONLYF #undef ACCONLYF
#undef IFINGAME #undef IFINGAME
#undef INMODE #undef INMODE

View File

@@ -753,6 +753,8 @@ void add_reqs(eLand l, string& s) {
#define ACCONLY(z) s += XLAT("Accessible only from %the1.\n", z); #define ACCONLY(z) s += XLAT("Accessible only from %the1.\n", z);
#define ACCONLY2(z,x) s += XLAT("Accessible only from %the1 or %the2.\n", z, x); #define ACCONLY2(z,x) s += XLAT("Accessible only from %the1 or %the2.\n", z, x);
#define ACCONLY3(z,y,x) s += XLAT("Accessible only from %the1, %2, or %3.\n", z, y, x); #define ACCONLY3(z,y,x) s += XLAT("Accessible only from %the1, %2, or %3.\n", z, y, x);
#define ACCONLY4(z1,z2,z3,z4) s += XLAT("Accessible only from %the1, %2, %3, or %4.\n", z1, z2, z3, z4);
#define ACCONLY5(z1,z2,z3,z4,z5) s += XLAT("Accessible only from %the1, %2, %3, %4, or %5.\n", z1, z2, z3, z4, z5);
#define ACCONLYF(z) s += XLAT("Accessible only from %the1 (until finished).\n", z); #define ACCONLYF(z) s += XLAT("Accessible only from %the1 (until finished).\n", z);
#define IFINGAME(land, ok, fallback) if(isLandIngame(land)) { ok } else { s += XLAT("Alternative rule when %the1 is not in the game:\n", land); fallback } #define IFINGAME(land, ok, fallback) if(isLandIngame(land)) { ok } else { s += XLAT("Alternative rule when %the1 is not in the game:\n", land); fallback }
#include "content.cpp" #include "content.cpp"

View File

@@ -2519,6 +2519,7 @@ EX void giantLandSwitch(cell *c, int d, cell *from) {
case laCrossroads3: case laCrossroads3:
case laCrossroads4: case laCrossroads4:
case laCrossroads5: case laCrossroads5:
case laCrossroads6:
if(c->wall == waTower) c->land = laCamelot; if(c->wall == waTower) c->land = laCamelot;
ONEMPTY { ONEMPTY {
if(!BITRUNCATED && c->land == laCrossroads5 && hrand(100) < 60) if(!BITRUNCATED && c->land == laCrossroads5 && hrand(100) < 60)

View File

@@ -53,8 +53,7 @@ EX int landMultiplier(eLand l) {
} }
EX bool isCrossroads(eLand l) { EX bool isCrossroads(eLand l) {
return l == laCrossroads || l == laCrossroads2 || l == laCrossroads3 || return among(l, laCrossroads, laCrossroads2, laCrossroads3, laCrossroads4, laCrossroads5, laCrossroads6);
l == laCrossroads4 || l == laCrossroads5;
} }
EX bool bearsCamelot(eLand l) { EX bool bearsCamelot(eLand l) {
@@ -264,6 +263,8 @@ EX bool landUnlocked(eLand l) {
#define ACCONLY(x) #define ACCONLY(x)
#define ACCONLY2(x,y) #define ACCONLY2(x,y)
#define ACCONLY3(x,y,z) #define ACCONLY3(x,y,z)
#define ACCONLY4(a,b,c,d)
#define ACCONLY5(a,b,c,d,e)
#define ACCONLYF(x) #define ACCONLYF(x)
#define IFINGAME(land, ok, fallback) if(isLandIngame(land)) { ok } else { fallback } #define IFINGAME(land, ok, fallback) if(isLandIngame(land)) { ok } else { fallback }
#define INMODE(x) if(x) return true; #define INMODE(x) if(x) return true;
@@ -565,7 +566,7 @@ EX eLand getNewLand(eLand old) {
laDeadCaves, laRedRock, laVariant, laHell, laCocytus, laPower, laDeadCaves, laRedRock, laVariant, laHell, laCocytus, laPower,
laBull, laTerracotta, laRose, laGraveyard, laHive, laDragon, laTrollheim, laBull, laTerracotta, laRose, laGraveyard, laHive, laDragon, laTrollheim,
laWet, laFrog, laEclectic, laCursed, laDice, laWet, laFrog, laEclectic, laCursed, laDice,
laCrossroads5, laCrossroads5, laCrossroads6
}) })
if(landUnlocked(l)) tab[cnt++] = l; if(landUnlocked(l)) tab[cnt++] = l;
@@ -588,6 +589,7 @@ EX eLand getNewLand(eLand old) {
{laDesert, laRedRock, 5, 5}, {laDesert, laRedRock, 5, 5},
{laFrog, laReptile, 2, 2}, {laFrog, laSwitch, 2, 2}, {laFrog, laZebra, 2, 2}, {laFrog, laReptile, 2, 2}, {laFrog, laSwitch, 2, 2}, {laFrog, laZebra, 2, 2},
{laEclectic, laStorms, 3, 3}, {laEclectic, laIce, 3, 3}, {laEclectic, laPalace, 3, 3}, {laEclectic, laDeadCaves, 3, 3}, {laEclectic, laStorms, 3, 3}, {laEclectic, laIce, 3, 3}, {laEclectic, laPalace, 3, 3}, {laEclectic, laDeadCaves, 3, 3},
{laCursed, laCrossroads6, 1, 1},
{laEFire, laDragon, 5, 5}, {laEWater, laLivefjord, 5, 5}, {laEEarth, laDeadCaves, 5, 5}, {laEAir, laWhirlwind, 5, 5}, {laEFire, laDragon, 5, 5}, {laEWater, laLivefjord, 5, 5}, {laEEarth, laDeadCaves, 5, 5}, {laEAir, laWhirlwind, 5, 5},
}) { }) {
@@ -735,7 +737,7 @@ EX vector<eLand> land_over = {
laPrairie, laBull, laTerracotta, laRose, laPrairie, laBull, laTerracotta, laRose,
laElementalWall, laTrollheim, laElementalWall, laTrollheim,
laHell, laCrossroads3, laCocytus, laPower, laCrossroads4, laHell, laCrossroads3, laCocytus, laPower, laCrossroads4,
laCrossroads5, laCrossroads5, laCrossroads6,
// EXTRA // EXTRA
laWildWest, laHalloween, laDual, laSnakeNest, laMagnetic, laCA, laAsteroids laWildWest, laHalloween, laDual, laSnakeNest, laMagnetic, laCA, laAsteroids
}; };