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