#18 & massive structure overhaul
This commit is contained in:
		
							parent
							
								
									83659e69b4
								
							
						
					
					
						commit
						3b0de65de1
					
				
					 16 changed files with 397 additions and 221 deletions
				
			
		
							
								
								
									
										25
									
								
								lib/RPGEngine/Internals/Data/Game.hs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								lib/RPGEngine/Internals/Data/Game.hs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,25 @@
 | 
			
		|||
-- Representation of all the game's data
 | 
			
		||||
 | 
			
		||||
module RPGEngine.Internals.Data.Game
 | 
			
		||||
( Game(..),
 | 
			
		||||
 | 
			
		||||
initGame
 | 
			
		||||
) where
 | 
			
		||||
 | 
			
		||||
import RPGEngine.Internals.Data.State
 | 
			
		||||
 | 
			
		||||
----------------------------- Constants ------------------------------
 | 
			
		||||
 | 
			
		||||
-- TODO Add more
 | 
			
		||||
data Game = Game {
 | 
			
		||||
    -- Current state of the game
 | 
			
		||||
    state :: State
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
----------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
-- Initialize the game
 | 
			
		||||
initGame :: Game
 | 
			
		||||
initGame = Game { 
 | 
			
		||||
    state = defaultState
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										77
									
								
								lib/RPGEngine/Internals/Data/Internals.hs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								lib/RPGEngine/Internals/Data/Internals.hs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,77 @@
 | 
			
		|||
-- Represents an item in the game.
 | 
			
		||||
 | 
			
		||||
module RPGEngine.Internals.Data.Internals
 | 
			
		||||
( Action(..)
 | 
			
		||||
, Condition(..)
 | 
			
		||||
, Object(..)
 | 
			
		||||
, EntityId
 | 
			
		||||
, ItemId
 | 
			
		||||
) where
 | 
			
		||||
 | 
			
		||||
----------------------------- Constants ------------------------------
 | 
			
		||||
 | 
			
		||||
type EntityId = String
 | 
			
		||||
type ItemId = String
 | 
			
		||||
 | 
			
		||||
data Object = 
 | 
			
		||||
    Item { -- All fields are required
 | 
			
		||||
        -- Easy way to identify items
 | 
			
		||||
        id          :: ItemId,
 | 
			
		||||
        -- Horizontal coördinate in the level
 | 
			
		||||
        x           :: Int,
 | 
			
		||||
        -- Vertical coördinate in the level
 | 
			
		||||
        y           :: Int,
 | 
			
		||||
        name        :: String,
 | 
			
		||||
        -- Short description of the object
 | 
			
		||||
        description :: String,
 | 
			
		||||
        -- Counts how often the object can be used by the player. Either 
 | 
			
		||||
        -- infinite or a natural number
 | 
			
		||||
        useTimes    :: Maybe Int,
 | 
			
		||||
        -- List of conditional actions when the player is standing on this object
 | 
			
		||||
        actions     :: [([Condition], Action)],
 | 
			
		||||
        -- Interpretation depends on action with this object.
 | 
			
		||||
        value       :: Maybe Int
 | 
			
		||||
    }
 | 
			
		||||
    | Entity {
 | 
			
		||||
    -- Required fields
 | 
			
		||||
        -- Easy way to identify items
 | 
			
		||||
        id          :: EntityId,
 | 
			
		||||
        -- Horizontal coördinate in the level
 | 
			
		||||
        x           :: Int,
 | 
			
		||||
        -- Vertical coördinate in the level
 | 
			
		||||
        y           :: Int,
 | 
			
		||||
        name        :: String,
 | 
			
		||||
        -- Short description of the object
 | 
			
		||||
        description :: String,
 | 
			
		||||
        -- List of conditional actions when the player is standing on this object
 | 
			
		||||
        actions     :: [([Condition], Action)],
 | 
			
		||||
    -- Optional fields
 | 
			
		||||
        -- The direction of the item. e.g. a door has a direction.
 | 
			
		||||
        direction   :: Maybe Direction,
 | 
			
		||||
        -- Some entities have health points.
 | 
			
		||||
        hp          :: Maybe Int,
 | 
			
		||||
        -- Interpretation depends on action with this object.
 | 
			
		||||
        value       :: Maybe Int
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
data Direction = North 
 | 
			
		||||
               | East 
 | 
			
		||||
               | South 
 | 
			
		||||
               | West
 | 
			
		||||
               deriving (Show)
 | 
			
		||||
 | 
			
		||||
data Action = Leave
 | 
			
		||||
            | RetrieveItem ItemId
 | 
			
		||||
            | UseItem ItemId
 | 
			
		||||
            | DecreaseHp EntityId ItemId
 | 
			
		||||
            | IncreasePlayerHp ItemId
 | 
			
		||||
            | Nothing
 | 
			
		||||
            deriving (Show, Eq)
 | 
			
		||||
 | 
			
		||||
data Condition = InventoryFull
 | 
			
		||||
               | InventoryContains ItemId
 | 
			
		||||
               | Not Condition
 | 
			
		||||
               | AlwaysFalse
 | 
			
		||||
               deriving (Show, Eq)
 | 
			
		||||
 | 
			
		||||
----------------------------------------------------------------------
 | 
			
		||||
							
								
								
									
										15
									
								
								lib/RPGEngine/Internals/Data/Player.hs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								lib/RPGEngine/Internals/Data/Player.hs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,15 @@
 | 
			
		|||
-- Represents a player in the game. This player can move around, pick
 | 
			
		||||
-- up items and interact with the world.
 | 
			
		||||
 | 
			
		||||
module RPGEngine.Internals.Data.Player
 | 
			
		||||
( Player(..)
 | 
			
		||||
) where
 | 
			
		||||
 | 
			
		||||
import RPGEngine.Internals.Data.Internals
 | 
			
		||||
 | 
			
		||||
----------------------------- Constants ------------------------------
 | 
			
		||||
 | 
			
		||||
data Player = Player {
 | 
			
		||||
    hp :: Int,
 | 
			
		||||
    inventory :: [Object]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										34
									
								
								lib/RPGEngine/Internals/Data/State.hs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								lib/RPGEngine/Internals/Data/State.hs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,34 @@
 | 
			
		|||
-- Describes the current state of the game, 
 | 
			
		||||
-- e.g. Main menu, game, pause, win or lose
 | 
			
		||||
-- Allows to easily go to a next state and change rendering accordingly
 | 
			
		||||
 | 
			
		||||
module RPGEngine.Internals.Data.State 
 | 
			
		||||
( State(..)
 | 
			
		||||
, defaultState
 | 
			
		||||
 | 
			
		||||
, nextState
 | 
			
		||||
) where
 | 
			
		||||
 | 
			
		||||
----------------------------- Constants ------------------------------
 | 
			
		||||
 | 
			
		||||
-- Current state of the game.
 | 
			
		||||
data State = Menu
 | 
			
		||||
           | Playing
 | 
			
		||||
           | Pause
 | 
			
		||||
           | Win
 | 
			
		||||
           | Lose
 | 
			
		||||
 | 
			
		||||
-- Default state of the game, Menu
 | 
			
		||||
defaultState :: State
 | 
			
		||||
defaultState = Menu
 | 
			
		||||
 | 
			
		||||
----------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
-- Get the next state based on the current state
 | 
			
		||||
nextState :: State -> State
 | 
			
		||||
nextState Menu = Playing
 | 
			
		||||
nextState Playing = Pause
 | 
			
		||||
nextState Pause = Playing
 | 
			
		||||
nextState _ = Menu
 | 
			
		||||
 | 
			
		||||
----------------------------------------------------------------------
 | 
			
		||||
		Reference in a new issue