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)
#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( '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, "")
NATIVE(0)
REQ(NEVER)
LAND( 0xC06000, "Great Wall" , laBarrier, ZERO | LF_TECHNICAL, itNone, RESERVED, "")
NATIVE(0)
REQ(NEVER)
LAND( 0xFF0000, "Crossroads" , laCrossroads, ZERO, itHyperstone, RESERVED,
"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"
@ -1054,51 +1069,104 @@ LAND( 0xFF0000, "Crossroads" , laCrossroads, ZERO, itHyperstone, RESERVED,
"A special treasure, Hyperstone, can be found on the Crossroads, but only "
"after you have found 10 of every other treasure."
)
NATIVE(0)
REQ(ALWAYS)
LAND( 0xCDA98F, "Desert", laDesert, ZERO, itSpice, RESERVED,
"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,
"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."
)
NATIVE((m == moWolf || m == moWolfMoved || m == moYeti) ? 2 : 0)
REQ(ALWAYS)
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,
"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)
NATIVE((m == moSlime) ? 2 : 0)
REQ(ALWAYS)
LAND( 0x704070, "Hall of Mirrors", laMirror, ZERO | LF_MIRROR, itShard, RESERVED,
"A strange land filled with mirrors. "
"Break magic mirrors and mirage clouds to "
"gain treasures and helpful Mimics."
)
NATIVE((m == moMirrorSpirit || m == moNarciss || m == moMimic) ? 1 : 0)
REQ(GOLD(R30))
LAND( 0x404070, "Graveyard", laGraveyard, ZERO, itBone, RESERVED,
"All the monsters you kill are carried to this strange land, and buried. "
"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,
"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."
)
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,
"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,
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,
"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 "
"the floor.\n"
)
NATIVE((m == moRunDog) ? 2 : 0)
REQ(ALWAYS)
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,
"Evil people are mining for emeralds in this living cave. "
"It does not grow naturally, but it is dug out in a regular "
"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)
NATIVE((m == moVineSpirit || m == moVineBeast) ? 2 : 0)
REQ(GOLD(R60))
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)
NATIVE(isBug(m) ? 1 : 0)
REQ(KILLS(R100) GOLD(R60))
LAND( 0xFFFF00, "Land of Power", laPower, ZERO, itPower, RESERVED,
"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 "
@ -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 "
"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 )
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 )
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,
"An alternate layout of the Crossroads. It is more dense and more regular, "
"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)
NATIVE((m == moPirate || m == moParrot || m == moCShark) ? 1 : 0)
REQAS(laOcean,)
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)
NATIVE((m == moBomberbird || m == moTameBomberbird) ? 1 : 0)
REQ(GOLD(R30))
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 also take one of the boats and venture into the Ocean, "
"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,
"Many lost boats are spinning in this whirlpool. Some of them contain treasures "
"and Pirates.\n\n"
"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."
)
NATIVE((m == moPirate || m == moCShark) ? 1 : 0)
REQAS(laOcean, ACCONLY(laOcean))
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,
"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. "
@ -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 "
"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 "
"experiments in peace and solitude. They have changed the direction of gravity, "
"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 "
"no cell immediately below them which contains a wall. It is impossible to move "
"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.")
NATIVE((m == moOrangeDog) ? 2 : 0)
REQ(GOLD(R30) ITEMS(itFeather, U10))
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)
NATIVE(isNative(laElementalWall, m))
REQAS(laElementalWall,)
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)
NATIVE(isNative(laElementalWall, m))
REQAS(laElementalWall,)
LAND( 0x4040FF, "Crossroads III", laCrossroads3, ZERO, itHyperstone, RESERVED,
"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.")
// REQAS(laOcean,)
REQ(NEVER)
NATIVE(0)
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.")
NATIVE(0)
REQ(NEVER)
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)
NATIVE((m == moOutlaw) ? 2 : 0)
REQ( NEVER )
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)
NATIVE((m == moMutant || m == moForestTroll) ? 1 : 0)
REQ( GOLD(R60) ITEMS(itRuby, U10) )
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)
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)
NATIVE(isNative(laHaunted, m))
REQAS(laHaunted,)
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)
NATIVE((m == moAirElemental || m == moWindCrow) ? 2 : 0)
REQ( GOLD(R60) )
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)
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)
NATIVE(isNative(laWarpCoast, m))
REQAS(laWarpCoast,)
LAND( 0xC08080, "Crossroads IV", laCrossroads4, ZERO, itHyperstone, RESERVED,
"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,
"This forest was planted by one of the wizards from the Ivory Tower "
"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)
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)
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,
"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 "
@ -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 "
"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,
"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. "
"You will need to use a magical weapon spell to defeat them, and to rob the "
"ancient jewelry buried in the graves."
)
NATIVE(m == moDraugr ? 1 : 0)
REQ(ITEMS(itBarrow, U10))
LAND( 0x90A548, "Trollheim", laTrollheim, ZERO, itTrollEgg, RESERVED,
"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 "
"elderly Trolls, who have petrified upon death. Or maybe you have killed "
"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)
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,
"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,
"Gravitational anomalies in the Jungle create mountains "
"overgrown with ivies and bushes. "
"Will you dare to climb the ivies to get the amethysts hidden above?\n\n"
"Cells adjacent to Ivies count as stable (but 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)
NATIVE(m == moReptile ? 1 : 0)
REQ(GOLD(R30) ITEMS(itElixir, U10))
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)
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")
NATIVE(0)
REQ(GOLD(R300))
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)
NATIVE(isNative(laMirror, m))
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)
NATIVE(isNative(laMirror, m))
REQAS(laMirror,)
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,
"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)
NATIVE((m == moLavaWolf || m == moSalamander) ? 2 : 0)
REQ(GOLD(R60) ITEMS(itElixir, U10))
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)
NATIVE(m == moHunterDog ? 1 : 0)
REQ(ALWAYS)
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)
NATIVE(isNative(laTerracotta, m))
REQAS(laTerracotta,)
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)
NATIVE(m == moHexSnake ? 2 : 0)
REQ(GOLD(R90))
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)
NATIVE(m == moSwitch1 || m == moSwitch2 ? 2 : 0)
REQ(KILL(moSkeleton, laPalace))
LAND( 0x306030, "Magnetosphere", laMagnetic, ZERO, itMagnet, RESERVED, NODESCYET)
NATIVE(isMagneticPole(m) ? 2 : 0)
REQ(NEVER)
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,
"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 "
"somehow. In the meantime, its memory has been cleared, since the 'remove faraway cells from the memory'"
" option was on."
)
NATIVE(0)
REQ(NEVER)
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... "
"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 "
"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,
"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..."
)
NATIVE(among(m, moWestHawk, moFallingDog) ? 2 : 0)
REQ(ITEMS(itFeather, 5) ITEMS(itIvory, 5))
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, "
"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 "
"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
LAND( 0x202020, "Space Rocks", laAsteroids, ZERO, itAsteroid, RESERVED, rock_description)
ITEM( '!', 0xFFD0D0, "Fuel", itAsteroid, IC_TREASURE, ZERO, RESERVED, osNone, rock_description)
MONSTER('A', 0x606040, "Space Rock", moAsteroid, ZERO, RESERVED, moAsteroid, rock_description)
NATIVE(m == moAsteroid ? 2 : 0)
REQ( NEVER )
//shmupspecials
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 WALL
#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;
}
bool eu = elementalUnlocked();
bool tu = trollUnlocked();
bool eu = landUnlocked(laElementalWall);
bool tu = landUnlocked(laTrollheim);
if(flags & AF_MSG) fightmessage(m, killer, dostun, flags);
if(dostun)
@ -2573,12 +2573,12 @@ bool attackMonster(cell *c, flagtype flags, eMonster killer) {
if(tk < R100 && ntk >= R100 && !euclid && !sphere)
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");
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));
if(m == moVizier && c->monst != moVizier && kills[moVizier] == 1) {
@ -7063,7 +7063,7 @@ bool collectItem(cell *c2, bool telekinesis) {
halloween::getTreat(c2);
}
else {
bool lhu = hellUnlocked();
bool lhu = landUnlocked(laHell);
if(c2->item == itBarrow)
for(int i=0; i<c2->landparam; i++) 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..."));
IF(R10 * 9)
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("And the Orbs of Yendor await!"));
}

