Allure 0.4.3 → 0.4.4
raw patch · 9 files changed
+184/−94 lines, 9 filesdep ~LambdaHack
Dependency ranges changed: LambdaHack
Files
- Allure.cabal +8/−5
- PLAYING.md +39/−41
- README.md +11/−2
- config.default +8/−6
- scores binary
- src/Content/ActorKind.hs +24/−10
- src/Content/CaveKind.hs +12/−8
- src/Content/ItemKind.hs +80/−22
- src/Content/RuleKind.hs +2/−0
Allure.cabal view
@@ -1,9 +1,9 @@ cabal-version: >= 1.10 name: Allure-version: 0.4.3+version: 0.4.4 license: OtherLicense license-file: LICENSE-tested-with: GHC == 7.2.2, GHC == 7.4+tested-with: GHC == 7.2.2, GHC == 7.4.1 data-files: LICENSE, CREDITS, PLAYING.md, README.md, config.default, config.bot, scores author: Andres Loeh, Mikolaj Konarski and others@@ -13,6 +13,9 @@ The game is barely fun at this stage and not yet really Sci-Fi. See the wiki for design notes and contribute. .+ New in this release are missiles flying for three turns+ (by an old kosmikus' idea), visual feedback for targeting+ and animations of combat and individual monster moves. Long term goals are high replayability and auto-balancing through procedural content generation and persistent content modification based on player behaviour.@@ -41,7 +44,7 @@ ConfigDefault hs-source-dirs: src other-modules: Paths_Allure- build-depends: LambdaHack >= 0.2.0 && < 0.2.1,+ build-depends: LambdaHack >= 0.2.1 && < 0.2.2, template-haskell >= 2.6 && < 3, ConfigFile >= 1.1.1 && < 2, array >= 0.3.0.3 && < 1,@@ -60,6 +63,6 @@ BangPatterns, RecordWildCards, NamedFieldPuns other-extensions: CPP, QuasiQuotes ghc-options: -Wall -fwarn-orphans -fwarn-tabs -fwarn-incomplete-uni-patterns -fwarn-incomplete-record-updates -fwarn-monomorphism-restriction -fwarn-unrecognised-pragmas- ghc-options: -fno-warn-auto-orphans -fno-warn-implicit-prelude -fno-warn-unused-do-bind+ ghc-options: -fno-warn-auto-orphans -fno-warn-implicit-prelude ghc-options: -fno-ignore-asserts -funbox-strict-fields- ghc-options: -threaded+ ghc-options: -threaded -with-rtsopts=-C0.005
PLAYING.md view
@@ -55,11 +55,8 @@ /|\ /|\ 1 2 3 b j n -Shift and a movement key make the hero run in the indicated direction,-until anything of interest is spotted. '5' and '.' skip a turn.-(Note that If you are using the curses or vty frontends,-numerical keypad may not work correctly depending on the versions-of curses, terminfo and terminal emulators. Vi keys should work regardless.)+SHIFT (or CTRL) and a movement key make the hero run in the indicated+direction, until anything of interest is spotted. '5' and '.' skip a turn. Melee, searching for secret doors and opening closed doors can be done by bumping into a monster, a wall and a door, respectively. @@ -67,22 +64,22 @@ are specialized versions of 'a' and 'p', offering narrower default item choice. The commands that take player time are marked with a *. - key command- < ascend a level*- > descend a level*- ? display help- Q quit without saving- X save and exit the game- a apply a consumable*- c close a door*- d drop an object*- g get an object*- i display inventory- p project a projectile*- q quaff a drink*- r read a comm*- t throw a missile*- z zap a mechanism*+ key command+ < ascend a level*+ > descend a level*+ ? display help+ Q quit without saving+ X save and exit the game+ a apply a consumable*+ c close a door*+ d drop an object*+ g get an object*+ i display inventory+ p project a projectile*+ q quaff a drink*+ r read a comm*+ t throw a missile*+ z zap a mechanism* To make a ranged attack, you need to set your target first, using targeting mode. Note that the target, for the few commands that require any,@@ -95,28 +92,29 @@ than the selected hero). The targeting commands and all the less used commands are listed below. None of them takes hero time. - key command- ESC cancel action- RET accept choice- SPACE clear messages- TAB cycle among heroes on level- * target monster- / target location- D dump current configuration- P display previous messages- V display game version- [ target next shallower level- ] target next deeper level- { target 10 levels shallower- } target 10 levels deeper- 0--9 select a hero anywhere in the spaceship (gtk only)+ key command+ ESC cancel action+ RET accept choice+ SPACE clear messages+ TAB cycle among heroes on level+ * target monster+ / target location+ D dump current configuration+ P display previous messages+ V display game version+ [ target next shallower level+ ] target next deeper level+ { target 10 levels shallower+ } target 10 levels deeper+ 0--9 select a hero anywhere in the spaceship -There are also some debug and cheat keys. Use at your own peril!+There are also some debug and cheat keys, all entered with the CTRL+key modifier. Use at your own peril! - key command- O toggle "omniscience"- I inform about level meta-data- R rotate display modes+ key command+ CTRL-o toggle "omniscience"+ CTRL-i inform about level meta-data+ CTRL-r rotate vision modes (effective next turn) Monsters
README.md view
@@ -23,12 +23,21 @@ and run 'cabal install' from the main directory. -Compatibility note-------------------+Compatibility notes+------------------- The current code was tested with GHC 7.2.2 and several pre-release versions of GHC 7.4. A [few tweaks] [7] are needed to compile with 7.0 and some more are needed for 6.12.++If you are using the curses or vty frontends,+numerical keypad may not work correctly depending on the versions+of curses, terminfo and terminal emulators.+Selecting heroes via number keys or SHIFT-keypad keys is disabled+with curses, because CTRL-keypad for running does not work there,+so the numbers produced by the keypad have to be used. With vty on xterm,+CTRL-direction keys seem to work OK, but on rxvt they do not.+Vi keys (ykuhlbjn) should work everywhere regardless. Gtk works fine, too. Further information
config.default view
@@ -22,18 +22,20 @@ ; braceright: TgtAscend (-10) ; slash: TgtFloor ; asterisk: TgtEnemy+; plus: EpsIncr True+; minus: EpsIncr False ; Tab: HeroCycle ; ; ; ; Items. ; g: Pickup ; d: Drop ; i: Inventory-; a: Apply { verb = "apply", object = "consumable", syms = "!?" }-; p: Project { verb = "project", object = "projectile", syms = "/|" }+; a: Apply { verb = "apply", object = "consumable", syms = "!?,_~" }+; p: Project { verb = "project", object = "missile", syms = "-}{" } ; q: Apply { verb = "quaff", object = "drink", syms = "!" }-; r: Apply { verb = "read", object = "comm", syms = "?" }-; z: Project { verb = "zap", object = "mechanism", syms = "/" }-; t: Project { verb = "throw", object = "missile", syms = "|" }+; r: Apply { verb = "read", object = "tablet", syms = "?" }+; z: Project { verb = "zap", object = "mechanism", syms = "-" }+; t: Project { verb = "throw", object = "projectile", syms = "}{" } ; ; ; ; Saving or ending the game. ; X: GameSave@@ -95,7 +97,7 @@ ; period: KP_Begin ; [monsters]-; smellTimeout: 1000+; smellTimeout: 100 ; [ui] ; font: Terminus,Monospace normal normal normal normal 12
scores view
binary file changed (226 → 90 bytes)
src/Content/ActorKind.hs view
@@ -10,6 +10,7 @@ import qualified Game.LambdaHack.Content as Content import Game.LambdaHack.Content.ActorKind import Game.LambdaHack.Random+import Game.LambdaHack.Time cdefs :: Content.CDefs ActorKind cdefs = Content.CDefs@@ -18,9 +19,9 @@ , getFreq = afreq , validate = avalidate , content =- [hero, eye, fastEye, nose]+ [hero, projectile, eye, fastEye, nose] }-hero, eye, fastEye, nose :: ActorKind+hero, projectile, eye, fastEye, nose :: ActorKind hero = ActorKind { asymbol = '@'@@ -28,24 +29,37 @@ , afreq = [("hero", 1)] -- Does not appear randomly in the dungeon. , acolor = BrWhite -- Heroes white, monsters colorful. , ahp = RollDice 60 1- , aspeed = 10+ , aspeed = toSpeed 2 , asight = True , asmell = False , aiq = 13 -- Can see hidden doors, when he is under alien control.- , aregen = 5000+ , aregen = 500 } +projectile = ActorKind -- includes homing missiles+ { asymbol = '*'+ , aname = "projectile"+ , afreq = [("projectile", 1)] -- Does not appear randomly in the dungeon.+ , acolor = BrWhite+ , ahp = RollDice 0 0+ , aspeed = toSpeed 0+ , asight = False+ , asmell = False+ , aiq = 0+ , aregen = maxBound+ }+ eye = ActorKind { asymbol = 'r' , aname = "deranged household robot" , afreq = [("monster", 60), ("summon", 50)] , acolor = BrYellow , ahp = RollDice 3 4- , aspeed = 10+ , aspeed = toSpeed 2 , asight = True , asmell = False , aiq = 8- , aregen = 1000+ , aregen = 100 } fastEye = ActorKind { asymbol = 'm'@@ -53,11 +67,11 @@ , afreq = [("monster", 15)] , acolor = BrMagenta , ahp = RollDice 1 4- , aspeed = 5+ , aspeed = toSpeed 4 , asight = True , asmell = False , aiq = 12- , aregen = 50 -- Regenerates fast (at max HP most of the time!).+ , aregen = 5 -- Regenerates fast (at max HP most of the time!). } nose = ActorKind { asymbol = 'h'@@ -65,9 +79,9 @@ , afreq = [("monster", 20), ("summon", 100)] , acolor = Green , ahp = RollDice 7 2- , aspeed = 11+ , aspeed = toSpeed 1.8 , asight = False , asmell = True , aiq = 0- , aregen = 1000+ , aregen = 100 }
src/Content/CaveKind.hs view
@@ -41,8 +41,12 @@ , copenChance = 1%10 , chiddenChance = 1%5 , citemNum = RollDice 5 2- , cdefTile = "fillerWall"- , ccorTile = "darkCorridor"+ , cdefaultTile = "fillerWall"+ , ccorridorTile = "darkCorridor"+ , cfillerTile = "fillerWall"+ , cdarkLegendTile = "darkLegend"+ , clitLegendTile = "litLegend"+ , chiddenTile = "hidden" } arena = rogue { csymbol = 'A'@@ -54,8 +58,8 @@ , cvoidChance = 1%3 , cnonVoidMin = 2 , citemNum = RollDice 3 2 -- few rooms- , cdefTile = "floorArenaLit"- , ccorTile = "path"+ , cdefaultTile = "floorArenaLit"+ , ccorridorTile = "path" } empty = rogue { csymbol = '.'@@ -69,8 +73,8 @@ , cnonVoidMin = 1 , cminStairDist = 50 , citemNum = RollDice 6 2 -- whole floor strewn with treasure- , cdefTile = "floorRoomLit"- , ccorTile = "floorRoomLit"+ , cdefaultTile = "floorRoomLit"+ , ccorridorTile = "floorRoomLit" } noise = rogue { csymbol = '!'@@ -82,6 +86,6 @@ , cvoidChance = 0 , cnonVoidMin = 0 , citemNum = RollDice 3 2 -- few rooms- , cdefTile = "noiseSet"- , ccorTile = "path"+ , cdefaultTile = "noiseSet"+ , ccorridorTile = "path" }
src/Content/ItemKind.hs view
@@ -6,6 +6,8 @@ -- | Weapons and treasure for Allure of the Stars. module Content.ItemKind ( cdefs ) where +import qualified Data.List as L+ import Game.LambdaHack.Color import qualified Game.LambdaHack.Content as Content import Game.LambdaHack.Effect@@ -20,14 +22,37 @@ , getFreq = ifreq , validate = ivalidate , content =- [necklace, dart, gem1, gem2, gem3, gold, javelin, potion1, potion2, potion3, ring, scroll1, scroll2, scroll3, sword, wand, fist, foot, tentacle, weight]+ [necklace, dart, gem1, gem2, gem3, gold, javelin, kitchenKnife, potion1, potion2, potion3, ring, scroll1, scroll2, scroll3, sword, wand, fist, foot, tentacle, weight] }-necklace, dart, gem1, gem2, gem3, gold, javelin, potion1, potion2, potion3, ring, scroll1, scroll2, scroll3, sword, wand, fist, foot, tentacle, weight :: ItemKind+necklace, dart, gem1, gem2, gem3, gold, javelin, kitchenKnife, potion1, potion2, potion3, ring, scroll1, scroll2, scroll3, sword, wand, fist, foot, tentacle, weight :: ItemKind gem, potion, scroll :: ItemKind -- generic templates -- rollDeep (aDb, xDy) = rollDice aDb + lvl * rollDice xDy / depth +{- Item group symbols (from Angband, only as an informal convention for now):++! potion, flask, concoction, bottle, jar, vial, canister+? scroll, book, note, tablet, remote+, food+- magical wand, magical rod, transmitter, pistol, rifle+_ magical staff, scanner+= ring+" necklace+$ gold, gem+~ light, tool+/ polearm+| edged weapon+\ hafted weapon+} launcher+{ projectile+( clothes+[ torso armour+] misc. armour+) shield++-}+ necklace = ItemKind { isymbol = '"' , iname = "necklace"@@ -37,29 +62,35 @@ , icount = intToDeep 1 , ipower = (RollDice 2 3, RollDice 1 10) , iverbApply = "tear down"- , iverbProject = "throw"+ , iverbProject = "cast"+ , iweight = 30+ , itoThrow = -50 -- not dense enough } dart = ItemKind- { isymbol = '|'+ { isymbol = '{' , iname = "billiard ball" , ifreq = [("dng", 30)]- , iflavour = zipPlain [Cyan]+ , iflavour = zipPlain [BrWhite] , ieffect = Wound (RollDice 1 1) , icount = (RollDice 3 3, RollDice 0 0) , ipower = intToDeep 0- , iverbApply = "snap"- , iverbProject = "throw"+ , iverbApply = "splinter"+ , iverbProject = "hurl"+ , iweight = 50+ , itoThrow = 0 -- a cheap dart } gem = ItemKind- { isymbol = '*'+ { isymbol = '$' , iname = "precious gem" , ifreq = [("dng", 20)] -- x3, but rare on shallow levels- , iflavour = zipPlain brightCol -- natural, so not fancy+ , iflavour = zipPlain $ L.delete BrYellow brightCol -- natural, so not fancy , ieffect = NoEffect , icount = intToDeep 0 , ipower = intToDeep 0 , iverbApply = "crush"- , iverbProject = "throw"+ , iverbProject = "toss"+ , iweight = 50+ , itoThrow = 0 } gem1 = gem { icount = (RollDice 0 0, RollDice 1 1) -- appears on max depth@@ -79,22 +110,39 @@ , icount = (RollDice 0 0, RollDice 10 10) , ipower = intToDeep 0 , iverbApply = "grind"- , iverbProject = "throw"+ , iverbProject = "toss"+ , iweight = 31+ , itoThrow = 0 } javelin = ItemKind- { isymbol = '|'- , iname = "kitchen knife"+ { isymbol = '{'+ , iname = "javelin" , ifreq = [("dng", 30)] , iflavour = zipPlain [Brown] , ieffect = Wound (RollDice 1 2)- , icount = (RollDice 0 0, RollDice 2 2)+ , icount = (RollDice 0 0, RollDice 1 1) , ipower = (RollDice 1 1, RollDice 2 2) , iverbApply = "break up"+ , iverbProject = "hurl"+ , iweight = 2000+ , itoThrow = 0 -- cheap but deadly+ }+kitchenKnife = ItemKind+ { isymbol = '{'+ , iname = "kitchen knife"+ , ifreq = [("dng", 30)]+ , iflavour = zipPlain [BrCyan]+ , ieffect = Wound (RollDice 1 1)+ , icount = (RollDice 0 0, RollDice 1 2)+ , ipower = (RollDice 0 0, RollDice 1 2)+ , iverbApply = "bend" , iverbProject = "throw"+ , iweight = 200+ , itoThrow = -50 -- too flexible and the handle causes air resistance } potion = ItemKind { isymbol = '!'- , iname = "concoction"+ , iname = "vial" , ifreq = [("dng", 15)] , iflavour = zipFancy stdCol , ieffect = NoEffect@@ -102,6 +150,8 @@ , ipower = intToDeep 0 , iverbApply = "gulp down" , iverbProject = "lob"+ , iweight = 200+ , itoThrow = -50 -- oily, bad grip } potion1 = potion { ifreq = [("dng", 5)]@@ -125,18 +175,22 @@ , icount = intToDeep 1 , ipower = (RollDice 1 6, RollDice 3 2) , iverbApply = "squeeze down"- , iverbProject = "throw"+ , iverbProject = "toss"+ , iweight = 15+ , itoThrow = 0 } scroll = ItemKind { isymbol = '?'- , iname = "comm tablet"+ , iname = "tablet" , ifreq = [("dng", 6)] , iflavour = zipFancy darkCol -- arcane and old , ieffect = NoEffect , icount = intToDeep 1 , ipower = intToDeep 0 , iverbApply = "dial"- , iverbProject = "throw"+ , iverbProject = "lob"+ , iweight = 700+ , itoThrow = -25 -- bad grip } scroll1 = scroll { ieffect = SummonFriend@@ -149,19 +203,21 @@ { ieffect = Descend } sword = ItemKind- { isymbol = ')'+ { isymbol = '/' , iname = "sharpened pipe" , ifreq = [("dng", 60)]- , iflavour = zipPlain [BrCyan]+ , iflavour = zipPlain [Cyan] , ieffect = Wound (RollDice 3 1) , icount = intToDeep 1 , ipower = (RollDice 1 2, RollDice 4 2) , iverbApply = "hit" , iverbProject = "heave"+ , iweight = 3000+ , itoThrow = -25 -- bad grip } wand = ItemKind- { isymbol = '/'- , iname = "transmitter"+ { isymbol = '-'+ , iname = "injector" , ifreq = [("dng", 15)] , iflavour = zipFancy [BrRed] , ieffect = Dominate@@ -169,6 +225,8 @@ , ipower = intToDeep 0 , iverbApply = "snap" , iverbProject = "zap"+ , iweight = 300+ , itoThrow = 25 -- jet } fist = sword { isymbol = '@'
src/Content/RuleKind.hs view
@@ -37,4 +37,6 @@ , rtitle = "Allure of the Stars" , rpathsDataFile = Self.getDataFileName , rpathsVersion = Self.version+ , ritemMelee = "/|\\"+ , ritemProject = "!?,-~}{" }