1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-01-26 00:47:00 +00:00

refactored native and landUnlocked into content.cpp

This commit is contained in:
Zeno Rogue 2019-04-11 21:33:17 +02:00
parent cffb895c72
commit f90e1001e3
8 changed files with 372 additions and 530 deletions

View File

@ -20,6 +20,15 @@
#define LAND(a,b,c,d,e,f,g) #define LAND(a,b,c,d,e,f,g)
#endif #endif
#ifndef NATIVE
#define NATIVE(x)
#endif
#ifndef REQ
#define REQ(x)
#define REQAS(x,y)
#endif
MONSTER( 0, 0, "no monster" , moNone, ZERO | CF_NOGHOST | CF_NOBLOW, RESERVED, moNone, NULL) MONSTER( 0, 0, "no monster" , moNone, ZERO | CF_NOGHOST | CF_NOBLOW, RESERVED, moNone, NULL)
MONSTER( 'Y', 0x4040FF, "Yeti" , moYeti, ZERO, RESERVED, moYeti, MONSTER( 'Y', 0x4040FF, "Yeti" , moYeti, ZERO, RESERVED, moYeti,
@ -1044,7 +1053,13 @@ WALL( '+', 0x804000, "trunk", waTrunk3, WF_WALL, RESERVED, 0, sgNone, "The skele
LAND( 0xFF00FF, "???" , laNone, ZERO | LF_TECHNICAL, itNone, RESERVED, "") LAND( 0xFF00FF, "???" , laNone, ZERO | LF_TECHNICAL, itNone, RESERVED, "")
NATIVE(0)
REQ(NEVER)
LAND( 0xC06000, "Great Wall" , laBarrier, ZERO | LF_TECHNICAL, itNone, RESERVED, "") LAND( 0xC06000, "Great Wall" , laBarrier, ZERO | LF_TECHNICAL, itNone, RESERVED, "")
NATIVE(0)
REQ(NEVER)
LAND( 0xFF0000, "Crossroads" , laCrossroads, ZERO, itHyperstone, RESERVED, LAND( 0xFF0000, "Crossroads" , laCrossroads, ZERO, itHyperstone, RESERVED,
"This land is a quick gateway to other lands. It is very easy to find other lands " "This land is a quick gateway to other lands. It is very easy to find other lands "
"from the Crossroads. Which means that you find monsters from most other lands here!\n\n" "from the Crossroads. Which means that you find monsters from most other lands here!\n\n"
@ -1054,51 +1069,104 @@ LAND( 0xFF0000, "Crossroads" , laCrossroads, ZERO, itHyperstone, RESERVED,
"A special treasure, Hyperstone, can be found on the Crossroads, but only " "A special treasure, Hyperstone, can be found on the Crossroads, but only "
"after you have found 10 of every other treasure." "after you have found 10 of every other treasure."
) )
NATIVE(0)
REQ(ALWAYS)
LAND( 0xCDA98F, "Desert", laDesert, ZERO, itSpice, RESERVED, LAND( 0xCDA98F, "Desert", laDesert, ZERO, itSpice, RESERVED,
"A hot land, full of sand dunes, mysterious Spice, and huge and dangerous sand worms." "A hot land, full of sand dunes, mysterious Spice, and huge and dangerous sand worms."
) )
NATIVE((m == moDesertman || m == moWorm) ? 2 : 0)
REQ(ALWAYS)
LAND( 0x8080FF, "Icy Land", laIce, ZERO | LF_ICY, itDiamond, RESERVED, LAND( 0x8080FF, "Icy Land", laIce, ZERO | LF_ICY, itDiamond, RESERVED,
"A very cold land, full of ice walls. Your mere presence will cause these ice walls to " "A very cold land, full of ice walls. Your mere presence will cause these ice walls to "
"melt, even if you don't want it." "melt, even if you don't want it."
) )
NATIVE((m == moWolf || m == moWolfMoved || m == moYeti) ? 2 : 0)
REQ(ALWAYS)
LAND( 0x306060, "Living Cave", laCaves, ZERO | LF_TROLL, itGold, RESERVED, cavehelp) LAND( 0x306060, "Living Cave", laCaves, ZERO | LF_TROLL, itGold, RESERVED, cavehelp)
NATIVE((m == moGoblin || m == moTroll) ? 2 : m == moSeep ? 1 : 0)
REQ(ALWAYS)
LAND( 0x00C000, "Jungle", laJungle, ZERO, itRuby, RESERVED, LAND( 0x00C000, "Jungle", laJungle, ZERO, itRuby, RESERVED,
"A land filled with huge ivy plants and dangerous animals." "A land filled with huge ivy plants and dangerous animals."
) )
NATIVE((m == moIvyRoot || m == moMonkey) ? 2 : (isIvy(m) || m == moEagle || m == moMonkey) ? 1 : 0)
REQ(ALWAYS)
LAND( 0x900090, "Alchemist Lab", laAlchemist, ZERO, itElixir, RESERVED, slimehelp) LAND( 0x900090, "Alchemist Lab", laAlchemist, ZERO, itElixir, RESERVED, slimehelp)
NATIVE((m == moSlime) ? 2 : 0)
REQ(ALWAYS)
LAND( 0x704070, "Hall of Mirrors", laMirror, ZERO | LF_MIRROR, itShard, RESERVED, LAND( 0x704070, "Hall of Mirrors", laMirror, ZERO | LF_MIRROR, itShard, RESERVED,
"A strange land filled with mirrors. " "A strange land filled with mirrors. "
"Break magic mirrors and mirage clouds to " "Break magic mirrors and mirage clouds to "
"gain treasures and helpful Mimics." "gain treasures and helpful Mimics."
) )
NATIVE((m == moMirrorSpirit || m == moNarciss || m == moMimic) ? 1 : 0)
REQ(GOLD(R30))
LAND( 0x404070, "Graveyard", laGraveyard, ZERO, itBone, RESERVED, LAND( 0x404070, "Graveyard", laGraveyard, ZERO, itBone, RESERVED,
"All the monsters you kill are carried to this strange land, and buried. " "All the monsters you kill are carried to this strange land, and buried. "
"Careless Rogues are also carried here..." "Careless Rogues are also carried here..."
) )
NATIVE((m == moZombie || m == moNecromancer) ? 2 : m == moGhost ? 1 : 0)
REQ(KILLS(R100))
LAND( 0x00FF00, "R'Lyeh", laRlyeh, ZERO, itStatue, RESERVED, LAND( 0x00FF00, "R'Lyeh", laRlyeh, ZERO, itStatue, RESERVED,
"An ancient sunken city which can be reached only when the stars are right.\n\n" "An ancient sunken city which can be reached only when the stars are right.\n\n"
"You can find Temples of Cthulhu in R'Lyeh once you collect five Statues of Cthulhu." "You can find Temples of Cthulhu in R'Lyeh once you collect five Statues of Cthulhu."
) )
NATIVE(
(m == moCultist || m == moTentacle || m == moPyroCultist) ? 2 :
(m == moCultistLeader || isIvy(m)) ? 1 : 0)
REQ(ACCONLYF(laOcean) GOLD(R60))
LAND( 0xC00000, "Hell", laHell, ZERO, itHell, RESERVED, LAND( 0xC00000, "Hell", laHell, ZERO, itHell, RESERVED,
"A land filled with demons and molten sulphur. Abandon all hope ye who enter here!" "A land filled with demons and molten sulphur. Abandon all hope ye who enter here!"
) )
NATIVE((m == moLesser || m == moGreater) ? 2 : 0)
REQ(NUMBER(orbsUnlocked(), 9, XLAT("Finished lands required: %1 (collect %2 treasure)\n", "9", its(R10))))
LAND( 0x00FF00, "Cocytus", laCocytus, ZERO | LF_ICY, itSapphire, RESERVED, LAND( 0x00FF00, "Cocytus", laCocytus, ZERO | LF_ICY, itSapphire, RESERVED,
cocytushelp cocytushelp
) )
NATIVE((m == moShark || m == moGreaterShark || m == moCrystalSage) ? 2 : m == moYeti ? 1 : 0)
REQ(ITEMS(itHell, U10) ITEMS(itDiamond, U10))
LAND( 0xFFFF00, "Land of Eternal Motion", laMotion, ZERO, itFeather, RESERVED, LAND( 0xFFFF00, "Land of Eternal Motion", laMotion, ZERO, itFeather, RESERVED,
"A land where you cannot stop, because every piece of floor is extremely unstable. Only monsters who " "A land where you cannot stop, because every piece of floor is extremely unstable. Only monsters who "
"can run forever are able to survive there, and only phoenix feathers are so light that they do not disturb " "can run forever are able to survive there, and only phoenix feathers are so light that they do not disturb "
"the floor.\n" "the floor.\n"
) )
NATIVE((m == moRunDog) ? 2 : 0)
REQ(ALWAYS)
LAND( 0x008000, "Dry Forest", laDryForest, ZERO, itFernFlower, RESERVED, foresthelp) LAND( 0x008000, "Dry Forest", laDryForest, ZERO, itFernFlower, RESERVED, foresthelp)
NATIVE((m == moHedge || m == moFireFairy) ? 2 : 0)
REQ(GOLD(R60))
LAND( 0x60C060, "Emerald Mine", laEmerald, ZERO, itEmerald, RESERVED, LAND( 0x60C060, "Emerald Mine", laEmerald, ZERO, itEmerald, RESERVED,
"Evil people are mining for emeralds in this living cave. " "Evil people are mining for emeralds in this living cave. "
"It does not grow naturally, but it is dug out in a regular " "It does not grow naturally, but it is dug out in a regular "
"pattern, which is optimal according to the evil engineers." "pattern, which is optimal according to the evil engineers."
) )
NATIVE((m == moFlailer || m == moLancer || m == moMiner) ? 2 : m == moHedge ? 1 : 0)
REQ( ORD(AKILL(moVizier, laPalace), ITEMS(itFernFlower, U5) ITEMS(itGold, U5)))
LAND( 0x421C52, "Vineyard", laWineyard, ZERO, itWine, RESERVED, vinehelp) LAND( 0x421C52, "Vineyard", laWineyard, ZERO, itWine, RESERVED, vinehelp)
NATIVE((m == moVineSpirit || m == moVineBeast) ? 2 : 0)
REQ(GOLD(R60))
LAND( 0x104040, "Dead Cave", laDeadCaves, ZERO | LF_TROLL, itSilver, RESERVED, deadcavehelp) LAND( 0x104040, "Dead Cave", laDeadCaves, ZERO | LF_TROLL, itSilver, RESERVED, deadcavehelp)
NATIVE((m == moEarthElemental || m == moDarkTroll) ? 2 : (m == moGoblin || m == moSeep) ? 1 : 0)
REQ(GOLD(R60) ITEMS(itGold, 10))
LAND( 0x705020, "Hive", laHive, ZERO, itRoyalJelly, RESERVED, hivehelp) LAND( 0x705020, "Hive", laHive, ZERO, itRoyalJelly, RESERVED, hivehelp)
NATIVE(isBug(m) ? 1 : 0)
REQ(KILLS(R100) GOLD(R60))
LAND( 0xFFFF00, "Land of Power", laPower, ZERO, itPower, RESERVED, LAND( 0xFFFF00, "Land of Power", laPower, ZERO, itPower, RESERVED,
"The Land of Power is filled with everburning fire, magical Orbs, and guarded by " "The Land of Power is filled with everburning fire, magical Orbs, and guarded by "
"witches and golems. There are basic orbs lying everywhere, and more prized ones " "witches and golems. There are basic orbs lying everywhere, and more prized ones "
@ -1109,27 +1177,58 @@ LAND( 0xFFFF00, "Land of Power", laPower, ZERO, itPower, RESERVED,
"Witches and Golems don't pursue you into other Lands. Also, most Orb powers " "Witches and Golems don't pursue you into other Lands. Also, most Orb powers "
"are drained when you leave the Land of Power." "are drained when you leave the Land of Power."
) )
NATIVE((isWitch(m) || m == moEvilGolem) ? 1 : 0)
REQ(ITEMS(itHell, U10))
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)
REQ(ITEMS(itEmerald, U5) ACCONLY2(laCrossroads, laCrossroads3))
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)
REQ(ACCONLY(laRlyeh) ITEMS(itStatue, U5))
LAND( 0xFF8000, "Crossroads II", laCrossroads2, ZERO, itHyperstone, RESERVED, LAND( 0xFF8000, "Crossroads II", laCrossroads2, ZERO, itHyperstone, RESERVED,
"An alternate layout of the Crossroads. It is more dense and more regular, " "An alternate layout of the Crossroads. It is more dense and more regular, "
"although you won't find the castle of Camelot here." "although you won't find the castle of Camelot here."
) )
NATIVE(0)
REQ(GOLD(R60))
LAND( 0x0000FF, "Caribbean", laCaribbean, ZERO | LF_SEA | LF_PURESEA, itPirate, RESERVED, caribbeanhelp) LAND( 0x0000FF, "Caribbean", laCaribbean, ZERO | LF_SEA | LF_PURESEA, itPirate, RESERVED, caribbeanhelp)
NATIVE((m == moPirate || m == moParrot || m == moCShark) ? 1 : 0)
REQAS(laOcean,)
LAND( 0x400000, "Red Rock Valley", laRedRock, ZERO | LF_TROLL, itRedGem, RESERVED, redrockhelp ) LAND( 0x400000, "Red Rock Valley", laRedRock, ZERO | LF_TROLL, itRedGem, RESERVED, redrockhelp )
NATIVE((m == moRedTroll || m == moHexSnake) ? 2 : 0)
REQ(GOLD(R60) ITEMS(itSpice, 10))
LAND( 0xD0D0D0, "Minefield", laMinefield, ZERO, itBombEgg, RESERVED, minedesc) LAND( 0xD0D0D0, "Minefield", laMinefield, ZERO, itBombEgg, RESERVED, minedesc)
NATIVE((m == moBomberbird || m == moTameBomberbird) ? 1 : 0)
REQ(GOLD(R30))
LAND( 0x2020FF, "Ocean", laOcean, ZERO | LF_EQUI | LF_SEA | LF_COASTAL, itCoast, RESERVED, LAND( 0x2020FF, "Ocean", laOcean, ZERO | LF_EQUI | LF_SEA | LF_COASTAL, itCoast, RESERVED,
"You can collect some valuable Ambers on the coast, but beware the tides!\n\n" "You can collect some valuable Ambers on the coast, but beware the tides!\n\n"
"You can also take one of the boats and venture into the Ocean, " "You can also take one of the boats and venture into the Ocean, "
"to find other coasts, dangerous whirlpools, and islands inhabited by Pirates." "to find other coasts, dangerous whirlpools, and islands inhabited by Pirates."
) )
NATIVE((m == moBomberbird || m == moTameBomberbird) ? 1 : 0)
REQ(GOLD(R30))
LAND( 0x0000C0, "Whirlpool", laWhirlpool, ZERO | LF_CYCLIC | LF_SEA, itWhirlpool, RESERVED, LAND( 0x0000C0, "Whirlpool", laWhirlpool, ZERO | LF_CYCLIC | LF_SEA, itWhirlpool, RESERVED,
"Many lost boats are spinning in this whirlpool. Some of them contain treasures " "Many lost boats are spinning in this whirlpool. Some of them contain treasures "
"and Pirates.\n\n" "and Pirates.\n\n"
"Unmanned boats will go one cell clockwise in each turn. Sharks and manned boats " "Unmanned boats will go one cell clockwise in each turn. Sharks and manned boats "
"are only allowed to go with the current, that is, towards the center, or clockwise." "are only allowed to go with the current, that is, towards the center, or clockwise."
) )
NATIVE((m == moPirate || m == moCShark) ? 1 : 0)
REQAS(laOcean, ACCONLY(laOcean))
LAND( 0xFFD500, "Palace", laPalace, ZERO, itPalace, RESERVED, palacedesc ) LAND( 0xFFD500, "Palace", laPalace, ZERO, itPalace, RESERVED, palacedesc )
NATIVE((m == moPalace || m == moFatGuard || m == moSkeleton || m == moVizier) ? 2 :
m == moSkeleton ? 1 : 0)
REQ(GOLD(R30))
LAND( 0xC0C000, "Living Fjord", laLivefjord, ZERO | LF_SEA | LF_COASTAL | LF_TROLL, itFjord, RESERVED, LAND( 0xC0C000, "Living Fjord", laLivefjord, ZERO | LF_SEA | LF_COASTAL | LF_TROLL, itFjord, RESERVED,
"A coastal area, from where you can get both to the inland worlds and to the Ocean. " "A coastal area, from where you can get both to the inland worlds and to the Ocean. "
"Each turn, each cell will become water or earth, based on the majority of cells around it. " "Each turn, each cell will become water or earth, based on the majority of cells around it. "
@ -1137,44 +1236,126 @@ LAND( 0xC0C000, "Living Fjord", laLivefjord, ZERO | LF_SEA | LF_COASTAL | LF_TRO
"but elementals, dead Trolls, and cells outside of the Living Fjord have " "but elementals, dead Trolls, and cells outside of the Living Fjord have "
"a very powerful effect." "a very powerful effect."
) )
NATIVE(m == moViking ? 2 : (m == moFjordTroll || m == moWaterElemental) ? 1 : 0)
REQAS(laOcean,)
LAND( 0xFFFFE0, "Ivory Tower", laIvoryTower, ZERO | LF_GRAVITY | LF_EQUI, itIvory, RESERVED, "Powerful wizards claimed this part of the world, to perform their magical " LAND( 0xFFFFE0, "Ivory Tower", laIvoryTower, ZERO | LF_GRAVITY | LF_EQUI, itIvory, RESERVED, "Powerful wizards claimed this part of the world, to perform their magical "
"experiments in peace and solitude. They have changed the direction of gravity, " "experiments in peace and solitude. They have changed the direction of gravity, "
"to make it even harder for intruders to reach them.\n\n" "to make it even harder for intruders to reach them.\n\n"
"Gravity works as follows: cells are unstable if they are empty, and there is " "Gravity works as follows: cells are unstable if they are empty, and there is "
"no cell immediately below them which contains a wall. It is impossible to move " "no cell immediately below them which contains a wall. It is impossible to move "
"from one unstable cell to another, except if moving down.") "from one unstable cell to another, except if moving down.")
NATIVE((m == moFamiliar || m == moGargoyle) ? 2 : 0)
REQ(GOLD(R30))
LAND( 0x606060, "Zebra", laZebra, ZERO, itZebra, RESERVED, "Everything in this Land has black and white stripes.") LAND( 0x606060, "Zebra", laZebra, ZERO, itZebra, RESERVED, "Everything in this Land has black and white stripes.")
NATIVE((m == moOrangeDog) ? 2 : 0)
REQ(GOLD(R30) ITEMS(itFeather, U10))
LAND( 0xC08080, "Plane of Fire", laEFire, ZERO | LF_ELEMENTAL, itElemental, RESERVED, elemdesc) LAND( 0xC08080, "Plane of Fire", laEFire, ZERO | LF_ELEMENTAL, itElemental, RESERVED, elemdesc)
NATIVE(isNative(laElementalWall, m))
REQAS(laElementalWall,)
LAND( 0x808080, "Plane of Air", laEAir, ZERO | LF_ELEMENTAL, itElemental, RESERVED, elemdesc) LAND( 0x808080, "Plane of Air", laEAir, ZERO | LF_ELEMENTAL, itElemental, RESERVED, elemdesc)
NATIVE(isNative(laElementalWall, m))
REQAS(laElementalWall,)
LAND( 0x80C080, "Plane of Earth", laEEarth, ZERO | LF_ELEMENTAL, itElemental, RESERVED, elemdesc) LAND( 0x80C080, "Plane of Earth", laEEarth, ZERO | LF_ELEMENTAL, itElemental, RESERVED, elemdesc)
NATIVE(isNative(laElementalWall, m))
REQAS(laElementalWall,)
LAND( 0x8080C0, "Plane of Water", laEWater, ZERO | LF_ELEMENTAL, itElemental, RESERVED, elemdesc) LAND( 0x8080C0, "Plane of Water", laEWater, ZERO | LF_ELEMENTAL, itElemental, RESERVED, elemdesc)
NATIVE(isNative(laElementalWall, m))
REQAS(laElementalWall,)
LAND( 0x4040FF, "Crossroads III", laCrossroads3, ZERO, itHyperstone, RESERVED, LAND( 0x4040FF, "Crossroads III", laCrossroads3, ZERO, itHyperstone, RESERVED,
"An alternate layout of the Crossroads. Great Walls cross here at right angles." "An alternate layout of the Crossroads. Great Walls cross here at right angles."
) )
NATIVE(0)
REQ(NUMBER(orbsUnlocked(), 9, XLAT("Finished lands required: %1 (collect %2 treasure)\n", "9", its(R10))))
LAND( 0x4040C0, "Sea Border", laOceanWall, ZERO | LF_TECHNICAL | LF_SEA, itNone, RESERVED, "Border between seas.") LAND( 0x4040C0, "Sea Border", laOceanWall, ZERO | LF_TECHNICAL | LF_SEA, itNone, RESERVED, "Border between seas.")
// REQAS(laOcean,)
REQ(NEVER)
NATIVE(0)
LAND( 0x4040C0, "Elemental Planes", laElementalWall, ZERO | LF_ELEMENTAL, itElemental, RESERVED, elemdesc) LAND( 0x4040C0, "Elemental Planes", laElementalWall, ZERO | LF_ELEMENTAL, itElemental, RESERVED, elemdesc)
NATIVE((m == elementalOf(l) && m) ? 2 : (m == moAirElemental || m == moEarthElemental || m == moWaterElemental || m == moFireElemental) ? 1 : 0)
REQ(KILL(moAirElemental, laWhirlwind) KILL(moWaterElemental, laLivefjord) KILL(moEarthElemental, laDeadCaves) KILL(moFireElemental, laDragon))
LAND( 0xE08020, "Canvas", laCanvas, ZERO | LF_TECHNICAL, itNone, RESERVED, "A fake Land with colored floors.") LAND( 0xE08020, "Canvas", laCanvas, ZERO | LF_TECHNICAL, itNone, RESERVED, "A fake Land with colored floors.")
NATIVE(0)
REQ(NEVER)
LAND( 0x00C000, "Palace Quest", laPrincessQuest, ZERO, itSavedPrincess, RESERVED, princessdesc) // fake LAND( 0x00C000, "Palace Quest", laPrincessQuest, ZERO, itSavedPrincess, RESERVED, princessdesc) // fake
NATIVE(isNative(laPalace, m))
REQ(ACCONLY(laPalace) KILL(moVizier, laPalace))
LAND( 0xD0D060, "Wild West", laWildWest, ZERO, itBounty, RESERVED, wildwestdesc) LAND( 0xD0D060, "Wild West", laWildWest, ZERO, itBounty, RESERVED, wildwestdesc)
NATIVE((m == moOutlaw) ? 2 : 0)
REQ( NEVER )
LAND( 0x80A080, "Land of Storms", laStorms, ZERO | LF_TROLL, itFulgurite, RESERVED, elecdesc) LAND( 0x80A080, "Land of Storms", laStorms, ZERO | LF_TROLL, itFulgurite, RESERVED, elecdesc)
NATIVE((m == moMetalBeast || m == moMetalBeast2 || m == moStormTroll) ? 1 : 0)
REQ( GOLD(R60) )
LAND( 0x20A050, "Overgrown Woods", laOvergrown, ZERO | LF_TROLL, itMutant, RESERVED, overdesc) LAND( 0x20A050, "Overgrown Woods", laOvergrown, ZERO | LF_TROLL, itMutant, RESERVED, overdesc)
NATIVE((m == moMutant || m == moForestTroll) ? 1 : 0)
REQ( GOLD(R60) ITEMS(itRuby, U10) )
LAND( 0x20D050, "Clearing", laClearing, ZERO | LF_CYCLIC, itMutant2, RESERVED, cleardesc) LAND( 0x20D050, "Clearing", laClearing, ZERO | LF_CYCLIC, itMutant2, RESERVED, cleardesc)
NATIVE((m == moMutant || m == moRedFox) ? 1 : 0)
REQ(ACCONLY(laOvergrown) ITEMS(itMutant, U5))
LAND( 0x303030, "Haunted Woods", laHaunted, ZERO | LF_EQUI | LF_HAUNTED, itLotus, RESERVED, hauntdesc) LAND( 0x303030, "Haunted Woods", laHaunted, ZERO | LF_EQUI | LF_HAUNTED, itLotus, RESERVED, hauntdesc)
NATIVE((m == moGhost || m == moFriendlyGhost) ? 1 : 0)
REQ(ACCONLY(laGraveyard) ITEMS(itBone, U10))
LAND( 0x303030, "Haunted Woods", laHauntedWall, ZERO | LF_EQUI | LF_TECHNICAL | LF_HAUNTED, itLotus, RESERVED, hauntdesc) LAND( 0x303030, "Haunted Woods", laHauntedWall, ZERO | LF_EQUI | LF_TECHNICAL | LF_HAUNTED, itLotus, RESERVED, hauntdesc)
NATIVE(isNative(laHaunted, m))
REQAS(laHaunted,)
LAND( 0x303030, "Haunted Woods", laHauntedBorder, ZERO | LF_EQUI | LF_TECHNICAL | LF_HAUNTED, itLotus, RESERVED, hauntdesc) LAND( 0x303030, "Haunted Woods", laHauntedBorder, ZERO | LF_EQUI | LF_TECHNICAL | LF_HAUNTED, itLotus, RESERVED, hauntdesc)
NATIVE(isNative(laHaunted, m))
REQAS(laHaunted,)
LAND( 0xC0C0FF, "Windy Plains", laWhirlwind, ZERO, itWindstone, RESERVED, winddesc) LAND( 0xC0C0FF, "Windy Plains", laWhirlwind, ZERO, itWindstone, RESERVED, winddesc)
NATIVE((m == moAirElemental || m == moWindCrow) ? 2 : 0)
REQ( GOLD(R60) )
LAND( 0x764e7c*2, "Rose Garden", laRose, ZERO, itRose, RESERVED, roselanddesc) LAND( 0x764e7c*2, "Rose Garden", laRose, ZERO, itRose, RESERVED, roselanddesc)
NATIVE((m == moFalsePrincess || m == moRoseBeauty || m == moRoseLady) ? 2 : 0)
REQ( GOLD(R60) )
LAND( 0xFFD580, "Warped Coast", laWarpCoast, ZERO | LF_WARPED | LF_COASTAL, itCoral, RESERVED, warplanddesc) LAND( 0xFFD580, "Warped Coast", laWarpCoast, ZERO | LF_WARPED | LF_COASTAL, itCoral, RESERVED, warplanddesc)
NATIVE(m == moRatling ? 2 : m == moRatlingAvenger ? 1 : 0)
REQAS(laOcean,)
LAND( 0xFFD580, "Warped Sea", laWarpSea, ZERO | LF_WARPED | LF_SEA | LF_COASTAL, itCoral, RESERVED, warplanddesc) LAND( 0xFFD580, "Warped Sea", laWarpSea, ZERO | LF_WARPED | LF_SEA | LF_COASTAL, itCoral, RESERVED, warplanddesc)
NATIVE(isNative(laWarpCoast, m))
REQAS(laWarpCoast,)
LAND( 0xC08080, "Crossroads IV", laCrossroads4, ZERO, itHyperstone, RESERVED, LAND( 0xC08080, "Crossroads IV", laCrossroads4, ZERO, itHyperstone, RESERVED,
"An alternate layout of the Crossroads, without walls." "An alternate layout of the Crossroads, without walls."
) )
NATIVE(0)
REQ(GOLD(R200))
LAND( 0xFFD580, "Yendorian Forest", laEndorian, ZERO | LF_GRAVITY | LF_EQUI, itApple, RESERVED, LAND( 0xFFD580, "Yendorian Forest", laEndorian, ZERO | LF_GRAVITY | LF_EQUI, itApple, RESERVED,
"This forest was planted by one of the wizards from the Ivory Tower " "This forest was planted by one of the wizards from the Ivory Tower "
"to conduct experiments with gravity." "to conduct experiments with gravity."
) )
NATIVE((m == moResearcher || m == moSparrowhawk) ? 2 : 0)
REQ(ITEMS(itIvory, U10))
LAND( 0x487830, "Galápagos", laTortoise, ZERO, itBabyTortoise, RESERVED, tortoisedesc) LAND( 0x487830, "Galápagos", laTortoise, ZERO, itBabyTortoise, RESERVED, tortoisedesc)
NATIVE(m == moTortoise ? 1 : 0)
REQ(COND(tortoise::seek(), XLAT("Find a %1 in %the2.", itBabyTortoise, laDragon)) ACCONLY(laDragon))
LAND( 0xD04000, "Dragon Chasms", laDragon, ZERO, itDragon, RESERVED, dragondesc) LAND( 0xD04000, "Dragon Chasms", laDragon, ZERO, itDragon, RESERVED, dragondesc)
NATIVE((isDragon(m) || m == moFireElemental) ? 1 : 0)
REQ(NUMBER(killtypes(), R20, XLAT("Different kills required: %1.\n", its(R20))))
LAND( 0xD04000, "Kraken Depths", laKraken, ZERO | LF_SEA | LF_PURESEA, itKraken, RESERVED, LAND( 0xD04000, "Kraken Depths", laKraken, ZERO | LF_SEA | LF_PURESEA, itKraken, RESERVED,
"A long time ago, this was a trade route. But then, Krakens have risen out of the " "A long time ago, this was a trade route. But then, Krakens have risen out of the "
"depths. Many trading ships sank here. Legend says that you can uncover the secret " "depths. Many trading ships sank here. Legend says that you can uncover the secret "
@ -1184,56 +1365,147 @@ LAND( 0xD04000, "Kraken Depths", laKraken, ZERO | LF_SEA | LF_PURESEA, itKraken,
"a Kraken. You will also need Orb of the Fish to get the treasures, luckily you can " "a Kraken. You will also need Orb of the Fish to get the treasures, luckily you can "
"steal one from the Viking treasure hunters." "steal one from the Viking treasure hunters."
) )
NATIVE(m == moKrakenH ? 2 : (m == moViking || m == moKrakenT) ? 1 : 0)
REQ(ITEMS(itFjord, U10))
LAND( 0x804020, "Burial Grounds", laBurial, ZERO, itBarrow, RESERVED, LAND( 0x804020, "Burial Grounds", laBurial, ZERO, itBarrow, RESERVED,
"Ancient Viking heroes were buried here. Their graves have barrows raised over " "Ancient Viking heroes were buried here. Their graves have barrows raised over "
"them, and are guarded by Draugar, animated corpses who are immune to mundane weapons. " "them, and are guarded by Draugar, animated corpses who are immune to mundane weapons. "
"You will need to use a magical weapon spell to defeat them, and to rob the " "You will need to use a magical weapon spell to defeat them, and to rob the "
"ancient jewelry buried in the graves." "ancient jewelry buried in the graves."
) )
NATIVE(m == moDraugr ? 1 : 0)
REQ(ITEMS(itBarrow, U10))
LAND( 0x90A548, "Trollheim", laTrollheim, ZERO, itTrollEgg, RESERVED, LAND( 0x90A548, "Trollheim", laTrollheim, ZERO, itTrollEgg, RESERVED,
"Many clans of Trolls spend their lives in this kingdom. You can find many " "Many clans of Trolls spend their lives in this kingdom. You can find many "
"statues of Trolls here. You suppose that they are not actually statues, but simply " "statues of Trolls here. You suppose that they are not actually statues, but simply "
"elderly Trolls, who have petrified upon death. Or maybe you have killed " "elderly Trolls, who have petrified upon death. Or maybe you have killed "
"these Trolls yourself?" "these Trolls yourself?"
) )
NATIVE(isTroll(m) ? 1 : 0)
REQ( KILL(moTroll, laCaves) KILL(moDarkTroll, laDeadCaves) KILL(moRedTroll, laRedRock) KILL(moStormTroll, laStorms) KILL(moForestTroll, laOvergrown) KILL(moFjordTroll, laLivefjord) )
LAND( 0xFF7518, "Halloween", laHalloween, ZERO, itTreat, RESERVED, halloweendesc) LAND( 0xFF7518, "Halloween", laHalloween, ZERO, itTreat, RESERVED, halloweendesc)
NATIVE((m == moGhost || m == moZombie || m == moWitch ||
m == moLesser || m == moGreater ||
m == moVampire || m == moDraugr ||
m == moSkeleton || m == moWitchFire ||
m == moFlailer || m == moPyroCultist ||
m == moFatGuard || m == moHedge ||
m == moLancer || m == moFireFairy ||
m == moBomberbird || m == moRatlingAvenger ||
m == moVineBeast || m == moDragonHead || m == moDragonTail) ? 1 : 0)
REQ( NEVER )
LAND( 0x605040, "Dungeon", laDungeon, ZERO | LF_GRAVITY | LF_EQUI, itSlime, RESERVED, LAND( 0x605040, "Dungeon", laDungeon, ZERO | LF_GRAVITY | LF_EQUI, itSlime, RESERVED,
"The result of a collaboration of the Great Vizier and the Wizard of the Ivory Tower." "The result of a collaboration of the Great Vizier and the Wizard of the Ivory Tower."
) )
NATIVE(m == moBat ? 2 : m == moSkeleton || m == moGhost ? 1 : 0)
REQ(ITEMS(itPalace, U5) ITEMS(itIvory, U5))
LAND( 0x603000, "Lost Mountain", laMountain, ZERO | LF_GRAVITY | LF_CYCLIC, itAmethyst, RESERVED, LAND( 0x603000, "Lost Mountain", laMountain, ZERO | LF_GRAVITY | LF_CYCLIC, itAmethyst, RESERVED,
"Gravitational anomalies in the Jungle create mountains " "Gravitational anomalies in the Jungle create mountains "
"overgrown with ivies and bushes. " "overgrown with ivies and bushes. "
"Will you dare to climb the ivies to get the amethysts hidden above?\n\n" "Will you dare to climb the ivies to get the amethysts hidden above?\n\n"
"Cells adjacent to Ivies count as stable (but Ivies " "Cells adjacent to Ivies count as stable (but Ivies "
"cannot climb themselves or other Ivies).") "cannot climb themselves or other Ivies).")
NATIVE(m == moEagle || m == moMonkey || isIvy(m) || m == moFriendlyIvy ? 1 : 0)
REQ(ITEMS(itRuby, U5) ITEMS(itIvory, U5) ACCONLY(laJungle))
LAND( 0xFFFF00, "Reptiles", laReptile, ZERO, itDodeca, RESERVED, reptiledesc) LAND( 0xFFFF00, "Reptiles", laReptile, ZERO, itDodeca, RESERVED, reptiledesc)
NATIVE(m == moReptile ? 1 : 0)
REQ(GOLD(R30) ITEMS(itElixir, U10))
LAND( 0x0000D0, "Prairie", laPrairie, ZERO, itGreenGrass, RESERVED, prairiedesc) LAND( 0x0000D0, "Prairie", laPrairie, ZERO, itGreenGrass, RESERVED, prairiedesc)
NATIVE((m == moRagingBull || m == moHerdBull || m == moGadfly) ? 1 : 0)
REQ(GOLD(R90))
LAND( 0x800080, "Bull Dash", laBull, ZERO, itBull, RESERVED, bulldashdesc) LAND( 0x800080, "Bull Dash", laBull, ZERO, itBull, RESERVED, bulldashdesc)
NATIVE((m == moSleepBull || m == moRagingBull || m == moButterfly || m == moGadfly) ? 1 : 0)
REQ(GOLD(R90))
LAND( 0xC000C0, "Crossroads V", laCrossroads5, ZERO, itHyperstone, RESERVED, "Extremely narrow Crossroads layout.\n") LAND( 0xC000C0, "Crossroads V", laCrossroads5, ZERO, itHyperstone, RESERVED, "Extremely narrow Crossroads layout.\n")
NATIVE(0)
REQ(GOLD(R300))
LAND( 0xC0C0C0, "Cellular Automaton", laCA, ZERO | LF_TECHNICAL, itNone, RESERVED, cadesc) LAND( 0xC0C0C0, "Cellular Automaton", laCA, ZERO | LF_TECHNICAL, itNone, RESERVED, cadesc)
NATIVE(0)
REQ(NEVER)
LAND( 0xC0C0FF, "Mirror Wall", laMirrorWall, ZERO | LF_TECHNICAL | LF_INMIRRORORWALL, itShard, RESERVED, mirroreddesc) LAND( 0xC0C0FF, "Mirror Wall", laMirrorWall, ZERO | LF_TECHNICAL | LF_INMIRRORORWALL, itShard, RESERVED, mirroreddesc)
NATIVE(isNative(laMirror, m))
LAND( 0xC8C8FF, "Reflection", laMirrored, ZERO | LF_TECHNICAL | LF_INMIRROR | LF_INMIRRORORWALL, itShard, RESERVED, mirroreddesc) LAND( 0xC8C8FF, "Reflection", laMirrored, ZERO | LF_TECHNICAL | LF_INMIRROR | LF_INMIRRORORWALL, itShard, RESERVED, mirroreddesc)
NATIVE(isNative(laMirror, m))
REQAS(laMirror,)
LAND( 0xC0C0FF, "Reflection", laMirrorWall2, ZERO | LF_TECHNICAL | LF_INMIRROR | LF_INMIRRORORWALL, itShard, RESERVED, mirroreddesc) LAND( 0xC0C0FF, "Reflection", laMirrorWall2, ZERO | LF_TECHNICAL | LF_INMIRROR | LF_INMIRRORORWALL, itShard, RESERVED, mirroreddesc)
NATIVE(isNative(laMirror, m))
REQAS(laMirror,)
LAND( 0xC8C8FF, "Reflection", laMirrored2, ZERO | LF_TECHNICAL | LF_INMIRROR | LF_INMIRRORORWALL, itShard, RESERVED, mirroreddesc) LAND( 0xC8C8FF, "Reflection", laMirrored2, ZERO | LF_TECHNICAL | LF_INMIRROR | LF_INMIRRORORWALL, itShard, RESERVED, mirroreddesc)
NATIVE(isNative(laMirror, m))
REQAS(laMirror,)
LAND( 0xC8C8FF, "Mirror Land", laMirrorOld, ZERO | LF_MIRROR, itShard, RESERVED, LAND( 0xC8C8FF, "Mirror Land", laMirrorOld, ZERO | LF_MIRROR, itShard, RESERVED,
"A strange land which contains mirrors and mirages, protected by Mirror Rangers.") "A strange land which contains mirrors and mirages, protected by Mirror Rangers.")
NATIVE((m == moEagle || m == moRanger || m == moMimic) ? 1 : 0)
REQ(GOLD(R30))
LAND( 0xA06000, "Volcanic Wasteland", laVolcano, ZERO, itLavaLily, RESERVED, lavadesc) LAND( 0xA06000, "Volcanic Wasteland", laVolcano, ZERO, itLavaLily, RESERVED, lavadesc)
NATIVE((m == moLavaWolf || m == moSalamander) ? 2 : 0)
REQ(GOLD(R60) ITEMS(itElixir, U10))
LAND( 0x8080FF, "Blizzard", laBlizzard, ZERO | LF_ICY, itBlizzard, RESERVED, blizzarddesc) LAND( 0x8080FF, "Blizzard", laBlizzard, ZERO | LF_ICY, itBlizzard, RESERVED, blizzarddesc)
NATIVE((m == moVoidBeast || m == moIceGolem) ? 2 : 0)
REQ(ITEMS(itDiamond, U5) ITEMS(itWindstone, U5))
LAND( 0x207068, "Hunting Ground", laHunting, ZERO, itHunting, RESERVED, huntingdesc) LAND( 0x207068, "Hunting Ground", laHunting, ZERO, itHunting, RESERVED, huntingdesc)
NATIVE(m == moHunterDog ? 1 : 0)
REQ(ALWAYS)
LAND( 0xE2725B, "Terracotta Army", laTerracotta, ZERO, itTerra, RESERVED, terraldesc) LAND( 0xE2725B, "Terracotta Army", laTerracotta, ZERO, itTerra, RESERVED, terraldesc)
NATIVE(m == moJiangshi ? 2 : m == moTerraWarrior ? 1 : 0)
REQ(GOLD(R90))
LAND( 0xE2725B, "Terracotta Army", laMercuryRiver, ZERO | LF_TECHNICAL, itTerra, RESERVED, terraldesc) LAND( 0xE2725B, "Terracotta Army", laMercuryRiver, ZERO | LF_TECHNICAL, itTerra, RESERVED, terraldesc)
NATIVE(isNative(laTerracotta, m))
REQAS(laTerracotta,)
LAND( 0x80FF00, "Crystal World", laDual, ZERO, itGlowCrystal, RESERVED, crystaldesc) LAND( 0x80FF00, "Crystal World", laDual, ZERO, itGlowCrystal, RESERVED, crystaldesc)
NATIVE(m == moRatling ? 2 : 0)
REQ(GOLD(R90))
LAND( 0x306030, "Snake Nest", laSnakeNest, ZERO, itSnake, RESERVED, NODESCYET) LAND( 0x306030, "Snake Nest", laSnakeNest, ZERO, itSnake, RESERVED, NODESCYET)
NATIVE(m == moHexSnake ? 2 : 0)
REQ(GOLD(R90))
LAND( 0x80FF00, "Docks", laDocks, ZERO | LF_SEA, itDock, RESERVED, NODESCYET) LAND( 0x80FF00, "Docks", laDocks, ZERO | LF_SEA, itDock, RESERVED, NODESCYET)
NATIVE(among(m, moRatling, moPirate, moCShark, moAlbatross, moFireFairy) ? 2 : 0)
REQAS(laOcean,)
LAND( 0x306030, "Ruined City", laRuins, ZERO, itRuins, RESERVED, ruindesc) LAND( 0x306030, "Ruined City", laRuins, ZERO, itRuins, RESERVED, ruindesc)
NATIVE(m == moSwitch1 || m == moSwitch2 ? 2 : 0)
REQ(KILL(moSkeleton, laPalace))
LAND( 0x306030, "Magnetosphere", laMagnetic, ZERO, itMagnet, RESERVED, NODESCYET) LAND( 0x306030, "Magnetosphere", laMagnetic, ZERO, itMagnet, RESERVED, NODESCYET)
NATIVE(isMagneticPole(m) ? 2 : 0)
REQ(NEVER)
LAND( 0x306030, "Jelly Kingdom", laSwitch, ZERO, itSwitch, RESERVED, jellydesc) LAND( 0x306030, "Jelly Kingdom", laSwitch, ZERO, itSwitch, RESERVED, jellydesc)
NATIVE(m == moSwitch1 || m == moSwitch2 ? 2 : 0)
REQ(GOLD(R30) ITEMS(itElixir, U10))
LAND( 0xFF00FF, "Lost Memory", laMemory, ZERO | LF_TECHNICAL, itNone, RESERVED, LAND( 0xFF00FF, "Lost Memory", laMemory, ZERO | LF_TECHNICAL, itNone, RESERVED,
"Because of the properties of hyperbolic geometry, it is extremely unlikely to randomly " "Because of the properties of hyperbolic geometry, it is extremely unlikely to randomly "
"get back to a faraway place you have been to. However, you have managed to get there " "get back to a faraway place you have been to. However, you have managed to get there "
"somehow. In the meantime, its memory has been cleared, since the 'remove faraway cells from the memory'" "somehow. In the meantime, its memory has been cleared, since the 'remove faraway cells from the memory'"
" option was on." " option was on."
) )
NATIVE(0)
REQ(NEVER)
LAND( 0x804000, "Brown Island", laBrownian, ZERO | LF_PURESEA, itBrownian, RESERVED, LAND( 0x804000, "Brown Island", laBrownian, ZERO | LF_PURESEA, itBrownian, RESERVED,
"The Brown Islands have been generated by ancient underground creatures, who moved randomly and raised lands in their path... " "The Brown Islands have been generated by ancient underground creatures, who moved randomly and raised lands in their path... "
"adults spawned larvae in each move, which also moved randomly and also raised lands in their path, and eventually became adults and spawned their own larvae. " "adults spawned larvae in each move, which also moved randomly and also raised lands in their path, and eventually became adults and spawned their own larvae. "
@ -1243,10 +1515,16 @@ LAND( 0x804000, "Brown Island", laBrownian, ZERO | LF_PURESEA, itBrownian, RESER
"or to lose three levels, in a single move, (attacks are possible at any " "or to lose three levels, in a single move, (attacks are possible at any "
"difference, though). Killed Bronze Beasts rise the land by one level." "difference, though). Killed Bronze Beasts rise the land by one level."
) )
NATIVE(among(m, moBrownBug, moAcidBird) ? 2 : 0)
REQAS(laOcean,)
LAND( 0x211F6F, "Free Fall", laWestWall, ZERO | LF_GRAVITY | LF_EQUI, itWest, RESERVED, LAND( 0x211F6F, "Free Fall", laWestWall, ZERO | LF_GRAVITY | LF_EQUI, itWest, RESERVED,
"What on one side looks to be a normal (well, infinite) horizontal wall, on to the other side turns out to be the vertical wall" "What on one side looks to be a normal (well, infinite) horizontal wall, on to the other side turns out to be the vertical wall"
" of an infinitely high tower. Jump from the window, and let the magical gravity carry you..." " of an infinitely high tower. Jump from the window, and let the magical gravity carry you..."
) )
NATIVE(among(m, moWestHawk, moFallingDog) ? 2 : 0)
REQ(ITEMS(itFeather, 5) ITEMS(itIvory, 5))
LAND( 0x30FF30, "Irradiated Field", laVariant, ZERO, itVarTreasure, RESERVED, LAND( 0x30FF30, "Irradiated Field", laVariant, ZERO, itVarTreasure, RESERVED,
"These fields are ravaged with many kinds of magical radiation, which not only make the ground glow nicely in various colors, " "These fields are ravaged with many kinds of magical radiation, which not only make the ground glow nicely in various colors, "
"but also cause the inhabitants to protect the treasures of their land in various ways. In some areas of the Irradiated Fields, " "but also cause the inhabitants to protect the treasures of their land in various ways. In some areas of the Irradiated Fields, "
@ -1254,12 +1532,21 @@ LAND( 0x30FF30, "Irradiated Field", laVariant, ZERO, itVarTreasure, RESERVED,
"careless, or help you if you know how to use them to your advantage. Will you walk through the Irradiated Fields randomly, or " "careless, or help you if you know how to use them to your advantage. Will you walk through the Irradiated Fields randomly, or "
"try to find areas where treasures are common but nasty monsters are not, and keep to them? It is your choice!\n\n" "try to find areas where treasures are common but nasty monsters are not, and keep to them? It is your choice!\n\n"
) )
NATIVE(
m == moVariantWarrior ? 2 :
among(m, moMonk, moCrusher, moSkeleton, moHedge, moLancer, moFlailer, moCultist, moPyroCultist, moNecromancer, moGhost, moZombie, moRatling) ? 1 :
isIvy(m) ? 1 : 0)
#define LST {itRuins, itEmerald, itBone}
REQ(ITEMS_TOTAL(LST, variant_unlock_value()))
#undef LST
// add new content here // add new content here
LAND( 0x202020, "Space Rocks", laAsteroids, ZERO, itAsteroid, RESERVED, rock_description) LAND( 0x202020, "Space Rocks", laAsteroids, ZERO, itAsteroid, RESERVED, rock_description)
ITEM( '!', 0xFFD0D0, "Fuel", itAsteroid, IC_TREASURE, ZERO, RESERVED, osNone, rock_description) ITEM( '!', 0xFFD0D0, "Fuel", itAsteroid, IC_TREASURE, ZERO, RESERVED, osNone, rock_description)
MONSTER('A', 0x606040, "Space Rock", moAsteroid, ZERO, RESERVED, moAsteroid, rock_description) MONSTER('A', 0x606040, "Space Rock", moAsteroid, ZERO, RESERVED, moAsteroid, rock_description)
NATIVE(m == moAsteroid ? 2 : 0)
REQ( NEVER )
//shmupspecials //shmupspecials
MONSTER( '@', 0xC0C0C0, "Rogue", moPlayer, ZERO | CF_PLAYER, RESERVED, moNone, "In the Shoot'em Up mode, you are armed with thrown Knives.") MONSTER( '@', 0xC0C0C0, "Rogue", moPlayer, ZERO | CF_PLAYER, RESERVED, moNone, "In the Shoot'em Up mode, you are armed with thrown Knives.")
@ -1284,4 +1571,21 @@ MONSTER( '*', 0, "vertex", moRogueviz, ZERO | CF_TECHNICAL, RESERVED, moN
#undef LAND #undef LAND
#undef WALL #undef WALL
#undef ITEM #undef ITEM
#undef NATIVE
#undef REQ
#undef REQAS
#undef GOLD
#undef ITEMS
#undef NEVER
#undef ALWAYS
#undef KILLS
#undef KILL
#undef AKILL
#undef ORD
#undef NUMBER
#undef COND
#undef ITEMS_TOTAL
#undef ACCONLY
#undef ACCONLY2
#undef ACCONLYF

View File

@ -2533,8 +2533,8 @@ bool attackMonster(cell *c, flagtype flags, eMonster killer) {
c->stuntime = 2; c->stuntime = 2;
} }
bool eu = elementalUnlocked(); bool eu = landUnlocked(laElementalWall);
bool tu = trollUnlocked(); bool tu = landUnlocked(laTrollheim);
if(flags & AF_MSG) fightmessage(m, killer, dostun, flags); if(flags & AF_MSG) fightmessage(m, killer, dostun, flags);
if(dostun) if(dostun)
@ -2573,12 +2573,12 @@ bool attackMonster(cell *c, flagtype flags, eMonster killer) {
if(tk < R100 && ntk >= R100 && !euclid && !sphere) if(tk < R100 && ntk >= R100 && !euclid && !sphere)
addMessage(XLAT("You feel that the souls of slain enemies pull you to the Graveyard...")); addMessage(XLAT("You feel that the souls of slain enemies pull you to the Graveyard..."));
if(!tu && trollUnlocked()) { if(!tu && landUnlocked(laTrollheim)) {
playSound(c, "message-troll"); playSound(c, "message-troll");
addMessage(XLAT("%The1 says, \"I die, but my clan in Trollheim will avenge me!\"", m)); addMessage(XLAT("%The1 says, \"I die, but my clan in Trollheim will avenge me!\"", m));
} }
if(!eu && elementalUnlocked()) if(!eu && landUnlocked(laElementalWall))
addMessage(XLAT("After killing %the1, you feel able to reach the Elemental Planes!", m)); addMessage(XLAT("After killing %the1, you feel able to reach the Elemental Planes!", m));
if(m == moVizier && c->monst != moVizier && kills[moVizier] == 1) { if(m == moVizier && c->monst != moVizier && kills[moVizier] == 1) {
@ -7063,7 +7063,7 @@ bool collectItem(cell *c2, bool telekinesis) {
halloween::getTreat(c2); halloween::getTreat(c2);
} }
else { else {
bool lhu = hellUnlocked(); bool lhu = landUnlocked(laHell);
if(c2->item == itBarrow) if(c2->item == itBarrow)
for(int i=0; i<c2->landparam; i++) gainItem(c2->item); for(int i=0; i<c2->landparam; i++) gainItem(c2->item);
else if(c2->item) gainItem(c2->item); else if(c2->item) gainItem(c2->item);
@ -7119,7 +7119,7 @@ bool collectItem(cell *c2, bool telekinesis) {
addMessage(XLAT("Kill monsters and collect treasures, and you may get access to Hell...")); addMessage(XLAT("Kill monsters and collect treasures, and you may get access to Hell..."));
IF(R10 * 9) IF(R10 * 9)
addMessage(XLAT("To access Hell, collect %1 treasures each of 9 kinds...", its(R10))); addMessage(XLAT("To access Hell, collect %1 treasures each of 9 kinds...", its(R10)));
if(hellUnlocked() && !lhu) { if(landUnlocked(laHell) && !lhu) {
addMessage(XLAT("Abandon all hope, the gates of Hell are opened!")); addMessage(XLAT("Abandon all hope, the gates of Hell are opened!"));
addMessage(XLAT("And the Orbs of Yendor await!")); addMessage(XLAT("And the Orbs of Yendor await!"));
} }

151
help.cpp
View File

@ -561,6 +561,36 @@ string generateHelpForMonster(eMonster m) {
return s; return s;
} }
void add_reqs(eLand l, string& s) {
back:
switch(l) {
#define LAND(a,b,c,d,e,f,g) case c:
#define REQ(x) x return;
#define REQAS(x,y) y l = x; goto back;
#define GOLD(x) NUMBER(gold(), x, XLAT("Treasure required: %1 $$$.\n", its(x)))
#define KILL(who, where) NUMBER(kills[who], 1, XLAT("Kills required: %1 (%2).\n", who, where))
#define ITEMS(kind, number) NUMBER(items[kind], number, XLAT("Treasure required: %1 x %2.\n", its(number), kind))
#define NEVER ;
#define ALWAYS s += XLAT("Always available.\n");
#define KILLS(x) NUMBER(tkills(), x, XLAT("Kills required: %1.\n", its(x)))
#define AKILL(who, where) s += XLAT("Alternatively: kill a %1 in %the2.\n", who, where); buteol(s, kills[who], 1);
#define ORD(a, b) b a
#define ALT(x) // if([&] { x return true; } ()) return true;
#define NUMBER(val, required, description) s += description; buteol(s, val, required);
#define COND(x,y) s += (y);
#define ITEMS_TOTAL(list, z) \
{ int now = 0; string t = ""; for(eItem i: list) { if(t!="") t += " + "; t += XLATN(iinf[i].name); now += items[i]; } s += XLAT("Treasure required: %1 x %2.\n", its(z), t); buteol(s, now, 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 ACCONLYF(z) s += XLAT("Accessible only from %the1 (until finished).\n", z);
#include "content.cpp"
case landtypes: return;
}
}
string generateHelpForLand(eLand l) { string generateHelpForLand(eLand l) {
string s = helptitle(XLATN(linf[l].name), linf[l].color); string s = helptitle(XLATN(linf[l].name), linf[l].color);
@ -571,21 +601,8 @@ string generateHelpForLand(eLand l) {
if(l == laMinefield) addMinefieldExplanation(s); if(l == laMinefield) addMinefieldExplanation(s);
s += "\n\n"; s += "\n\n";
if(l == laIce || l == laCaves || l == laDesert || l == laMotion || l == laJungle ||
l == laCrossroads || l == laAlchemist || l == laHunting)
s += XLAT("Always available.\n");
#define ACCONLY(z) s += XLAT("Accessible only from %the1.\n", z); add_reqs(l, s);
#define ACCONLY2(z,x) s += XLAT("Accessible only from %the1 or %the2.\n", z, x);
#define ACCONLYF(z) s += XLAT("Accessible only from %the1 (until finished).\n", z);
#define TREQ(z) { s += XLAT("Treasure required: %1 $$$.\n", its(z)); buteol(s, gold(), z); }
#define TREQ2(z,x) { s += XLAT("Treasure required: %1 x %2.\n", its(z), x); buteol(s, items[x], z); }
#define TREQ3(z,x) { int now = 0; string t = ""; for(eItem i: x) { if(t!="") t += " + "; t += XLATN(iinf[i].name); now += items[i]; } s += XLAT("Treasure required: %1 x %2.\n", its(z), t); buteol(s, now, z); }
if(l == laMirror || l == laMinefield || l == laPalace ||
l == laOcean || l == laLivefjord || l == laZebra || l == laWarpCoast || l == laWarpSea ||
l == laReptile || l == laIvoryTower || l == laSwitch)
TREQ(R30)
if(l == laPower && inv::on) if(l == laPower && inv::on)
help += XLAT( help += XLAT(
@ -601,112 +618,6 @@ string generateHelpForLand(eLand l) {
if(isPureSealand(l)) if(isPureSealand(l))
s += XLAT("Aquatic region -- accessible only from coastal regions and other aquatic regions.\n"); s += XLAT("Aquatic region -- accessible only from coastal regions and other aquatic regions.\n");
if(l == laWhirlpool) ACCONLY(laOcean)
if(l == laRlyeh) ACCONLYF(laOcean)
if(l == laTemple) ACCONLY(laRlyeh)
if(l == laClearing) ACCONLY(laOvergrown)
if(l == laHaunted) ACCONLY(laGraveyard)
if(l == laPrincessQuest) ACCONLY(laPalace)
if(l == laMountain) ACCONLY(laJungle)
if(l == laCamelot) ACCONLY2(laCrossroads, laCrossroads3)
if(l == laDryForest || l == laWineyard || l == laDeadCaves || l == laHive || l == laRedRock ||
l == laOvergrown || l == laStorms || l == laWhirlwind ||
l == laCrossroads2 || l == laRlyeh || l == laVolcano)
TREQ(R60)
if(l == laReptile) TREQ2(U10, itElixir)
if(l == laVolcano) TREQ2(U10, itElixir)
if(l == laSwitch) TREQ2(U10, itElixir)
if(l == laEndorian) TREQ2(U10, itIvory)
if(l == laKraken) TREQ2(U10, itFjord)
if(l == laBurial) TREQ2(U10, itKraken)
if(l == laDungeon) TREQ2(U5, itIvory)
if(l == laDungeon) TREQ2(U5, itPalace)
if(l == laMountain) TREQ2(U5, itIvory)
if(l == laMountain) TREQ2(U5, itRuby)
if(l == laBlizzard) TREQ2(U5, itDiamond)
if(l == laBlizzard) TREQ2(U5, itWindstone)
if(l == laWestWall) TREQ2(U5, itIvory)
if(l == laWestWall) TREQ2(U5, itFeather)
if(l == laBrownian) TREQ(R30)
if(l == laVariant) {
const auto lst = vector<eItem>{itRuins, itEmerald, itBone};
TREQ3(variant_unlock_value(), lst)
}
if(l == laPrairie) TREQ(R90)
if(l == laBull) TREQ(R90)
if(l == laRose) TREQ(R90)
if(l == laTerracotta) TREQ(R90)
if(l == laCrossroads4) TREQ(R200)
if(l == laCrossroads5) TREQ(R300)
if(l == laGraveyard || l == laHive) {
s += XLAT("Kills required: %1.\n", "100");
buteol(s, tkills(), R100);
}
if(l == laDragon) {
s += XLAT("Different kills required: %1.\n", "20");
buteol(s, killtypes(), R20);
}
if(l == laTortoise) ACCONLY(laDragon)
if(l == laTortoise) s += XLAT("Find a %1 in %the2.", itBabyTortoise, laDragon);
if(l == laHell || l == laCrossroads3) {
s += XLAT("Finished lands required: %1 (collect %2 treasure)\n", "9", its(R10));
buteol(s, orbsUnlocked(), 9);
}
if(l == laCocytus || l == laPower) TREQ2(U10, itHell)
if(l == laRedRock) TREQ2(U10, itSpice)
if(l == laOvergrown) TREQ2(U10, itRuby)
if(l == laClearing) TREQ2(U5, itMutant)
if(l == laCocytus) TREQ2(U10, itDiamond)
if(l == laDeadCaves) TREQ2(U10, itGold)
if(l == laTemple) TREQ2(U5, itStatue)
if(l == laHaunted) TREQ2(U10, itBone)
if(l == laCamelot) TREQ2(U5, itEmerald)
if(l == laEmerald) {
TREQ2(U5, itFernFlower) TREQ2(U5, itGold)
s += XLAT("Alternatively: kill a %1 in %the2.\n", moVizier, laPalace);
buteol(s, kills[moVizier], 1);
}
#define KILLREQ(who, where) { s += XLAT("Kills required: %1 (%2).\n", who, where); buteol(s, kills[who], 1); }
if(l == laPrincessQuest)
KILLREQ(moVizier, laPalace);
if(l == laElementalWall) {
KILLREQ(moFireElemental, laDragon);
KILLREQ(moEarthElemental, laDeadCaves);
KILLREQ(moWaterElemental, laLivefjord);
KILLREQ(moAirElemental, laWhirlwind);
}
if(l == laRuins)
KILLREQ(moSkeleton, laPalace);
if(l == laTrollheim) {
KILLREQ(moTroll, laCaves);
KILLREQ(moFjordTroll, laLivefjord);
KILLREQ(moDarkTroll, laDeadCaves);
KILLREQ(moStormTroll, laStorms);
KILLREQ(moForestTroll, laOvergrown);
KILLREQ(moRedTroll, laRedRock);
}
if(l == laZebra) TREQ2(U10, itFeather)
if(l == laCamelot || l == laPrincessQuest) if(l == laCamelot || l == laPrincessQuest)
s += XLAT("Completing the quest in this land is not necessary for the Hyperstone Quest."); s += XLAT("Completing the quest in this land is not necessary for the Hyperstone Quest.");

View File

@ -775,8 +775,6 @@ void moveMonster(cell *ct, cell *cf, int direction_hint);
int palaceHP(); int palaceHP();
void placeLocalOrbs(cell *c); void placeLocalOrbs(cell *c);
int elementalKills(); int elementalKills();
bool elementalUnlocked();
bool trollUnlocked();
bool isMultitile(eMonster m); bool isMultitile(eMonster m);
void checkFreedom(cell *cf); void checkFreedom(cell *cf);
int rosedist(cell *c); int rosedist(cell *c);
@ -1601,7 +1599,6 @@ static const int NO_LOVE = 8;
int gold(int no = 0); int gold(int no = 0);
int tkills(); int tkills();
bool hellUnlocked();
bool markOrb(eItem it); // mark the orb as 'used', return true if exists bool markOrb(eItem it); // mark the orb as 'used', return true if exists
bool markEmpathy(eItem it); // mark both the given orb and Empathy as 'used', return true if exists bool markEmpathy(eItem it); // mark both the given orb and Empathy as 'used', return true if exists

View File

@ -17,228 +17,9 @@ bool nodisplay(eMonster m) {
// returns: 2 = treasure increaser, 1 = just appears, 0 = does not appear // returns: 2 = treasure increaser, 1 = just appears, 0 = does not appear
int isNative(eLand l, eMonster m) { int isNative(eLand l, eMonster m) {
switch(l) { switch(l) {
case laIce: #define LAND(a,b,c,d,e,f,g) case c:
return (m == moWolf || m == moWolfMoved || m == moYeti) ? 2 : 0; #define NATIVE(x) return x;
#include "content.cpp"
case laJungle:
return (m == moIvyRoot || m == moMonkey) ? 2 :
(isIvy(m) || m == moEagle || m == moMonkey) ? 1 : 0;
case laCaves:
return (m == moGoblin || m == moTroll) ? 2 : m == moSeep ? 1 : 0;
case laDesert:
return (m == moDesertman || m == moWorm) ? 2 : 0;
case laAlchemist:
return (m == moSlime) ? 2 : 0;
case laMirror: case laMirrored: case laMirrorWall: case laMirrorWall2: case laMirrored2:
return (m == moMirrorSpirit || m == moNarciss || m == moMimic) ? 1 : 0;
case laMirrorOld:
return (m == moEagle || m == moRanger || m == moMimic) ? 1 : 0;
case laMotion:
return (m == moRunDog) ? 2 : 0;
case laGraveyard:
return (m == moZombie || m == moNecromancer) ? 2 :
m == moGhost ? 1 : 0;
case laRlyeh:
return
(m == moCultist || m == moTentacle || m == moPyroCultist) ? 2 :
(m == moCultistLeader || isIvy(m)) ? 1 : 0;
case laDryForest:
return (m == moHedge || m == moFireFairy) ? 2 : 0;
case laHell:
return (m == moLesser || m == moGreater) ? 2 : 0;
case laCocytus:
return (m == moShark || m == moGreaterShark || m == moCrystalSage) ? 2 :
m == moYeti ? 1 : 0;
case laCrossroads: case laCrossroads2: case laCrossroads3: case laCrossroads4:
case laCrossroads5:
case laNone: case laBarrier: case laOceanWall: case laCanvas: case laMemory:
return 0;
case laEmerald:
return (m == moFlailer || m == moLancer || m == moMiner) ? 2 :
m == moHedge ? 1 : 0;
case laWineyard:
return (m == moVineSpirit || m == moVineBeast) ? 2 : 0;
case laHive:
return isBug(m) ? 1 : 0;
case laDeadCaves:
return (m == moEarthElemental || m == moDarkTroll) ? 2 :
(m == moGoblin || m == moSeep) ? 1 : 0;
case laPower:
return (isWitch(m) || m == moEvilGolem) ? 1 : 0;
case laCamelot:
return (m == moKnight || m == moHedge || m == moFlailer || m == moLancer) ? 1 : 0;
case laTemple:
return (m == moTentacle || m == moCultist || m == moPyroCultist || m == moCultistLeader) ? 1 : 0;
case laCaribbean:
return (m == moPirate || m == moParrot || m == moCShark) ? 1 : 0;
case laRedRock: return (m == moRedTroll || m == moHexSnake) ? 2 : 0;
case laMinefield:
return (m == moBomberbird || m == moTameBomberbird) ? 1 : 0;
case laOcean:
return (m == moAlbatross) ? 2 : (m == moPirate || m == moCShark) ? 1 : 0;
case laWhirlpool:
return (m == moPirate || m == moCShark) ? 1 : 0;
case laPalace: case laPrincessQuest:
return (m == moPalace || m == moFatGuard || m == moSkeleton || m == moVizier) ? 2 :
m == moSkeleton ? 1 : 0;
case laLivefjord:
return m == moViking ? 2 : (m == moFjordTroll || m == moWaterElemental) ? 1 : 0;
case laIvoryTower:
return (m == moFamiliar || m == moGargoyle) ? 2 : 0;
case laZebra: return (m == moOrangeDog) ? 2 : 0;
case laEAir: case laEEarth: case laEWater: case laEFire:
case laElementalWall:
if(m == elementalOf(l) && m) return 2;
return (m == moAirElemental || m == moEarthElemental || m == moWaterElemental || m == moFireElemental) ? 1 : 0;
case laStorms:
return (m == moMetalBeast || m == moMetalBeast2 || m == moStormTroll) ? 1 : 0;
case laOvergrown:
return (m == moMutant || m == moForestTroll) ? 1 : 0;
case laWildWest:
return (m == moOutlaw) ? 2 : 0;
case laHalloween:
return (m == moGhost || m == moZombie || m == moWitch ||
m == moLesser || m == moGreater ||
m == moVampire || m == moDraugr ||
m == moSkeleton || m == moWitchFire ||
m == moFlailer || m == moPyroCultist ||
m == moFatGuard || m == moHedge ||
m == moLancer || m == moFireFairy ||
m == moBomberbird || m == moRatlingAvenger ||
m == moVineBeast || m == moDragonHead || m == moDragonTail) ? 1 : 0;
case laClearing:
return (m == moMutant || m == moRedFox) ? 1 : 0;
case laHaunted: case laHauntedWall: case laHauntedBorder:
return (m == moGhost || m == moFriendlyGhost) ? 1 : 0;
case laWhirlwind:
return (m == moAirElemental || m == moWindCrow) ? 2 : 0;
case laRose:
return (m == moFalsePrincess || m == moRoseBeauty || m == moRoseLady) ? 2 : 0;
case laWarpCoast: case laWarpSea:
return m == moRatling ? 2 : m == moRatlingAvenger ? 1 : 0;
case laDragon:
return (isDragon(m) || m == moFireElemental) ? 1 : 0;
case laEndorian:
return (m == moResearcher || m == moSparrowhawk) ? 2 : 0;
case laTortoise:
return m == moTortoise ? 1 : 0;
case laTrollheim:
return isTroll(m) ? 1 : 0;
case laKraken:
return m == moKrakenH ? 2 : (m == moViking || m == moKrakenT) ? 1 : 0;
case laBurial:
return m == moDraugr ? 1 : 0;
case laDungeon:
return
m == moBat ? 2 :
m == moSkeleton || m == moGhost ? 1 :
0;
case laMountain:
return
m == moEagle || m == moMonkey || isIvy(m) || m == moFriendlyIvy ? 1 : 0;
case laReptile:
return m == moReptile ? 1 : 0;
case laBull:
return (m == moSleepBull || m == moRagingBull || m == moButterfly || m == moGadfly) ? 1 : 0;
case laPrairie:
return (m == moRagingBull || m == moHerdBull || m == moGadfly) ? 1 : 0;
case laVolcano:
return (m == moLavaWolf || m == moSalamander) ? 2 : 0;
case laTerracotta: case laMercuryRiver:
return m == moJiangshi ? 2 : m == moTerraWarrior ? 1 : 0;
case laBlizzard:
return (m == moVoidBeast || m == moIceGolem) ? 2 : 0;
case laHunting:
return m == moHunterDog ? 1 : 0;
case laDual:
return m == moRatling ? 2 : 0;
case laSnakeNest:
return m == moHexSnake ? 2 : 0;
case laCA: return 0;
case laDocks:
return among(m, moRatling, moPirate, moCShark, moAlbatross, moFireFairy) ? 2 : 0;
case laSwitch:
return m == moSwitch1 || m == moSwitch2 ? 2 : 0;
case laRuins:
return among(m, moPair, moHexDemon, moAltDemon, moMonk, moCrusher) ? 2 :
m == moSkeleton ? 1 : 0;
case laVariant:
return
m == moVariantWarrior ? 2 :
among(m, moMonk, moCrusher, moSkeleton, moHedge, moLancer, moFlailer, moCultist, moPyroCultist, moNecromancer, moGhost, moZombie, moRatling) ? 1 :
isIvy(m) ? 1 : 0;
case laWestWall:
return among(m, moWestHawk, moFallingDog) ? 2 : 0;
case laBrownian:
return among(m, moBrownBug, moAcidBird) ? 2 : 0;
case laMagnetic:
return isMagneticPole(m) ? 2 : 0;
case laAsteroids:
return m == moAsteroid ? 2 : 0;
case landtypes: return 0; case landtypes: return 0;
} }
@ -299,10 +80,6 @@ bool landUnlockedRPM(eLand n) {
return false; return false;
} }
int variant_unlock() {
return items[itRuins] + items[itEmerald] + items[itBone];
}
int variant_unlock_value() { int variant_unlock_value() {
return inv::on ? 75 : 30; return inv::on ? 75 : 30;
} }
@ -312,161 +89,29 @@ bool landUnlocked(eLand l) {
return landUnlockedRPM(l); return landUnlockedRPM(l);
} }
back:
switch(l) { switch(l) {
case laOvergrown: #define LAND(a,b,c,d,e,f,g) case c:
return gold() >= R60 && items[itRuby] >= U10; #define REQ(x) x return true;
#define REQAS(x,y) l = x; goto back;
#define GOLD(x) if(gold() < x) return false;
#define ITEMS(kind, number) if(items[kind] < number) return false;
#define NEVER if(1) return false;
#define ALWAYS ;
#define KILLS(x) if(tkills() < x) return false;
#define KILL(x, where) if(!kills[x]) return false;
#define AKILL(x, where) if(kills[x]) return true;
#define ORD(a, b) a b
#define NUMBER(val, required, description) if(val < required) return false;
#define COND(x,y) if(!(x)) return false;
#define ITEMS_TOTAL(list, z) { int total = 0; for(eItem x: list) total += items[x]; if(total < z) return false; }
#define ACCONLY(x)
#define ACCONLY2(x,y)
#define ACCONLYF(x)
#include "content.cpp"
case laStorms: case laWhirlwind: case landtypes: return false;
return gold() >= R60;
case laWildWest: case laHalloween: case laAsteroids:
return false;
case laIce: case laJungle: case laCaves: case laDesert:
case laMotion: case laCrossroads: case laAlchemist:
return true;
case laMirror: case laMinefield: case laPalace:
case laOcean: case laLivefjord: case laMirrored: case laMirrorWall: case laMirrorWall2:
case laDocks:
case laMirrored2:
return gold() >= R30;
case laCaribbean: case laWhirlpool:
return gold() >= R30;
case laRlyeh: case laDryForest: case laWineyard: case laCrossroads2:
return gold() >= R60;
case laDeadCaves:
return gold() >= R60 && items[itGold] >= U10;
case laGraveyard:
return tkills() >= R100;
case laHive:
return tkills() >= R100 && gold() >= R60;
case laRedRock:
return gold() >= R60 && items[itSpice] >= U10;
case laEmerald:
return (items[itFernFlower] >= U5 && items[itGold] >= U5) || kills[moVizier];
case laCamelot:
return items[itEmerald] >= U5;
case laHell: case laCrossroads3:
return hellUnlocked();
case laPower:
return items[itHell] >= U10;
case laCocytus:
return items[itHell] >= U10 && items[itDiamond] >= U10;
case laTemple:
return items[itStatue] >= U5;
case laClearing:
return items[itMutant] >= U5;
case laIvoryTower: return gold() >= R30;
case laZebra: return gold() >= R30 && items[itFeather] >= U10;
case laEAir: case laEEarth: case laEWater: case laEFire: case laElementalWall:
return elementalUnlocked();
case laBarrier: case laNone: case laOceanWall: case laCanvas: case laCA: case laMemory:
return false;
case laMirrorOld:
return false;
case laHaunted: case laHauntedWall: case laHauntedBorder:
return items[itBone] >= U10;
case laPrincessQuest: return kills[moVizier] && !shmup::on && multi::players == 1;
case laRose:
return gold() >= R90;
case laWarpCoast: case laWarpSea:
return gold() >= R30;
case laCrossroads4:
return gold() >= R200;
case laEndorian:
return items[itIvory] >= U10;
case laTortoise:
return tortoise::seek();
case laDragon:
return killtypes() >= R20;
case laKraken:
return items[itFjord] >= U10;
case laBurial:
return items[itKraken] >= U10;
case laTrollheim:
return trollUnlocked();
case laDungeon:
return items[itPalace] >= U5 && items[itIvory] >= U5;
case laMountain:
return items[itRuby] >= U5 && items[itIvory] >= U5;
case laReptile:
return gold() >= R30 && items[itElixir] >= U10;
case laPrairie:
case laBull:
return gold() >= R90;
case laVolcano:
return gold() >= R60 && items[itElixir] >= U10;
case laHunting:
return true;
case laTerracotta: case laMercuryRiver:
return gold() >= R90;
case laBlizzard:
return items[itDiamond] >= U5 && items[itWindstone] >= U5;
case laCrossroads5:
return gold() >= R300;
case laDual:
case laSnakeNest:
return gold() >= R90;
case laSwitch:
return gold() >= R30 && items[itElixir] >= U10;
case laRuins:
return kills[moSkeleton];
case laBrownian:
return gold() >= R30;
case laWestWall:
return items[itFeather] >= 5 && items[itIvory] >= 5;
case laVariant:
return variant_unlock() >= variant_unlock_value();
case laMagnetic:
return false; // not implemented
case landtypes:
return false;
} }
return false; return false;
} }
@ -531,17 +176,6 @@ int elementalKills() {
kills[moAirElemental] + kills[moWaterElemental] + kills[moEarthElemental] + kills[moFireElemental]; kills[moAirElemental] + kills[moWaterElemental] + kills[moEarthElemental] + kills[moFireElemental];
} }
bool elementalUnlocked() {
return
kills[moAirElemental] && kills[moWaterElemental] && kills[moEarthElemental] && kills[moFireElemental];
}
bool trollUnlocked() {
return
kills[moTroll] && kills[moDarkTroll] && kills[moRedTroll] &&
kills[moStormTroll] && kills[moForestTroll] && kills[moFjordTroll];
}
eLand randomElementalLandWeighted() { eLand randomElementalLandWeighted() {
int i = hrand(elementalKills()); int i = hrand(elementalKills());
i -= kills[moAirElemental]; if(i<0) return laEAir; i -= kills[moAirElemental]; if(i<0) return laEAir;
@ -804,7 +438,7 @@ eLand getNewLand(eLand old) {
if(items[itIvory] >= U5 && !generatingEquidistant && items[itFeather] >= U5) if(items[itIvory] >= U5 && !generatingEquidistant && items[itFeather] >= U5)
tab[cnt++] = laWestWall; tab[cnt++] = laWestWall;
if(variant_unlock() >= variant_unlock_value()) { if(landUnlocked(laVariant)) {
tab[cnt++] = laVariant; tab[cnt++] = laVariant;
if(old == laRuins) LIKELY tab[cnt++] = laVariant; if(old == laRuins) LIKELY tab[cnt++] = laVariant;
if(old == laGraveyard) LIKELY tab[cnt++] = laVariant; if(old == laGraveyard) LIKELY tab[cnt++] = laVariant;
@ -837,7 +471,7 @@ eLand getNewLand(eLand old) {
if(old == laReptile) LIKELY tab[cnt++] = laDragon; if(old == laReptile) LIKELY tab[cnt++] = laDragon;
} }
if(trollUnlocked()) { if(landUnlocked(laTrollheim)) {
tab[cnt++] = laTrollheim; tab[cnt++] = laTrollheim;
if(isTrollLand(old)) LIKELY tab[cnt++] = laTrollheim; if(isTrollLand(old)) LIKELY tab[cnt++] = laTrollheim;
if(old == laTrollheim) for(int i=0; i<landtypes; i++) { if(old == laTrollheim) for(int i=0; i<landtypes; i++) {
@ -846,7 +480,7 @@ eLand getNewLand(eLand old) {
} }
} }
if(elementalUnlocked()) { if(landUnlocked(laElementalWall)) {
tab[cnt++] = randomElementalLandWeighted(); tab[cnt++] = randomElementalLandWeighted();
if(old == laDragon) LIKELY tab[cnt++] = laEFire; if(old == laDragon) LIKELY tab[cnt++] = laEFire;
@ -862,7 +496,7 @@ eLand getNewLand(eLand old) {
if(old == laEAir) LIKELY tab[cnt++] = laWhirlwind; if(old == laEAir) LIKELY tab[cnt++] = laWhirlwind;
} }
if(hellUnlocked()) { if(landUnlocked(laHell)) {
if(!generatingEquidistant && old != laPrairie) tab[cnt++] = laCrossroads3; if(!generatingEquidistant && old != laPrairie) tab[cnt++] = laCrossroads3;
tab[cnt++] = laHell; tab[cnt++] = laHell;
} }

View File

@ -26,7 +26,7 @@ void showOverview() {
mouseovers += " "; mouseovers += " ";
mouseovers += XLAT(" kills: %1/%2", its(tkills()), its(killtypes())); mouseovers += XLAT(" kills: %1/%2", its(tkills()), its(killtypes()));
mouseovers += XLAT(" $$$: %1", its(gold())); mouseovers += XLAT(" $$$: %1", its(gold()));
if(hellUnlocked()) { if(landUnlocked(laHell)) {
int i1, i2; countHyperstoneQuest(i1, i2); int i1, i2; countHyperstoneQuest(i1, i2);
mouseovers += XLAT(" Hyperstone: %1/%2", its(i1), its(i2)); mouseovers += XLAT(" Hyperstone: %1/%2", its(i1), its(i2));
} }

View File

@ -360,10 +360,6 @@ int orbsUnlocked() {
return i; return i;
} }
bool hellUnlocked() {
return orbsUnlocked() >= 9;
}
ld orbprizefun(int tr) { ld orbprizefun(int tr) {
if(tactic::on) return 1; if(tactic::on) return 1;
if(tr < 10) return 0; if(tr < 10) return 0;

View File

@ -334,7 +334,7 @@ void showMission() {
dialog::addInfo(XLAT("Collect %1 $$$ to access more worlds", its(R30))); dialog::addInfo(XLAT("Collect %1 $$$ to access more worlds", its(R30)));
else if(gold() < R60) else if(gold() < R60)
dialog::addInfo(XLAT("Collect %1 $$$ to access even more lands", its(R60))); dialog::addInfo(XLAT("Collect %1 $$$ to access even more lands", its(R60)));
else if(!hellUnlocked()) else if(!landUnlocked(laHell))
dialog::addInfo(XLAT("Collect at least %1 treasures in each of 9 types to access Hell", its(R10))); dialog::addInfo(XLAT("Collect at least %1 treasures in each of 9 types to access Hell", its(R10)));
else if(items[itHell] < R10) else if(items[itHell] < R10)
dialog::addInfo(XLAT("Collect at least %1 Demon Daisies to find the Orbs of Yendor", its(R10))); dialog::addInfo(XLAT("Collect at least %1 Demon Daisies to find the Orbs of Yendor", its(R10)));
@ -363,7 +363,7 @@ void showMission() {
dialog::addInfo(XLAT("Kill a Vizier in the Palace to access Emerald Mine")); dialog::addInfo(XLAT("Kill a Vizier in the Palace to access Emerald Mine"));
else if(items[itEmerald] < U5) else if(items[itEmerald] < U5)
dialog::addInfo(XLAT("Collect 5 Emeralds to access Camelot")); dialog::addInfo(XLAT("Collect 5 Emeralds to access Camelot"));
else if(hellUnlocked() && !chaosmode) { else if(landUnlocked(laHell) && !chaosmode) {
eLand l = nextHyperstone(); eLand l = nextHyperstone();
if(l) if(l)
dialog::addInfo( dialog::addInfo(