Implement saving+loading the game
Implement ToJSON and FromJSON for all of the various pieces of the game state, and add a pair of functions saveGame/loadGame implementing a prism to save the game as zlib-compressed JSON. To test this, there's now Arbitrary, CoArbitrary, and Function instances for all the parts of the game state - to get around circular imports with the concrete entities this unfortunately is happening via orphan instances, plus an hs-boot file to break a circular import that was just a little too hard to remove by moving things around. Ugh.
This commit is contained in:
parent
2f2e5a0b68
commit
f37d0f75c0
30 changed files with 620 additions and 97 deletions
|
|
@ -12,6 +12,7 @@ import Test.QuickCheck.Arbitrary.Generic
|
|||
import Brick (str)
|
||||
import Brick.Widgets.Border.Style (unicode)
|
||||
import Brick.Types (Edges(..))
|
||||
import Data.Aeson
|
||||
--------------------------------------------------------------------------------
|
||||
import Xanthous.Entities
|
||||
( Draw(..)
|
||||
|
|
@ -28,7 +29,15 @@ import Xanthous.Data
|
|||
|
||||
data Wall = Wall
|
||||
deriving stock (Show, Eq, Ord, Generic, Enum)
|
||||
deriving anyclass (CoArbitrary, Function)
|
||||
deriving anyclass (NFData, CoArbitrary, Function)
|
||||
|
||||
instance ToJSON Wall where
|
||||
toJSON = const $ String "Wall"
|
||||
|
||||
instance FromJSON Wall where
|
||||
parseJSON = withText "Wall" $ \case
|
||||
"Wall" -> pure Wall
|
||||
_ -> fail "Invalid Wall: expected Wall"
|
||||
|
||||
-- deriving via Brainless Wall instance Brain Wall
|
||||
instance Brain Wall where step = brainVia Brainless
|
||||
|
|
@ -53,7 +62,7 @@ data Door = Door
|
|||
, _locked :: Bool
|
||||
}
|
||||
deriving stock (Show, Eq, Ord, Generic)
|
||||
deriving anyclass (NFData, CoArbitrary, Function)
|
||||
deriving anyclass (NFData, CoArbitrary, Function, ToJSON, FromJSON)
|
||||
makeLenses ''Door
|
||||
|
||||
instance Arbitrary Door where
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue