1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-09-06 12:27:57 +00:00

new Crossroads variant: thematic crossroads

This commit is contained in:
Zeno Rogue
2025-07-07 14:00:11 +02:00
parent 0ec3e396d9
commit 0381dc8c84
12 changed files with 211 additions and 9 deletions

View File

@@ -53,7 +53,7 @@ EX int landMultiplier(eLand l) {
}
EX bool isCrossroads(eLand l) {
return among(l, laCrossroads, laCrossroads2, laCrossroads3, laCrossroads4, laCrossroads5, laCrossroads6, laMasterCrossroads);
return among(l, laCrossroads, laCrossroads2, laCrossroads3, laCrossroads4, laCrossroads5, laCrossroads6, laMasterCrossroads) || isThematic(l);
}
EX bool isCrossroadsNM(eLand l) {
@@ -61,7 +61,7 @@ EX bool isCrossroadsNM(eLand l) {
}
EX bool bearsCamelot(eLand l) {
return isCrossroads(l) && !among(l, laCrossroads2, laCrossroads5, laMasterCrossroads);
return isCrossroads(l) && !among(l, laCrossroads2, laCrossroads5, laMasterCrossroads) && (l == laThematicUrban || !isThematic(l));
}
EX bool inmirror(const cellwalker& cw) {
@@ -338,6 +338,9 @@ EX bool voronoi_sea_incompatible(eLand l1, eLand l2) {
EX bool incompatible1(eLand l1, eLand l2) {
if(l1 == laMasterCrossroads && !isCrossroads(l2)) return true;
if(isThematic(l1) && which_thematic(l2) != l1) return true;
if(isCrossroadsNM(l1) && isCrossroadsNM(l2)) return true;
if(l1 == laJungle && l2 == laMotion) return true;
if(l1 == laMirrorOld && l2 == laMotion) return true;
@@ -358,6 +361,7 @@ EX bool incompatible1(eLand l1, eLand l2) {
if(l1 == laWarpSea && l2 == laKraken) return true;
if(l1 == laPrairie && l2 == laCrossroads3) return true;
if(l1 == laPrairie && l2 == laCrossroads4) return true;
if(l1 == laPrairie && l2 == laCrossroads6) return true;
if(l1 == laWet && l2 == laDesert) return true;
if(l1 == laFrog && l2 == laMotion) return true;
if(l1 == laBull && l2 == laTerracotta) return true;
@@ -459,6 +463,14 @@ EX bool all_unlocked = false;
EX vector<eLand> cheatdest_list;
EX eLand getNewThematic(eLand l) {
for(int it=0; it<100; it++) {
eLand l1 = pick(laThematicNature, laThematicUrban, laThematicDeath, laThematicAbstract, laThematicHeat, laThematicWater, laThematicEarth);
if(l1 != l) return l1;
}
return l;
}
EX eLand getNewLand(eLand old) {
#if CAP_LEGACY
@@ -571,7 +583,8 @@ EX eLand getNewLand(eLand old) {
laDeadCaves, laRedRock, laVariant, laHell, laCocytus, laPower,
laBull, laTerracotta, laRose, laGraveyard, laHive, laDragon, laTrollheim,
laWet, laFrog, laEclectic, laCursed, laDice,
laCrossroads5, laCrossroads6, laMasterCrossroads
laCrossroads5, laCrossroads6, laMasterCrossroads,
laThematicNature, laThematicUrban, laThematicDeath, laThematicAbstract, laThematicHeat, laThematicWater, laThematicEarth
})
if(landUnlocked(l)) tab[cnt++] = l;
@@ -742,11 +755,132 @@ EX vector<eLand> land_over = {
laPrairie, laBull, laTerracotta, laRose,
laElementalWall, laTrollheim,
laHell, laCrossroads3, laCocytus, laPower, laCrossroads4,
laCrossroads5, laCrossroads6, laMasterCrossroads,
laCrossroads5, laCrossroads6, laMasterCrossroads, laThematic,
// EXTRA
laWildWest, laHalloween, laDual, laSnakeNest, laMagnetic, laCA, laAsteroids
};
EX bool isThematic(eLand l) {
return among(l, laThematic, laThematicNature, laThematicUrban, laThematicDeath, laThematicAbstract, laThematicHeat, laThematicWater, laThematicEarth);
}
EX eLand which_thematic(eLand l) {
// note: even if some lands are not directly accessible from Thematic, they still affect orb generation in it
switch(l) {
case laJungle:
case laEndorian:
case laWineyard:
case laOvergrown:
case laFrog:
case laRose:
case laDryForest:
case laPrairie:
case laBull:
case laMountain: // not via crossroads
case laClearing: // not via crossroads
case laTortoise: // not via crossroads
return laThematicNature;
case laAlchemist:
case laMotion:
case laMirror:
case laMirrorOld:
case laMinefield:
case laSwitch:
case laReptile:
case laZebra:
case laDice:
case laWestWall:
case laHalloween: // not standard
case laDual: // not standard
return laThematicAbstract;
case laIvoryTower:
case laPalace:
case laDungeon:
case laRuins:
case laEclectic:
case laRlyeh:
case laVariant:
case laCamelot: // in
case laTemple: // not via crossroads
case laPrincessQuest: // not via crossroads
case laWildWest: // not standard
return laThematicUrban;
case laHunting:
case laGraveyard:
case laBurial:
case laCursed:
case laDeadCaves:
case laTerracotta:
case laHive:
case laHaunted: case laHauntedWall: case laHauntedBorder: // not via crossroads
return laThematicDeath;
case laIce:
case laVolcano:
case laDragon:
case laHell:
case laCocytus:
case laPower:
case laBlizzard:
case laEFire:
return laThematicHeat;
case laNone:
case laBarrier:
case laOceanWall:
case laCA:
case laCanvas:
case laElementalWall:
case laMercuryRiver:
case laMirrorWall:
case laMirrorWall2:
case laMirrored:
case laMirrored2:
case laMemory:
case landtypes:
return laNone;
case laCrossroads:
case laCrossroads2:
case laCrossroads3:
case laCrossroads4:
case laCrossroads5:
case laCrossroads6:
case laMasterCrossroads:
case laThematic:
case laThematicAbstract:
case laThematicNature:
case laThematicUrban:
case laThematicDeath:
case laThematicHeat:
case laThematicWater:
case laThematicEarth:
case laMagnetic:
case laAsteroids:
return laThematic;
case laOcean:
case laDocks:
case laWet:
case laWarpCoast: case laWarpSea:
case laLivefjord:
case laKraken: // not direct
case laCaribbean: // not direct
case laBrownian: // not direct
case laWhirlpool: // not direct
case laEWater:
return laThematicWater;
case laRedRock:
case laDesert:
case laCaves:
case laStorms:
case laWhirlwind:
case laEmerald:
case laEEarth:
case laEAir:
case laTrollheim:
case laSnakeNest: // not standard
return laThematicEarth;
}
return laThematic;
}
EX vector<eLand> landlist;
#if HDR