Allure 0.6.1.0 → 0.6.2.0
raw patch · 14 files changed
+149/−115 lines, 14 filesdep ~LambdaHackdep ~base
Dependency ranges changed: LambdaHack, base
Files
- Allure.cabal +15/−13
- CHANGELOG.md +20/−0
- GameDefinition/Content/CaveKind.hs +19/−17
- GameDefinition/Content/ItemKind.hs +33/−29
- GameDefinition/Content/ItemKindActor.hs +15/−15
- GameDefinition/Content/ItemKindBlast.hs +17/−18
- GameDefinition/Content/ItemKindOrgan.hs +3/−4
- GameDefinition/Content/ModeKind.hs +2/−4
- GameDefinition/Content/PlaceKind.hs +7/−8
- GameDefinition/Content/RuleKind.hs +1/−1
- GameDefinition/PLAYING.md +11/−4
- GameDefinition/TieKnot.hs +1/−1
- Makefile +1/−1
- test/test.hs +4/−0
Allure.cabal view
@@ -5,7 +5,7 @@ -- PVP summary:+-+------- breaking API changes -- | | +----- minor or non-breaking API additions -- | | | +--- code changes with no API change-version: 0.6.1.0+version: 0.6.2.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.@@ -29,7 +29,7 @@ bug-reports: http://github.com/AllureOfTheStars/Allure/issues license: AGPL-3 license-file: LICENSE-tested-with: GHC >= 7.10 && <= 8.2+tested-with: GHC >= 8.0 && <= 8.2 data-files: GameDefinition/config.ui.default, GameDefinition/fonts/16x16x.fon, GameDefinition/fonts/8x8xb.fon,@@ -72,11 +72,11 @@ Content.TileKind, TieKnot, Paths_Allure- build-depends: LambdaHack >= 0.6.1.0 && < 0.6.2.0,+ build-depends: LambdaHack >= 0.6.2.0 && < 0.6.3.0, template-haskell >= 2.6, async >= 2,- base >= 4 && < 99,+ base >= 4.9 && < 99, containers >= 0.5.3.0, enummapset-th >= 0.6.0.0, filepath >= 1.2.0.1,@@ -85,10 +85,11 @@ default-language: Haskell2010 default-extensions: MonoLocalBinds, ScopedTypeVariables, OverloadedStrings- BangPatterns, RecordWildCards, NamedFieldPuns, MultiWayIf+ BangPatterns, RecordWildCards, NamedFieldPuns, MultiWayIf,+ StrictData other-extensions: TemplateHaskell- ghc-options: -Wall -fwarn-orphans -fwarn-tabs -fwarn-incomplete-uni-patterns -fwarn-incomplete-record-updates -fwarn-unrecognised-pragmas- ghc-options: -fno-warn-implicit-prelude -fno-ignore-asserts -fexpose-all-unfoldings -fspecialise-aggressively+ ghc-options: -Wall -Wcompat -Worphans -Wincomplete-uni-patterns -Wincomplete-record-updates -Wimplicit-prelude -Wmissing-home-modules -Widentities+ ghc-options: -fno-ignore-asserts -fexpose-all-unfoldings -fspecialise-aggressively ghc-options: -threaded -rtsopts if impl(ghcjs) {@@ -103,7 +104,7 @@ build-depends: zlib >= 0.5.3.1 -- The -A options makes it slightly faster, especially with short sessions: ghc-options: "-with-rtsopts=-A99m -K1000K"--- TODO: get back to -K1K when I can use pretty-1.1.3.4 (TH depends on an old one)+-- TODO: get back to -K1K when I can use pretty-1.1.3.4 (TH depends on an old one), that is, when I can drop GHC 8.0.2 and older } test-suite test@@ -128,7 +129,7 @@ build-depends: LambdaHack, template-haskell >= 2.6, - base >= 4 && < 99,+ base >= 4.9 && < 99, containers >= 0.5.3.0, enummapset-th >= 0.6.0.0, filepath >= 1.2.0.1,@@ -137,10 +138,11 @@ default-language: Haskell2010 default-extensions: MonoLocalBinds, ScopedTypeVariables, OverloadedStrings- BangPatterns, RecordWildCards, NamedFieldPuns, MultiWayIf+ BangPatterns, RecordWildCards, NamedFieldPuns, MultiWayIf,+ StrictData other-extensions: TemplateHaskell- ghc-options: -Wall -fwarn-orphans -fwarn-tabs -fwarn-incomplete-uni-patterns -fwarn-incomplete-record-updates -fwarn-unrecognised-pragmas- ghc-options: -fno-warn-implicit-prelude -fno-ignore-asserts -fexpose-all-unfoldings -fspecialise-aggressively+ ghc-options: -Wall -Wcompat -Worphans -Wincomplete-uni-patterns -Wincomplete-record-updates -Wimplicit-prelude -Wmissing-home-modules -Widentities+ ghc-options: -fno-ignore-asserts -fexpose-all-unfoldings -fspecialise-aggressively ghc-options: -threaded -rtsopts if impl(ghcjs) {@@ -151,5 +153,5 @@ } else { build-depends: zlib >= 0.5.3.1 ghc-options: "-with-rtsopts=-A99m -K1000K"--- get back to -K1K when I can use pretty-1.1.3.4 (TH depends on an old one)+-- TODO: get back to -K1K when I can use pretty-1.1.3.4 (TH depends on an old one), that is, when I can drop GHC 8.0.2 and older }
CHANGELOG.md view
@@ -1,3 +1,23 @@+## [v0.6.2.0, aka 'Zoom out'](https://github.com/LambdaHack/LambdaHack/compare/v0.6.1.0...v0.6.2.0)++- make fireworks slower and so easier to spot+- make rattlesnake deeper but more common+- announce no effect of activation+- describe original and current faction of an actor+- highlight dominated actors+- mark organs with comma instead of percent and gems with dollar+- make the healing cave dangerous to prevent camping+- slightly balance various content+- by default move item the same as last time+- often spawn between heroes and stairs going deeper+- fix totalUsefulness computation for negative effects+- fix abandoning distant enemy target despite no alternatives+- fix slow pushing of actors+- fix a crash when many actors run towards stairs+- hotfix: Pass zoom keys through to the browser+- help players find the info about changing the font size+- depend on GHC >= 8.0 and new vector+ ## [v0.6.1.0, aka 'Breaking one rule at a time'](https://github.com/LambdaHack/LambdaHack/compare/v0.6.0.0...v0.6.1.0) - major engine bugfix: fix redrawing after window minimized and restored
GameDefinition/Content/CaveKind.hs view
@@ -52,8 +52,8 @@ , chidden = 7 , cactorCoeff = 130 -- the maze requires time to explore , cactorFreq = [("monster", 50), ("animal", 25), ("robot", 25)]- , citemNum = 5 * d 5- , citemFreq = [("useful", 50), ("treasure", 50)]+ , citemNum = 6 * d 5+ , citemFreq = [("useful", 40), ("treasure", 60)] , cplaceFreq = [("rogue", 100)] , cpassable = False , cdefTile = "fillerWall"@@ -90,11 +90,12 @@ , chidden = 0 , cactorCoeff = 100 , cactorFreq = [("monster", 25), ("animal", 70), ("robot", 5)]- , citemNum = 4 * d 5 -- few rooms- , citemFreq = [("useful", 20), ("treasure", 30), ("any scroll", 50)]+ , citemNum = 5 * d 5 -- few rooms+ , citemFreq = [("useful", 20), ("treasure", 40), ("any scroll", 40)] , cplaceFreq = [("arena", 100)] , cpassable = True , cdefTile = "arenaSetLit"+ , cdarkCorTile = "trailLit" -- let trails give off light , clitCorTile = "trailLit" } arena2 = arena@@ -103,10 +104,9 @@ , cdarkChance = 41 + d 10 -- almost all rooms lit (1 in 10 dark) -- Trails provide enough light for fun stealth. , cnightChance = 51 -- always night- , citemNum = 6 * d 5 -- rare, so make it exciting- , citemFreq = [("useful", 30), ("treasure", 70)] -- lives up to the name+ , citemNum = 7 * d 5 -- rare, so make it exciting+ , citemFreq = [("useful", 20), ("treasure", 80)] -- lives up to the name , cdefTile = "arenaSetDark"- , cdarkCorTile = "trailLit" -- let trails give off light } laboratory = arena2 { csymbol = 'L'@@ -122,11 +122,12 @@ , cdoorChance = 1 , copenChance = 1%2 , chidden = 7- , citemNum = 6 * d 5 -- reward difficulty- , citemFreq = [("useful", 20), ("treasure", 30), ("any vial", 50)]+ , citemNum = 7 * d 5 -- reward difficulty+ , citemFreq = [("useful", 20), ("treasure", 40), ("any vial", 40)] , cplaceFreq = [("laboratory", 100)] , cpassable = False , cdefTile = "fillerWall"+ , cdarkCorTile = "labTrailLit" -- let lab smoke give off light always , clitCorTile = "labTrailLit" , cstairFreq = [("staircase lift", 100)] }@@ -148,7 +149,7 @@ , chidden = 0 , cactorCoeff = 80 , cactorFreq = [("monster", 25), ("animal", 5), ("robot", 70)]- , citemNum = 4 * d 5 -- few rooms+ , citemNum = 5 * d 5 -- few rooms , cplaceFreq = [("empty", 100)] , cpassable = True , cdefTile = "emptySet"@@ -174,7 +175,7 @@ , chidden = 0 , cactorCoeff = 160 -- the maze requires time to explore , cactorFreq = [("monster", 70), ("animal", 15), ("robot", 15)]- , citemNum = 6 * d 5 -- an incentive to explore the labyrinth+ , citemNum = 7 * d 5 -- an incentive to explore the labyrinth , cpassable = True , cplaceFreq = [("noise", 100)] , cdefTile = "noiseSet"@@ -186,7 +187,7 @@ { cname = "Power distribution hub" , cfreq = [("caveNoise2", 1)] , cnightChance = 51 -- easier variant, but looks sinister- , citemNum = 12 * d 5 -- an incentive to explore the final labyrinth+ , citemNum = 13 * d 5 -- an incentive to explore the final labyrinth , cplaceFreq = [("noise", 1), ("mine", 99)] , cstairFreq = [("gated staircase", 100)] }@@ -196,8 +197,9 @@ , cfreq = [("caveBridge", 1)] , cdarkChance = 0 -- all rooms lit, for a gentle start , cextraStairs = 1- , cactorFreq = [] -- safe, nothing spawns- , citemNum = 8 * d 5 -- lure them in with loot+ , cactorCoeff = 200 -- it's quite deep already, so spawn slowly+ , cactorFreq = [("animal", 100)]+ , citemNum = 9 * d 5 -- lure them in with loot , citemFreq = filter ((/= "treasure") . fst) $ citemFreq rogue } shallow2rogue = rogue@@ -221,8 +223,8 @@ shallow1empty = shallow2empty -- TODO: replace some rooms with oriels? { cname = "Outermost deck" , cfreq = [("outermost", 100)]- , cactorCoeff = 5 -- shallower than LH, so less immediate actors, so boost- , cactorFreq = [("animal", 4), ("robot", 1), ("immobile robot", 95)]+ , cactorCoeff = 4 -- shallower than LH, so less immediate actors, so boost+ , cactorFreq = [("animal", 5), ("robot", 5), ("immobile robot", 90)] -- The medbot faucets on lvl 1 act like HP resets. Needed to avoid -- cascading failure, if the particular starting conditions were -- very hard. Items are not reset, even if they are bad, which provides@@ -244,7 +246,7 @@ , cfreq = [("caveRaid", 1)] , cdarkChance = 0 -- all rooms lit, for a gentle start , cmaxVoid = 1%10- , cactorCoeff = 1000 -- deep level with no kit, so slow spawning+ , cactorCoeff = 500 -- deep level with no kit, so slow spawning , cactorFreq = [("animal", 50), ("robot", 50)] , citemNum = 6 * d 8 -- just one level, hard enemies, treasure , citemFreq = [("useful", 33), ("gem", 33), ("currency", 33)]
GameDefinition/Content/ItemKind.hs view
@@ -52,14 +52,14 @@ -- * Item group symbols, from Angband and variants -symbolProjectile, _symbolLauncher, symbolLight, symbolTool, symbolGem, symbolGold, symbolNecklace, symbolRing, symbolPotion, symbolFlask, symbolScroll, symbolTorsoArmor, symbolMiscArmor, _symbolClothes, symbolShield, symbolPolearm, symbolEdged, symbolHafted, symbolWand, _symbolStaff, _symbolFood :: Char+symbolProjectile, _symbolLauncher, symbolLight, symbolTool, symbolSpecial, symbolGold, symbolNecklace, symbolRing, symbolPotion, symbolFlask, symbolScroll, symbolTorsoArmor, symbolMiscArmor, _symbolClothes, symbolShield, symbolPolearm, symbolEdged, symbolHafted, symbolWand, _symbolStaff, symbolFood :: Char symbolProjectile = '{' _symbolLauncher = '}' symbolLight = '(' symbolTool = ')'-symbolGem = '*'-symbolGold = '$'+symbolSpecial = '*' -- don't overuse, because it clashes with projectiles+symbolGold = '$' -- also gems symbolNecklace = '"' symbolRing = '=' symbolPotion = '!' -- concoction, bottle, jar, vial, canister@@ -74,7 +74,7 @@ symbolHafted = '\\' symbolWand = '-' -- magical rod, transmitter, pistol, rifle _symbolStaff = '_' -- scanner-_symbolFood = ',' -- distinct from floor, because middle dots used+symbolFood = ',' -- also body part; distinct from floor: not middle dot -- * Thrown weapons @@ -375,7 +375,7 @@ { irarity = [(10, 2)] , ieffects = [ ELabel "of smelly concoction" , toOrganActorTurn "keen-smelling" (40 + d 10)- , DetectActor 5+ , DetectActor 10 , OnSmash (Explode "smelly droplet") ] } flask11 = flask@@ -486,8 +486,9 @@ , ieffects = [ RefillHP 10, DropItem 1 maxBound COrgan "poisoned" , OnSmash (Explode "healing mist 2") ] }-potion5 = potion- { ieffects = [ OneOf [ RefillHP 10, RefillHP 5, Burn 5+potion5 = potion -- needs to be common to show at least a portion of effects+ { irarity = [(1, 30), (10, 15)]+ , ieffects = [ OneOf [ RefillHP 10, RefillHP 5, Burn 5 , toOrganActorTurn "strengthened" (20 + d 5) ] , OnSmash (OneOf [ Explode "dense shower" , Explode "sparse shower"@@ -496,8 +497,8 @@ , Explode "red paint" , Explode "blast 10" ]) ] }-potion6 = potion- { irarity = [(3, 2), (10, 5)]+potion6 = potion -- needs to be common to show at least a portion of effects+ { irarity = [(1, 5), (10, 20)] , ieffects = [ Impress , OneOf [ RefillCalm (-60) , RefillHP 20, RefillHP 10, Burn 10@@ -561,23 +562,24 @@ } scroll2 = scroll { irarity = [(1, 2)]- , ieffects = [ ELabel "of greed", Teleport 20, DetectItem 10+ , ieffects = [ ELabel "of greed", Teleport 20, DetectItem 20 , RefillCalm (-100) ] } scroll3 = scroll { irarity = [(1, 4), (10, 2)] , ieffects = [Ascend True] }-scroll4 = scroll- { ieffects = [OneOf [ Teleport 5, RefillCalm 5, InsertMove 5- , DetectActor 10, DetectItem 10 ]]+scroll4 = scroll -- needs to be common to show at least a portion of effects+ { irarity = [(1, 40), (10, 20)]+ , ieffects = [OneOf [ Teleport 5, RefillCalm 5, InsertMove 5+ , DetectActor 20, DetectItem 20 ]] }-scroll5 = scroll- { irarity = [(10, 14)]+scroll5 = scroll -- needs to be common to show at least a portion of effects+ { irarity = [(10, 30)] , ieffects = [ Impress , OneOf [ Teleport 20, Ascend False, Ascend True , Summon "hero" 1, Summon "mobile animal" 2- , Detect 20, RefillCalm (-100)+ , Detect 40, RefillCalm (-100) , CreateItem CGround "useful" TimerNone ] ] } scroll6 = scroll@@ -591,7 +593,8 @@ , ieffects = [InsertMove $ 1 + d 2 + dl 2] } scroll9 = scroll- { ieffects = [ELabel "of scientific explanation", Identify]+ { irarity = [(1, 30)]+ , ieffects = [ELabel "of scientific explanation", Identify] } scroll10 = scroll { irarity = [(10, 20)]@@ -605,10 +608,10 @@ } scroll12 = scroll { irarity = [(1, 9), (10, 4)]- , ieffects = [DetectHidden 10]+ , ieffects = [DetectHidden 20] } scroll13 = scroll- { ieffects = [ELabel "of acute hearing", DetectActor 7]+ { ieffects = [ELabel "of acute hearing", DetectActor 20] } -- * Assorted tools@@ -646,7 +649,7 @@ , ikit = [] } seeingItem = ItemKind- { isymbol = '%'+ { isymbol = symbolFood , iname = "visual sensor" , ifreq = [("useful", 100)] , iflavour = zipPlain [Red]@@ -742,7 +745,7 @@ necklace3 = necklace { iaspects = [Timeout $ d 3 + 4 - dl 3 |*| 5] , ieffects = [ ELabel "of fearful listening"- , Recharging (DetectActor 10)+ , Recharging (DetectActor 20) , Recharging (RefillCalm (-20)) ] ++ ieffects necklace }@@ -1036,7 +1039,7 @@ , ifreq = [("useful", 100), ("starting weapon", 100)] , iflavour = zipPlain [BrCyan] , icount = 1- , irarity = [(1, 40), (5, 1)]+ , irarity = [(3 * 10/12, 50), (4 * 10/12, 1)] , iverbHit = "stab" , iweight = 1000 , idamage = toDmg $ 6 * d 1@@ -1124,7 +1127,7 @@ , irarity = [(5, 1), (10, 6)] , iaspects = [Timeout $ d 4 + 5 - dl 4 |*| 2] , ieffects = ieffects sword- ++ [Unique, Recharging Impress, Recharging (DetectActor 3)]+ ++ [Unique, Recharging Impress, Recharging (DetectActor 5)] } swordNullify = sword { isymbol = symbolEdged@@ -1196,7 +1199,7 @@ -- * Treasure gem = ItemKind- { isymbol = symbolGem+ { isymbol = symbolGold , iname = "gem" , ifreq = [("treasure", 100), ("gem", 100)] , iflavour = zipPlain $ delete BrYellow brightCol -- natural, so not fancy@@ -1214,19 +1217,20 @@ , ikit = [] } gem1 = gem- { irarity = [(3, 0), (10, 12)]+ { irarity = [(3, 0), (10, 24)] } gem2 = gem- { irarity = [(5, 0), (10, 14)]+ { irarity = [(5, 0), (10, 28)] } gem3 = gem- { irarity = [(7, 0), (10, 16)]+ { irarity = [(7, 0), (10, 32)] } gem4 = gem- { irarity = [(9, 0), (10, 50)]+ { irarity = [(9, 0), (10, 100)] } gem5 = gem- { iname = "stimpack"+ { isymbol = symbolSpecial+ , iname = "stimpack" , iflavour = zipPlain [BrYellow] , irarity = [(1, 40), (10, 40)] , iaspects = []
GameDefinition/Content/ItemKindActor.hs view
@@ -339,7 +339,7 @@ , ifreq = [("animal", 100), ("mobile", 1), ("mobile animal", 100)] , iflavour = zipPlain [Brown] , icount = 1- , irarity = [(4, 1), (10, 7)]+ , irarity = [(5, 1), (10, 12)] , iverbHit = "thud" , iweight = 80000 , idamage = toDmg 0@@ -472,10 +472,10 @@ thornbush = ItemKind { isymbol = 't' , iname = "thornbush"- , ifreq = [("animal", 50), ("immobile animal", 100)]+ , ifreq = [("animal", 20), ("immobile animal", 30)] , iflavour = zipPlain [Brown] , icount = 1- , irarity = [(1, 2)]+ , irarity = [(1, 10)] , iverbHit = "thud" , iweight = 80000 , idamage = toDmg 0@@ -495,10 +495,10 @@ razorwireFence = ItemKind { isymbol = 'f' , iname = "razorwire fence"- , ifreq = [("robot", 50), ("immobile robot", 50)]+ , ifreq = [("robot", 10), ("immobile robot", 10)] , iflavour = zipPlain [Cyan] , icount = 1- , irarity = [(3 * 10/12, 0), (4 * 10/12, 2)]+ , irarity = [(3 * 10/12, 0), (4 * 10/12, 10)] -- quickly vanishes at depth , iverbHit = "thud" , iweight = 80000 , idamage = toDmg 0@@ -513,10 +513,10 @@ electricFence = ItemKind { isymbol = 'f' , iname = "electric fence"- , ifreq = [("robot", 50), ("immobile robot", 50)]+ , ifreq = [("robot", 10), ("immobile robot", 10)] , iflavour = zipPlain [Blue] , icount = 1- , irarity = [(3 * 10/12, 0), (4 * 10/12, 2)]+ , irarity = [(3 * 10/12, 0), (4 * 10/12, 10)] , iverbHit = "thud" , iweight = 80000 , idamage = toDmg 0@@ -531,10 +531,10 @@ activeFence = ItemKind { isymbol = 'f' , iname = "active fence"- , ifreq = [("robot", 50), ("immobile robot", 50)]+ , ifreq = [("robot", 30), ("immobile robot", 30)] , iflavour = zipPlain [Red] , icount = 1- , irarity = [(5 * 10/12, 0), (6 * 10/12, 2)]+ , irarity = [(5 * 10/12, 0), (6 * 10/12, 3)] , iverbHit = "thud" , iweight = 80000 , idamage = toDmg 0@@ -550,10 +550,10 @@ steamFaucet = ItemKind { isymbol = 'f' , iname = "steam faucet"- , ifreq = [("robot", 50), ("immobile robot", 90)]+ , ifreq = [("robot", 30), ("immobile robot", 50)] , iflavour = zipPlain [BrBlue] , icount = 1- , irarity = [(5, 2)]+ , irarity = [(1, 3), (5 * 10/12, 3)] , iverbHit = "thud" , iweight = 80000 , idamage = toDmg 0@@ -568,10 +568,10 @@ biogasFaucet = ItemKind { isymbol = 'f' , iname = "biogas faucet"- , ifreq = [("robot", 50), ("immobile robot", 120)]+ , ifreq = [("robot", 10), ("immobile robot", 30)] , iflavour = zipPlain [BrGreen] , icount = 1- , irarity = [(5, 2)]+ , irarity = [(1, 10), (5 * 10/12, 10)] , iverbHit = "thud" , iweight = 80000 , idamage = toDmg 0@@ -586,10 +586,10 @@ medbotFaucet = ItemKind { isymbol = 'f' , iname = "nano medbot faucet"- , ifreq = [("robot", 50), ("immobile robot", 270)]+ , ifreq = [("robot", 10), ("immobile robot", 90)] , iflavour = zipPlain [BrYellow] , icount = 1- , irarity = [(5, 2)]+ , irarity = [(1, 10), (5 * 10/12, 10)] , iverbHit = "thud" , iweight = 80000 , idamage = toDmg 0
GameDefinition/Content/ItemKindBlast.hs view
@@ -88,11 +88,10 @@ , iaspects = [AddShine $ intToDice $ n `div` 2] , ieffects = [ RefillCalm (-1) | n >= 5 ] ++ [ DropBestWeapon | n >= 5]- ++ [ OnSmash (Explode $ toGroupName- $ "firecracker" <+> tshow (n - 1))+ ++ [ OnSmash $ Explode+ $ toGroupName $ "firecracker" <+> tshow (n - 1) | n > 2 ]- , ifeature = [ ToThrow $ ThrowMod (5 + 3 * n) (10 + 100 `div` n)- , Fragile, Identified ]+ , ifeature = [toVelocity 5, Fragile, Identified] , idesc = "" , ikit = [] }@@ -143,7 +142,7 @@ { isymbol = '`' , iname = "mist" , ifreq = [("calming mist", 1)]- , iflavour = zipFancy [White]+ , iflavour = zipFancy [BrGreen] , icount = 8 , irarity = [(1, 1)] , iverbHit = "sooth"@@ -175,7 +174,7 @@ { isymbol = '`' , iname = "mist" -- powerful, so slow and narrow , ifreq = [("healing mist", 1)]- , iflavour = zipFancy [White]+ , iflavour = zipFancy [BrGreen] , icount = 8 , irarity = [(1, 1)] , iverbHit = "revitalize"@@ -191,7 +190,7 @@ { isymbol = '`' , iname = "mist" , ifreq = [("healing mist 2", 1)]- , iflavour = zipFancy [White]+ , iflavour = zipFancy [BrGreen] , icount = 8 , irarity = [(1, 1)] , iverbHit = "revitalize"@@ -207,7 +206,7 @@ { isymbol = '`' , iname = "mist" , ifreq = [("wounding mist", 1)]- , iflavour = zipFancy [White]+ , iflavour = zipFancy [BrRed] , icount = 8 , irarity = [(1, 1)] , iverbHit = "devitalize"@@ -287,7 +286,7 @@ { isymbol = '*' , iname = "hoof glue" , ifreq = [("glue", 1)]- , iflavour = zipPlain [BrYellow]+ , iflavour = zipPlain [Cyan] , icount = 16 , irarity = [(1, 1)] , iverbHit = "glue"@@ -303,7 +302,7 @@ { isymbol = '`' , iname = "single spark" , ifreq = [("single spark", 1)]- , iflavour = zipPlain [BrYellow]+ , iflavour = zipPlain [BrWhite] , icount = 1 , irarity = [(1, 1)] , iverbHit = "spark"@@ -319,7 +318,7 @@ { isymbol = '`' , iname = "spark" , ifreq = [("spark", 1)]- , iflavour = zipPlain [BrYellow]+ , iflavour = zipPlain [BrWhite] , icount = 16 , irarity = [(1, 1)] , iverbHit = "scorch"@@ -342,7 +341,7 @@ { isymbol = '`' , iname = "dense shower" , ifreq = [("dense shower", 1)]- , iflavour = zipFancy [Red]+ , iflavour = zipFancy [Green] , icount = 16 , irarity = [(1, 1)] , iverbHit = "strengthen"@@ -358,7 +357,7 @@ { isymbol = '`' , iname = "sparse shower" , ifreq = [("sparse shower", 1)]- , iflavour = zipFancy [Blue]+ , iflavour = zipFancy [Red] , icount = 16 , irarity = [(1, 1)] , iverbHit = "weaken"@@ -439,7 +438,7 @@ { isymbol = '`' , iname = "haste spray" , ifreq = [("haste spray", 1)]- , iflavour = zipPlain [BrRed]+ , iflavour = zipPlain [BrYellow] , icount = 16 , irarity = [(1, 1)] , iverbHit = "haste"@@ -471,7 +470,7 @@ { isymbol = '`' , iname = "eye drop" , ifreq = [("eye drop", 1)]- , iflavour = zipPlain [BrGreen]+ , iflavour = zipPlain [BrCyan] , icount = 16 , irarity = [(1, 1)] , iverbHit = "cleanse"@@ -519,7 +518,7 @@ { isymbol = '`' , iname = "eye shine" , ifreq = [("eye shine", 1)]- , iflavour = zipPlain [BrRed]+ , iflavour = zipPlain [Cyan] , icount = 16 , irarity = [(1, 1)] , iverbHit = "smear"@@ -586,7 +585,7 @@ { isymbol = '`' , iname = "poison cloud" , ifreq = [("poison cloud", 1)]- , iflavour = zipPlain [Green]+ , iflavour = zipPlain [BrMagenta] , icount = 16 , irarity = [(1, 1)] , iverbHit = "poison"@@ -602,7 +601,7 @@ { isymbol = '`' , iname = "mist" , ifreq = [("anti-slow mist", 1)]- , iflavour = zipPlain [BrRed]+ , iflavour = zipPlain [BrYellow] , icount = 8 , irarity = [(1, 1)] , iverbHit = "propel"
GameDefinition/Content/ItemKindOrgan.hs view
@@ -34,7 +34,7 @@ -- * Human weapon organs fist = ItemKind- { isymbol = '%'+ { isymbol = ',' , iname = "fist" , ifreq = [("fist", 100)] , iflavour = zipPlain [Red]@@ -133,8 +133,7 @@ , ifreq = [("thorn", 100)] , icount = 2 + d 3 , iverbHit = "impale"- , idamage = toDmg $ 1 * d 1- , ieffects = [RefillHP (-2)]+ , idamage = toDmg $ 1 * d 3 , ifeature = [Identified, Meleeable] -- not Durable , idesc = "" }@@ -230,7 +229,7 @@ -- * Armor organs armoredSkin = ItemKind- { isymbol = '%'+ { isymbol = ',' , iname = "armored skin" , ifreq = [("armored skin", 100)] , iflavour = zipPlain [Red]
GameDefinition/Content/ModeKind.hs view
@@ -335,10 +335,8 @@ , ( playerMonster , [] ) , ( playerAnimal- , -- Fun from the start to avoid empty initial level:- [ (3, 5 + d 2, "animal") -- many, because no spawning- -- Optional huge battle at the end:- , (12, 100, "mobile animal") ] )+ , -- Optional huge battle at the end:+ [(12, 100, "mobile animal")] ) , ( playerRobot , [] ) ] -- gentle introduction , rosterEnemy = [ ("Spacefarer", "Alien Hierarchy")
GameDefinition/Content/PlaceKind.hs view
@@ -727,8 +727,8 @@ cells = PlaceKind { psymbol = '#' , pname = "cells"- , pfreq = [ ("rogue", 50), ("arena", 50), (" laboratory", 50)- , ("empty", 50), ("noise", 50) ]+ , pfreq = [ ("rogue", 20), ("arena", 20), (" laboratory", 20)+ , ("empty", 20), ("noise", 20), ("zoo", 200) ] , prarity = [(1, 10), (10, 10)] , pcover = CReflect , pfence = FWall@@ -738,8 +738,9 @@ ] , poverride = [] }-cells2 = cells- { pfreq = ("zoo", 400) : pfreq cells+cells2 = cells -- this one is distinct enough from others+ { pfreq = [ ("rogue", 50), ("arena", 50), (" laboratory", 50)+ , ("empty", 50), ("noise", 50), ("zoo", 500) ] , ptopLeft = [ "··#" , "··#" , "##·"@@ -752,15 +753,13 @@ ] } cells4 = cells- { pfreq = ("zoo", 400) : pfreq cells- , ptopLeft = [ "··#"+ { ptopLeft = [ "··#" , "·##" , "#··" ] } cells5 = cells- { pfreq = ("zoo", 400) : pfreq cells- , ptopLeft = [ "··#"+ { ptopLeft = [ "··#" , "·#·" , "##·" ]
GameDefinition/Content/RuleKind.hs view
@@ -68,6 +68,6 @@ , rfirstDeathEnds = False , rwriteSaveClips = 1000 , rleadLevelClips = 50- , rscoresFile = "scores"+ , rscoresFile = "Allure.scores" , rnearby = 20 }
GameDefinition/PLAYING.md view
@@ -17,7 +17,12 @@ at this stage of game development, but the game is already playable and winnable. Contributions are welcome. +If the game window is too large for your screen or you experience+other technical issues, please consult+[README.md](https://github.com/AllureOfTheStars/Allure/blob/master/README.md)+or describe your problem on gitter or the issue tracker. + Heroes ------ @@ -190,8 +195,8 @@ as explained in section [Heroes](#heroes) above. Commands for saving and exiting the current game, starting a new game,-setting options for the current game and challenges for the next game, etc.,-are listed in the Main Menu, brought up by the `ESC` key.+configuring convenience settings for the current game and challenges+for the next game are listed in the Main Menu, brought up by the `ESC` key. Game difficulty, from the challenges menu, determines hitpoints at birth for any actor of any UI-using faction. The "lone wolf" challenge mode reduces player's starting actors to exactly@@ -212,7 +217,6 @@ along a single staircase and also of guarding staircases against enemies from other levels or, inversely, avoiding the staircases. - Monsters -------- @@ -261,8 +265,11 @@ The displayed figures are rounded, but the game internally keeps track of minute fractions of HP. +The stress of combat drains Calm, gradually limiting the use of items and,+if Calm reaches zero and the actor is sufficiently impressed by his foes,+making him defect and surrender to their domination. Whenever the monster's or hero's hit points reach zero, the combatant dies.-When the last hero dies, the scenario ends in defeat.+When the last hero dies or is dominated, the scenario ends in defeat. On Winning and Dying
GameDefinition/TieKnot.hs view
@@ -67,7 +67,7 @@ let (r, _) = R.randomR (0, length l - 1) initialGen in case splitAt r l of (pre, i : post) -> pre ++ boostItem i : post- _ -> assert `failure` l+ _ -> error $ "" `showFailure` l boostedItems = boostList Content.ItemKind.items cdefsItem = Content.ItemKind.cdefs
Makefile view
@@ -142,7 +142,7 @@ dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 7 --noAnim --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 60 --dumpInitRngs --automateAll --keepAutomated --gameMode "battle survival" 2> /tmp/teletypetest.log testDefense-medium:- dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 9 --noAnim --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 500 --dumpInitRngs --automateAll --keepAutomated --gameMode defense 2> /tmp/teletypetest.log+ dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 9 --noAnim --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 300 --dumpInitRngs --automateAll --keepAutomated --gameMode defense 2> /tmp/teletypetest.log test-short-new: dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 5 --savePrefix raid --dumpInitRngs --automateAll --keepAutomated --gameMode raid --frontendTeletype --stopAfterSeconds 2 2> /tmp/teletypetest.log
test/test.hs view
@@ -1,3 +1,7 @@+import Prelude ()++import Game.LambdaHack.Common.Prelude+ import TieKnot main :: IO ()