43 lines
1.4 KiB
Haskell
43 lines
1.4 KiB
Haskell
module Dodge.Particle.TeslaArc
|
|
( aTeslaArcAt
|
|
) where
|
|
import Dodge.Data
|
|
import Dodge.Damage
|
|
import Dodge.Spark
|
|
import RandomHelp
|
|
import Picture
|
|
import Geometry
|
|
import LensHelp
|
|
|
|
aTeslaArcAt :: Color -> [ArcStep] -> Particle
|
|
aTeslaArcAt col thearc = PtTeslaArc
|
|
{ _ptPoints = map (^. asPos) thearc
|
|
, _ptUpdate = moveTeslaArc thearc
|
|
, _ptTimer = 2
|
|
, _ptColor = brightX 100 1.5 col
|
|
}
|
|
|
|
moveTeslaArc :: [ArcStep]
|
|
-> World
|
|
-> Particle
|
|
-> (World,Maybe Particle)
|
|
moveTeslaArc thearc w pt
|
|
| _ptTimer pt == 2 = (makesparks $ foldr damthings w thearc, Just $ pt & ptTimer -~ 1)
|
|
| _ptTimer pt < 1 = (w, Nothing)
|
|
| otherwise = (w, Just $ pt & ptTimer -~ 1)
|
|
where
|
|
rcol = brightX 100 1.5 <$> takeOne [white,azure,blue,cyan]
|
|
rdir = state (randomR (-0.7,0.7)) <&> (+ ld)
|
|
rspeed = state (randomR (3,6))
|
|
makeaspark = randSpark rspeed rcol rdir lp
|
|
makesparks = makeaspark . makeaspark . makeaspark
|
|
(lp,ld) = case last thearc of
|
|
ArcStep lp' ld' Nothing -> (lp',ld')
|
|
ArcStep lp' ld' (Just (Left cr)) -> (lp' -.- (_crRad cr + 1) *.* unitVectorAtAngle ld',ld'+pi)
|
|
ArcStep lp' ld' (Just (Right _)) -> (lp' -.- 2 *.* unitVectorAtAngle ld',ld'+pi)
|
|
damthings (ArcStep _ _ Nothing) = id
|
|
damthings (ArcStep p dir (Just crwl)) = damageCrWall (thedamage p dir) crwl
|
|
thedamage p dir = Damage ELECTRICAL 50 (p -.- q) p (p +.+ q) NoDamageEffect
|
|
where
|
|
q = 5 *.* unitVectorAtAngle dir
|