Remove Smoke datatype
This commit is contained in:
+4
-23
@@ -58,18 +58,12 @@ halfHeight w = _windowY w / 2
|
|||||||
hasLOS :: Point2 -> Point2 -> World -> Bool
|
hasLOS :: Point2 -> Point2 -> World -> Bool
|
||||||
{-# INLINE hasLOS #-}
|
{-# INLINE hasLOS #-}
|
||||||
hasLOS p1 p2 w = (not $ collidePointWallsSimple p1 p2 nearbyWalls)
|
hasLOS p1 p2 w = (not $ collidePointWallsSimple p1 p2 nearbyWalls)
|
||||||
&& (not $ collidePointSmoke p1 p2 nearbySmoke)
|
|
||||||
where nearbyWalls = wallsAlongLine p1 p2 w
|
where nearbyWalls = wallsAlongLine p1 p2 w
|
||||||
nearbySmoke = _smoke w -- smokeAlongLine p1 p2 w
|
|
||||||
|
|
||||||
smokeLOS :: Point2 -> Point2 -> World -> Bool
|
|
||||||
smokeLOS p1 p2 w = not $ collidePointSmoke p1 p2 nearbySmoke
|
|
||||||
where nearbySmoke = _smoke w
|
|
||||||
|
|
||||||
hasLOSIndirect :: Point2 -> Point2 -> World -> Bool
|
hasLOSIndirect :: Point2 -> Point2 -> World -> Bool
|
||||||
hasLOSIndirect p1 p2 w = case collidePointIndirect p1 p2 $ wallsAlongLine p1 p2 w
|
hasLOSIndirect p1 p2 w = case collidePointIndirect p1 p2 $ wallsAlongLine p1 p2 w
|
||||||
of Just _ -> False
|
of Just _ -> False
|
||||||
Nothing -> True && smokeLOS p1 p2 w
|
Nothing -> True
|
||||||
|
|
||||||
isWalkable :: Point2 -> Point2 -> World -> Bool
|
isWalkable :: Point2 -> Point2 -> World -> Bool
|
||||||
isWalkable p1 p2 w = not $ collidePointWalkable p1 p2 nearbyWalls
|
isWalkable p1 p2 w = not $ collidePointWalkable p1 p2 nearbyWalls
|
||||||
@@ -129,24 +123,21 @@ canWalk i j w = not $ collidePointWalkable ipos jpos $ wallsAlongLine ipos jpos
|
|||||||
canSeeIndirect :: Int -> Int -> World -> Bool
|
canSeeIndirect :: Int -> Int -> World -> Bool
|
||||||
canSeeIndirect i j w = case collidePointIndirect ipos jpos $ wallsAlongLine ipos jpos w
|
canSeeIndirect i j w = case collidePointIndirect ipos jpos $ wallsAlongLine ipos jpos w
|
||||||
of Just _ -> False
|
of Just _ -> False
|
||||||
Nothing -> True && smokeLOS ipos jpos w
|
Nothing -> True
|
||||||
where ipos = _crPos (_creatures w IM.! i)
|
where ipos = _crPos (_creatures w IM.! i)
|
||||||
jpos = _crPos (_creatures w IM.! j)
|
jpos = _crPos (_creatures w IM.! j)
|
||||||
|
|
||||||
canSeeFire :: Point2 -> Point2 -> World -> Bool
|
canSeeFire :: Point2 -> Point2 -> World -> Bool
|
||||||
canSeeFire p p' w = (not $ collidePointFireVision p p' $ wallsAlongLine p p' w)
|
canSeeFire p p' w = (not $ collidePointFireVision p p' $ wallsAlongLine p p' w)
|
||||||
&& smokeLOS p p' w
|
|
||||||
|
|
||||||
canSeeFireVision :: Int -> Int -> World -> Bool
|
canSeeFireVision :: Int -> Int -> World -> Bool
|
||||||
canSeeFireVision i j w = (not $ collidePointFireVision ipos jpos $ wallsAlongLine ipos jpos w)
|
canSeeFireVision i j w = (not $ collidePointFireVision ipos jpos $ wallsAlongLine ipos jpos w)
|
||||||
&& smokeLOS ipos jpos w
|
|
||||||
where ipos = _crPos (_creatures w IM.! i)
|
where ipos = _crPos (_creatures w IM.! i)
|
||||||
jpos = _crPos (_creatures w IM.! j)
|
jpos = _crPos (_creatures w IM.! j)
|
||||||
|
|
||||||
canSeeFireVisionAny :: Int -> Int -> World -> Bool
|
canSeeFireVisionAny :: Int -> Int -> World -> Bool
|
||||||
canSeeFireVisionAny i j w = (not $ and $ fmap ($ (wallsAlongLine (_crPos icr) (_crPos jcr) w) )
|
canSeeFireVisionAny i j w = not $ and $ fmap ($ (wallsAlongLine (_crPos icr) (_crPos jcr) w) )
|
||||||
$ zipWith collidePointFireVision ips jps
|
$ zipWith collidePointFireVision ips jps
|
||||||
) && smokeLOS (_crPos icr) (_crPos jcr) w
|
|
||||||
where icr = _creatures w IM.! i
|
where icr = _creatures w IM.! i
|
||||||
jcr = _creatures w IM.! j
|
jcr = _creatures w IM.! j
|
||||||
ips = map (\p -> (_crPos icr +.+ _crRad icr *.* p)) [(1,0),(0,1),(-1,0),(0,-1)]
|
ips = map (\p -> (_crPos icr +.+ _crRad icr *.* p)) [(1,0),(0,1),(-1,0),(0,-1)]
|
||||||
@@ -154,9 +145,8 @@ canSeeFireVisionAny i j w = (not $ and $ fmap ($ (wallsAlongLine (_crPos icr) (_
|
|||||||
|
|
||||||
|
|
||||||
canSeeFireVisionAll :: Int -> Int -> World -> Bool
|
canSeeFireVisionAll :: Int -> Int -> World -> Bool
|
||||||
canSeeFireVisionAll i j w = (not $ or $ fmap ($ (wallsAlongLine (_crPos icr) (_crPos jcr) w) )
|
canSeeFireVisionAll i j w = not $ or $ fmap ($ (wallsAlongLine (_crPos icr) (_crPos jcr) w) )
|
||||||
$ zipWith collidePointFireVision ips jps
|
$ zipWith collidePointFireVision ips jps
|
||||||
) && smokeLOS (_crPos icr) (_crPos jcr) w
|
|
||||||
where icr = _creatures w IM.! i
|
where icr = _creatures w IM.! i
|
||||||
jcr = _creatures w IM.! j
|
jcr = _creatures w IM.! j
|
||||||
ips = map (\p -> (_crPos icr +.+ _crRad icr *.* p)) [(1,0),(0,1),(-1,0),(0,-1)]
|
ips = map (\p -> (_crPos icr +.+ _crRad icr *.* p)) [(1,0),(0,1),(-1,0),(0,-1)]
|
||||||
@@ -424,15 +414,6 @@ collidePointFireVision p1 p2 ws = any ( isJust
|
|||||||
Just _ -> not $ _wlIsSeeThrough wl
|
Just _ -> not $ _wlIsSeeThrough wl
|
||||||
Nothing -> True
|
Nothing -> True
|
||||||
|
|
||||||
collidePointSmoke :: Point2 -> Point2 -> [Smoke] -> Bool
|
|
||||||
collidePointSmoke a b = any $ isJust . uncurry (intersectSegSeg' a b) . smokePerpLine a b
|
|
||||||
|
|
||||||
smokePerpLine :: Point2 -> Point2 -> Smoke -> (Point2,Point2)
|
|
||||||
smokePerpLine a b sm = (p +.+ orth, p -.- orth)
|
|
||||||
where
|
|
||||||
p = _smPos sm
|
|
||||||
orth = _smRad sm *.* safeNormalizeV (vNormal (a -.- b))
|
|
||||||
|
|
||||||
-- shit this is ugly
|
-- shit this is ugly
|
||||||
lineOfThickness :: Float -> [Point2] -> Picture
|
lineOfThickness :: Float -> [Point2] -> Picture
|
||||||
lineOfThickness t = pictures . f
|
lineOfThickness t = pictures . f
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ import Dodge.AIs
|
|||||||
import Dodge.CreatureState
|
import Dodge.CreatureState
|
||||||
import Dodge.Prototypes
|
import Dodge.Prototypes
|
||||||
import Dodge.Base
|
import Dodge.Base
|
||||||
import Dodge.Smoke
|
|
||||||
import Dodge.Item.Weapon
|
import Dodge.Item.Weapon
|
||||||
import Dodge.Item.Consumable
|
import Dodge.Item.Consumable
|
||||||
|
import Dodge.WorldEvent.Cloud
|
||||||
|
|
||||||
import Picture
|
import Picture
|
||||||
import Geometry
|
import Geometry
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ data World = World
|
|||||||
, _cloudsZone :: IM.IntMap (IM.IntMap (IM.IntMap Cloud))
|
, _cloudsZone :: IM.IntMap (IM.IntMap (IM.IntMap Cloud))
|
||||||
, _projectiles :: IM.IntMap Projectile
|
, _projectiles :: IM.IntMap Projectile
|
||||||
, _particles' :: ![Particle']
|
, _particles' :: ![Particle']
|
||||||
, _smoke :: [Smoke]
|
|
||||||
, _walls :: !(IM.IntMap Wall)
|
, _walls :: !(IM.IntMap Wall)
|
||||||
, _wallsZone :: (IM.IntMap (IM.IntMap (IM.IntMap Wall)))
|
, _wallsZone :: (IM.IntMap (IM.IntMap (IM.IntMap Wall)))
|
||||||
, _forceFields :: IM.IntMap ForceField
|
, _forceFields :: IM.IntMap ForceField
|
||||||
@@ -497,16 +496,6 @@ data DamageType = Piercing {_dmAmount :: Int , _dmFrom :: Point2 , _dmAt :: Poin
|
|||||||
|
|
||||||
data Either3 a b c = E3x1 a | E3x2 b | E3x3 c
|
data Either3 a b c = E3x1 a | E3x2 b | E3x3 c
|
||||||
|
|
||||||
data Smoke =
|
|
||||||
Smoke
|
|
||||||
{ _smPos :: Point2
|
|
||||||
, _smRad :: Float
|
|
||||||
, _smColor :: Color
|
|
||||||
, _smUpdate :: Smoke -> Maybe Smoke
|
|
||||||
, _smPs :: [Point2]
|
|
||||||
, _smTime :: Int
|
|
||||||
}
|
|
||||||
|
|
||||||
data WLID = WLID { _wlIDx :: Int, _wlIDy :: Int, _wlIDid :: Int}
|
data WLID = WLID { _wlIDx :: Int, _wlIDy :: Int, _wlIDid :: Int}
|
||||||
|
|
||||||
data Wall
|
data Wall
|
||||||
@@ -637,7 +626,6 @@ makeLenses ''FloorItem
|
|||||||
makeLenses ''Projectile
|
makeLenses ''Projectile
|
||||||
makeLenses ''Particle'
|
makeLenses ''Particle'
|
||||||
makeLenses ''Wall
|
makeLenses ''Wall
|
||||||
makeLenses ''Smoke
|
|
||||||
makeLenses ''ForceField
|
makeLenses ''ForceField
|
||||||
makeLenses ''FFState
|
makeLenses ''FFState
|
||||||
makeLenses ''PressPlate
|
makeLenses ''PressPlate
|
||||||
|
|||||||
@@ -219,7 +219,6 @@ basicWorld = World
|
|||||||
, _pathInc = M.empty
|
, _pathInc = M.empty
|
||||||
, _windowX = 800
|
, _windowX = 800
|
||||||
, _windowY = 840
|
, _windowY = 840
|
||||||
, _smoke = []
|
|
||||||
, _mapDisplay = (False, 0.2)
|
, _mapDisplay = (False, 0.2)
|
||||||
, _lightSources = IM.empty
|
, _lightSources = IM.empty
|
||||||
, _tempLightSources = [youLight]
|
, _tempLightSources = [youLight]
|
||||||
|
|||||||
@@ -45,7 +45,6 @@ worldPictures w
|
|||||||
, map _ptPict' $ _particles' w
|
, map _ptPict' $ _particles' w
|
||||||
, map drawWallFloor (wallFloorsToDraw w)
|
, map drawWallFloor (wallFloorsToDraw w)
|
||||||
-- , map (drawWallFace w) (wallShadowsToDraw w)
|
-- , map (drawWallFace w) (wallShadowsToDraw w)
|
||||||
, map (drawSmokeShadow w) $ _smoke w
|
|
||||||
, testPic w
|
, testPic w
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -86,43 +85,6 @@ wallFloorsToDraw w = filter isVisible $ IM.elems $ wallsOnScreen w
|
|||||||
wallsOnScreen :: World -> IM.IntMap Wall
|
wallsOnScreen :: World -> IM.IntMap Wall
|
||||||
wallsOnScreen w = wallsNearZones (zoneOfScreen w) w
|
wallsOnScreen w = wallsNearZones (zoneOfScreen w) w
|
||||||
|
|
||||||
drawSmokeShadow :: World -> Smoke -> Picture
|
|
||||||
drawSmokeShadow w sm@(Smoke {_smPos = p, _smRad = r', _smColor = c, _smPs = ps, _smTime = t})
|
|
||||||
= pictures
|
|
||||||
[ onLayerL [74,0] $ color col $
|
|
||||||
pictures [uncurry translate p $ circle r'
|
|
||||||
,line $ (\(x,y) -> [x,y]) $ smokePerpLine (_cameraPos w) p sm
|
|
||||||
,line [_cameraPos w, mouseWorldPos w]
|
|
||||||
,trap' p
|
|
||||||
]
|
|
||||||
, onLayerL [74] $ color (withAlpha 0.1 c) $ pictures
|
|
||||||
$ concatMap (f . (+.+ p)) p's
|
|
||||||
]
|
|
||||||
where
|
|
||||||
r = r'/2
|
|
||||||
col | smokeLOS (_cameraPos w) (mouseWorldPos w) w = red
|
|
||||||
| otherwise = green
|
|
||||||
orth p' = r *.* (safeNormalizeV $ vNormal $ p' -.- _cameraCenter w)
|
|
||||||
pa p' = p' +.+ orth p'
|
|
||||||
pb p' = p' -.- orth p'
|
|
||||||
pao p' = pa p' +.+ l *.* safeNormalizeV (pa p' -.- _cameraCenter w)
|
|
||||||
pbo p' = pb p' +.+ l *.* safeNormalizeV (pb p' -.- _cameraCenter w)
|
|
||||||
semiCirc p' = uncurry translate p' $ rotate (0 - (a p')) $ arcSolid 0 180 r
|
|
||||||
a p' = pi - argV (orth p')
|
|
||||||
trap p' = polygon [pa p', pb p', pbo p', pao p']
|
|
||||||
f p' = [semiCirc p', trap p']
|
|
||||||
p's = zipWith (\x p -> rotateV (x * fromIntegral t / 60) p) xs ps
|
|
||||||
xs = concat $ repeat [-1,-0.5,0,0.5,1]
|
|
||||||
l = _windowX w + _windowY w + magV (_cameraPos w -.- _cameraCenter w)
|
|
||||||
-- cenpic = color (withAlpha 0.5 c) $ pictures $ f p
|
|
||||||
orth' p' = r' *.* (safeNormalizeV $ vNormal $ p' -.- _cameraCenter w)
|
|
||||||
pa' p' = p' +.+ orth' p'
|
|
||||||
pb' p' = p' -.- orth' p'
|
|
||||||
pao' p' = pa' p' +.+ l *.* safeNormalizeV (pa' p' -.- _cameraCenter w)
|
|
||||||
pbo' p' = pb' p' +.+ l *.* safeNormalizeV (pb' p' -.- _cameraCenter w)
|
|
||||||
trap' p' = line [pa' p', pb' p', pbo' p', pao' p',pa' p']
|
|
||||||
semiCirc' p' = uncurry translate p' $ rotate (0 - (a p')) $ arcSolid 0 180 r'
|
|
||||||
|
|
||||||
drawWallFloor :: Wall -> Picture
|
drawWallFloor :: Wall -> Picture
|
||||||
drawWallFloor wl = if _wlIsSeeThrough wl
|
drawWallFloor wl = if _wlIsSeeThrough wl
|
||||||
then setDepth 0.9 . color c $ polygon [x,x +.+ n2,y+.+n2, y]
|
then setDepth 0.9 . color c $ polygon [x,x +.+ n2,y+.+n2, y]
|
||||||
|
|||||||
@@ -1,33 +0,0 @@
|
|||||||
module Dodge.Smoke where
|
|
||||||
|
|
||||||
import Dodge.Data
|
|
||||||
import Dodge.Base
|
|
||||||
import Dodge.RandomHelp
|
|
||||||
import Geometry.Data
|
|
||||||
import Picture
|
|
||||||
|
|
||||||
import Control.Lens
|
|
||||||
import Control.Monad.State
|
|
||||||
|
|
||||||
spawnSmokeAt :: Point2 -> World -> World
|
|
||||||
spawnSmokeAt p w =
|
|
||||||
w & smoke %~ (:) thesmoke
|
|
||||||
& randGen .~ g
|
|
||||||
where
|
|
||||||
thesmoke = Smoke
|
|
||||||
{_smPos = p
|
|
||||||
,_smRad = 20
|
|
||||||
,_smColor = white
|
|
||||||
,_smUpdate = f
|
|
||||||
,_smPs = ps
|
|
||||||
,_smTime = 500
|
|
||||||
}
|
|
||||||
f s = case s ^. smPs of
|
|
||||||
[] -> Nothing
|
|
||||||
_ -> case s ^. smTime of
|
|
||||||
0 -> Just $ s & smPs %~ init
|
|
||||||
t -> Just $ s & smTime .~ t-1
|
|
||||||
(ps,g) = runState (sequence $ replicate 60 $ randInCirc 20) $ _randGen w
|
|
||||||
|
|
||||||
spawnSmokeAtCursor :: World -> World
|
|
||||||
spawnSmokeAtCursor w = spawnSmokeAt (mouseWorldPos w) w
|
|
||||||
@@ -30,7 +30,6 @@ update w
|
|||||||
$ updateLightSources
|
$ updateLightSources
|
||||||
$ zoneClouds
|
$ zoneClouds
|
||||||
$ updateClouds
|
$ updateClouds
|
||||||
$ updateSmoke
|
|
||||||
$ updateCreatures
|
$ updateCreatures
|
||||||
$ updateBlocks -- $ zoning
|
$ updateBlocks -- $ zoning
|
||||||
$ updateSeenWalls
|
$ updateSeenWalls
|
||||||
@@ -71,9 +70,6 @@ updateLightSources w = set tempLightSources (catMaybes tlss) w'
|
|||||||
|
|
||||||
updateParticles w = IM.foldr' _ptUpdate w $ _projectiles w
|
updateParticles w = IM.foldr' _ptUpdate w $ _projectiles w
|
||||||
|
|
||||||
updateSmoke :: World -> World
|
|
||||||
updateSmoke w = w & smoke %~ mapMaybe (\s -> _smUpdate s s)
|
|
||||||
|
|
||||||
updateParticles' :: World -> World
|
updateParticles' :: World -> World
|
||||||
updateParticles' w = set particles' (catMaybes ps) w'
|
updateParticles' w = set particles' (catMaybes ps) w'
|
||||||
where (w',ps) = mapAccumR (\a b -> _ptUpdate' b a b) w $ _particles' w
|
where (w',ps) = mapAccumR (\a b -> _ptUpdate' b a b) w $ _particles' w
|
||||||
@@ -145,7 +141,6 @@ clClSpringVel :: Cloud -> World -> Cloud -> Point2 -> Point2
|
|||||||
clClSpringVel a w b v
|
clClSpringVel a w b v
|
||||||
| ida == idb = v
|
| ida == idb = v
|
||||||
| dist pa pb < radDist = v +.+ 0.1 *.* (safeNormalizeV (pa -.- pb))
|
| dist pa pb < radDist = v +.+ 0.1 *.* (safeNormalizeV (pa -.- pb))
|
||||||
-- | dist pa pb < radDist = v +.+ 0.1 *.* (safeNormalizeV (pa -.- pb))
|
|
||||||
| otherwise = v
|
| otherwise = v
|
||||||
where ida = _clID a
|
where ida = _clID a
|
||||||
idb = _clID b
|
idb = _clID b
|
||||||
|
|||||||
@@ -39,3 +39,5 @@ makeFlamerSmoke pos w = w & clouds %~ IM.insert i theCloud
|
|||||||
, _clEffect = const id
|
, _clEffect = const id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spawnSmokeAtCursor :: World -> World
|
||||||
|
spawnSmokeAtCursor w = makeSmokeCloud (mouseWorldPos w) w
|
||||||
|
|||||||
Reference in New Issue
Block a user