diff --git a/src/Dodge/Data/Item/Params.hs b/src/Dodge/Data/Item/Params.hs index 870a18de8..6815c45b2 100644 --- a/src/Dodge/Data/Item/Params.hs +++ b/src/Dodge/Data/Item/Params.hs @@ -19,7 +19,7 @@ data ItemParams | FlatShieldParams {_flatShieldWlMIX :: Maybe Int} | Arcing - { _currentArc :: Maybe [ArcStep] + { _currentArc :: [ArcStep] , _arcSize :: Float , _arcNumber :: Int , _newArcStep :: NextArcStep --ItemParams -> World -> ArcStep -> State StdGen (Maybe ArcStep) diff --git a/src/Dodge/Draw.hs b/src/Dodge/Draw.hs index cd16e14db..1cec9d917 100644 --- a/src/Dodge/Draw.hs +++ b/src/Dodge/Draw.hs @@ -18,7 +18,7 @@ module Dodge.Draw ( module Dodge.RadarSweep.Draw, module Dodge.Spark.Draw, module Dodge.Targeting.Draw, - module Dodge.Tesla.Arc.Draw, + module Dodge.Tesla.Draw, module Dodge.TractorBeam.Draw, module Dodge.Shockwave.Draw, ) where @@ -40,5 +40,5 @@ import Dodge.RadarSweep.Draw import Dodge.Shockwave.Draw import Dodge.Spark.Draw import Dodge.Targeting.Draw -import Dodge.Tesla.Arc.Draw +import Dodge.Tesla.Draw import Dodge.TractorBeam.Draw diff --git a/src/Dodge/HeldUse.hs b/src/Dodge/HeldUse.hs index 280e926c5..722eca4c0 100644 --- a/src/Dodge/HeldUse.hs +++ b/src/Dodge/HeldUse.hs @@ -24,7 +24,7 @@ import Dodge.Item.Weapon.Shatter import Dodge.Projectile.Create import Dodge.RadarSweep import Dodge.SoundLogic -import Dodge.Tesla.Arc +import Dodge.Tesla import Geometry import LensHelp import ListHelp diff --git a/src/Dodge/Item/Held/BatteryGuns.hs b/src/Dodge/Item/Held/BatteryGuns.hs index c19df094d..25c76a104 100644 --- a/src/Dodge/Item/Held/BatteryGuns.hs +++ b/src/Dodge/Item/Held/BatteryGuns.hs @@ -5,11 +5,11 @@ module Dodge.Item.Held.BatteryGuns , tractorGun ) where +import Dodge.Data.ArcStep import Dodge.SoundLogic.ExternallyGeneratedSounds import Dodge.Default.Item import Control.Lens import Dodge.Data.Item -import Dodge.Tesla.ItemParams import Geometry.Data sparkGun :: Item @@ -34,6 +34,16 @@ teslaGun = & itAmmoSlots .~ singleAmmo ElectricalAmmo & itUse . heldTriggerType .~ AutoTrigger +teslaParams :: ItemParams +teslaParams = + Arcing + { _currentArc = [] + , _arcSize = 20 + , _arcNumber = 10 + , _newArcStep = DefaultArcStep --defaultArcStep + , _previousArcEffect = NoPreviousArcEffect + } + -- previous phaseV parameters: 0.2, 1, 5 laser :: Item laser = diff --git a/src/Dodge/Render/ShapePicture.hs b/src/Dodge/Render/ShapePicture.hs index e8a0f4730..d07df8c74 100644 --- a/src/Dodge/Render/ShapePicture.hs +++ b/src/Dodge/Render/ShapePicture.hs @@ -133,3 +133,4 @@ mcSPic :: LWorld -> Machine -> SPic mcSPic lw mc = uncurryV translateSPxy (_mcPos mc) $ rotateSP (_mcDir mc) (drawMachine lw mc) + diff --git a/src/Dodge/Tesla.hs b/src/Dodge/Tesla.hs index c02114b07..86cf8b50c 100644 --- a/src/Dodge/Tesla.hs +++ b/src/Dodge/Tesla.hs @@ -1,9 +1,162 @@ -module Dodge.Tesla - ( module Dodge.Tesla.Ball - , module Dodge.Tesla.Arc - , module Dodge.Tesla.ItemParams - ) where -import Dodge.Tesla.Ball -import Dodge.Tesla.Arc -import Dodge.Tesla.ItemParams +module Dodge.Tesla ( + makeTeslaArc, + updateTeslaArc, +) where +import Data.Foldable +import Data.List (sortOn) +import Data.Maybe +import Dodge.Base.Collide +import Dodge.Damage +import Dodge.Data.ArcStep +import Dodge.Data.CrWlID +import Dodge.Data.World +import Dodge.Spark +import Geometry +import qualified IntMapHelp as IM +import LensHelp +import MonadHelp +import Picture +import RandomHelp +import Shape + +updateTeslaArc :: + World -> + TeslaArc -> + (World, Maybe TeslaArc) +updateTeslaArc w pt + | _taTimer pt == 2 = + ( makesparks $ foldl' (flip damthings) w thearc + , Just $ pt & taTimer -~ 1 + ) + | _taTimer pt < 0 = (w, Nothing) + | otherwise = (w, Just $ pt & taTimer -~ 1) + where + thearc = _taArcSteps pt + rcol = brightX 100 1.5 <$> takeOne [white, azure, blue, cyan] + rspeed = state (randomR (3, 6)) + makeaspark = randSpark ELECTRICAL rspeed rcol rdir lp + makesparks = makeaspark . makeaspark . makeaspark + rp x = randPeakedParam 2 (x - 0.7) x (x + 0.7) + (lp, rdir) = case last thearc of + ArcStep lp' ld' NothingID -> (lp', rp ld') + ArcStep lp' ld' (CrID crid) -> case w ^? cWorld . lWorld . creatures . ix crid of + Nothing -> (lp', rp ld') + Just cr -> (lp' -.- (_crRad cr + 1) *.* unitVectorAtAngle ld', rp $ ld' + pi) + ArcStep lp' ld' (WlID wlid) -> case w ^? cWorld . lWorld . walls . ix wlid of + Nothing -> (lp', rp ld') + Just wl -> + ( lp' -.- 2 *.* unitVectorAtAngle ld' + , randWallReflect ld' wl + ) + damthings (ArcStep p dir crwl) = damageCrWlID (thedamage p dir) crwl + thedamage p dir = Damage ELECTRICAL 50 (p -.- q) p (p +.+ q) NoDamageEffect + where + q = 5 *.* unitVectorAtAngle dir + +randWallReflect :: RandomGen g => Float -> Wall -> State g Float +randWallReflect a wl = do + let (x, y) = _wlLine wl + outa = reflectAngle a x y + a1 = nearestAngleRep outa $ argV (x - y) + a2 = if a1 < outa then a1 + pi else a1 - pi + randPeaked a1 outa a2 + +makeTeslaArc :: ItemParams -> Point2 -> Float -> World -> (World, ItemParams) +makeTeslaArc ip pos dir w = + ( w & randGen .~ g + & cWorld . lWorld . teslaArcs + .:~ TeslaArc + { _taPoints = map (^. asPos) newarc + , _taArcSteps = newarc + , _taTimer = 2 + , _taColor = brightX 100 1.5 col + } + , ip & currentArc .~ newarc + ) + where + (col, g) = takeOne [white, azure, blue, cyan] & runState $ _randGen w + newarc = updateArc ip w pos dir & evalState $ _randGen w + +createNewArc :: + ItemParams -> + World -> + Point2 -> + Float -> + State StdGen [ArcStep] +createNewArc arcparams w p dir = + take (_arcNumber arcparams) + <$> unfoldrMID (doArcStep (_newArcStep arcparams) arcparams w) (ArcStep p dir NothingID) + +updateArc :: + ItemParams -> + World -> + Point2 -> + Float -> + State StdGen [ArcStep] +updateArc ip w p dir = take (_arcNumber ip) <$> zipArcs ip w (ArcStep p dir NothingID) carc + where + carc = case _currentArc ip of + (_:xs) -> xs + [] -> [] -- tail $ _currentArc ip + +zipArcs :: + ItemParams -> + World -> + ArcStep -> + [ArcStep] -> + State StdGen [ArcStep] +zipArcs ip w x (y : ys) = + (x :) <$> do + defaultnext <- doArcStep (_newArcStep ip) ip w x + case defaultnext of + Nothing -> return [] + Just z@(ArcStep _ _ (CrID _)) -> return [z] + Just z@(ArcStep _ _ (WlID _)) -> return [z] + Just z -> do + p <- randInCirc 5 + let csize = _arcSize ip + center = _asPos x +.+ csize *.* unitVectorAtAngle (_asDir x) + newp = _asPos y +.+ p + --newdir = argV $ newp -.- _asPos x + newdir = _asDir x + if dist newp center < csize + then zipArcs ip w (y & asPos .~ newp & asDir .~ newdir) ys + else zipArcs ip w z ys +zipArcs ip w y _ = createNewArc ip w (_asPos y) (_asDir y) + +doArcStep :: NextArcStep -> ItemParams -> World -> ArcStep -> State StdGen (Maybe ArcStep) +doArcStep nas = case nas of + DefaultArcStep -> defaultArcStep + EndArc -> const $ const $ const $ return Nothing + +defaultArcStep :: + RandomGen g => + ItemParams -> + World -> + ArcStep -> + State g (Maybe ArcStep) +defaultArcStep _ _ (ArcStep _ _ (CrID _)) = return Nothing +defaultArcStep _ _ (ArcStep _ _ (WlID _)) = return Nothing +defaultArcStep itparams w (ArcStep p dir _) = do + let csize = _arcSize itparams + --rot <- takeOne [pi/4,negate pi/4] + rot <- takeOne [0] + let center = csize *.* rotateV rot (unitVectorAtAngle dir) +.+ p + newp <- (center +.+) <$> randInCirc csize + let mcr = + listToMaybe + . sortOn (dist center . _crPos) + . filter (\cr -> dist center (_crPos cr) < csize) + . IM.elems + $ w ^. cWorld . lWorld . creatures --_creatures (_cWorld w) + mwl = + listToMaybe + . sortOn (dist p . fst) + . mapMaybe (\q -> sequence $ collidePointWallsFilter (const True) p (center +.+ q) w) + -- collidePointWallsWall and wlsnearpoint + $ polyCirc 6 csize + f (q, wl) = ArcStep q dir (WlID $ _wlID wl) + g cr = ArcStep (_crPos cr +.+ csize *.* unitVectorAtAngle dir) dir (CrID $ _crID cr) + return . listToMaybe . sortOn (dist p . (^. asPos)) $ + ArcStep newp dir NothingID : catMaybes [fmap f mwl, fmap g mcr] diff --git a/src/Dodge/Tesla/Arc.hs b/src/Dodge/Tesla/Arc.hs deleted file mode 100644 index 1dc03d11e..000000000 --- a/src/Dodge/Tesla/Arc.hs +++ /dev/null @@ -1,169 +0,0 @@ -module Dodge.Tesla.Arc ( - makeTeslaArc, - updateTeslaArc, -) where - -import Data.Foldable -import Data.List (sortOn) -import Data.Maybe -import Dodge.Base.Collide -import Dodge.Damage -import Dodge.Data.ArcStep -import Dodge.Data.CrWlID -import Dodge.Data.World -import Dodge.Spark -import Geometry -import qualified IntMapHelp as IM -import LensHelp -import MonadHelp -import Picture -import RandomHelp -import Shape - -updateTeslaArc :: - World -> - TeslaArc -> - (World, Maybe TeslaArc) -updateTeslaArc w pt - | _taTimer pt == 2 = - ( makesparks $ foldl' (flip damthings) w thearc - , Just $ pt & taTimer -~ 1 - ) - | _taTimer pt < 1 = (w, Nothing) - | otherwise = (w, Just $ pt & taTimer -~ 1) - where - thearc = _taArcSteps pt - rcol = brightX 100 1.5 <$> takeOne [white, azure, blue, cyan] - rspeed = state (randomR (3, 6)) - makeaspark = randSpark ELECTRICAL rspeed rcol rdir lp - makesparks = makeaspark . makeaspark . makeaspark - rp x = randPeakedParam 2 (x - 0.7) x (x + 0.7) - (lp, rdir) = case last thearc of - ArcStep lp' ld' NothingID -> (lp', rp ld') - ArcStep lp' ld' (CrID crid) -> case w ^? cWorld . lWorld . creatures . ix crid of - Nothing -> (lp', rp ld') - Just cr -> (lp' -.- (_crRad cr + 1) *.* unitVectorAtAngle ld', rp $ ld' + pi) - ArcStep lp' ld' (WlID wlid) -> case w ^? cWorld . lWorld . walls . ix wlid of - Nothing -> (lp', rp ld') - Just wl -> - ( lp' -.- 2 *.* unitVectorAtAngle ld' - , randWallReflect ld' wl - ) - damthings (ArcStep p dir crwl) = damageCrWlID (thedamage p dir) crwl - thedamage p dir = Damage ELECTRICAL 50 (p -.- q) p (p +.+ q) NoDamageEffect - where - q = 5 *.* unitVectorAtAngle dir - -randWallReflect :: RandomGen g => Float -> Wall -> State g Float -randWallReflect a wl = do - let (x, y) = _wlLine wl - outa = reflectAngle a x y - a1 = nearestAngleRep outa $ argV (x - y) - a2 = if a1 < outa then a1 + pi else a1 - pi - randPeaked a1 outa a2 - -makeTeslaArc :: ItemParams -> Point2 -> Float -> World -> (World, ItemParams) -makeTeslaArc ip pos dir w = - ( w & randGen .~ g - & cWorld . lWorld . teslaArcs - .:~ TeslaArc - { _taPoints = map (^. asPos) newarc - , _taArcSteps = newarc - , _taTimer = 2 - , _taColor = brightX 100 1.5 col - } - , ip & currentArc ?~ newarc - ) - where - (col, g) = takeOne [white, azure, blue, cyan] & runState $ _randGen w - newarc = createArc ip w pos dir & evalState $ _randGen w - -createArc :: - ItemParams -> - World -> - Point2 -> - Float -> - State StdGen [ArcStep] -createArc arcparams@Arcing{_currentArc = Nothing} w p dir = createNewArc arcparams w p dir -createArc arcparams w p dir = updateArc arcparams w p dir - -createNewArc :: - ItemParams -> - World -> - Point2 -> - Float -> - State StdGen [ArcStep] -createNewArc arcparams w p dir = - take (_arcNumber arcparams) - <$> unfoldrMID (doArcStep (_newArcStep arcparams) arcparams w) (ArcStep p dir NothingID) - -updateArc :: - ItemParams -> - World -> - Point2 -> - Float -> - State StdGen [ArcStep] -updateArc ip w p dir = take (_arcNumber ip) <$> zipArcs ip w (ArcStep p dir NothingID) carc - where - carc = tail $ fromJust $ _currentArc ip - -zipArcs :: - ItemParams -> - World -> - ArcStep -> - [ArcStep] -> - State StdGen [ArcStep] -zipArcs ip w x (y : ys) = - (x :) <$> do - defaultnext <- doArcStep (_newArcStep ip) ip w x - case defaultnext of - Nothing -> return [] - Just z@(ArcStep _ _ (CrID _)) -> return [z] - Just z@(ArcStep _ _ (WlID _)) -> return [z] - Just z -> do - p <- randInCirc 5 - let csize = _arcSize ip - center = _asPos x +.+ csize *.* unitVectorAtAngle (_asDir x) - newp = _asPos y +.+ p - --newdir = argV $ newp -.- _asPos x - newdir = _asDir x - if dist newp center < csize - then zipArcs ip w (y & asPos .~ newp & asDir .~ newdir) ys - else zipArcs ip w z ys -zipArcs ip w y _ = createNewArc ip w (_asPos y) (_asDir y) - -doArcStep :: NextArcStep -> ItemParams -> World -> ArcStep -> State StdGen (Maybe ArcStep) -doArcStep nas = case nas of - DefaultArcStep -> defaultArcStep - EndArc -> const $ const $ const $ return Nothing - -defaultArcStep :: - RandomGen g => - ItemParams -> - World -> - ArcStep -> - State g (Maybe ArcStep) -defaultArcStep _ _ (ArcStep _ _ (CrID _)) = return Nothing -defaultArcStep _ _ (ArcStep _ _ (WlID _)) = return Nothing -defaultArcStep itparams w (ArcStep p dir _) = do - let csize = _arcSize itparams - --rot <- takeOne [pi/4,negate pi/4] - rot <- takeOne [0] - let center = csize *.* rotateV rot (unitVectorAtAngle dir) +.+ p - newp <- (center +.+) <$> randInCirc csize - let mcr = - listToMaybe - . sortOn (dist center . _crPos) - . filter (\cr -> dist center (_crPos cr) < csize) - . IM.elems - $ w ^. cWorld . lWorld . creatures --_creatures (_cWorld w) - mwl = - listToMaybe - . sortOn (dist p . fst) - . mapMaybe (\q -> sequence $ collidePointWallsFilter (const True) p (center +.+ q) w) - -- collidePointWallsWall and wlsnearpoint - $ polyCirc 6 csize - f (q, wl) = ArcStep q dir (WlID $ _wlID wl) - g cr = ArcStep (_crPos cr +.+ csize *.* unitVectorAtAngle dir) dir (CrID $ _crID cr) - return . listToMaybe . sortOn (dist p . (^. asPos)) $ - ArcStep newp dir NothingID : catMaybes [fmap f mwl, fmap g mcr] diff --git a/src/Dodge/Tesla/Arc/Draw.hs b/src/Dodge/Tesla/Arc/Draw.hs deleted file mode 100644 index 271845f45..000000000 --- a/src/Dodge/Tesla/Arc/Draw.hs +++ /dev/null @@ -1,15 +0,0 @@ -module Dodge.Tesla.Arc.Draw where - -import Dodge.Data.TeslaArc -import Geometry -import Picture - -drawTeslaArc :: TeslaArc -> Picture -drawTeslaArc pt = - setLayer BloomNoZWrite $ - fold - [ setDepth 20.5 $ color (brightX 2 1 $ _taColor pt) $ thickLine 3 ps - , setDepth 20 $ color (V4 0 0 0 0.5) $ thickLine 10 ps - ] - where - ps = _taPoints pt diff --git a/src/Dodge/Tesla/Ball.hs b/src/Dodge/Tesla/Ball.hs deleted file mode 100644 index 90cd1a295..000000000 --- a/src/Dodge/Tesla/Ball.hs +++ /dev/null @@ -1,7 +0,0 @@ -module Dodge.Tesla.Ball where - -import Dodge.Data.World -import Geometry - -makeTeslaBallAt :: Point2 -> World -> World -makeTeslaBallAt _ = id diff --git a/src/Dodge/Tesla/ItemParams.hs b/src/Dodge/Tesla/ItemParams.hs deleted file mode 100644 index 2e374cdad..000000000 --- a/src/Dodge/Tesla/ItemParams.hs +++ /dev/null @@ -1,14 +0,0 @@ -module Dodge.Tesla.ItemParams where - -import Dodge.Data.ArcStep -import Dodge.Data.Item.Params - -teslaParams :: ItemParams -teslaParams = - Arcing - { _currentArc = Nothing - , _arcSize = 20 - , _arcNumber = 10 - , _newArcStep = DefaultArcStep --defaultArcStep - , _previousArcEffect = NoPreviousArcEffect - } diff --git a/src/Dodge/Update.hs b/src/Dodge/Update.hs index 9ea8037fe..201da5b49 100644 --- a/src/Dodge/Update.hs +++ b/src/Dodge/Update.hs @@ -47,7 +47,7 @@ import Dodge.SmoothScroll import Dodge.SoundLogic import Dodge.Spark import Dodge.Terminal.Type -import Dodge.Tesla.Arc +import Dodge.Tesla import Dodge.TmTm import Dodge.TractorBeam.Update import Dodge.Update.Camera diff --git a/tags b/tags index db062b806..5829af5ab 100644 --- a/tags +++ b/tags @@ -573,6 +573,7 @@ Draw src/Dodge/Shockwave/Draw.hs 1;" m Draw src/Dodge/Spark/Draw.hs 1;" m Draw src/Dodge/Targeting/Draw.hs 1;" m Draw src/Dodge/Tesla/Arc/Draw.hs 1;" m +Draw src/Dodge/Tesla/Draw.hs 1;" m Draw src/Dodge/TractorBeam/Draw.hs 1;" m Draw src/Dodge/Wall/Draw.hs 1;" m DrawBlankProjectile src/Dodge/Data/Item/Use/Consumption/Ammo.hs 20;" C @@ -3700,6 +3701,7 @@ createGas src/Dodge/Gas.hs 8;" f createHeadLamp src/Dodge/Euse.hs 135;" f createItemYou src/Dodge/Inventory/Add.hs 95;" f createLightMap src/Render.hs 26;" f +createNewArc src/Dodge/Tesla.hs 81;" f createNewArc src/Dodge/Tesla/Arc.hs 90;" f createPathGrid src/Dodge/Room/Path.hs 21;" f createProjectile src/Dodge/HeldUse.hs 575;" f @@ -3816,6 +3818,7 @@ defaultAimMvType src/Dodge/Default/Creature.hs 116;" f defaultAimParams src/Dodge/Default/Item/Use/AimParams.hs 9;" f defaultAimingCrit src/Dodge/Default/Creature.hs 125;" f defaultApplyDamage src/Dodge/Creature/Damage.hs 20;" f +defaultArcStep src/Dodge/Tesla.hs 133;" f defaultArcStep src/Dodge/Tesla/Arc.hs 140;" f defaultArcStep src/Dodge/Tesla/Arc/Default.hs 15;" f defaultAudition src/Dodge/Default/Creature.hs 93;" f @@ -3936,6 +3939,7 @@ divideLineOddNumPoints src/Geometry.hs 278;" f doAfterPlacement src/Dodge/Layout.hs 86;" f doAfterPlacements src/Dodge/Layout.hs 83;" f doAnyEquipmentEffect src/Dodge/Creature/State.hs 180;" f +doArcStep src/Dodge/Tesla.hs 128;" f doArcStep src/Dodge/Tesla/Arc.hs 135;" f doBackspace src/Dodge/Update/Input/Text.hs 31;" f doBlBl src/Dodge/WorldEffect.hs 90;" f @@ -4131,6 +4135,7 @@ drawSwitchWire src/Dodge/LevelGen/Switch.hs 28;" f drawTargeting src/Dodge/Targeting/Draw.hs 13;" f drawTerminalDisplay src/Dodge/Render/HUD.hs 351;" f drawTeslaArc src/Dodge/Tesla/Arc/Draw.hs 7;" f +drawTeslaArc src/Dodge/Tesla/Draw.hs 9;" f drawText src/Picture/Base.hs 220;" f drawTitle src/Dodge/Render/MenuScreen.hs 58;" f drawTitleBackground src/Dodge/Render/List.hs 44;" f @@ -4643,7 +4648,7 @@ lasSensorTurretTest src/Dodge/Room/LasTurret.hs 104;" f lasTunnel src/Dodge/Room/LasTurret.hs 123;" f lasTunnelRunPast src/Dodge/Room/LasTurret.hs 164;" f lasTurret src/Dodge/Placement/Instance/Turret.hs 23;" f -laser src/Dodge/Item/Held/BatteryGuns.hs 38;" f +laser src/Dodge/Item/Held/BatteryGuns.hs 48;" f laserLinkTest src/Dodge/Item/Grammar.hs 119;" f lastMap src/Dodge/DoubleTree.hs 174;" f launcher src/Dodge/Item/Held/Launcher.hs 12;" f @@ -4802,6 +4807,7 @@ makeSwitch src/Dodge/LevelGen/Switch.hs 52;" f makeSwitchSPic src/Dodge/LevelGen/Switch.hs 40;" f makeTermLine src/Dodge/Terminal.hs 120;" f makeTermPara src/Dodge/Terminal.hs 123;" f +makeTeslaArc src/Dodge/Tesla.hs 65;" f makeTeslaArc src/Dodge/Tesla/Arc.hs 65;" f makeTeslaBallAt src/Dodge/Tesla/Ball.hs 6;" f makeTeslaExplosionAt src/Dodge/WorldEvent/Explosion.hs 40;" f @@ -5299,6 +5305,7 @@ randPeaked src/RandomHelp.hs 133;" f randPeakedParam src/RandomHelp.hs 125;" f randProb src/RandomHelp.hs 68;" f randSpark src/Dodge/Spark.hs 74;" f +randWallReflect src/Dodge/Tesla.hs 57;" f randWallReflect src/Dodge/Tesla/Arc.hs 57;" f randomChallenges src/Dodge/Room/Start.hs 62;" f randomCompass src/Dodge/Layout.hs 59;" f @@ -5836,6 +5843,7 @@ terminalShape src/Dodge/Machine/Draw.hs 32;" f terminalWheelEvent src/Dodge/Update/Scroll.hs 78;" f teslaGun src/Dodge/Item/Held/BatteryGuns.hs 21;" f teslaGunPic src/Dodge/Item/Draw/SPic.hs 386;" f +teslaParams src/Dodge/Item/Held/BatteryGuns.hs 37;" f teslaParams src/Dodge/Tesla/ItemParams.hs 6;" f testCrossWalls src/Dodge/Room/Path.hs 47;" f testEvent src/Dodge/Event/Test.hs 10;" f @@ -5912,7 +5920,7 @@ torso src/Dodge/Creature/Picture.hs 105;" f tractCr src/Dodge/TractorBeam/Update.hs 28;" f tractFlIt src/Dodge/TractorBeam/Update.hs 23;" f tractorBeamAt src/Dodge/HeldUse.hs 347;" f -tractorGun src/Dodge/Item/Held/BatteryGuns.hs 60;" f +tractorGun src/Dodge/Item/Held/BatteryGuns.hs 70;" f tractorGunPic src/Dodge/Item/Draw/SPic.hs 413;" f tractorPullPos src/Dodge/TractorBeam/Update.hs 33;" f tractorSPic src/Dodge/TractorBeam/Draw.hs 10;" f @@ -6014,6 +6022,7 @@ unusedSpotNearInLink src/Dodge/PlacementSpot.hs 191;" f upHammer src/Dodge/Default.hs 76;" f upProjectile src/Dodge/Projectile/Update.hs 26;" f updateAllNodes src/TreeHelp.hs 85;" f +updateArc src/Dodge/Tesla.hs 91;" f updateArc src/Dodge/Tesla/Arc.hs 100;" f updateAttachedItems src/Dodge/Creature/State.hs 256;" f updateBackspaceRegex src/Dodge/Update/Input/InGame.hs 455;" f @@ -6109,6 +6118,7 @@ updateSounds src/Sound.hs 66;" f updateSpark src/Dodge/Spark.hs 19;" f updateSparks src/Dodge/Update.hs 564;" f updateTempLightSource src/Dodge/LightSource/Update.hs 7;" f +updateTeslaArc src/Dodge/Tesla.hs 23;" f updateTeslaArc src/Dodge/Tesla/Arc.hs 23;" f updateTeslaArcs src/Dodge/Update.hs 546;" f updateTractorBeam src/Dodge/TractorBeam/Update.hs 9;" f @@ -6290,6 +6300,7 @@ zConnect src/Dodge/Render/Connectors.hs 17;" f zConnectCol src/Dodge/Render/Connectors.hs 28;" f zConnectColMidX src/Dodge/Render/Connectors.hs 31;" f zeroZ src/Geometry/Vector.hs 8;" f +zipArcs src/Dodge/Tesla.hs 103;" f zipArcs src/Dodge/Tesla/Arc.hs 110;" f zipCount src/Dodge/Tree/Shift.hs 129;" f zipCountDown src/Dodge/Room/Procedural.hs 118;" f