Add z level to energy balls
This commit is contained in:
+19
-15
@@ -17,8 +17,9 @@ import Geometry
|
||||
import LensHelp
|
||||
import Picture
|
||||
import RandomHelp
|
||||
import Linear.V3
|
||||
|
||||
makeFlamelet :: Point2 -> Point2 -> Float -> Int -> World -> World
|
||||
makeFlamelet :: Point3 -> Point3 -> Float -> Int -> World -> World
|
||||
makeFlamelet p v s t w =
|
||||
w
|
||||
& randGen .~ g
|
||||
@@ -36,29 +37,29 @@ updateEnergyBall :: World -> EnergyBall -> (World, Maybe EnergyBall)
|
||||
updateEnergyBall w eb
|
||||
| _ebTimer eb <= 0 = (w, Nothing)
|
||||
| otherwise =
|
||||
( ebEffect eb . ebFlicker eb $ ebDamage (_ebPos eb) (_ebType eb) w
|
||||
, Just $ eb & ebTimer -~ 1 & ebPos .~ bp & ebVel .~ drag * bv
|
||||
( ebEffect eb . ebFlicker eb $ ebDamage (eb ^. ebPos) (_ebType eb) w
|
||||
, Just $ eb & ebTimer -~ 1 & ebPos . _xy .~ bp & ebVel . _xy .~ drag * bv
|
||||
)
|
||||
where
|
||||
drag = case eb ^. ebType of
|
||||
ExplosiveBall -> 0.9
|
||||
_ -> 0.85
|
||||
p = eb ^. ebPos + eb ^. ebVel
|
||||
(bp, bv) = fromMaybe (p, eb ^. ebVel) $ bouncePoint (const True) 0 (eb ^. ebPos) p w
|
||||
p = (eb ^. ebPos + eb ^. ebVel) ^. _xy
|
||||
(bp, bv) = fromMaybe (p, eb ^. ebVel . _xy) $ bouncePoint (const True) 0 (eb ^. ebPos . _xy) p w
|
||||
|
||||
ebEffect :: EnergyBall -> World -> World
|
||||
ebEffect eb = case _ebType eb of
|
||||
ElectricalBall i ->
|
||||
soundContinue (EBSound i) (_ebPos eb) elecCrackleS (Just 2)
|
||||
soundContinue (EBSound i) (eb ^. ebPos . _xy) elecCrackleS (Just 2)
|
||||
. randSparkExtraVel
|
||||
(_ebVel eb)
|
||||
(eb ^. ebVel . _xy)
|
||||
ElectricSpark
|
||||
(state (randomR (3, 6)))
|
||||
(state (randomR (0, 2 * pi)))
|
||||
(_ebPos eb)
|
||||
(eb ^. ebPos . _xy)
|
||||
IncendiaryBall{}
|
||||
| _ebTimer eb == 20 ->
|
||||
soundStart (EBSound (-1)) (_ebPos eb) fireFadeS Nothing
|
||||
soundStart (EBSound (-1)) (eb ^. ebPos . _xy) fireFadeS Nothing
|
||||
_ -> id
|
||||
|
||||
energyBallAt :: EnergyBallType -> Point2 -> World -> World
|
||||
@@ -66,7 +67,7 @@ energyBallAt ebt p =
|
||||
cWorld . lWorld . energyBalls
|
||||
.:~ EnergyBall
|
||||
{ _ebVel = 0
|
||||
, _ebPos = p
|
||||
, _ebPos = p `v2z` 20
|
||||
, _ebTimer = 20
|
||||
, _ebType = ebt
|
||||
}
|
||||
@@ -75,8 +76,8 @@ makeMovingEB :: Point2 -> EnergyBallType -> Point2 -> World -> World
|
||||
makeMovingEB v ebt p =
|
||||
cWorld . lWorld . energyBalls
|
||||
.:~ EnergyBall
|
||||
{ _ebVel = v
|
||||
, _ebPos = p
|
||||
{ _ebVel = v `v2z` 0
|
||||
, _ebPos = p `v2z` 20
|
||||
, _ebTimer = 20
|
||||
, _ebType = ebt
|
||||
}
|
||||
@@ -88,7 +89,7 @@ ebFlicker :: EnergyBall -> World -> World
|
||||
ebFlicker pt
|
||||
| _ebTimer pt `mod` 7 == 0 =
|
||||
cWorld . lWorld . lights
|
||||
.:~ LSParam (addZ 5 $ _ebPos pt) 70 (0.5 * xyzV4 (ebColor pt))
|
||||
.:~ LSParam (pt ^. ebPos) 70 (0.5 * xyzV4 (ebColor pt))
|
||||
| otherwise = id
|
||||
|
||||
ebColor :: EnergyBall -> Color
|
||||
@@ -99,9 +100,12 @@ ebColor eb = case eb ^. ebType of
|
||||
ExplosiveBall -> white
|
||||
FlashBall -> white
|
||||
|
||||
ebDamage :: Point2 -> EnergyBallType -> World -> World
|
||||
ebDamage sp dt = damageInCircle (const $ ebtToDamage sp dt) sp r
|
||||
ebDamage :: Point3 -> EnergyBallType -> World -> World
|
||||
ebDamage sp dt
|
||||
| z > 0 && z < 25 = damageInCircle (const $ ebtToDamage (sp ^. _xy) dt) (sp ^. _xy) r
|
||||
| otherwise = id
|
||||
where
|
||||
z = sp ^. _z
|
||||
r = fromMaybe 5 $ dt ^? fbSize
|
||||
|
||||
ebtToDamage :: Point2 -> EnergyBallType -> Damage
|
||||
|
||||
Reference in New Issue
Block a user