about summary refs log tree commit diff
path: root/src/Xanthous
diff options
context:
space:
mode:
authorGriffin Smith <root@gws.fyi>2019-08-25T17·28-0400
committerGriffin Smith <root@gws.fyi>2019-08-25T17·28-0400
commitd3f3890dc5408581eb6181125c871d1cf2c0e18f (patch)
treeed6d9e396e6c732b1bce27ea6962ce408b59f218 /src/Xanthous
parentfb0d1b3e66251aa56a3df1d05fd4b82b33380a31 (diff)
An @-sign in a box, in haskell
Initial commit of a Haskell version of Xanthous, written using Brick and
built with Nix.

This is so much nicer and so much easier
Diffstat (limited to 'src/Xanthous')
-rw-r--r--src/Xanthous/App.hs21
-rw-r--r--src/Xanthous/Game.hs12
-rw-r--r--src/Xanthous/Game/Draw.hs28
-rw-r--r--src/Xanthous/Prelude.hs10
-rw-r--r--src/Xanthous/Resource.hs11
5 files changed, 82 insertions, 0 deletions
diff --git a/src/Xanthous/App.hs b/src/Xanthous/App.hs
new file mode 100644
index 0000000000..5c0383c38e
--- /dev/null
+++ b/src/Xanthous/App.hs
@@ -0,0 +1,21 @@
+module Xanthous.App (makeApp) where
+
+import Xanthous.Prelude
+import Brick hiding (App)
+import qualified Brick
+import Graphics.Vty.Attributes (defAttr)
+
+import Xanthous.Game
+import Xanthous.Game.Draw (drawGame)
+import Xanthous.Resource (Name)
+
+type App = Brick.App GameState () Name
+
+makeApp :: IO App
+makeApp = pure $ Brick.App
+  { appDraw = drawGame
+  , appChooseCursor = const headMay
+  , appHandleEvent = resizeOrQuit
+  , appStartEvent = pure
+  , appAttrMap = const $ attrMap defAttr []
+  }
diff --git a/src/Xanthous/Game.hs b/src/Xanthous/Game.hs
new file mode 100644
index 0000000000..c88509819c
--- /dev/null
+++ b/src/Xanthous/Game.hs
@@ -0,0 +1,12 @@
+module Xanthous.Game
+  ( GameState(..)
+  , getInitialState
+  ) where
+
+import Xanthous.Prelude
+
+data GameState = GameState
+  { }
+
+getInitialState :: IO GameState
+getInitialState = pure GameState
diff --git a/src/Xanthous/Game/Draw.hs b/src/Xanthous/Game/Draw.hs
new file mode 100644
index 0000000000..2d793ba27b
--- /dev/null
+++ b/src/Xanthous/Game/Draw.hs
@@ -0,0 +1,28 @@
+module Xanthous.Game.Draw
+  ( drawGame
+  ) where
+
+import Xanthous.Prelude
+import Brick
+import Brick.Widgets.Border
+import Brick.Widgets.Border.Style
+
+import Xanthous.Game (GameState(..))
+import Xanthous.Resource (Name(..))
+
+drawMessages :: GameState -> Widget Name
+drawMessages _ = str "Welcome to Xanthous! It's dangerous out there, why not stay inside?"
+
+drawMap :: GameState -> Widget Name
+drawMap _game
+  = viewport MapViewport Both
+  $ vBox mapRows
+  where
+    -- TODO
+    firstRow = [str "@"] <> replicate 79 (str " ")
+    mapRows = firstRow <> (replicate 20 . hBox . replicate 80 $ str " ")
+
+drawGame :: GameState -> [Widget Name]
+drawGame game = pure . withBorderStyle unicode
+  $   drawMessages game
+  <=> border (drawMap game)
diff --git a/src/Xanthous/Prelude.hs b/src/Xanthous/Prelude.hs
new file mode 100644
index 0000000000..e75c11d7bb
--- /dev/null
+++ b/src/Xanthous/Prelude.hs
@@ -0,0 +1,10 @@
+module Xanthous.Prelude
+  ( module ClassyPrelude
+  , Type
+  , Constraint
+  , module GHC.TypeLits
+  ) where
+
+import ClassyPrelude hiding (return)
+import Data.Kind
+import GHC.TypeLits hiding (Text)
diff --git a/src/Xanthous/Resource.hs b/src/Xanthous/Resource.hs
new file mode 100644
index 0000000000..2310a68cc2
--- /dev/null
+++ b/src/Xanthous/Resource.hs
@@ -0,0 +1,11 @@
+module Xanthous.Resource
+  ( Name(..)
+  ) where
+
+import Xanthous.Prelude
+
+data Name = MapViewport
+            -- ^ The main viewport where we display the game content
+          | MessageBox
+            -- ^ The box where we display messages to the user
+  deriving stock (Show, Eq, Ord)