Allure 0.4.101.1 → 0.5.0.0
raw patch · 18 files changed
+255/−214 lines, 18 filesdep ~LambdaHack
Dependency ranges changed: LambdaHack
Files
- Allure.cabal +7/−8
- CHANGELOG.md +12/−1
- GameDefinition/Client/UI/Content/KeyKind.hs +8/−8
- GameDefinition/Content/CaveKind.hs +24/−9
- GameDefinition/Content/ItemKind.hs +12/−11
- GameDefinition/Content/ItemKindActor.hs +15/−15
- GameDefinition/Content/ItemKindOrgan.hs +6/−6
- GameDefinition/Content/ModeKind.hs +44/−40
- GameDefinition/Content/ModeKindPlayer.hs +10/−16
- GameDefinition/Content/PlaceKind.hs +2/−2
- GameDefinition/Content/TileKind.hs +20/−20
- GameDefinition/Main.hs +1/−0
- GameDefinition/PLAYING.md +17/−17
- GameDefinition/config.ui.default +3/−2
- GameDefinition/scores binary
- Makefile +69/−55
- README.md +3/−2
- test/test.hs +2/−2
Allure.cabal view
@@ -2,11 +2,11 @@ -- The package version. See the Haskell package versioning policy (PVP) -- for standards guiding when and how versions should be incremented. -- http://www.haskell.org/haskellwiki/Package_versioning_policy--- PVP summary: +-+------- breaking API changes--- | | +----- non-breaking API additions--- | | | +--- code changes with no API change-version: 0.4.101.1-synopsis: Near-future Sci-Fi roguelike and tactical squad game+-- PVP summary:+-+------- breaking API changes+-- | | +----- non-breaking API additions+-- | | | +--- code changes with no API change+version: 0.5.0.0+synopsis: Near-future Sci-Fi roguelike and tactical squad game description: Allure of the Stars is a near-future Sci-Fi roguelike and tactical squad game. See the wiki for design notes and contribute.@@ -25,12 +25,11 @@ bug-reports: http://github.com/AllureOfTheStars/Allure/issues license: AGPL-3 license-file: LICENSE-tested-with: GHC == 7.6, GHC == 7.8+tested-with: GHC == 7.6, GHC == 7.8, GHC == 7.10 data-files: GameDefinition/config.ui.default, GameDefinition/scores, GameDefinition/PLAYING.md, README.md, LICENSE, CREDITS, CHANGELOG.md extra-source-files: GameDefinition/MainMenu.ascii, Makefile--- extra-doc-files: GameDefinition/screenshot.png author: Andres Loeh, Mikolaj Konarski and others maintainer: Mikolaj Konarski <mikolaj.konarski@funktory.com> category: Game@@ -63,7 +62,7 @@ Content.TileKind, TieKnot, Paths_Allure- build-depends: LambdaHack >= 0.4.101.1 && < 0.5.1.0,+ build-depends: LambdaHack >= 0.5.0.0 && < 0.5.1.0, template-haskell >= 2.6 && < 3, base >= 4 && < 5,
CHANGELOG.md view
@@ -1,8 +1,19 @@+## [v0.5.0.0, aka 'Halfway through space'](https://github.com/AllureOfTheStars/Allure/compare/v0.4.101.0...v0.5.0.0)++- let AI put excess items in shared stash and use them out of shared stash+- let UI multiple items pickup routine put items that don't fit into equipment into shared stash, if possible, not into inventory pack+- re-enable the ability to hear close, invisible foes+- add a few more AI and autonomous henchmen tactics (CTRL-T)+- keep difficulty setting over session restart+- change some game start keybindings+- replace the Duel game mode with the Raid game mode+- various bugfixes, minor improvements and balancing+ ## [v0.4.101.1, aka 'Officially fun'](https://github.com/AllureOfTheStars/Allure/compare/v0.4.100.0...v0.4.101.1) - the game is now officially fun to play, with a seal of the Galactic Council - introduce unique boss monsters and unique artifact items-- add animals that heal the player, in particular as a mid-game reset for HP+- add robots that heal the player, in particular as a mid-game reset for HP - move spaceship airlock to level 10 and beef up spaceship crew - let AI gang up, attempt stealth and react to player aggressiveness - spawn actors fast, close to the enemy and in large numbers
GameDefinition/Client/UI/Content/KeyKind.hs view
@@ -3,7 +3,7 @@ -- and is released under the terms of the GNU Affero General Public License. -- For license and copyright information, see the file LICENSE. ----- | The default game key-command mapping to be used for UI. Can be overriden+-- | The default game key-command mapping to be used for UI. Can be overridden -- via macros in the config file. module Client.UI.Content.KeyKind ( standardKeys ) where @@ -28,11 +28,15 @@ -- Main Menu, which apart of these includes a few extra commands [ ("CTRL-x", ([CmdMenu], GameExit))- , ("CTRL-u", ([CmdMenu], GameRestart "duel"))+ , ("CTRL-r", ([CmdMenu], GameRestart "raid")) , ("CTRL-k", ([CmdMenu], GameRestart "skirmish")) , ("CTRL-m", ([CmdMenu], GameRestart "ambush")) , ("CTRL-b", ([CmdMenu], GameRestart "battle"))- , ("CTRL-n", ([CmdMenu], GameRestart "campaign"))+ , ("CTRL-c", ([CmdMenu], GameRestart "campaign"))+ , ("CTRL-i", ([CmdDebug], GameRestart "battle survival"))+ , ("CTRL-f", ([CmdDebug], GameRestart "safari"))+ , ("CTRL-u", ([CmdDebug], GameRestart "safari survival"))+ , ("CTRL-e", ([CmdDebug], GameRestart "defense")) , ("CTRL-d", ([CmdMenu], GameDifficultyCycle)) -- Movement and terrain alteration@@ -193,11 +197,7 @@ , ("RightButtonPress", ([CmdMouse], TgtPointerEnemy)) -- Debug and others not to display in help screens- , ("CTRL-s", ([CmdDebug], GameSave))- , ("CTRL-i", ([CmdDebug], GameRestart "battle survival"))- , ("CTRL-f", ([CmdDebug], GameRestart "safari"))- , ("CTRL-r", ([CmdDebug], GameRestart "safari survival"))- , ("CTRL-e", ([CmdDebug], GameRestart "defense"))+ , ("CTRL-S", ([CmdDebug], GameSave)) , ("CTRL-semicolon", ([CmdInternal], MoveOnceToCursor)) , ("CTRL-colon", ([CmdInternal], RunOnceToCursor)) , ("CTRL-period", ([CmdInternal], ContinueToCursor))
GameDefinition/Content/CaveKind.hs view
@@ -21,9 +21,9 @@ , validateSingle = validateSingleCaveKind , validateAll = validateAllCaveKind , content =- [rogue, arena, empty, noise, battle, skirmish, ambush, safari1, safari2, safari3, bridge, shallow2rogue, shallow2arena, shallow2empty, shallow1arena]+ [rogue, arena, empty, noise, battle, skirmish, ambush, safari1, safari2, safari3, rogueLit, bridge, shallow2rogue, shallow2arena, shallow2empty, shallow1arena] }-rogue, arena, empty, noise, battle, skirmish, ambush, safari1, safari2, safari3, bridge, shallow2rogue, shallow2arena, shallow2empty, shallow1arena :: CaveKind+rogue, arena, empty, noise, battle, skirmish, ambush, safari1, safari2, safari3, rogueLit, bridge, shallow2rogue, shallow2arena, shallow2empty, shallow1arena :: CaveKind rogue = CaveKind { csymbol = 'R'@@ -111,7 +111,7 @@ , cauxConnects = 0 , cmaxVoid = 0 , chidden = 1000- , cactorCoeff = 150 -- the maze requires time to explore+ , cactorCoeff = 160 -- the maze requires time to explore , cactorFreq = [("alien", 70), ("animal", 15), ("robot", 15)] , citemNum = 12 * d 2 -- an incentive to explore the labyrinth , cpassable = True@@ -188,20 +188,29 @@ safari1 = ambush {cfreq = [("caveSafari1", 1)]} safari2 = battle {cfreq = [("caveSafari2", 1)]} safari3 = skirmish {cfreq = [("caveSafari3", 1)]}-bridge = rogue+rogueLit = rogue+ { csymbol = 'S'+ , cname = "Triton City Sewers"+ , cfreq = [("caveRogueLit", 1)]+ , cdarkChance = 0+ , cmaxVoid = 1%10+ , cactorCoeff = 1000 -- deep level with no eqp, so slow spawning+ , cactorFreq = [("animal", 50), ("robot", 50)]+ , citemNum = 30 * d 2 -- just one level, hard enemies, treasure+ , citemFreq = [("useful", 33), ("gem", 33), ("currency", 33)]+ , cdarkCorTile = "emergency walkway"+ , clitCorTile = "emergency walkway"+ }+bridge = rogueLit { csymbol = 'B' , cname = "Captain's bridge" , cfreq = [("caveBridge", 1)] , cgrid = DiceXY (d 2 + 1) 2 , cminPlaceSize = DiceXY 10 7 , cmaxPlaceSize = DiceXY 40 14- , cdarkChance = 0- , cmaxVoid = 1%10 , cactorFreq = [] -- safe, nothing spawns , citemNum = 15 * d 2 -- lure them in with loot- , citemFreq = filter ((/= "treasure") . fst) $ citemFreq arena- , cdarkCorTile = "emergency walkway"- , clitCorTile = "emergency walkway"+ , citemFreq = filter ((/= "treasure") . fst) $ citemFreq rogue } shallow2rogue = rogue { cfreq = [("shallow random 2", 50)]@@ -228,5 +237,11 @@ , cminPlaceSize = DiceXY (2 * d 2 + 3) 3 , cactorCoeff = 3 -- mostly immobile actors anyway , cactorFreq = [("animal", 8), ("robot", 2), ("immobile robot", 90)]+ -- The medbot faucets on lvl 1 act like HP resets. They are needed to avoid+ -- cascading failure, if the particular starting conditions were+ -- very hard. The items are not reset, even if the are bad, which provides+ -- enough of a continuity. The faucets on lvl 1 are not OP and can't be+ -- abused, because they spawn less and less often and they don't heal over+ -- max HP. , couterFenceTile = "oriels fence" }
GameDefinition/Content/ItemKind.hs view
@@ -127,7 +127,7 @@ , iweight = 4000 , iaspects = [AddHurtRanged (d 2 + dl 5 |*| 20)] , ieffects = [Hurt (4 * d 1), PullActor (ThrowMod 200 50)]- , ifeature = []+ , ifeature = [Identified] , idesc = "A display piece harking back to the Earth's oceanic tourism hayday. The cruel, barbed head lodges in its victim so painfully that the weakest tug of the thin line sends the victim flying." , ikit = [] }@@ -276,7 +276,7 @@ , iweight = 30 , iaspects = [ Unique , Periodic- , Timeout $ d 3 + 3 - dl 3 |*| 10+ , Timeout $ 1 + d 2 , AddArmorMelee $ 2 + d 3 , AddArmorRanged $ 2 + d 3 ] , ieffects = [Recharging (RefillCalm 1)]@@ -393,26 +393,28 @@ } ring1 = ring { irarity = [(10, 2)]- , iaspects = [AddSpeed $ d 2, AddMaxHP $ dl 5 - 5 - d 5]+ , iaspects = [AddSpeed $ 1 + d 2, AddMaxHP $ dl 7 - 7 - d 7] , ieffects = [Explode "distortion"] -- strong magic , ifeature = ifeature ring ++ [EqpSlot EqpSlotAddSpeed ""] } ring2 = ring- { iaspects = [AddMaxHP $ 10 + dl 10, AddMaxCalm $ dl 5 - 20 - d 5]+ { irarity = [(10, 5)]+ , iaspects = [AddMaxHP $ 10 + dl 10, AddMaxCalm $ dl 5 - 20 - d 5] , ifeature = ifeature ring ++ [EqpSlot EqpSlotAddMaxHP ""] } ring3 = ring- { iaspects = [AddMaxCalm $ 15 + dl 15]+ { irarity = [(10, 5)]+ , iaspects = [AddMaxCalm $ 29 + dl 10] , ifeature = ifeature ring ++ [EqpSlot EqpSlotAddMaxCalm ""] , idesc = "Cold, solid to the touch, perfectly round, engraved with solemn, strangely comforting, worn out words." } ring4 = ring- { irarity = [(3, 6), (10, 6)]+ { irarity = [(3, 3), (10, 5)] , iaspects = [AddHurtMelee $ d 5 + dl 5 |*| 3, AddMaxHP $ dl 3 - 5 - d 3] , ifeature = ifeature ring ++ [EqpSlot EqpSlotAddHurtMelee ""] } ring5 = ring -- by the time it's found, probably no space in eqp- { irarity = [(5, 0), (10, 1)]+ { irarity = [(5, 0), (10, 2)] , iaspects = [AddLight $ d 2] , ieffects = [Explode "distortion"] -- strong magic , ifeature = ifeature ring ++ [EqpSlot EqpSlotAddLight ""]@@ -500,8 +502,7 @@ , OnSmash (OneOf [ Explode "healing mist 2" , Explode "calming mist" , Explode "distressing odor"- , Explode "distortion" -- outlier, OK- , Explode "smelly droplet"+ , Explode "eye drop" , Explode "blast 20" ]) ] } potion7 = potion@@ -981,7 +982,7 @@ gem = ItemKind { isymbol = symbolGem , iname = "gem"- , ifreq = [("treasure", 100), ("gem", 1)]+ , ifreq = [("treasure", 100), ("gem", 100)] , iflavour = zipPlain $ delete BrYellow brightCol -- natural, so not fancy , icount = 1 , irarity = []@@ -1016,7 +1017,7 @@ currency = ItemKind { isymbol = symbolGold , iname = "gold grain"- , ifreq = [("treasure", 100), ("currency", 1)]+ , ifreq = [("treasure", 100), ("currency", 100)] , iflavour = zipPlain [BrYellow] , icount = 10 + d 20 + dl 20 , irarity = [(1, 25), (10, 10)]
GameDefinition/Content/ItemKindActor.hs view
@@ -58,9 +58,9 @@ , ifreq = [("sniper", 100), ("mobile", 1)] , ikit = ikit warrior ++ [ ("ring of opportunity sniper", CEqp)- , ("any arrow", CInv), ("any arrow", CInv)+ , ("any arrow", CSha), ("any arrow", CInv) , ("any arrow", CInv), ("any arrow", CInv)- , ("flask", CInv), ("light source", CInv)+ , ("flask", CInv), ("light source", CSha) , ("light source", CInv), ("light source", CInv) ] } @@ -127,7 +127,7 @@ , ieffects = [] , ifeature = [Durable, Identified] , idesc = "A blind, slimy mass of clawing, stinging and burning. You'd think it's powerless, but as soon as it touches your trembling body, it's always one step ahead."- , ikit = [ ("nostril", COrgan), ("claw", COrgan)+ , ikit = [ ("nostril", COrgan), ("small claw", COrgan) , ("tentacle", COrgan), ("tentacle", COrgan) , ("thorn", COrgan), ("sting", COrgan) , ("sapient brain", COrgan) ]@@ -149,7 +149,7 @@ , idesc = "It moves in sudden jerks and never makes a noise. Speaks in hard objects hurled at deadly speeds." , ikit = [ ("speed gland 4", COrgan) , ("eye 7", COrgan)- , ("any arrow", CInv), ("any arrow", CInv)+ , ("any arrow", CSha), ("any arrow", CInv) , ("any arrow", CInv), ("any arrow", CInv) , ("sapient brain", COrgan) ] }@@ -212,7 +212,7 @@ , ifeature = [Durable, Identified] , idesc = "" , ikit = [ ("screeching beak", COrgan) -- in reality it grunts and hisses- , ("claw", COrgan), ("eye 6", COrgan)+ , ("small claw", COrgan), ("eye 6", COrgan) , ("animal brain", COrgan) ] } skunk = ItemKind@@ -243,7 +243,7 @@ , irarity = [(1, 5)] , iverbHit = "thud" , iweight = 80000- , iaspects = [ AddMaxHP 30, AddMaxCalm 30, AddSpeed 18+ , iaspects = [ AddMaxHP 20, AddMaxCalm 30, AddSpeed 17 , AddSkills $ EM.singleton AbAlter (-1) ] , ieffects = [] , ifeature = [Durable, Identified]@@ -267,7 +267,7 @@ , ifeature = [Durable, Identified] , idesc = "" , ikit = [ ("venom tooth", COrgan), ("small claw", COrgan)- , ("eye 5", COrgan), ("nostril", COrgan)+ , ("eye 2", COrgan), ("nostril", COrgan) , ("animal brain", COrgan) ] } rattlesnake = ItemKind@@ -276,7 +276,7 @@ , ifreq = [("animal", 100), ("horror", 100), ("mobile animal", 100)] , iflavour = zipPlain [Brown] , icount = 1- , irarity = [(3, 3), (10, 5)]+ , irarity = [(4, 1), (10, 7)] , iverbHit = "thud" , iweight = 80000 , iaspects = [ AddMaxHP 25, AddMaxCalm 60, AddSpeed 15@@ -285,7 +285,7 @@ , ifeature = [Durable, Identified] , idesc = "" , ikit = [ ("venom fang", COrgan)- , ("eye 5", COrgan), ("nostril", COrgan)+ , ("eye 3", COrgan), ("nostril", COrgan) , ("animal brain", COrgan) ] } komodoDragon = ItemKind -- bad hearing; regeneration makes it very powerful@@ -346,7 +346,7 @@ , ifreq = [("animal", 100), ("mobile", 1)] , iflavour = zipPlain [Brown] , icount = 1- , irarity = [(1 * 10/12, 1000), (2 * 10/12, 0)] -- unique+ , irarity = [(1 * 10/12, 1000000), (2 * 10/12, 0)] -- unique , iverbHit = "thud" , iweight = 80000 , iaspects = [ Unique, AddMaxHP 90, AddMaxCalm 60, AddSpeed 25@@ -368,7 +368,7 @@ , ifreq = [("animal", 100), ("horror", 100)] , iflavour = zipPlain [Brown] , icount = 1- , irarity = [(1, 3), (10, 6)]+ , irarity = [(1, 2), (10, 4)] , iverbHit = "thud" , iweight = 1000 , iaspects = [ AddMaxHP 8, AddMaxCalm 60, AddSpeed 30@@ -385,7 +385,7 @@ , ifreq = [("animal", 100), ("horror", 100), ("mobile animal", 100)] , iflavour = zipPlain [Magenta] , icount = 1- , irarity = [(5, 1), (10, 10)]+ , irarity = [(5, 1), (10, 8)] , iverbHit = "thud" , iweight = 1000 , iaspects = [ AddMaxHP 8, AddMaxCalm 60, AddSpeed 30@@ -400,7 +400,7 @@ thornbush = ItemKind { isymbol = 't' , iname = "thornbush"- , ifreq = [("animal", 100)]+ , ifreq = [("animal", 50)] , iflavour = zipPlain [Brown] , icount = 1 , irarity = [(1, 3)]@@ -639,7 +639,7 @@ , ("construction robot", 100) ] , iflavour = zipPlain [BrRed] , icount = 1- , irarity = [(5, 1), (10, 10)]+ , irarity = [(6, 0), (10, 10)] , iverbHit = "thud" , iweight = 800000 , iaspects = [ AddMaxHP 41, AddMaxCalm 60, AddSpeed 20@@ -649,7 +649,7 @@ , idesc = "Heavy multi-purpose construction robot. Excels at discharging, dismantling and demolition." , ikit = [ ("large jaw", COrgan), ("small claw", COrgan), ("spotlight", COrgan) , ("construction hooter", CInv)- , ("armored skin", COrgan), ("eye 5", COrgan)+ , ("armored skin", COrgan), ("eye 4", COrgan) , ("robot brain", COrgan) ] } cleanerRobot = ItemKind
GameDefinition/Content/ItemKindOrgan.hs view
@@ -166,7 +166,7 @@ , icount = 1 , iverbHit = "sting" , iaspects = [AddArmorMelee 90, AddArmorRanged 90]- , ieffects = [Burn $ 2 * d 1, Paralyze 10, RefillHP 5]+ , ieffects = [Burn $ 2 * d 1, Paralyze 3, RefillHP 5] , ifeature = [Identified] -- not Durable , idesc = "Painful, but beneficial." }@@ -176,7 +176,7 @@ , icount = 1 , iverbHit = "sting" , iaspects = [Timeout $ 1 + d 5]- , ieffects = [Burn $ 1 * d 1, Recharging (Paralyze 3)]+ , ieffects = [Burn $ 2 * d 1, Recharging (Paralyze 2)] , idesc = "Painful, debilitating and harmful." } venomTooth = fist@@ -223,9 +223,9 @@ liveWire = fist { iname = "live wire" , ifreq = [("live wire", 100)]- , icount = 2+ , icount = 1 , iverbHit = "shock"- , iaspects = [Timeout $ 5 + d 5]+ , iaspects = [Timeout $ 3 + d 3] , ieffects = [ Hurt (1 * d 1) , Recharging (DropItem COrgan "temporary conditions" True) , Recharging $ RefillHP (-2)@@ -292,7 +292,7 @@ , ifreq = [("nostril", 100)] , icount = 2 , iverbHit = "snuff"- , iaspects = [AddSmell 2]+ , iaspects = [AddSmell 1] -- times 2, from icount , idesc = "" } @@ -355,7 +355,7 @@ scentGland = armoredSkin -- TODO: cone attack, 3m away, project? apply? { iname = "scent gland" , ifreq = [("scent gland", 100)]- , icount = 2+ , icount = 1 , iverbHit = "spray at" , iaspects = [Periodic, Timeout $ 10 + d 2 |*| 5 ] , ieffects = [ Recharging (Explode "distressing odor")
GameDefinition/Content/ModeKind.hs view
@@ -22,12 +22,12 @@ , validateSingle = validateSingleModeKind , validateAll = validateAllModeKind , content =- [campaign, duel, skirmish, ambush, battle, battleSurvival, safari, safariSurvival, pvp, coop, defense, screensaver]+ [campaign, raid, skirmish, ambush, battle, battleSurvival, safari, safariSurvival, pvp, coop, defense, screensaver] }-campaign, duel, skirmish, ambush, battle, battleSurvival, safari, safariSurvival, pvp, coop, defense, screensaver :: ModeKind+campaign, raid, skirmish, ambush, battle, battleSurvival, safari, safariSurvival, pvp, coop, defense, screensaver :: ModeKind campaign = ModeKind- { msymbol = 'n'+ { msymbol = 'c' , mname = "campaign" , mfreq = [("campaign", 1)] , mroster = rosterCampaign@@ -35,13 +35,13 @@ , mdesc = "You got stranded looting the blasted bridge of a once luxurious cruise liner. Your current plan is to fight through, gathering your spoils, to the shuttle airlock somewhere among the giant spaceship's uppermost decks. There are animal cries down below and ominous silence up above." } -duel = ModeKind- { msymbol = 'u'- , mname = "duel"- , mfreq = [("duel", 1)]- , mroster = rosterDuel- , mcaves = cavesSkirmish- , mdesc = "Let's settle the argument about this noble lady outside, in the woody biosphere behind the saloon."+raid = ModeKind+ { msymbol = 'r'+ , mname = "raid"+ , mfreq = [("raid", 1)]+ , mroster = rosterRaid+ , mcaves = cavesRaid+ , mdesc = "The Triton City sewers need purging. The first person to break through to the other end will be paid 100 gold grains. Please don't fight." } skirmish = ModeKind@@ -50,7 +50,7 @@ , mfreq = [("skirmish", 1)] , mroster = rosterSkirmish , mcaves = cavesSkirmish- , mdesc = "You owe restorative surgery to one of our crew: if we win, we take all you have; if you win, you take our old giant spaceship (if you still want it when you see it)."+ , mdesc = "You cheated. Come alone to the woody biosphere behind the saloon at noon, if you dare. The winner takes all the spoils, including the keys and the papers of the decrepit giant spaceship." } ambush = ModeKind@@ -90,7 +90,7 @@ } safariSurvival = ModeKind- { msymbol = 'n'+ { msymbol = 'u' , mname = "safari survival" , mfreq = [("safari survival", 1)] , mroster = rosterSafariSurvival@@ -127,17 +127,18 @@ screensaver = safari { mname = "safari screensaver"- , mfreq = [("screensaver", 1), ("starting", 1)]+ , mfreq = [("starting", 1)] , mroster = rosterSafari { rosterList = (head (rosterList rosterSafari)) -- changing leader by client needed, because of TFollow- {fleaderMode = LeaderAI $ AutoLeader True False}+ -- changing level by client enabled for UI+ {fleaderMode = LeaderAI $ AutoLeader False False} : tail (rosterList rosterSafari) } } -rosterCampaign, rosterDuel, rosterSkirmish, rosterAmbush, rosterBattle, rosterBattleSurvival, rosterSafari, rosterSafariSurvival, rosterPvP, rosterCoop, rosterDefense :: Roster+rosterCampaign, rosterRaid, rosterSkirmish, rosterAmbush, rosterBattle, rosterBattleSurvival, rosterSafari, rosterSafariSurvival, rosterPvP, rosterCoop, rosterDefense :: Roster rosterCampaign = Roster { rosterList = [ playerHero@@ -147,35 +148,43 @@ , rosterEnemy = [ ("Spacefarer Crew", "Alien Hierarchy") , ("Spacefarer Crew", "Animal Kingdom") , ("Spacefarer Crew", "Robot Anarchy") ]- , rosterAlly = [ ("Alien Hierarchy", "Animal Kingdom")- , ("Alien Hierarchy", "Robot Anarchy")- , ("Robot Anarchy", "Animal Kingdom") ] }+ , rosterAlly = [ ("Alien Hierarchy", "Animal Kingdom")+ , ("Alien Hierarchy", "Robot Anarchy")+ , ("Robot Anarchy", "Animal Kingdom") ] } -rosterDuel = Roster+rosterRaid = Roster { rosterList = [ playerHero { fname = "Spacefarer Crew"- , fhiCondPoly = hiDweller+ , fhiCondPoly = hiRaid , fentryLevel = 4 , finitialActors = 1 } , playerAntiHero { fname = "Red Collars"- , fhiCondPoly = hiDweller+ , fhiCondPoly = hiRaid , fentryLevel = 4 , finitialActors = 1 }- , playerHorror ]- , rosterEnemy = [ ("Spacefarer Crew", "Red Collars")- , ("Spacefarer Crew", "Horror Den")- , ("Red Collars", "Horror Den") ]- , rosterAlly = [] }+ , playerAnimal { fentryLevel = 4+ , finitialActors = 1 }+ , playerRobot { fentryLevel = 4+ , finitialActors = 1 } ]+ , rosterEnemy = [ ("Spacefarer Crew", "Animal Kingdom")+ , ("Spacefarer Crew", "Robot Anarchy")+ , ("Red Collars", "Animal Kingdom")+ , ("Red Collars", "Robot Anarchy") ]+ , rosterAlly = [("Robot Anarchy", "Animal Kingdom")] } -rosterSkirmish = rosterDuel+rosterSkirmish = Roster { rosterList = [ playerHero { fname = "Spacefarer Crew" , fhiCondPoly = hiDweller , fentryLevel = 4 } , playerAntiHero { fname = "Red Collars" , fhiCondPoly = hiDweller , fentryLevel = 4 }- , playerHorror ] }+ , playerHorror ]+ , rosterEnemy = [ ("Spacefarer Crew", "Red Collars")+ , ("Spacefarer Crew", "Horror Den")+ , ("Red Collars", "Horror Den") ]+ , rosterAlly = [] } -rosterAmbush = rosterDuel+rosterAmbush = rosterSkirmish { rosterList = [ playerSniper { fname = "Spacefarer Crew" , fhiCondPoly = hiDweller , fentryLevel = 7@@ -301,8 +310,8 @@ { rosterList = [ playerAntiHero { fname = "Coral" } , playerAntiHero { fname = "Amber" , fleaderMode = LeaderNull }- , playerAntiHero { fname = "Green" } , playerAnimal { fhasUI = True }+ , playerAnimal , playerMonster { fname = "Alien Hierarchy" , finitialActors = 3 } , playerMonster { fname = "Leaderless Alien Hierarchy"@@ -310,15 +319,8 @@ , fleaderMode = LeaderNull } , playerRobot ] , rosterEnemy = [ ("Coral", "Alien Hierarchy")- , ("Amber", "Alien Hierarchy")- , ("Animal Kingdom", "Leaderless Alien Hierarchy") ]- , rosterAlly = [ ("Coral", "Amber")- , ("Coral", "Green")- , ("Amber", "Green")- , ("Green", "Animal Kingdom")- , ("Green", "Robot Anarchy")- , ("Green", "Alien Hierarchy")- , ("Green", "Leaderless Alien Hierarchy") ] }+ , ("Amber", "Alien Hierarchy") ]+ , rosterAlly = [ ("Coral", "Amber") ] } rosterDefense = rosterCampaign { rosterList = [ playerAntiHero@@ -326,7 +328,7 @@ , playerAnimal , playerRobot ] } -cavesCampaign, cavesSkirmish, cavesAmbush, cavesBattle, cavesSafari :: Caves+cavesCampaign, cavesRaid, cavesSkirmish, cavesAmbush, cavesBattle, cavesSafari :: Caves cavesCampaign = IM.fromList $ [(1, ("shallow random 1", Nothing))]@@ -337,6 +339,8 @@ ++ [(10, ("caveEmpty", Just False))] ++ [(11, ("campaign random", Nothing))] ++ [(12, ("caveNoise", Nothing))]++cavesRaid = IM.fromList [(4, ("caveRogueLit", Just True))] cavesSkirmish = IM.fromList [(4, ("caveSkirmish", Nothing))]
GameDefinition/Content/ModeKindPlayer.hs view
@@ -11,10 +11,9 @@ , playerAnimal, playerMobileAnimal , playerRobot, playerMobileRobot , playerHorror- , hiHero, hiDweller+ , hiHero, hiDweller, hiRaid ) where -import qualified Data.EnumMap.Strict as EM import Data.List import Game.LambdaHack.Common.Ability@@ -113,7 +112,7 @@ , fhasGender = False , ftactic = TRoam -- can't pick up, so no point exploring , fentryLevel = 3- , finitialActors = 2 + d 2+ , finitialActors = 2 + d 2 -- many, because no spawning , fleaderMode = LeaderNull , fhasUI = False }@@ -130,10 +129,9 @@ , fhiCondPoly = hiDweller , fhasNumbers = False , fhasGender = False- , ftactic = TRoam -- TODO: TFollow- -- coordinated via net, follow alien leader+ , ftactic = TRoam -- TODO:TFollow -- coordinated via net, follow alien leader , fentryLevel = 3- , finitialActors = 2 + d 2+ , finitialActors = 2 + d 2 -- many, because no spawning , fleaderMode = LeaderNull , fhasUI = False }@@ -166,7 +164,7 @@ victoryOutcomes :: [Outcome] victoryOutcomes = [Conquer, Escape] -hiHero, hiDweller :: HiCondPoly+hiHero, hiDweller, hiRaid :: HiCondPoly -- Heroes rejoice in loot. hiHero = [ ( [(HiLoot, 1)]@@ -187,12 +185,8 @@ , [minBound..maxBound] \\ victoryOutcomes ) ] -minusTen, meleeAdjacent, _meleeAndRanged :: Skills---- To make sure only a lot of weak items can override move-only-leader, etc.-minusTen = EM.fromList $ zip [minBound..maxBound] [-10, -10..]--meleeAdjacent = EM.delete AbWait $ EM.delete AbMelee minusTen---- Melee and reaction fire.-_meleeAndRanged = EM.delete AbProject $ meleeAdjacent+hiRaid = [ ( [(HiLoot, 1)]+ , [minBound..maxBound] )+ , ( [(HiConst, 100)]+ , victoryOutcomes )+ ]
GameDefinition/Content/PlaceKind.hs view
@@ -24,7 +24,7 @@ rect = PlaceKind -- Valid for any nonempty area, hence low frequency. { psymbol = 'r' , pname = "room"- , pfreq = [("rogue", 70), ("ambush", 8), ("noise", 40)]+ , pfreq = [("rogue", 70), ("ambush", 8), ("noise", 80)] , prarity = [(1, 10), (10, 8)] , pcover = CStretch , pfence = FWall@@ -34,7 +34,7 @@ ruin = PlaceKind { psymbol = 'R' , pname = "ruin"- , pfreq = [("ambush", 17), ("battle", 100), ("noise", 20)]+ , pfreq = [("ambush", 17), ("battle", 100), ("noise", 40)] , prarity = [(1, 10), (10, 20)] , pcover = CStretch , pfence = FWall
GameDefinition/Content/TileKind.hs view
@@ -30,26 +30,24 @@ } wall, wallCache, hardRock, doorlessWall, oriel, pillar, lampPost, burningBush, bush, tree, wallSuspect, doorClosed, doorOpen, stairsUp, stairsDown, escapeUp, escapeDown, liftUp, lift, liftDown, unknown, floorCorridorLit, floorActorLit, floorItemLit, floorActorItemLit, floorArenaShade, floorRedLit, floorBlueLit, floorGreenLit :: TileKind +oriel = TileKind+ { tsymbol = '\''+ , tname = "oriel"+ , tfreq = [("oriels fence", 4)]+ , tcolor = White+ , tcolor2 = Black+ , tfeature = [Dark, Impenetrable]+ } wall = TileKind { tsymbol = '#' , tname = "granite wall"- , tfreq = [ ("fillerWall", 1), ("cachable", 70)- , ("legendLit", 100), ("legendDark", 100)+ , tfreq = [ ("fillerWall", 1), ("legendLit", 100), ("legendDark", 100)+ , ("cachable", 70) , ("noiseSet", 100), ("battleSet", 250) ] , tcolor = BrWhite , tcolor2 = defFG , tfeature = [HideAs "suspect wall"] }-wallCache = TileKind- { tsymbol = '&'- , tname = "cache"- , tfreq = [ ("cachable", 30)- , ("legendLit", 100), ("legendDark", 100) ]- , tcolor = BrWhite- , tcolor2 = defFG- , tfeature = [ Cause $ IK.CreateItem CGround "useful" IK.TimerNone- , ChangeTo "cachable" ]- } hardRock = TileKind { tsymbol = '#' , tname = "outer hull"@@ -66,14 +64,6 @@ , tcolor2 = defFG , tfeature = [] }-oriel = TileKind- { tsymbol = '\''- , tname = "oriel"- , tfreq = [("oriels fence", 4)]- , tcolor = White- , tcolor2 = Black- , tfeature = [Dark, Impenetrable]- } pillar = TileKind { tsymbol = 'O' , tname = "rock"@@ -82,6 +72,16 @@ , tcolor = BrWhite , tcolor2 = defFG , tfeature = []+ }+wallCache = TileKind+ { tsymbol = '&'+ , tname = "cache"+ , tfreq = [ ("cachable", 30)+ , ("legendLit", 100), ("legendDark", 100) ]+ , tcolor = BrWhite+ , tcolor2 = defFG+ , tfeature = [ Cause $ IK.CreateItem CGround "useful" IK.TimerNone+ , ChangeTo "cachable" ] } lampPost = TileKind { tsymbol = 'O'
GameDefinition/Main.hs view
@@ -4,6 +4,7 @@ -- For license and copyright information, see the file LICENSE. -- -- | The main source code file of Allure of the Stars.+-- Module "TieKnot" is separated to make it usable in tests. module Main ( main ) where import System.Environment (getArgs)
GameDefinition/PLAYING.md view
@@ -22,7 +22,7 @@ ------ The heroes are marked on the map with symbols `@` and `1` through `9`.-Their goal is to explore an old, warped, once luxurious, space liner,+Their goal is to explore a warped, old, once luxurious space liner, battle the horrors within, gather as much gold and precious gems as possible, and escape to tell the tale. @@ -30,7 +30,7 @@ and his attributes are displayed at the bottommost status line, which in its most complex form may look as follows. - *@12 Adventurer 4d1+5% Calm: 20/60 HP: 33/50 Target: basilisk [**___]+ *@12 Adventurer 4d1+5% Calm: 20/60 HP: 33/50 Target: basilisk [**__] The line starts with the list of party members (unless there's only one member) and the shortened name of the team. Clicking on the list selects heroes and@@ -95,7 +95,7 @@ /|\ /|\ /|\ 1 2 3 j k l b j n -In aiming mode (KEYPAD_* or \) the same keys (or the middle and right+In aiming mode (`KEYPAD_*` or `\`) the same keys (or the middle and right mouse buttons) move the crosshair (the white box). In normal mode, `SHIFT` (or `CTRL`) and a movement key make the current party leader run in the indicated direction, until anything of interest is spotted.@@ -109,8 +109,8 @@ Few commands other than movement, 'g'etting an item from the floor, 'a'pplying an item and 'f'linging an item are necessary for casual play. Some are provided only as specialized versions of the more general-commands or as building blocks for more complex convenience macros,-e.g., the autoexplore command (key `X`) could be defined+commands or as building blocks for more complex convenience macros.+E.g., the autoexplore command (key `X`) could be defined by the player as a macro using `CTRL-?`, `CTRL-.` and `V`. The following minimal command set lets you accomplish almost anything@@ -133,12 +133,11 @@ ESC cancel action, open Main Menu The only activity not possible with the commands above is the management-of non-leader party members. The defaults should usually suffice,-especially if your non-leader heroes can only melee or wait-and none have found the equipment that enables opportunity fire.-If there's a need, you can manually set party tactics with `CTRL-T`-and you can assign individual targets to party members-using the aiming and targeting commands listed below.+of non-leader party members. You don't need it, unless your non-leader actors+can move or fire opportunistically (via innate skills or rare equipment).+If really needed, you can manually set party tactics with `CTRL-T`+and you can assign individual targets to party members using the aiming+and targeting commands listed below. keys command KEYPAD_* or \ aim at an enemy@@ -167,7 +166,7 @@ Commands for saving and exiting the current game, starting a new game, etc., are listed in the Main Menu, brought up by the `ESC` key. Game difficulty setting affects hitpoints at birth for any actors-of any UI-using faction. For a person new to roguelikes, the Duel scenario+of any UI-using faction. For a person new to roguelikes, the Raid scenario offers a gentle introduction. The subsequent game modes gradually introduce squad combat, stealth, opportunity fire, asymmetric battles and more. @@ -222,10 +221,11 @@ your score is based on the gold and precious gems you've plundered. In the latter case, your score is based on the number of turns you spent overcoming your foes (the quicker the victory, the better; the slower-the demise, the better). Bonus points, based on the number of heroes-that were lost, are awarded if you win.+the demise, the better). Bonus points, based on the number of heroes lost,+are awarded if you win. -If all your heroes fall, you will invariably see a new foolhardy party-of adventurers clamoring to be led into the spaceship. They start+When all your heroes fall, you are going to invariably see a new foolhardy+party of adventurers clamoring to be led into the spaceship. They start their conquest from a new entrance, with no experience and no equipment,-and new, undaunted enemies bar their way. Lead them to fame, wealth and glory!+and new, undaunted enemies bar their way. Lead the new hopeful explorers+to fame, wealth and glory!
GameDefinition/config.ui.default view
@@ -36,9 +36,10 @@ movementViKeys_hjklyubn = False movementLaptopKeys_uk8o79jl = True ; Monospace fonts that have fixed size regardless of boldness (on some OSes)-font = "Terminus,DejaVu Sans Mono,Consolas,Courier New,Liberation Mono,Courier,FreeMono,Monospace normal normal normal normal 16"-;font = "Terminus,DejaVu Sans Mono,Consolas,Courier New,Liberation Mono,Courier,FreeMono,Monospace normal normal normal normal 20"+font = "Terminus,DejaVu Sans Mono,Consolas,Courier New,Liberation Mono,Courier,FreeMono,Monospace normal normal normal normal 14"+;font = "Terminus,DejaVu Sans Mono,Consolas,Courier New,Liberation Mono,Courier,FreeMono,Monospace normal normal normal normal 18" colorIsBold = True+; New historyMax takes effect after removal of savefiles. historyMax = 5000 maxFps = 30 noAnim = False
GameDefinition/scores view
binary file changed (80 → 962 bytes)
Makefile view
@@ -5,7 +5,7 @@ # # All xc* tests assume a profiling build (for stack traces).-# See the install-debug target below or .travis.yml.prof.+# See the install-debug target below. install-debug: cabal install --enable-library-profiling --enable-executable-profiling --ghc-options="-fprof-auto-calls" --disable-optimization@@ -18,68 +18,74 @@ dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --dumpInitRngs xcfrontendCampaign:- dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode campaign --difficulty 1+ dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame 1 --maxFps 60 --dumpInitRngs --automateAll --gameMode campaign +xcfrontendRaid:+ dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame 5 --maxFps 60 --dumpInitRngs --automateAll --gameMode raid+ xcfrontendSkirmish:- dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode skirmish+ dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame 5 --maxFps 60 --dumpInitRngs --automateAll --gameMode skirmish xcfrontendAmbush:- dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode ambush+ dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame 5 --maxFps 60 --dumpInitRngs --automateAll --gameMode ambush xcfrontendBattle:- dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode battle --difficulty 2+ dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame 2 --maxFps 60 --dumpInitRngs --automateAll --gameMode battle xcfrontendBattleSurvival:- dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode "battle survival" --difficulty 8+ dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame 8 --maxFps 60 --dumpInitRngs --automateAll --gameMode "battle survival" xcfrontendSafari:- dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode safari --difficulty 2+ dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame 2 --maxFps 60 --dumpInitRngs --automateAll --gameMode safari xcfrontendSafariSurvival:- dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode "safari survival" --difficulty 8+ dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame 8 --maxFps 60 --dumpInitRngs --automateAll --gameMode "safari survival" xcfrontendDefense:- dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode defense --difficulty 9+ dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame 9 --maxFps 60 --dumpInitRngs --automateAll --gameMode defense play: dist/build/Allure/Allure --dbgMsgSer --dumpInitRngs frontendCampaign:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode campaign --difficulty 1+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 1 --maxFps 60 --dumpInitRngs --automateAll --gameMode campaign +frontendRaid:+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 5 --maxFps 60 --dumpInitRngs --automateAll --gameMode raid+ frontendSkirmish:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode skirmish+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 5 --maxFps 60 --dumpInitRngs --automateAll --gameMode skirmish frontendAmbush:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode ambush+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 5 --maxFps 60 --dumpInitRngs --automateAll --gameMode ambush frontendBattle:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode battle --difficulty 2+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 2 --maxFps 60 --dumpInitRngs --automateAll --gameMode battle frontendBattleSurvival:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode "battle survival" --difficulty 8+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 8 --maxFps 60 --dumpInitRngs --automateAll --gameMode "battle survival" frontendSafari:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode safari --difficulty 2+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 2 --maxFps 60 --dumpInitRngs --automateAll --gameMode safari frontendSafariSurvival:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode "safari survival" --difficulty 8+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 8 --maxFps 60 --dumpInitRngs --automateAll --gameMode "safari survival" frontendDefense:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode defense --difficulty 9+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 9 --maxFps 60 --dumpInitRngs --automateAll --gameMode defense benchCampaign:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfter 60 --automateAll --keepAutomated --gameMode campaign --difficulty 1 --setDungeonRng 42 --setMainRng 42 +RTS -N1 -RTS+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 1 --noDelay --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfter 60 --automateAll --keepAutomated --gameMode campaign --setDungeonRng 42 --setMainRng 42 +RTS -N1 -RTS benchBattle:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfter 60 --automateAll --keepAutomated --gameMode battle --difficulty 2 --setDungeonRng 42 --setMainRng 42 +RTS -N1 -RTS+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 2 --noDelay --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfter 60 --automateAll --keepAutomated --gameMode battle --setDungeonRng 42 --setMainRng 42 +RTS -N1 -RTS benchFrontendCampaign:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 100000 --benchmark --stopAfter 60 --automateAll --keepAutomated --gameMode campaign --difficulty 1 --setDungeonRng 42 --setMainRng 42 +RTS -N1 -RTS+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 1 --maxFps 100000 --benchmark --stopAfter 60 --automateAll --keepAutomated --gameMode campaign --setDungeonRng 42 --setMainRng 42 +RTS -N1 -RTS benchFrontendBattle:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 100000 --benchmark --stopAfter 60 --automateAll --keepAutomated --gameMode battle --difficulty 2 --setDungeonRng 42 --setMainRng 42 +RTS -N1 -RTS+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 2 --maxFps 100000 --benchmark --stopAfter 60 --automateAll --keepAutomated --gameMode battle --setDungeonRng 42 --setMainRng 42 +RTS -N1 -RTS benchNull: benchCampaign benchBattle @@ -100,89 +106,97 @@ test-short: test-short-new test-short-load -test-medium: testCampaign-medium testSkirmish-medium testAmbush-medium testBattle-medium testBattleSurvival-medium testSafari-medium testSafariSurvival-medium testPvP-medium testCoop-medium testDefense-medium+test-medium: testCampaign-medium testRaid-medium testSkirmish-medium testAmbush-medium testBattle-medium testBattleSurvival-medium testSafari-medium testSafariSurvival-medium testPvP-medium testCoop-medium testDefense-medium -test-medium-no-safari: testCampaign-medium testSkirmish-medium testAmbush-medium testBattle-medium testBattleSurvival-medium testPvP-medium testCoop-medium testDefense-medium+test-medium-no-safari: testCampaign-medium testRaid-medium testSkirmish-medium testAmbush-medium testBattle-medium testBattleSurvival-medium testPvP-medium testCoop-medium testDefense-medium -test-long: testCampaign-long testSkirmish-medium testAmbush-medium testBattle-long testBattleSurvival-long testSafari-long testSafariSurvival-long testPvP-medium testDefense-long+test-long: testCampaign-long testRaid-medium testSkirmish-medium testAmbush-medium testBattle-long testBattleSurvival-long testSafari-long testSafariSurvival-long testPvP-medium testDefense-long -test-long-no-safari: testCampaign-long testSkirmish-medium testAmbush-medium testBattle-long testBattleSurvival-long testPvP-medium testDefense-long+test-long-no-safari: testCampaign-long testRaid-medium testSkirmish-medium testAmbush-medium testBattle-long testBattleSurvival-long testPvP-medium testDefense-long testCampaign-long:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 500 --dumpInitRngs --automateAll --keepAutomated --gameMode campaign --difficulty 1 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 1 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 500 --dumpInitRngs --automateAll --keepAutomated --gameMode campaign > /tmp/stdtest.log testCampaign-medium:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 400 --dumpInitRngs --automateAll --keepAutomated --gameMode campaign --difficulty 1 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 1 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 400 --dumpInitRngs --automateAll --keepAutomated --gameMode campaign > /tmp/stdtest.log +testRaid-long:+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 5 --maxFps 100000 --frontendStd --benchmark --stopAfter 60 --dumpInitRngs --automateAll --keepAutomated --gameMode raid > /tmp/stdtest.log++testRaid-medium:+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 5 --maxFps 100000 --frontendStd --benchmark --stopAfter 30 --dumpInitRngs --automateAll --keepAutomated --gameMode raid > /tmp/stdtest.log+ testSkirmish-long:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 100000 --frontendStd --benchmark --stopAfter 60 --dumpInitRngs --automateAll --keepAutomated --gameMode skirmish > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 5 --maxFps 100000 --frontendStd --benchmark --stopAfter 60 --dumpInitRngs --automateAll --keepAutomated --gameMode skirmish > /tmp/stdtest.log testSkirmish-medium:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 100000 --frontendStd --benchmark --stopAfter 30 --dumpInitRngs --automateAll --keepAutomated --gameMode skirmish > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 5 --maxFps 100000 --frontendStd --benchmark --stopAfter 30 --dumpInitRngs --automateAll --keepAutomated --gameMode skirmish > /tmp/stdtest.log testAmbush-long:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 60 --dumpInitRngs --automateAll --keepAutomated --gameMode ambush > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 5 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 60 --dumpInitRngs --automateAll --keepAutomated --gameMode ambush > /tmp/stdtest.log testAmbush-medium:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 30 --dumpInitRngs --automateAll --keepAutomated --gameMode ambush > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 5 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 30 --dumpInitRngs --automateAll --keepAutomated --gameMode ambush > /tmp/stdtest.log testBattle-long:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 100 --dumpInitRngs --automateAll --keepAutomated --gameMode battle --difficulty 2 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 2 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 100 --dumpInitRngs --automateAll --keepAutomated --gameMode battle > /tmp/stdtest.log testBattle-medium:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 50 --dumpInitRngs --automateAll --keepAutomated --gameMode battle --difficulty 2 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 2 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 50 --dumpInitRngs --automateAll --keepAutomated --gameMode battle > /tmp/stdtest.log testBattleSurvival-long:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 100 --dumpInitRngs --automateAll --keepAutomated --gameMode "battle survival" --difficulty 8 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 8 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 100 --dumpInitRngs --automateAll --keepAutomated --gameMode "battle survival" > /tmp/stdtest.log testBattleSurvival-medium:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 50 --dumpInitRngs --automateAll --keepAutomated --gameMode "battle survival" --difficulty 8 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 8 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 50 --dumpInitRngs --automateAll --keepAutomated --gameMode "battle survival" > /tmp/stdtest.log testSafari-long:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 250 --dumpInitRngs --automateAll --keepAutomated --gameMode safari --difficulty 2 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 2 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 250 --dumpInitRngs --automateAll --keepAutomated --gameMode safari > /tmp/stdtest.log testSafari-medium:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 200 --dumpInitRngs --automateAll --keepAutomated --gameMode safari --difficulty 2 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 2 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 200 --dumpInitRngs --automateAll --keepAutomated --gameMode safari > /tmp/stdtest.log testSafariSurvival-long:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 250 --dumpInitRngs --automateAll --keepAutomated --gameMode "safari survival" --difficulty 8 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 8 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 250 --dumpInitRngs --automateAll --keepAutomated --gameMode "safari survival" > /tmp/stdtest.log testSafariSurvival-medium:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 200 --dumpInitRngs --automateAll --keepAutomated --gameMode "safari survival" --difficulty 8 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 8 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 200 --dumpInitRngs --automateAll --keepAutomated --gameMode "safari survival" > /tmp/stdtest.log testPvP-long:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 60 --dumpInitRngs --automateAll --keepAutomated --gameMode PvP > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 5 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 60 --dumpInitRngs --automateAll --keepAutomated --gameMode PvP > /tmp/stdtest.log testPvP-medium:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 30 --dumpInitRngs --automateAll --keepAutomated --gameMode PvP > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 5 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 30 --dumpInitRngs --automateAll --keepAutomated --gameMode PvP > /tmp/stdtest.log testCoop-long:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 500 --dumpInitRngs --automateAll --keepAutomated --gameMode Coop --difficulty 2 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 2 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 500 --dumpInitRngs --automateAll --keepAutomated --gameMode Coop > /tmp/stdtest.log testCoop-medium:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 300 --dumpInitRngs --automateAll --keepAutomated --gameMode Coop --difficulty 2 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 2 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 300 --dumpInitRngs --automateAll --keepAutomated --gameMode Coop > /tmp/stdtest.log testDefense-long:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 500 --dumpInitRngs --automateAll --keepAutomated --gameMode defense --difficulty 9 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 9 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 500 --dumpInitRngs --automateAll --keepAutomated --gameMode defense > /tmp/stdtest.log testDefense-medium:- dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 300 --dumpInitRngs --automateAll --keepAutomated --gameMode defense --difficulty 9 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 9 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 300 --dumpInitRngs --automateAll --keepAutomated --gameMode defense > /tmp/stdtest.log test-short-new:- dist/build/Allure/Allure --dbgMsgSer --newGame --savePrefix campaign --dumpInitRngs --automateAll --keepAutomated --gameMode campaign --frontendStd --stopAfter 2 > /tmp/stdtest.log- dist/build/Allure/Allure --dbgMsgSer --newGame --savePrefix skirmish --dumpInitRngs --automateAll --keepAutomated --gameMode skirmish --frontendStd --stopAfter 2 > /tmp/stdtest.log- dist/build/Allure/Allure --dbgMsgSer --newGame --savePrefix ambush --dumpInitRngs --automateAll --keepAutomated --gameMode ambush --frontendStd --stopAfter 2 > /tmp/stdtest.log- dist/build/Allure/Allure --dbgMsgSer --newGame --savePrefix battle --dumpInitRngs --automateAll --keepAutomated --gameMode battle --frontendStd --stopAfter 2 > /tmp/stdtest.log- dist/build/Allure/Allure --dbgMsgSer --newGame --savePrefix battleSurvival --dumpInitRngs --automateAll --keepAutomated --gameMode "battle survival" --frontendStd --stopAfter 2 > /tmp/stdtest.log- dist/build/Allure/Allure --dbgMsgSer --newGame --savePrefix safari --dumpInitRngs --automateAll --keepAutomated --gameMode safari --frontendStd --stopAfter 2 > /tmp/stdtest.log- dist/build/Allure/Allure --dbgMsgSer --newGame --savePrefix safariSurvival --dumpInitRngs --automateAll --keepAutomated --gameMode "safari survival" --frontendStd --stopAfter 2 > /tmp/stdtest.log- dist/build/Allure/Allure --dbgMsgSer --newGame --savePrefix PvP --dumpInitRngs --automateAll --keepAutomated --gameMode PvP --frontendStd --stopAfter 2 > /tmp/stdtest.log- dist/build/Allure/Allure --dbgMsgSer --newGame --savePrefix Coop --dumpInitRngs --automateAll --keepAutomated --gameMode Coop --frontendStd --stopAfter 2 > /tmp/stdtest.log- dist/build/Allure/Allure --dbgMsgSer --newGame --savePrefix defense --dumpInitRngs --automateAll --keepAutomated --gameMode defense --frontendStd --stopAfter 2 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --newGame 5 --savePrefix campaign --dumpInitRngs --automateAll --keepAutomated --gameMode campaign --frontendStd --stopAfter 2 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --newGame 5 --savePrefix raid --dumpInitRngs --automateAll --keepAutomated --gameMode raid --frontendStd --stopAfter 2 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --newGame 5 --savePrefix skirmish --dumpInitRngs --automateAll --keepAutomated --gameMode skirmish --frontendStd --stopAfter 2 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --newGame 5 --savePrefix ambush --dumpInitRngs --automateAll --keepAutomated --gameMode ambush --frontendStd --stopAfter 2 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --newGame 5 --savePrefix battle --dumpInitRngs --automateAll --keepAutomated --gameMode battle --frontendStd --stopAfter 2 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --newGame 5 --savePrefix battleSurvival --dumpInitRngs --automateAll --keepAutomated --gameMode "battle survival" --frontendStd --stopAfter 2 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --newGame 5 --savePrefix safari --dumpInitRngs --automateAll --keepAutomated --gameMode safari --frontendStd --stopAfter 2 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --newGame 5 --savePrefix safariSurvival --dumpInitRngs --automateAll --keepAutomated --gameMode "safari survival" --frontendStd --stopAfter 2 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --newGame 5 --savePrefix PvP --dumpInitRngs --automateAll --keepAutomated --gameMode PvP --frontendStd --stopAfter 2 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --newGame 5 --savePrefix Coop --dumpInitRngs --automateAll --keepAutomated --gameMode Coop --frontendStd --stopAfter 2 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --newGame 5 --savePrefix defense --dumpInitRngs --automateAll --keepAutomated --gameMode defense --frontendStd --stopAfter 2 > /tmp/stdtest.log test-short-load: dist/build/Allure/Allure --dbgMsgSer --savePrefix campaign --dumpInitRngs --automateAll --keepAutomated --gameMode campaign --frontendStd --stopAfter 2 > /tmp/stdtest.log+ dist/build/Allure/Allure --dbgMsgSer --savePrefix raid --dumpInitRngs --automateAll --keepAutomated --gameMode raid --frontendStd --stopAfter 2 > /tmp/stdtest.log dist/build/Allure/Allure --dbgMsgSer --savePrefix skirmish --dumpInitRngs --automateAll --keepAutomated --gameMode skirmish --frontendStd --stopAfter 2 > /tmp/stdtest.log dist/build/Allure/Allure --dbgMsgSer --savePrefix ambush --dumpInitRngs --automateAll --keepAutomated --gameMode ambush --frontendStd --stopAfter 2 > /tmp/stdtest.log dist/build/Allure/Allure --dbgMsgSer --savePrefix battle --dumpInitRngs --automateAll --keepAutomated --gameMode battle --frontendStd --stopAfter 2 > /tmp/stdtest.log
README.md view
@@ -5,7 +5,7 @@ and tactical squad game. Have a look at [PLAYING.md](GameDefinition/PLAYING.md) or jump straight into the fray. -+ The game is written in [Haskell] [1] using the [LambdaHack] [10] roguelike game engine. Long-term goals of the project are high@@ -19,7 +19,7 @@ Pre-compiled game binaries for some platforms are available through the [release page] [11] and from the [Nix Packages Collection] [12]. To manually install a binary archive, make sure you have the GTK-libraries suite on your system, unpack the LambdaHack archive+libraries suite on your system, unpack the Allure archive and run the executable in the unpacked directory. On Windows, if you don't already have GTK installed (e.g., for the GIMP@@ -70,6 +70,7 @@ The latest official version of the game can be downloaded, compiled and installed automatically by Cabal from [Hackage] [3] as follows + cabal update cabal install gtk2hs-buildtools cabal install Allure --force-reinstalls
test/test.hs view
@@ -2,5 +2,5 @@ main :: IO () main =- tieKnot $ tail $ words "dist/build/LambdaHack/LambdaHack --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfter 6 --automateAll --gameMode campaign --setDungeonRng 42 --setMainRng 42"- -- tieKnot $ tail $ words "dist/build/LambdaHack/LambdaHack --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfter 6 --automateAll --gameMode battle --setDungeonRng 42 --setMainRng 42"+ tieKnot $ tail $ words "dist/build/LambdaHack/LambdaHack --dbgMsgSer --savePrefix test --newGame 2 --noDelay --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfter 6 --automateAll --keepAutomated --gameMode campaign --setDungeonRng 42 --setMainRng 42"+ -- tieKnot $ tail $ words "dist/build/LambdaHack/LambdaHack --dbgMsgSer --savePrefix test --newGame 2 --noDelay --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfter 6 --automateAll --keepAutomated --gameMode battle --setDungeonRng 42 --setMainRng 42"