packages feed

swarm-0.6.0.0: src/swarm-scenario/Swarm/Game/Scenario/Topography/Center.hs

-- |
-- SPDX-License-Identifier: BSD-3-Clause
--
-- Utility for determining the center of
-- the map, outside the context of a
-- running game
module Swarm.Game.Scenario.Topography.Center where

import Control.Lens (view)
import Data.List.NonEmpty (NonEmpty)
import Data.Maybe (fromMaybe, listToMaybe)
import Swarm.Game.Location (Location, origin)
import Swarm.Game.Robot (trobotLocation)
import Swarm.Game.Scenario (ScenarioLandscape)
import Swarm.Game.State.Landscape (SubworldDescription, genRobotTemplates)
import Swarm.Game.Universe (Cosmic (..), SubworldName (DefaultRootSubworld))

-- | Determine view center for a static map
-- without reference to a 'GameState'
-- (i.e. outside the context of an active game)
determineStaticViewCenter ::
  ScenarioLandscape ->
  NonEmpty SubworldDescription ->
  Cosmic Location
determineStaticViewCenter sLandscape worldTuples =
  fromMaybe defaultVC baseRobotLoc
 where
  theRobots = genRobotTemplates sLandscape worldTuples
  defaultVC = Cosmic DefaultRootSubworld origin

  -- The first robot is guaranteed to be the base.
  baseRobotLoc :: Maybe (Cosmic Location)
  baseRobotLoc = do
    theBaseRobot <- listToMaybe theRobots
    view trobotLocation theBaseRobot