Skip to content

Commit

Permalink
module reorganization
Browse files Browse the repository at this point in the history
  • Loading branch information
kostmo committed Aug 13, 2024
1 parent e4d0a52 commit e6b6da2
Show file tree
Hide file tree
Showing 12 changed files with 113 additions and 86 deletions.
3 changes: 2 additions & 1 deletion src/swarm-engine/Swarm/Game/State/Initialize.hs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
-- SPDX-License-Identifier: BSD-3-Clause
-- | SPDX-License-Identifier: BSD-3-Clause
-- Description: Game-related state and utilities
--
-- Definition of the record holding all the game-related state, and various related
Expand Down Expand Up @@ -43,6 +43,7 @@ import Swarm.Game.Scenario.Topography.Cell (Cell, cellToEntity)
import Swarm.Game.Scenario.Topography.Structure.Recognition
import Swarm.Game.Scenario.Topography.Structure.Recognition.Log
import Swarm.Game.Scenario.Topography.Structure.Recognition.Precompute
import Swarm.Game.Scenario.Topography.Structure.Recognition.Static
import Swarm.Game.Scenario.Topography.Structure.Recognition.Type
import Swarm.Game.State
import Swarm.Game.State.Landscape (mkLandscape)
Expand Down
20 changes: 2 additions & 18 deletions src/swarm-scenario/Swarm/Game/Scenario.hs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ module Swarm.Game.Scenario (
-- * Scenario
Scenario (..),
ScenarioLandscape (..),
StaticStructureInfo (..),
ScenarioMetadata (ScenarioMetadata),
staticPlacements,
structureDefs,
Expand Down Expand Up @@ -92,9 +91,10 @@ import Swarm.Game.Scenario.Topography.Navigation.Portal
import Swarm.Game.Scenario.Topography.Navigation.Waypoint (Parentage (..))
import Swarm.Game.Scenario.Topography.Structure qualified as Structure
import Swarm.Game.Scenario.Topography.Structure.Assembly qualified as Assembly
import Swarm.Game.Scenario.Topography.Structure.Named qualified as Structure
import Swarm.Game.Scenario.Topography.Structure.Overlay
import Swarm.Game.Scenario.Topography.Structure.Recognition.Static
import Swarm.Game.Scenario.Topography.Structure.Recognition.Symmetry
import Swarm.Game.Scenario.Topography.Structure.Recognition.Type (SymmetryAnnotatedGrid (..))
import Swarm.Game.Scenario.Topography.WorldDescription
import Swarm.Game.Terrain
import Swarm.Game.Universe
Expand All @@ -112,22 +112,6 @@ import System.Directory (doesFileExist)
import System.FilePath ((<.>), (</>))
import System.Random (randomRIO)

data StaticStructureInfo b = StaticStructureInfo
{ _structureDefs :: [SymmetryAnnotatedGrid (Maybe b)]
, _staticPlacements :: M.Map SubworldName [Structure.LocatedStructure]
}
deriving (Show)

makeLensesNoSigs ''StaticStructureInfo

-- | Structure templates that may be auto-recognized when constructed
-- by a robot
structureDefs :: Lens' (StaticStructureInfo b) [SymmetryAnnotatedGrid (Maybe b)]

-- | A record of the static placements of structures, so that they can be
-- added to the "recognized" list upon scenario initialization
staticPlacements :: Lens' (StaticStructureInfo b) (M.Map SubworldName [Structure.LocatedStructure])

-- * Scenario records

-- | Authorship information about scenario not used at play-time
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ import Swarm.Game.Scenario.Topography.ProtoCell (
StructurePalette (StructurePalette),
)
import Swarm.Game.Scenario.Topography.Structure (
LocatedStructure,
MergedStructure (MergedStructure),
NamedStructure,
parseStructure,
Expand All @@ -38,6 +37,7 @@ import Swarm.Game.Scenario.Topography.Structure.Assembly qualified as Assembly
import Swarm.Game.Scenario.Topography.Structure.Overlay (
PositionedGrid (..),
)
import Swarm.Game.Scenario.Topography.Structure.Recognition.Static (LocatedStructure)
import Swarm.Game.Scenario.Topography.WorldPalette
import Swarm.Game.Universe (SubworldName (DefaultRootSubworld))
import Swarm.Game.World.Parse ()
Expand Down
36 changes: 2 additions & 34 deletions src/swarm-topography/Swarm/Game/Scenario/Topography/Structure.hs
Original file line number Diff line number Diff line change
Expand Up @@ -14,41 +14,21 @@ import Data.List (intercalate)
import Data.List.NonEmpty qualified as NE
import Data.Map qualified as M
import Data.Maybe (catMaybes, fromMaybe)
import Data.Set (Set)
import Data.Set qualified as Set
import Data.Text (Text)
import Data.Text qualified as T
import Data.Yaml as Y
import Swarm.Game.Location
import Swarm.Game.Scenario.Topography.Grid
import Swarm.Game.Scenario.Topography.Navigation.Waypoint
import Swarm.Game.Scenario.Topography.Placement
import Swarm.Game.Scenario.Topography.ProtoCell
import Swarm.Game.Scenario.Topography.Structure.Named
import Swarm.Game.Scenario.Topography.Structure.Overlay
import Swarm.Game.Scenario.Topography.Structure.Recognition.Static
import Swarm.Game.World.Coords
import Swarm.Language.Syntax.Direction (AbsoluteDir)
import Swarm.Util (failT, showT)
import Swarm.Util.Yaml

data NamedArea a = NamedArea
{ name :: StructureName
, recognize :: Set AbsoluteDir
-- ^ whether this structure should be registered for automatic recognition
-- and which orientations shall be recognized.
-- The supplied direction indicates which cardinal direction the
-- original map's "North" has been re-oriented to.
-- E.g., 'DWest' represents a rotation of 90 degrees counter-clockwise.
, description :: Maybe Text
-- ^ will be UI-facing only if this is a recognizable structure
, structure :: a
}
deriving (Eq, Show, Functor)

isRecognizable :: NamedArea a -> Bool
isRecognizable = not . null . recognize

type NamedGrid c = NamedArea (Grid c)

type NamedStructure c = NamedArea (PStructure c)

data PStructure c = Structure
Expand All @@ -64,18 +44,6 @@ data PStructure c = Structure
data Placed c = Placed Placement (NamedStructure c)
deriving (Show)

-- | For use in registering recognizable pre-placed structures
data LocatedStructure = LocatedStructure
{ placedName :: StructureName
, upDirection :: AbsoluteDir
, cornerLoc :: Location
}
deriving (Show)

instance HasLocation LocatedStructure where
modifyLoc f (LocatedStructure x y originalLoc) =
LocatedStructure x y $ f originalLoc

data MergedStructure c = MergedStructure (PositionedGrid c) [LocatedStructure] [Originated Waypoint]

instance (FromJSONE e a) => FromJSONE e (NamedStructure (Maybe a)) where
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ import Swarm.Game.Scenario.Topography.Grid
import Swarm.Game.Scenario.Topography.Navigation.Waypoint
import Swarm.Game.Scenario.Topography.Placement
import Swarm.Game.Scenario.Topography.Structure
import Swarm.Game.Scenario.Topography.Structure.Named
import Swarm.Game.Scenario.Topography.Structure.Overlay
import Swarm.Game.Scenario.Topography.Structure.Recognition.Static
import Swarm.Language.Syntax.Direction (directionJsonModifier)
import Swarm.Util (commaList, quote, showT)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
-- |
-- SPDX-License-Identifier: BSD-3-Clause
module Swarm.Game.Scenario.Topography.Structure.Named where

import Data.Set (Set)
import Data.Text (Text)
import Swarm.Game.Scenario.Topography.Grid (Grid)
import Swarm.Game.Scenario.Topography.Placement (StructureName)
import Swarm.Language.Syntax.Direction (AbsoluteDir)

data NamedArea a = NamedArea
{ name :: StructureName
, recognize :: Set AbsoluteDir
-- ^ whether this structure should be registered for automatic recognition
-- and which orientations shall be recognized.
-- The supplied direction indicates which cardinal direction the
-- original map's "North" has been re-oriented to.
-- E.g., 'DWest' represents a rotation of 90 degrees counter-clockwise.
, description :: Maybe Text
-- ^ will be UI-facing only if this is a recognizable structure
, structure :: a
}
deriving (Eq, Show, Functor)

isRecognizable :: NamedArea a -> Bool
isRecognizable = not . null . recognize

type NamedGrid c = NamedArea (Grid c)
Original file line number Diff line number Diff line change
Expand Up @@ -45,23 +45,22 @@ import Data.Hashable (Hashable)
import Data.Map qualified as M
import Data.Maybe (catMaybes, mapMaybe)
import Data.Set qualified as Set
import Swarm.Game.Scenario (StaticStructureInfo (..))
import Swarm.Game.Scenario.Topography.Grid (getRows)
import Swarm.Game.Scenario.Topography.Placement (Orientation (..), applyOrientationTransform, getStructureName)
import Swarm.Game.Scenario.Topography.Structure
import Swarm.Game.Scenario.Topography.Structure qualified as Structure
import Swarm.Game.Scenario.Topography.Structure.Named
import Swarm.Game.Scenario.Topography.Structure.Recognition.Prep (
mkEntityLookup,
)
import Swarm.Game.Scenario.Topography.Structure.Recognition.Registry (
populateStaticFoundStructures,
)
import Swarm.Game.Scenario.Topography.Structure.Recognition.Static
import Swarm.Game.Scenario.Topography.Structure.Recognition.Type
import Swarm.Game.Universe (Cosmic (..))
import Swarm.Language.Syntax.Direction (AbsoluteDir)
import Swarm.Util (histogram)

getEntityGrid :: (Maybe b -> Maybe a) -> Structure.NamedGrid (Maybe b) -> [[Maybe a]]
getEntityGrid :: (Maybe b -> Maybe a) -> NamedGrid (Maybe b) -> [[Maybe a]]
getEntityGrid extractor = getRows . fmap extractor . structure

-- | Create Aho-Corasick matchers that will recognize all of the
Expand All @@ -85,25 +84,25 @@ mkAutomatons extractor xs =

infos =
M.fromList $
map (getStructureName . Structure.name . namedGrid &&& process) xs
map (getStructureName . name . namedGrid &&& process) xs

extractOrientedGrid ::
(Maybe b -> Maybe a) ->
Structure.NamedGrid (Maybe b) ->
NamedGrid (Maybe b) ->
AbsoluteDir ->
StructureWithGrid (Maybe b) a
extractOrientedGrid extractor x d =
StructureWithGrid wrapped d $ getEntityGrid extractor g
where
wrapped = NamedOriginal (getStructureName $ Structure.name x) x
wrapped = NamedOriginal (getStructureName $ name x) x
g = applyOrientationTransform (Orientation d False) <$> x

-- | At this point, we have already ensured that orientations
-- redundant by rotational symmetry have been excluded
-- (i.e. at Scenario validation time).
extractGrids ::
(Maybe b -> Maybe a) ->
Structure.NamedGrid (Maybe b) ->
NamedGrid (Maybe b) ->
[StructureWithGrid (Maybe b) a]
extractGrids extractor x =
map (extractOrientedGrid extractor x) $ Set.toList $ recognize x
Expand All @@ -118,7 +117,7 @@ lookupStaticPlacements ::
lookupStaticPlacements extractor (StaticStructureInfo structDefs thePlacements) =
concatMap f $ M.toList thePlacements
where
definitionMap = M.fromList $ map ((Structure.name &&& id) . namedGrid) structDefs
definitionMap = M.fromList $ map ((name &&& id) . namedGrid) structDefs

f (subworldName, locatedList) = mapMaybe g locatedList
where
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
{-# LANGUAGE TemplateHaskell #-}

-- |
-- SPDX-License-Identifier: BSD-3-Clause
module Swarm.Game.Scenario.Topography.Structure.Recognition.Static where

import Control.Lens (Lens')
import Data.Map (Map)
import Swarm.Game.Location
import Swarm.Game.Scenario.Topography.Placement (StructureName)
import Swarm.Game.Scenario.Topography.Structure.Named
import Swarm.Game.Universe (SubworldName)
import Swarm.Language.Syntax.Direction (AbsoluteDir)
import Swarm.Util.Lens (makeLensesNoSigs)

data RotationalSymmetry
= -- | Aka 1-fold symmetry
NoSymmetry
| -- | Equivalent under rotation by 180 degrees
TwoFold
| -- | Equivalent under rotation by 90 degrees
FourFold
deriving (Show, Eq)

data SymmetryAnnotatedGrid a = SymmetryAnnotatedGrid
{ namedGrid :: NamedGrid a
, symmetry :: RotationalSymmetry
}
deriving (Show)

-- | For use in registering recognizable pre-placed structures
data LocatedStructure = LocatedStructure
{ placedName :: StructureName
, upDirection :: AbsoluteDir
, cornerLoc :: Location
}
deriving (Show)

instance HasLocation LocatedStructure where
modifyLoc f (LocatedStructure x y originalLoc) =
LocatedStructure x y $ f originalLoc

data StaticStructureInfo b = StaticStructureInfo
{ _structureDefs :: [SymmetryAnnotatedGrid (Maybe b)]
, _staticPlacements :: Map SubworldName [LocatedStructure]
}
deriving (Show)

makeLensesNoSigs ''StaticStructureInfo

-- | Structure templates that may be auto-recognized when constructed
-- by a robot
structureDefs :: Lens' (StaticStructureInfo b) [SymmetryAnnotatedGrid (Maybe b)]

-- | A record of the static placements of structures, so that they can be
-- added to the "recognized" list upon scenario initialization
staticPlacements :: Lens' (StaticStructureInfo b) (Map SubworldName [LocatedStructure])
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,8 @@ import Data.Map qualified as M
import Data.Set qualified as Set
import Data.Text qualified as T
import Swarm.Game.Scenario.Topography.Placement (Orientation (..), applyOrientationTransform)
import Swarm.Game.Scenario.Topography.Structure (NamedGrid)
import Swarm.Game.Scenario.Topography.Structure qualified as Structure
import Swarm.Game.Scenario.Topography.Structure.Recognition.Type (RotationalSymmetry (..), SymmetryAnnotatedGrid (..))
import Swarm.Game.Scenario.Topography.Structure.Named (NamedGrid, recognize, structure)
import Swarm.Game.Scenario.Topography.Structure.Recognition.Static (RotationalSymmetry (..), SymmetryAnnotatedGrid (..))
import Swarm.Language.Syntax.Direction (AbsoluteDir (DSouth, DWest), getCoordinateOrientation)
import Swarm.Util (commaList, failT, histogram, showT)

Expand Down Expand Up @@ -66,5 +65,5 @@ checkSymmetry ng = do
quarterTurnRows = applyOrientationTransform (Orientation DWest False) originalRows
halfTurnRows = applyOrientationTransform (Orientation DSouth False) originalRows

suppliedOrientations = Structure.recognize ng
originalRows = Structure.structure ng
suppliedOrientations = recognize ng
originalRows = structure ng
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ import GHC.Generics (Generic)
import Linear (V2 (..))
import Swarm.Game.Location (Location)
import Swarm.Game.Scenario.Topography.Area
import Swarm.Game.Scenario.Topography.Structure (NamedGrid)
import Swarm.Game.Scenario.Topography.Structure.Named (NamedGrid)
import Swarm.Game.Scenario.Topography.Structure.Recognition.Static
import Swarm.Game.Universe (Cosmic, offsetBy)
import Swarm.Language.Syntax.Direction (AbsoluteDir)
import Text.AhoCorasick (StateMachine)
Expand Down Expand Up @@ -155,21 +156,6 @@ data StructureWithGrid b a = StructureWithGrid
}
deriving (Eq)

data RotationalSymmetry
= -- | Aka 1-fold symmetry
NoSymmetry
| -- | Equivalent under rotation by 180 degrees
TwoFold
| -- | Equivalent under rotation by 90 degrees
FourFold
deriving (Show, Eq)

data SymmetryAnnotatedGrid a = SymmetryAnnotatedGrid
{ namedGrid :: NamedGrid a
, symmetry :: RotationalSymmetry
}
deriving (Show)

-- | Structure definitions with precomputed metadata for consumption by the UI
data StructureInfo b a = StructureInfo
{ annotatedGrid :: SymmetryAnnotatedGrid b
Expand Down
3 changes: 2 additions & 1 deletion src/swarm-tui/Swarm/TUI/View/Structure.hs
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,11 @@ import Swarm.Game.Entity (Entity, entityDisplay)
import Swarm.Game.Scenario.Topography.Area
import Swarm.Game.Scenario.Topography.Cell (Cell, cellToEntity)
import Swarm.Game.Scenario.Topography.Placement (getStructureName)
import Swarm.Game.Scenario.Topography.Structure qualified as Structure
import Swarm.Game.Scenario.Topography.Structure.Named qualified as Structure
import Swarm.Game.Scenario.Topography.Structure.Recognition (foundStructures, recognitionState)
import Swarm.Game.Scenario.Topography.Structure.Recognition.Precompute (getEntityGrid)
import Swarm.Game.Scenario.Topography.Structure.Recognition.Registry (foundByName)
import Swarm.Game.Scenario.Topography.Structure.Recognition.Static
import Swarm.Game.Scenario.Topography.Structure.Recognition.Type
import Swarm.Game.State
import Swarm.Game.State.Substate (structureRecognition)
Expand Down
4 changes: 3 additions & 1 deletion swarm.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -221,11 +221,14 @@ library swarm-topography
Swarm.Game.Scenario.Topography.Rasterize
Swarm.Game.Scenario.Topography.Structure
Swarm.Game.Scenario.Topography.Structure.Assembly
Swarm.Game.Scenario.Topography.Structure.Named
Swarm.Game.Scenario.Topography.Structure.Overlay
Swarm.Game.Scenario.Topography.Structure.Recognition
Swarm.Game.Scenario.Topography.Structure.Recognition.Log
Swarm.Game.Scenario.Topography.Structure.Recognition.Precompute
Swarm.Game.Scenario.Topography.Structure.Recognition.Prep
Swarm.Game.Scenario.Topography.Structure.Recognition.Registry
Swarm.Game.Scenario.Topography.Structure.Recognition.Static
Swarm.Game.Scenario.Topography.Structure.Recognition.Symmetry
Swarm.Game.Scenario.Topography.Structure.Recognition.Tracking
Swarm.Game.Scenario.Topography.Structure.Recognition.Type
Expand Down Expand Up @@ -297,7 +300,6 @@ library swarm-scenario
Swarm.Game.Scenario.Topography.Center
Swarm.Game.Scenario.Topography.EntityFacade
Swarm.Game.Scenario.Topography.Navigation.Portal
Swarm.Game.Scenario.Topography.Structure.Recognition.Precompute
Swarm.Game.Scenario.Topography.WorldDescription
Swarm.Game.Scenario.Topography.WorldPalette
Swarm.Game.State.Config
Expand Down

0 comments on commit e6b6da2

Please sign in to comment.