From 81cd89a8cacb6417299a5517f6f7da9feab7416b Mon Sep 17 00:00:00 2001 From: Rin Date: Tue, 7 Nov 2023 13:29:09 +1100 Subject: [PATCH] Add framework for ECS --- README.md | 8 ++++++- app/Main.hs | 3 ++- package.yaml | 25 ++++++++++---------- pulsar.cabal | 6 ++++- src/Lib.hs | 62 +++++++++++++++++++++++++++++++++++++++++++++---- src/Overseer.hs | 18 ++++++++++++++ stack.yaml | 3 ++- stack.yaml.lock | 9 ++++++- 8 files changed, 112 insertions(+), 22 deletions(-) create mode 100644 src/Overseer.hs diff --git a/README.md b/README.md index 331bc49..38d1b30 100644 --- a/README.md +++ b/README.md @@ -4,4 +4,10 @@ An ECS-driven Sci-Fi RPG to tool around in Haskell with ## Setup for Development -Use `stack setup` to configure your environment. \ No newline at end of file +Stack is the canoncial build tool for this project. + +Use `stack setup` to configure your environment. + +### Hlint +You can use a system hlint, or use `stack build hlint` to build the same one we use. + diff --git a/app/Main.hs b/app/Main.hs index 4c6b30f..e3c40f9 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -1,6 +1,7 @@ module Main (main) where import Lib +import Overseer main :: IO () -main = someFunc +main = undefined diff --git a/package.yaml b/package.yaml index b547c16..1b5014b 100644 --- a/package.yaml +++ b/package.yaml @@ -19,20 +19,21 @@ extra-source-files: description: Please see the README at dependencies: -- base >= 4.7 && < 5 -- ghc >= 9.4.7 + - base >= 4.7 && < 5 + - ghc >= 9.4.7 + - containers > 0.6.0.0 ghc-options: -- -Wall -- -Wcompat -- -Widentities -- -Wincomplete-record-updates -- -Wincomplete-record-selectors # Coming Soon TM -- -Wincomplete-uni-patterns -- -Wmissing-export-lists -- -Wmissing-home-modules -- -Wpartial-fields -- -Wredundant-constraints + - -Wall + - -Wcompat + - -Widentities + - -Wincomplete-record-updates + - -Wincomplete-record-selectors # Coming Soon TM + - -Wincomplete-uni-patterns + - -Wmissing-export-lists + - -Wmissing-home-modules + - -Wpartial-fields + - -Wredundant-constraints default-extensions: - DerivingVia diff --git a/pulsar.cabal b/pulsar.cabal index 0b5e190..5d9b6f1 100644 --- a/pulsar.cabal +++ b/pulsar.cabal @@ -1,6 +1,6 @@ cabal-version: 2.2 --- This file has been generated from package.yaml by hpack version 0.36.0. +-- This file has been generated from package.yaml by hpack version 0.35.2. -- -- see: https://github.com/sol/hpack @@ -23,6 +23,7 @@ source-repository head library exposed-modules: Lib + Overseer other-modules: Paths_pulsar autogen-modules: @@ -42,6 +43,7 @@ library ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-record-selectors -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints build-depends: base >=4.7 && <5 + , containers >0.6.0.0 , ghc >=9.4.7 default-language: GHC2021 @@ -66,6 +68,7 @@ executable pulsar-exe ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-record-selectors -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints build-depends: base >=4.7 && <5 + , containers >0.6.0.0 , ghc >=9.4.7 , pulsar default-language: GHC2021 @@ -92,6 +95,7 @@ test-suite pulsar-test ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-record-selectors -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints build-depends: base >=4.7 && <5 + , containers >0.6.0.0 , ghc >=9.4.7 , pulsar default-language: GHC2021 diff --git a/src/Lib.hs b/src/Lib.hs index d36ff27..05fd355 100644 --- a/src/Lib.hs +++ b/src/Lib.hs @@ -1,6 +1,58 @@ -module Lib - ( someFunc - ) where +module Lib( -someFunc :: IO () -someFunc = putStrLn "someFunc" +) where + +-- data Status = Success | Partial | Failure deriving (Eq, Ord, Show, Read) + +-- data Response i = ResponseMk { +-- inform :: i, +-- msg :: String, +-- responseCode :: Status +-- } + +import Data.Kind(Type) + +data Has :: (k -> Type) -> Type where + This :: p x -> Has p + +{-# DEPRECATED UID "Use the specialised UID newtypes instead" #-} +type UID = Int + +class (Show a, Read a, Eq a, Ord a, Enum a) => IsUID a where + mkUID :: Int -> a + unUID :: a -> Int + +instance IsUID ItemUID where + mkUID = ItemUID + unUID (ItemUID a) = a +instance IsUID BodyPartUID where + mkUID = BodyPartUID + unUID (BodyPartUID a) = a +instance IsUID CreatureUID where + mkUID = CreatureUID + unUID (CreatureUID a) = a +instance IsUID StructureUID where + mkUID = StructureUID + unUID (StructureUID a) = a +instance IsUID CellUID where + mkUID = CellUID + unUID (CellUID a) = a +instance IsUID EventUID where + mkUID = EventUID + unUID (EventUID a) = a +instance IsUID TypeUID where + mkUID = TypeUID + unUID (TypeUID a) = a + +instance IsUID OverseerUID where + mkUID = OverseerUID + unUID (OverseerUID a) = a + +newtype ItemUID = ItemUID UID deriving (Show,Read,Eq,Ord,Enum) via Int +newtype BodyPartUID = BodyPartUID UID deriving (Show,Read,Eq,Ord,Enum) via Int +newtype CreatureUID = CreatureUID UID deriving (Show,Read,Eq,Ord,Enum) via Int +newtype StructureUID = StructureUID UID deriving (Show,Read,Eq,Ord,Enum) via Int +newtype CellUID = CellUID UID deriving (Show,Read,Eq,Ord,Enum) via Int +newtype EventUID = EventUID UID deriving (Show,Read,Eq,Ord,Enum) via Int +newtype TypeUID = TypeUID UID deriving (Show,Read,Eq,Ord,Enum) via Int +newtype OverseerUID = OverseerUID UID deriving (Show, Read, Eq, Ord, Enum) via Int \ No newline at end of file diff --git a/src/Overseer.hs b/src/Overseer.hs new file mode 100644 index 0000000..dfe09b9 --- /dev/null +++ b/src/Overseer.hs @@ -0,0 +1,18 @@ +--{-# LANGUAGE TypeFamilyDependencies #-} +module Overseer( + +) where + +import Lib +import Data.Sequence + +{-| The Overseer module handles disseminating and redirecting events between the relavent parties. Overall, this means that the Overseer for a type will have the full list of all UIDs in that type. For types with sub-types (such as the Creature -> BodyPart -> Sense relation), the Overseer carries the highest parent type. +-- An efficient data structure for searching is required, as there will be many searches per tick. A BST is ideal, however this requires restructuring the UID type to be indicative of position (i.e. it should not be monotonically increasing unless the tree is self-balancing) +-- Signalling success/failure back is important. Obviously, a bunch of events can be queued, however, there are race conditions. E.g. if two creatures attempt to pick up the same item in the same tick. In this case, we should use some deterministic mechanism to solve who gets priority. The other creature should be informed that they failed. +-- In this system, a list of Actions will be compiled at each tick, and the GameState will fold over them for each Overseer, applying each to its relevant member. +|-} + +---- GameState and Action Definitions ----------------------------------------------------------------------------------------------------- + +-- TODO: Figure out how to structure actions and event queues +-- This will likely require some kind of type-level list \ No newline at end of file diff --git a/stack.yaml b/stack.yaml index 3b2ba85..4339eab 100644 --- a/stack.yaml +++ b/stack.yaml @@ -40,7 +40,8 @@ packages: # - git: https://github.com/commercialhaskell/stack.git # commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a # -extra-deps: [] +extra-deps: + - containers-0.6.7 # Override default flag values for local packages and extra-deps # flags: {} diff --git a/stack.yaml.lock b/stack.yaml.lock index 6093dcf..694c9f3 100644 --- a/stack.yaml.lock +++ b/stack.yaml.lock @@ -3,7 +3,14 @@ # For more information, please see the documentation at: # https://docs.haskellstack.org/en/stable/lock_files -packages: [] +packages: +- completed: + hackage: containers-0.6.7@sha256:4aad61c33b21e453e5d18a465e674898fded282f233ffd154b48acc540c89537,2655 + pantry-tree: + sha256: d3430bcc4beafe609d6c5cd4a607549ee4ffe0eafc2ebb9c87b5e7b1b20b24d8 + size: 2902 + original: + hackage: containers-0.6.7 snapshots: - completed: sha256: fb482b8e2d5d061cdda4ba1da2957c012740c893a5ee1c1b99001adae7b1fbe7