151
help.cpp
View File

@ -561,6 +561,36 @@ string generateHelpForMonster(eMonster m) {
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 s = helptitle(XLATN(linf[l].name), linf[l].color);
@ -571,21 +601,8 @@ string generateHelpForLand(eLand l) {
if(l == laMinefield) addMinefieldExplanation(s);
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);
#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)
add_reqs(l, s);
if(l == laPower && inv::on)
help += XLAT(
@ -601,112 +618,6 @@ string generateHelpForLand(eLand l) {
if(isPureSealand(l))
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)
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();
void placeLocalOrbs(cell *c);
int elementalKills();
bool elementalUnlocked();
bool trollUnlocked();
bool isMultitile(eMonster m);
void checkFreedom(cell *cf);
int rosedist(cell *c);
@ -1601,7 +1599,6 @@ static const int NO_LOVE = 8;
int gold(int no = 0);
int tkills();
bool hellUnlocked();
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

View File

@ -17,228 +17,9 @@ bool nodisplay(eMonster m) {
// returns: 2 = treasure increaser, 1 = just appears, 0 = does not appear
int isNative(eLand l, eMonster m) {
switch(l) {
case laIce:
return (m == moWolf || m == moWolfMoved || m == moYeti) ? 2 : 0;
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;
#define LAND(a,b,c,d,e,f,g) case c:
#define NATIVE(x) return x;
#include "content.cpp"
case landtypes: return 0;
}
@ -299,10 +80,6 @@ bool landUnlockedRPM(eLand n) {
return false;
}
int variant_unlock() {
return items[itRuins] + items[itEmerald] + items[itBone];
}
int variant_unlock_value() {
return inv::on ? 75 : 30;
}
@ -312,161 +89,29 @@ bool landUnlocked(eLand l) {
return landUnlockedRPM(l);
}
back:
switch(l) {
case laOvergrown:
return gold() >= R60 && items[itRuby] >= U10;
case laStorms: case laWhirlwind:
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;
#define LAND(a,b,c,d,e,f,g) case c:
#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 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;
case landtypes: return false;
}
return false;
}
@ -531,17 +176,6 @@ int elementalKills() {
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() {
int i = hrand(elementalKills());
i -= kills[moAirElemental]; if(i<0) return laEAir;
@ -804,7 +438,7 @@ eLand getNewLand(eLand old) {
if(items[itIvory] >= U5 && !generatingEquidistant && items[itFeather] >= U5)
tab[cnt++] = laWestWall;
if(variant_unlock() >= variant_unlock_value()) {
if(landUnlocked(laVariant)) {
tab[cnt++] = laVariant;
if(old == laRuins) 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(trollUnlocked()) {
if(landUnlocked(laTrollheim)) {
tab[cnt++] = laTrollheim;
if(isTrollLand(old)) LIKELY tab[cnt++] = laTrollheim;
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();
if(old == laDragon) LIKELY tab[cnt++] = laEFire;
@ -862,7 +496,7 @@ eLand getNewLand(eLand old) {
if(old == laEAir) LIKELY tab[cnt++] = laWhirlwind;
}
if(hellUnlocked()) {
if(landUnlocked(laHell)) {
if(!generatingEquidistant && old != laPrairie) tab[cnt++] = laCrossroads3;
tab[cnt++] = laHell;
}

View File

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

View File

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

View File

@ -334,7 +334,7 @@ void showMission() {
dialog::addInfo(XLAT("Collect %1 $$$ to access more worlds", its(R30)));
else if(gold() < 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)));
else if(items[itHell] < 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"));
else if(items[itEmerald] < U5)
dialog::addInfo(XLAT("Collect 5 Emeralds to access Camelot"));
else if(hellUnlocked() && !chaosmode) {
else if(landUnlocked(laHell) && !chaosmode) {
eLand l = nextHyperstone();
if(l)
dialog::addInfo(