Reify press plates
This commit is contained in:
+4
-9
@@ -76,7 +76,9 @@ module Dodge.Data
|
|||||||
, module Dodge.Data.Gust
|
, module Dodge.Data.Gust
|
||||||
, module Dodge.Data.Projectile
|
, module Dodge.Data.Projectile
|
||||||
, module Dodge.Data.Modification
|
, module Dodge.Data.Modification
|
||||||
|
, module Dodge.Data.PressPlate
|
||||||
) where
|
) where
|
||||||
|
import Dodge.Data.PressPlate
|
||||||
import Dodge.Data.Modification
|
import Dodge.Data.Modification
|
||||||
import Dodge.Data.Projectile
|
import Dodge.Data.Projectile
|
||||||
import Dodge.Data.Gust
|
import Dodge.Data.Gust
|
||||||
@@ -351,15 +353,8 @@ data TerminalLine
|
|||||||
{_tlPause :: Int
|
{_tlPause :: Int
|
||||||
,_tlEffect :: Terminal -> World -> World
|
,_tlEffect :: Terminal -> World -> World
|
||||||
}
|
}
|
||||||
data PressPlate = PressPlate
|
|
||||||
{ _ppPict :: Picture
|
|
||||||
, _ppPos :: Point2
|
|
||||||
, _ppRot :: Float
|
|
||||||
, _ppEvent :: PressPlate -> World -> World
|
|
||||||
, _ppID :: Int
|
|
||||||
, _ppText :: String
|
|
||||||
}
|
|
||||||
data FloorItem = FlIt { _flIt :: Item , _flItPos :: Point2 , _flItRot :: Float, _flItID :: Int}
|
data FloorItem = FlIt { _flIt :: Item , _flItPos :: Point2 , _flItRot :: Float, _flItID :: Int}
|
||||||
|
deriving (Eq,Ord,Show,Read)
|
||||||
|
|
||||||
|
|
||||||
data IntID a = IntID Int a
|
data IntID a = IntID Int a
|
||||||
@@ -370,6 +365,7 @@ data WorldBeams = WorldBeams
|
|||||||
,_positronBeams :: [Beam]
|
,_positronBeams :: [Beam]
|
||||||
,_electronBeams :: [Beam]
|
,_electronBeams :: [Beam]
|
||||||
}
|
}
|
||||||
|
deriving (Eq,Ord,Show,Read)
|
||||||
|
|
||||||
{- Objects without ids.
|
{- Objects without ids.
|
||||||
Update themselves, perhaps with side effects. -}
|
Update themselves, perhaps with side effects. -}
|
||||||
@@ -688,7 +684,6 @@ makeLenses ''World
|
|||||||
makeLenses ''FloorItem
|
makeLenses ''FloorItem
|
||||||
makeLenses ''Prop
|
makeLenses ''Prop
|
||||||
makeLenses ''Particle
|
makeLenses ''Particle
|
||||||
makeLenses ''PressPlate
|
|
||||||
makeLenses ''Door
|
makeLenses ''Door
|
||||||
makeLenses ''Terminal
|
makeLenses ''Terminal
|
||||||
makeLenses ''Machine
|
makeLenses ''Machine
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
|
{-# LANGUAGE StrictData #-}
|
||||||
|
module Dodge.Data.PressPlate
|
||||||
|
where
|
||||||
|
import Geometry.Data
|
||||||
|
import Picture
|
||||||
|
import Control.Lens
|
||||||
|
data PressPlateEvent = PressPlateId
|
||||||
|
| PPLevelReset
|
||||||
|
deriving (Eq,Ord,Show,Read)
|
||||||
|
data PressPlate = PressPlate
|
||||||
|
{ _ppPict :: Picture
|
||||||
|
, _ppPos :: Point2
|
||||||
|
, _ppRot :: Float
|
||||||
|
, _ppEvent :: PressPlateEvent
|
||||||
|
, _ppID :: Int
|
||||||
|
, _ppText :: String
|
||||||
|
}
|
||||||
|
makeLenses ''PressPlate
|
||||||
@@ -103,7 +103,7 @@ defaultPP = PressPlate
|
|||||||
{ _ppPict = setDepth 1 . color (dim . dim $ bright blue) $ circleSolid 5
|
{ _ppPict = setDepth 1 . color (dim . dim $ bright blue) $ circleSolid 5
|
||||||
, _ppPos = V2 0 0
|
, _ppPos = V2 0 0
|
||||||
, _ppRot = 0
|
, _ppRot = 0
|
||||||
, _ppEvent = const id
|
, _ppEvent = PressPlateId
|
||||||
, _ppID = -1
|
, _ppID = -1
|
||||||
, _ppText = "Pressure plate"
|
, _ppText = "Pressure plate"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
module Dodge.PressPlate
|
||||||
|
where
|
||||||
|
import Dodge.Data
|
||||||
|
import Geometry
|
||||||
|
import Dodge.Base.You
|
||||||
|
import Dodge.WorldEvent.Explosion
|
||||||
|
|
||||||
|
doPressPlateEvent :: PressPlateEvent -> PressPlate -> World -> World
|
||||||
|
doPressPlateEvent ppe = case ppe of
|
||||||
|
PressPlateId -> const id
|
||||||
|
PPLevelReset -> ppLevelReset
|
||||||
|
|
||||||
|
ppLevelReset pp w
|
||||||
|
| dist (_crPos $ you w) (_ppPos pp) < 20 = makeExplosionAt (_ppPos pp) w
|
||||||
|
| otherwise = w
|
||||||
|
|
||||||
@@ -31,11 +31,8 @@ telRoomLev _ = do
|
|||||||
{ _ppPict = setDepth 0.5 . color red $ polygon ppFootprint
|
{ _ppPict = setDepth 0.5 . color red $ polygon ppFootprint
|
||||||
, _ppPos = V2 0 0
|
, _ppPos = V2 0 0
|
||||||
, _ppRot = 0
|
, _ppRot = 0
|
||||||
, _ppEvent = levelReset
|
, _ppEvent = PPLevelReset
|
||||||
, _ppID = 0
|
, _ppID = 0
|
||||||
, _ppText = "NEW LEVEL"
|
, _ppText = "NEW LEVEL"
|
||||||
}
|
}
|
||||||
ppFootprint = reverse $ rectNSWE 20 (-20) (-20) 20
|
ppFootprint = reverse $ rectNSWE 20 (-20) (-20) 20
|
||||||
levelReset pp w
|
|
||||||
| dist (_crPos $ you w) (_ppPos pp) < 20 = makeExplosionAt (_ppPos pp) w
|
|
||||||
| otherwise = w
|
|
||||||
|
|||||||
+2
-1
@@ -4,6 +4,7 @@ Module : Dodge.Update
|
|||||||
Description : Simulation update
|
Description : Simulation update
|
||||||
-}
|
-}
|
||||||
module Dodge.Update ( updateUniverse ) where
|
module Dodge.Update ( updateUniverse ) where
|
||||||
|
import Dodge.PressPlate
|
||||||
import Dodge.ModificationEffect
|
import Dodge.ModificationEffect
|
||||||
import Dodge.CrGroupUpdate
|
import Dodge.CrGroupUpdate
|
||||||
import Dodge.Zoning.Cloud
|
import Dodge.Zoning.Cloud
|
||||||
@@ -352,7 +353,7 @@ updateMIM f up = f %~ IM.mapMaybe (dbArg up)
|
|||||||
-- (_,g') = genWord8 g
|
-- (_,g') = genWord8 g
|
||||||
|
|
||||||
ppEvents :: World -> World
|
ppEvents :: World -> World
|
||||||
ppEvents w = IM.foldl' (flip $ \pp -> _ppEvent pp pp) w $ _pressPlates w
|
ppEvents w = IM.foldl' (flip $ \pp -> doPressPlateEvent (_ppEvent pp) pp) w $ _pressPlates w
|
||||||
|
|
||||||
updateSeenWalls :: World -> World
|
updateSeenWalls :: World -> World
|
||||||
updateSeenWalls w = foldl' markWallSeen w (map (_wlID . snd) $ allVisibleWalls w)
|
updateSeenWalls w = foldl' markWallSeen w (map (_wlID . snd) $ allVisibleWalls w)
|
||||||
|
|||||||
Reference in New Issue
Block a user