diff --git a/content.cpp b/content.cpp index 14540d29..5fdd058c 100644 --- a/content.cpp +++ b/content.cpp @@ -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 diff --git a/game.cpp b/game.cpp index 6f716e45..e8d2a19d 100644 --- a/game.cpp +++ b/game.cpp @@ -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; ilandparam; 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!")); } diff --git a/help.cpp b/help.cpp index 662e4dc3..7fa913bb 100644 --- a/help.cpp +++ b/help.cpp @@ -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{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."); diff --git a/hyper.h b/hyper.h index 4431d8f8..82e44d2a 100644 --- a/hyper.h +++ b/hyper.h @@ -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 diff --git a/landlock.cpp b/landlock.cpp index 71a3713f..f9e5440b 100644 --- a/landlock.cpp +++ b/landlock.cpp @@ -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= 9; - } - ld orbprizefun(int tr) { if(tactic::on) return 1; if(tr < 10) return 0; diff --git a/quit.cpp b/quit.cpp index af4207ed..570e3dd3 100644 --- a/quit.cpp +++ b/quit.cpp @@ -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(