Simplify character initialization to be all in one step
This commit is contained in:
parent
355c7d08be
commit
2a3a56ad01
6 changed files with 35 additions and 45 deletions
|
@ -2,7 +2,7 @@
|
||||||
{-# LANGUAGE OverloadedLists #-}
|
{-# LANGUAGE OverloadedLists #-}
|
||||||
module Area (
|
module Area (
|
||||||
Area(..)
|
Area(..)
|
||||||
, Key
|
, Key(..)
|
||||||
, dex
|
, dex
|
||||||
) where
|
) where
|
||||||
|
|
||||||
|
|
|
@ -9,23 +9,32 @@ import Control.Monad.IO.Class (liftIO)
|
||||||
import Data.Aeson (encode)
|
import Data.Aeson (encode)
|
||||||
import Data.ByteString.Lazy.Char8 (ByteString, putStrLn, unpack)
|
import Data.ByteString.Lazy.Char8 (ByteString, putStrLn, unpack)
|
||||||
import Prelude hiding (log, putStrLn)
|
import Prelude hiding (log, putStrLn)
|
||||||
|
import qualified Area (Key(..))
|
||||||
import Character (Character(..))
|
import Character (Character(..))
|
||||||
import Game (Game(..), InitProcess(..), State(..), stub)
|
import Game (Game(..), Position(..), State(..))
|
||||||
import Message (Connected, receive, send)
|
import Message (Connected, receive, send)
|
||||||
import qualified Message.Client as Client (Message(..))
|
import qualified Message.Client as Client (Message(..))
|
||||||
import qualified Message.Server as Server (Message(..))
|
import qualified Message.Server as Server (Message(..))
|
||||||
|
import Tool.Array (malloc)
|
||||||
|
|
||||||
edges :: Game -> Client.Message -> Connected Game
|
edges :: Game -> Client.Message -> Connected Game
|
||||||
|
|
||||||
edges (Game {state = Start}) Client.NewGame = return $ Game.stub {
|
edges Empty Client.NewGame = return Initializing
|
||||||
state = Initializing Name
|
|
||||||
|
edges Empty (Client.Resume {Client.game}) = return game
|
||||||
|
|
||||||
|
edges Initializing message@(Client.Initialize {}) = return $ Game {
|
||||||
|
character = Character {
|
||||||
|
name = Client.name message
|
||||||
|
, skin = Client.skin message
|
||||||
|
, gender = Client.gender message
|
||||||
|
, pokemons = malloc 6
|
||||||
|
}
|
||||||
|
, state = At $ Position {
|
||||||
|
area = Area.Key 0
|
||||||
|
, x = 0
|
||||||
|
, y = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
edges (Game {state = Start}) (Client.Resume {Client.game}) = return game
|
|
||||||
|
|
||||||
edges (Game {state = Initializing Name, character}) (Client.Initialize {Client.step = Name, Client.value}) = return $ Game {
|
|
||||||
character = character { name = value }
|
|
||||||
, state = Initializing Skin
|
|
||||||
}
|
}
|
||||||
|
|
||||||
edges game message = do
|
edges game message = do
|
||||||
|
|
|
@ -4,7 +4,6 @@ module Character (
|
||||||
Character(..)
|
Character(..)
|
||||||
, Key
|
, Key
|
||||||
, dex
|
, dex
|
||||||
, stub
|
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Data.Aeson (ToJSON(..), FromJSON(..), genericToEncoding, genericParseJSON, defaultOptions)
|
import Data.Aeson (ToJSON(..), FromJSON(..), genericToEncoding, genericParseJSON, defaultOptions)
|
||||||
|
@ -12,7 +11,7 @@ import Data.Vector (Vector)
|
||||||
import GHC.Generics (Generic)
|
import GHC.Generics (Generic)
|
||||||
import Gender (Gender(..))
|
import Gender (Gender(..))
|
||||||
import qualified Pokemon (T)
|
import qualified Pokemon (T)
|
||||||
import Tool.Array (Array, malloc)
|
import Tool.Array (Array)
|
||||||
|
|
||||||
data Character = Character {
|
data Character = Character {
|
||||||
name :: String
|
name :: String
|
||||||
|
@ -35,10 +34,3 @@ instance FromJSON Key where
|
||||||
|
|
||||||
dex :: Vector Character
|
dex :: Vector Character
|
||||||
dex = []
|
dex = []
|
||||||
|
|
||||||
stub :: Character
|
|
||||||
stub = Character {
|
|
||||||
name = ""
|
|
||||||
, skin = ""
|
|
||||||
, pokemons = malloc 6
|
|
||||||
}
|
|
||||||
|
|
27
src/Game.hs
27
src/Game.hs
|
@ -1,16 +1,14 @@
|
||||||
{-# LANGUAGE DeriveGeneric #-}
|
{-# LANGUAGE DeriveGeneric #-}
|
||||||
module Game (
|
module Game (
|
||||||
Game(..)
|
Game(..)
|
||||||
, InitProcess(..)
|
, Position(..)
|
||||||
, State(..)
|
, State(..)
|
||||||
, stub
|
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Data.Aeson (ToJSON(..), FromJSON(..), genericToEncoding, genericParseJSON, defaultOptions)
|
import Data.Aeson (ToJSON(..), FromJSON(..), genericToEncoding, genericParseJSON, defaultOptions)
|
||||||
import GHC.Generics (Generic)
|
import GHC.Generics (Generic)
|
||||||
|
|
||||||
import Character (Character)
|
import Character (Character)
|
||||||
import qualified Character (stub)
|
|
||||||
import qualified Area (Key)
|
import qualified Area (Key)
|
||||||
|
|
||||||
data Position = Position {
|
data Position = Position {
|
||||||
|
@ -31,13 +29,6 @@ instance ToJSON Turn where
|
||||||
instance FromJSON Turn where
|
instance FromJSON Turn where
|
||||||
parseJSON = genericParseJSON defaultOptions
|
parseJSON = genericParseJSON defaultOptions
|
||||||
|
|
||||||
data InitProcess = Gender | Name | Skin deriving (Generic)
|
|
||||||
|
|
||||||
instance ToJSON InitProcess where
|
|
||||||
toEncoding = genericToEncoding defaultOptions
|
|
||||||
instance FromJSON InitProcess where
|
|
||||||
parseJSON = genericParseJSON defaultOptions
|
|
||||||
|
|
||||||
data State =
|
data State =
|
||||||
At Position
|
At Position
|
||||||
| Fighting {
|
| Fighting {
|
||||||
|
@ -45,8 +36,6 @@ data State =
|
||||||
, opponent :: Character
|
, opponent :: Character
|
||||||
, turn :: Turn
|
, turn :: Turn
|
||||||
}
|
}
|
||||||
| Initializing InitProcess
|
|
||||||
| Start
|
|
||||||
deriving (Generic)
|
deriving (Generic)
|
||||||
|
|
||||||
instance ToJSON State where
|
instance ToJSON State where
|
||||||
|
@ -54,18 +43,16 @@ instance ToJSON State where
|
||||||
instance FromJSON State where
|
instance FromJSON State where
|
||||||
parseJSON = genericParseJSON defaultOptions
|
parseJSON = genericParseJSON defaultOptions
|
||||||
|
|
||||||
data Game = Game {
|
data Game =
|
||||||
|
Empty
|
||||||
|
| Initializing
|
||||||
|
| Game {
|
||||||
character :: Character
|
character :: Character
|
||||||
, state :: State
|
, state :: State
|
||||||
} deriving (Generic)
|
}
|
||||||
|
deriving (Generic)
|
||||||
|
|
||||||
instance ToJSON Game where
|
instance ToJSON Game where
|
||||||
toEncoding = genericToEncoding defaultOptions
|
toEncoding = genericToEncoding defaultOptions
|
||||||
instance FromJSON Game where
|
instance FromJSON Game where
|
||||||
parseJSON = genericParseJSON defaultOptions
|
parseJSON = genericParseJSON defaultOptions
|
||||||
|
|
||||||
stub :: Game
|
|
||||||
stub = Game {
|
|
||||||
character = Character.stub
|
|
||||||
, state = Start
|
|
||||||
}
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ import Network.Wai.Handler.WebSockets (websocketsOr)
|
||||||
import Network.WebSockets (ServerApp, acceptRequest, defaultConnectionOptions, forkPingThread)
|
import Network.WebSockets (ServerApp, acceptRequest, defaultConnectionOptions, forkPingThread)
|
||||||
import qualified Automaton (run)
|
import qualified Automaton (run)
|
||||||
import Config (listenPort)
|
import Config (listenPort)
|
||||||
import qualified Game (stub)
|
import qualified Game (Game(..))
|
||||||
|
|
||||||
makeApp :: IO ServerApp
|
makeApp :: IO ServerApp
|
||||||
makeApp =
|
makeApp =
|
||||||
|
@ -19,7 +19,7 @@ makeApp =
|
||||||
connection <- acceptRequest pending
|
connection <- acceptRequest pending
|
||||||
putStrLn "New connection"
|
putStrLn "New connection"
|
||||||
forkPingThread connection 20
|
forkPingThread connection 20
|
||||||
runReaderT (evalStateT Automaton.run Game.stub) connection
|
runReaderT (evalStateT Automaton.run Game.Empty) connection
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = do
|
main = do
|
||||||
|
|
|
@ -4,14 +4,16 @@ module Message.Client (
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Data.Aeson (FromJSON(..), ToJSON(..), genericParseJSON, genericToEncoding, defaultOptions)
|
import Data.Aeson (FromJSON(..), ToJSON(..), genericParseJSON, genericToEncoding, defaultOptions)
|
||||||
import Game (Game, InitProcess(..))
|
|
||||||
import GHC.Generics (Generic)
|
import GHC.Generics (Generic)
|
||||||
|
import Game (Game)
|
||||||
|
import Gender (Gender)
|
||||||
|
|
||||||
data Message =
|
data Message =
|
||||||
NewGame
|
NewGame
|
||||||
| Initialize {
|
| Initialize {
|
||||||
step :: InitProcess
|
name :: String
|
||||||
, value :: String
|
, skin :: String
|
||||||
|
, gender :: Gender
|
||||||
}
|
}
|
||||||
| Resume {
|
| Resume {
|
||||||
game :: Game
|
game :: Game
|
||||||
|
|
Loading…
Reference in a new issue