module Content.ModeKind
( content
) where
import Prelude ()
import Game.LambdaHack.Core.Prelude
import Content.ModeKindPlayer
import Game.LambdaHack.Content.CaveKind (CaveKind)
import Game.LambdaHack.Content.ModeKind
import Game.LambdaHack.Core.Dice
import Game.LambdaHack.Definition.Defs
content :: [ModeKind]
content =
[raid, brawl, shootout, hunt, escape, zoo, ambush, crawl, crawlEmpty, crawlSurvival, dig, see, safari, safariSurvival, battle, battleDefense, battleSurvival, defense, defenseEmpty, screensaverRaid, screensaverBrawl, screensaverShootout, screensaverHunt, screensaverEscape, screensaverZoo, screensaverAmbush, screensaverCrawl, screensaverSafari]
raid, brawl, shootout, hunt, escape, zoo, ambush, crawl, crawlEmpty, crawlSurvival, dig, see, safari, safariSurvival, battle, battleDefense, battleSurvival, defense, defenseEmpty, screensaverRaid, screensaverBrawl, screensaverShootout, screensaverHunt, screensaverEscape, screensaverZoo, screensaverAmbush, screensaverCrawl, screensaverSafari :: ModeKind
raid = ModeKind
{ msymbol = 'r'
, mname = "raid (1)"
, mfreq = [("raid", 1), ("campaign scenario", 1)]
, mroster = rosterRaid
, mcaves = cavesRaid
, mendMsg = [ (Killed, "This expedition has gone wrong. However, scientific mind does not despair, but analyzes and corrects. Did you perchance awake one animal too many? Did you remember to try using all consumables at your disposal for your immediate survival? Did you choose a challenge with difficulty level within your means? Answer honestly, ponder wisely, experiment methodically.")
, (Defeated, "Sadly, the other team snatched the grant, while you were busy contemplating natural phenomena. Science is a competitive sport, as sad as it sounds. It's not enough to make a discovery, you have to get there first.")
, (Escape, "You've got hold of the machine! Think of the hours of fun taking it apart and putting it back together again! That's a great first step on your quest to solve the typing problems of the world.") ]
, mdesc = "An incredibly advanced typing machine worth 100 gold is buried at the exit of this maze. Be the first to find it and fund a research team that makes typing accurate and dependable forever."
}
brawl = ModeKind
{ msymbol = 'k'
, mname = "brawl (2)"
, mfreq = [("brawl", 1), ("campaign scenario", 1)]
, mroster = rosterBrawl
, mcaves = cavesBrawl
, mendMsg = []
, mdesc = "Your engineering team disagrees over a drink with some gentlemen scientists about premises of a relative completeness theorem and there's only one way to settle that. Remember to keep your party together, or the opposing team might be tempted to gang upon a solitary disputant."
}
shootout = ModeKind
{ msymbol = 's'
, mname = "shootout (3)"
, mfreq = [("shootout", 1), ("campaign scenario", 1)]
, mroster = rosterShootout
, mcaves = cavesShootout
, mendMsg = []
, mdesc = "Whose arguments are most striking and whose ideas fly fastest? Let's scatter up, attack the problems from different angles and find out. (To display the trajectory of any soaring entity, point it with the crosshair in aiming mode.)"
}
hunt = ModeKind
{ msymbol = 'h'
, mname = "hunt (4)"
, mfreq = [("hunt", 1), ("campaign scenario", 1)]
, mroster = rosterHunt
, mcaves = cavesHunt
, mendMsg = []
, mdesc = "Who is the hunter and who is the prey?"
}
escape = ModeKind
{ msymbol = 'e'
, mname = "escape (5)"
, mfreq = [("escape", 1), ("campaign scenario", 1)]
, mroster = rosterEscape
, mcaves = cavesEscape
, mendMsg = []
, mdesc = "Dwelling into dark matters is dangerous, so avoid the crowd of firebrand disputants, catch any gems of thought, find a way out and bring back a larger team to shed new light on the field."
}
zoo = ModeKind
{ msymbol = 'b'
, mname = "zoo (6)"
, mfreq = [("zoo", 1), ("campaign scenario", 1)]
, mroster = rosterZoo
, mcaves = cavesZoo
, mendMsg = []
, mdesc = "The heat of the dispute reaches the nearby Wonders of Science and Nature exhibition, igniting greenery, nets and cages. Crazed animals must be dissuaded from ruining precious scientific equipment and setting back the otherwise fruitful exchange of ideas."
}
ambush = ModeKind
{ msymbol = 'm'
, mname = "ambush (7)"
, mfreq = [("ambush", 1), ("campaign scenario", 1)]
, mroster = rosterAmbush
, mcaves = cavesAmbush
, mendMsg = []
, mdesc = "Prevent hijacking of your ideas at all cost! Be stealthy, be observant, be aggressive. Fast execution is what makes or breaks a creative team."
}
crawl = ModeKind
{ msymbol = 'c'
, mname = "crawl (long)"
, mfreq = [("crawl", 1), ("campaign scenario", 1)]
, mroster = rosterCrawl
, mcaves = cavesCrawl
, mendMsg = [ (Killed, "To think that followers of science and agents of enlightenment would earn death as their reward! Where did we err in our ways? Perhaps nature should not have been disturbed so brashly and the fell beasts woken up from their slumber so eagerly? Perhaps the gathered items should have been used for scientific experiments on the spot rather than hoarded as if of base covetousness? Or perhaps the challenge, chosen freely but without the foreknowledge of the grisly difficulty, was insurmountable and forlorn from the start, despite the enormous power of educated reason at out disposal?")
, (Escape, "It's better to live to tell the tale than to choke on more than one can swallow. There was no more exquisite cultural artifacts and glorious scientific wonders in these forbidding tunnels anyway. Or were there?") ]
, mdesc = "Enjoy the peaceful seclusion of these cold austere tunnels, but don't let wanton curiosity, greed and the ever-creeping abstraction madness keep you down there for too long. If you find survivors (whole or perturbed or segmented) of the past scientific missions, exercise extreme caution and engage or ignore at your discretion."
}
safari = ModeKind
{ msymbol = 'f'
, mname = "safari"
, mfreq = [("safari", 1)]
, mroster = rosterSafari
, mcaves = cavesSafari
, mendMsg = []
, mdesc = "\"In this enactment you'll discover the joys of hunting the most exquisite of Earth's flora and fauna, both animal and semi-intelligent. Exit at the bottommost level.\" This is a drama script recovered from a monster nest debris."
}
dig = ModeKind
{ msymbol = 'd'
, mname = "dig"
, mfreq = [("dig", 1)]
, mroster = rosterCrawlEmpty
, mcaves = cavesDig
, mendMsg = []
, mdesc = "Delve deeper!"
}
see = ModeKind
{ msymbol = 'a'
, mname = "see"
, mfreq = [("see", 1)]
, mroster = rosterCrawlEmpty
, mcaves = cavesSee
, mendMsg = []
, mdesc = "See all!"
}
crawlEmpty = ModeKind
{ msymbol = 'c'
, mname = "crawl empty"
, mfreq = [("crawl empty", 1)]
, mroster = rosterCrawlEmpty
, mcaves = cavesCrawl
, mendMsg = []
, mdesc = "Enjoy the free space."
}
crawlSurvival = ModeKind
{ msymbol = 'd'
, mname = "crawl survival"
, mfreq = [("crawl survival", 1)]
, mroster = rosterCrawlSurvival
, mcaves = cavesCrawl
, mendMsg = []
, mdesc = "Lure the human intruders deeper and deeper."
}
safariSurvival = ModeKind
{ msymbol = 'u'
, mname = "safari survival"
, mfreq = [("safari survival", 1)]
, mroster = rosterSafariSurvival
, mcaves = cavesSafari
, mendMsg = []
, mdesc = "In this enactment you'll discover the joys of being hunted among the most exquisite of Earth's flora and fauna, both animal and semi-intelligent."
}
battle = ModeKind
{ msymbol = 'b'
, mname = "battle"
, mfreq = [("battle", 1)]
, mroster = rosterBattle
, mcaves = cavesBattle
, mendMsg = []
, mdesc = "Odds are stacked against those that unleash the horrors of abstraction."
}
battleDefense = ModeKind
{ msymbol = 'f'
, mname = "battle defense"
, mfreq = [("battle defense", 1)]
, mroster = rosterBattleDefense
, mcaves = cavesBattle
, mendMsg = []
, mdesc = "Odds are stacked for those that breathe mathematics."
}
battleSurvival = ModeKind
{ msymbol = 'i'
, mname = "battle survival"
, mfreq = [("battle survival", 1)]
, mroster = rosterBattleSurvival
, mcaves = cavesBattle
, mendMsg = []
, mdesc = "Odds are stacked for those that ally with the strongest."
}
defense = ModeKind
{ msymbol = 'e'
, mname = "defense"
, mfreq = [("defense", 1)]
, mroster = rosterDefense
, mcaves = cavesCrawl
, mendMsg = []
, mdesc = "Don't let human interlopers defile your abstract secrets and flee unpunished!"
}
defenseEmpty = ModeKind
{ msymbol = 'e'
, mname = "defense empty"
, mfreq = [("defense empty", 1)]
, mroster = rosterDefenseEmpty
, mcaves = cavesCrawl
, mendMsg = []
, mdesc = "Lord over."
}
screensave :: AutoLeader -> Roster -> Roster
screensave auto r =
let f [] = []
f ((player, initial) : rest) =
(player {fleaderMode = LeaderAI auto}, initial) : rest
in r {rosterList = f $ rosterList r}
screensaverRaid = raid
{ mname = "auto-raid (1)"
, mfreq = [("starting", 1), ("no confirms", 1)]
, mroster = screensave (AutoLeader False False) rosterRaid
}
screensaverBrawl = brawl
{ mname = "auto-brawl (2)"
, mfreq = [("no confirms", 1)]
, mroster = screensave (AutoLeader False False) rosterBrawl
}
screensaverShootout = shootout
{ mname = "auto-shootout (3)"
, mfreq = [("starting", 1), ("no confirms", 1)]
, mroster = screensave (AutoLeader False False) rosterShootout
}
screensaverHunt = hunt
{ mname = "auto-hunt (4)"
, mfreq = [("starting", 1), ("no confirms", 1)]
, mroster = screensave (AutoLeader False False) rosterHunt
}
screensaverEscape = escape
{ mname = "auto-escape (5)"
, mfreq = [("starting", 1), ("no confirms", 1)]
, mroster = screensave (AutoLeader False False) rosterEscape
}
screensaverZoo = zoo
{ mname = "auto-zoo (6)"
, mfreq = [("no confirms", 1)]
, mroster = screensave (AutoLeader False False) rosterZoo
}
screensaverAmbush = ambush
{ mname = "auto-ambush (7)"
, mfreq = [("no confirms", 1)]
, mroster = screensave (AutoLeader False False) rosterAmbush
}
screensaverCrawl = crawl
{ mname = "auto-crawl (long)"
, mfreq = [("no confirms", 1)]
, mroster = screensave (AutoLeader False False) rosterCrawl
}
screensaverSafari = safari
{ mname = "auto-safari"
, mfreq = [("starting", 1), ("no confirms", 1)]
, mroster =
screensave (AutoLeader False True) rosterSafari
}
rosterRaid, rosterBrawl, rosterShootout, rosterHunt, rosterEscape, rosterZoo, rosterAmbush, rosterCrawl, rosterCrawlEmpty, rosterCrawlSurvival, rosterSafari, rosterSafariSurvival, rosterBattle, rosterBattleDefense, rosterBattleSurvival, rosterDefense, rosterDefenseEmpty :: Roster
rosterRaid = Roster
{ rosterList = [ ( playerHero {fhiCondPoly = hiHeroShort}
, [(-2, 1, "hero")] )
, ( playerAntiHero { fname = "Indigo Founder"
, fhiCondPoly = hiHeroShort }
, [(-2, 1, "hero")] )
, ( playerAnimal
, [(-2, 2, "animal")] )
, (playerHorror, []) ]
, rosterEnemy = [ ("Explorer", "Animal Kingdom")
, ("Explorer", "Horror Den")
, ("Indigo Founder", "Animal Kingdom")
, ("Indigo Founder", "Horror Den") ]
, rosterAlly = [] }
rosterBrawl = Roster
{ rosterList = [ ( playerHero { fcanEscape = False
, fhiCondPoly = hiHeroMedium }
, [(-3, 3, "hero")] )
, ( playerAntiHero { fname = "Indigo Researcher"
, fcanEscape = False
, fhiCondPoly = hiHeroMedium }
, [(-3, 3, "hero")] )
, (playerHorror, []) ]
, rosterEnemy = [ ("Explorer", "Indigo Researcher")
, ("Explorer", "Horror Den")
, ("Indigo Researcher", "Horror Den") ]
, rosterAlly = [] }
rosterShootout = Roster
{ rosterList = [ ( playerHero { fcanEscape = False
, fhiCondPoly = hiHeroMedium }
, [(-5, 1, "scout hero"), (-5, 2, "ranger hero")] )
, ( playerAntiHero { fname = "Indigo Researcher"
, fcanEscape = False
, fhiCondPoly = hiHeroMedium }
, [(-5, 1, "scout hero"), (-5, 2, "ranger hero")] )
, (playerHorror, []) ]
, rosterEnemy = [ ("Explorer", "Indigo Researcher")
, ("Explorer", "Horror Den")
, ("Indigo Researcher", "Horror Den") ]
, rosterAlly = [] }
rosterHunt = Roster
{ rosterList = [ ( playerHero { fcanEscape = False
, fhiCondPoly = hiHeroMedium }
, [(-6, 7, "soldier hero")] )
, ( playerAntiHero { fname = "Indigo Researcher"
, fcanEscape = False
, fhiCondPoly = hiHeroMedium }
, [(-6, 1, "scout hero"), (-6, 6, "ambusher hero")] )
, (playerHorror, []) ]
, rosterEnemy = [ ("Explorer", "Indigo Researcher")
, ("Explorer", "Horror Den")
, ("Indigo Researcher", "Horror Den") ]
, rosterAlly = [] }
rosterEscape = Roster
{ rosterList = [ ( playerHero {fhiCondPoly = hiHeroMedium}
, [(-7, 1, "scout hero"), (-7, 2, "escapist hero")] )
, ( playerAntiHero { fname = "Indigo Researcher"
, fcanEscape = False
, fneverEmpty = False
, fhiCondPoly = hiHeroMedium }
, [(-7, 1, "scout hero"), (-7, 6, "ambusher hero")] )
, (playerHorror, []) ]
, rosterEnemy = [ ("Explorer", "Indigo Researcher")
, ("Explorer", "Horror Den")
, ("Indigo Researcher", "Horror Den") ]
, rosterAlly = [] }
rosterZoo = Roster
{ rosterList = [ ( playerHero { fcanEscape = False
, fhiCondPoly = hiHeroLong }
, [(-8, 5, "soldier hero")] )
, ( playerAnimal {fneverEmpty = True}
, [(-8, 100, "mobile animal")] )
, (playerHorror, []) ]
, rosterEnemy = [ ("Explorer", "Animal Kingdom")
, ("Explorer", "Horror Den") ]
, rosterAlly = [] }
rosterAmbush = Roster
{ rosterList = [ ( playerHero { fcanEscape = False
, fhiCondPoly = hiHeroMedium }
, [(-9, 1, "scout hero"), (-9, 5, "ambusher hero")] )
, ( playerAntiHero { fname = "Indigo Researcher"
, fcanEscape = False
, fhiCondPoly = hiHeroMedium }
, [(-9, 12, "soldier hero")] )
, (playerHorror, []) ]
, rosterEnemy = [ ("Explorer", "Indigo Researcher")
, ("Explorer", "Horror Den")
, ("Indigo Researcher", "Horror Den") ]
, rosterAlly = [] }
rosterCrawl = Roster
{ rosterList = [ ( playerHero
, [(-1, 3, "hero")] )
, ( playerMonster
, [(-4, 1, "scout monster"), (-4, 3, "monster")] )
, ( playerAnimal
,
[ (-1, 1 + 1 `d` 2, "animal")
, (-10, 100, "mobile animal") ] ) ]
, rosterEnemy = [ ("Explorer", "Monster Hive")
, ("Explorer", "Animal Kingdom") ]
, rosterAlly = [("Monster Hive", "Animal Kingdom")] }
rosterCrawlEmpty = Roster
{ rosterList = [ ( playerHero
, [(-1, 1, "hero")] )
, (playerHorror, []) ]
, rosterEnemy = []
, rosterAlly = [] }
rosterCrawlSurvival = rosterCrawl
{ rosterList = [ ( playerAntiHero
, [(-1, 3, "hero")] )
, ( playerMonster
, [(-4, 1, "scout monster"), (-4, 3, "monster")] )
, ( playerAnimal {fhasUI = True}
,
[ (-1, 1 + 1 `d` 2, "animal")
, (-10, 100, "mobile animal") ] ) ] }
rosterSafari = Roster
{ rosterList = [ ( playerMonsterTourist
, [(-4, 15, "monster")] )
, ( playerHunamConvict
, [(-4, 2, "civilian")] )
, ( playerAnimalMagnificent
, [(-7, 15, "mobile animal")] )
, ( playerAnimalExquisite
, [(-10, 20, "mobile animal")] ) ]
, rosterEnemy = [ ("Monster Tourist Office", "Hunam Convict")
, ( "Monster Tourist Office"
, "Animal Magnificent Specimen Variety" )
, ( "Monster Tourist Office"
, "Animal Exquisite Herds and Packs Galore" )
, ( "Animal Magnificent Specimen Variety"
, "Hunam Convict" )
, ( "Hunam Convict"
, "Animal Exquisite Herds and Packs Galore" ) ]
, rosterAlly = [ ( "Animal Magnificent Specimen Variety"
, "Animal Exquisite Herds and Packs Galore" ) ] }
rosterSafariSurvival = rosterSafari
{ rosterList = [ ( playerMonsterTourist
{ fleaderMode = LeaderAI $ AutoLeader True True
, fhasUI = False }
, [(-4, 15, "monster")] )
, ( playerHunamConvict
, [(-4, 3, "civilian")] )
, ( playerAnimalMagnificent
{ fleaderMode = LeaderUI $ AutoLeader True False
, fhasUI = True }
, [(-7, 20, "mobile animal")] )
, ( playerAnimalExquisite
, [(-10, 30, "mobile animal")] ) ] }
rosterBattle = Roster
{ rosterList = [ ( playerHero { fcanEscape = False
, fhiCondPoly = hiHeroLong }
, [(-5, 5, "soldier hero")] )
, ( playerMonster {fneverEmpty = True}
, [(-5, 35, "mobile monster")] )
, ( playerAnimal {fneverEmpty = True}
, [(-5, 30, "mobile animal")] ) ]
, rosterEnemy = [ ("Explorer", "Monster Hive")
, ("Explorer", "Animal Kingdom") ]
, rosterAlly = [("Monster Hive", "Animal Kingdom")] }
rosterBattleDefense = rosterBattle
{ rosterList = [ ( playerHero { fcanEscape = False
, fhiCondPoly = hiHeroLong
, fleaderMode =
LeaderAI $ AutoLeader False False
, fhasUI = False }
, [(-5, 5, "soldier hero")] )
, ( playerMonster { fneverEmpty = True
, fhasUI = True }
, [(-5, 35, "mobile monster")] )
, ( playerAnimal {fneverEmpty = True}
, [(-5, 30, "mobile animal")] ) ] }
rosterBattleSurvival = rosterBattle
{ rosterList = [ ( playerHero { fcanEscape = False
, fhiCondPoly = hiHeroLong
, fleaderMode =
LeaderAI $ AutoLeader False False
, fhasUI = False }
, [(-5, 5, "soldier hero")] )
, ( playerMonster {fneverEmpty = True}
, [(-5, 35, "mobile monster")] )
, ( playerAnimal { fneverEmpty = True
, fhasUI = True }
, [(-5, 30, "mobile animal")] ) ] }
rosterDefense = rosterCrawl
{ rosterList = [ ( playerAntiHero
, [(-1, 3, "hero")] )
, ( playerAntiMonster
, [(-4, 1, "scout monster"), (-4, 3, "monster")] )
, ( playerAnimal
, [ (-1, 1 + 1 `d` 2, "animal")
, (-10, 100, "mobile animal") ] ) ] }
rosterDefenseEmpty = rosterCrawl
{ rosterList = [ ( playerAntiMonster {fneverEmpty = True}
, [(-4, 1, "scout monster")] )
, (playerHorror, []) ]
, rosterEnemy = []
, rosterAlly = [] }
cavesRaid, cavesBrawl, cavesShootout, cavesHunt, cavesEscape, cavesZoo, cavesAmbush, cavesCrawl, cavesDig, cavesSee, cavesSafari, cavesBattle :: Caves
cavesRaid = [([-2], ["caveRaid"])]
cavesBrawl = [([-3], ["caveBrawl"])]
cavesShootout = [([-5], ["caveShootout"])]
cavesHunt = [([-6], ["caveHunt"])]
cavesEscape = [([-7], ["caveEscape"])]
cavesZoo = [([-8], ["caveZoo"])]
cavesAmbush = [([-9], ["caveAmbush"])]
listCrawl :: [([Int], [GroupName CaveKind])]
listCrawl =
[ ([-1], ["caveOutermost"])
, ([-2], ["caveShallowRogue"])
, ([-3], ["caveEmpty"])
, ([-4, -5, -6], ["default random", "caveRogue", "caveArena"])
, ([-7, -8], ["caveRogue", "caveSmoking"])
, ([-9], ["caveLaboratory"])
, ([-10], ["caveMine"]) ]
cavesCrawl = listCrawl
renumberCaves :: Int -> ([Int], [GroupName CaveKind])
-> ([Int], [GroupName CaveKind])
renumberCaves offset (ns, l) = (map (+ offset) ns, l)
cavesDig = concat $ zipWith (map . renumberCaves)
[0, -10 ..]
(replicate 100 listCrawl)
cavesSee = let numberCaves n c = ([n], [c])
in zipWith numberCaves [-1, -2 ..]
$ concatMap (replicate 8) allCaves
allCaves :: [GroupName CaveKind]
allCaves =
[ "caveRaid", "caveBrawl", "caveShootout", "caveHunt", "caveEscape", "caveZoo"
, "caveAmbush"
, "caveRogue", "caveLaboratory", "caveEmpty", "caveArena", "caveSmoking"
, "caveNoise", "caveMine" ]
cavesSafari = [ ([-4], ["caveSafari1"])
, ([-7], ["caveSafari2"])
, ([-10], ["caveSafari3"]) ]
cavesBattle = [([-5], ["caveBattle"])]