diff --git a/src/Dodge/Tesla/Arc.hs b/src/Dodge/Tesla/Arc.hs index 60e5e8594..9e6d89eba 100644 --- a/src/Dodge/Tesla/Arc.hs +++ b/src/Dodge/Tesla/Arc.hs @@ -31,29 +31,42 @@ updateTeslaArc :: TeslaArc -> (World, Maybe TeslaArc) updateTeslaArc w pt - | _taTimer pt == 2 = (makesparks $ foldl' (flip damthings) w thearc, Just $ pt & taTimer -~ 1) + | _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] - rdir = state (randomR (-0.7, 0.7)) <&> (+ ld) +-- rdir = state (randomR (-0.7, 0.7)) <&> (+ ld) rspeed = state (randomR (3, 6)) makeaspark = randSpark ELECTRICAL rspeed rcol rdir lp makesparks = makeaspark . makeaspark . makeaspark - (lp, ld) = case last thearc of - ArcStep lp' ld' NothingID -> (lp', ld') + 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', ld') - Just cr -> (lp' -.- (_crRad cr + 1) *.* unitVectorAtAngle ld', ld' + pi) + 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', ld') - Just _ -> (lp' -.- 2 *.* unitVectorAtAngle ld', ld' + pi) + Nothing -> (lp', rp ld') + --Just _ -> (lp' -.- 2 *.* unitVectorAtAngle ld', ld' + pi) + Just wl -> (lp' -.- 2 *.* unitVectorAtAngle ld' +-- , uncurry (reflectAngle ld') (_wlLine wl)) + , 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 diff --git a/src/Geometry.hs b/src/Geometry.hs index 4711c0366..1b121945d 100644 --- a/src/Geometry.hs +++ b/src/Geometry.hs @@ -139,6 +139,20 @@ difference x y reflectIn :: Point2 -> Point2 -> Point2 reflectIn line vec = rotateV (2 * angleBetween line vec) vec +-- takes an angle of entry (measured from x axis) and two wall points and gives a +-- reflected angle (from x axis) +reflectAngle :: Float -> Point2 -> Point2 -> Float +reflectAngle a x y = 2 * argV (x - y) - a + +{- | Find the representation (by applying +-pi) of an angle + - that is nearest to another given angle -} +nearestAngleRep :: Float -> Float -> Float +nearestAngleRep a b + | b >= a && b - a <= pi = b + | b >= a = nearestAngleRep a (b - 2*pi) + | a - b <= pi = b + | otherwise = nearestAngleRep a (b + 2*pi) + {- | Find angle between two points. Not normalised, ranges from -2*pi to 2*pi. -} diff --git a/src/RandomHelp.hs b/src/RandomHelp.hs index 2bcea9b51..0aeb688f3 100644 --- a/src/RandomHelp.hs +++ b/src/RandomHelp.hs @@ -121,3 +121,14 @@ randsSpread (a, b) i randsOnCirc :: RandomGen g => Int -> State g [Float] randsOnCirc = randsSpread (0, 2 * pi) + +randPeakedParam :: RandomGen g => Int -> Float -> Float -> Float -> State g Float +randPeakedParam i a b c = do + x <- state $ randomR (-1, 1) + let y = x ^ i + return $ if y < 0 + then a + y * (a-b) + else b + y * (c-b) + +randPeaked :: RandomGen g => Float -> Float -> Float -> State g Float +randPeaked = randPeakedParam 3 diff --git a/tags b/tags index a9b45fafd..7dca9836c 100644 --- a/tags +++ b/tags @@ -3326,29 +3326,29 @@ amr src/Dodge/Item/Held/Rod.hs 44;" f analyser src/Dodge/Placement/Instance/Analyser.hs 12;" f analyserByDoor src/Dodge/Room/LasTurret.hs 74;" f andOrRegex src/Dodge/DisplayInventory.hs 81;" f -angleBetween src/Geometry.hs 145;" f +angleBetween src/Geometry.hs 159;" f angleVV src/Geometry/Vector.hs 57;" f angleVV3 src/Geometry/Vector3D.hs 122;" f annoToRoomTree src/Dodge/Annotation.hs 17;" f anyUnusedSpot src/Dodge/PlacementSpot.hs 66;" f anythingHitCirc src/Dodge/Base/Collide.hs 243;" f -applyCME src/Dodge/HeldUse.hs 115;" f +applyCME src/Dodge/HeldUse.hs 117;" f applyCreatureDamage src/Dodge/Creature/Damage.hs 14;" f applyDamageEffect src/Dodge/Creature/Damage.hs 31;" f applyEventIO src/Loop.hs 89;" f applyIndividualDamage src/Dodge/Creature/Damage.hs 49;" f applyIndividualDamage' src/Dodge/Creature/Damage.hs 52;" f -applyInvLock src/Dodge/HeldUse.hs 130;" f +applyInvLock src/Dodge/HeldUse.hs 132;" f applyMagnetsToBul src/Dodge/Bullet.hs 36;" f applyNoDamage src/Dodge/Creature/Damage.hs 11;" f applyPastDamages src/Dodge/Creature/State.hs 135;" f applyPiercingDamage src/Dodge/Creature/Damage.hs 57;" f applyPosition src/Sound.hs 110;" f -applyRecoil src/Dodge/HeldUse.hs 149;" f +applyRecoil src/Dodge/HeldUse.hs 151;" f applyResFactor src/Dodge/Data/Config.hs 108;" f applySetTerminalString src/Dodge/Debug/Terminal.hs 79;" f -applySidePush src/Dodge/HeldUse.hs 156;" f -applySoundCME src/Dodge/HeldUse.hs 140;" f +applySidePush src/Dodge/HeldUse.hs 158;" f +applySoundCME src/Dodge/HeldUse.hs 142;" f applyTerminalCommand src/Dodge/Debug/Terminal.hs 28;" f applyTerminalCommandArguments src/Dodge/Debug/Terminal.hs 40;" f applyTerminalString src/Dodge/Debug/Terminal.hs 22;" f @@ -3356,15 +3356,15 @@ applyToNode src/TreeHelp.hs 64;" f applyToRandomNode src/TreeHelp.hs 150;" f applyToSubforest src/TreeHelp.hs 77;" f applyToSubtree src/TreeHelp.hs 70;" f -applyTorqueCME src/Dodge/HeldUse.hs 167;" f +applyTorqueCME src/Dodge/HeldUse.hs 169;" f applyWorldConfig src/Dodge/Config/Update.hs 38;" f aquamarine src/Color.hs 23;" f arc src/Picture/Base.hs 287;" f arcFull src/Picture/Arc.hs 11;" f arcPart src/Picture/Arc.hs 24;" f arcSolid src/Picture/Base.hs 276;" f -arcStepwise src/Geometry.hs 329;" f -arcStepwisePositive src/Geometry.hs 343;" f +arcStepwise src/Geometry.hs 343;" f +arcStepwisePositive src/Geometry.hs 357;" f arcTest src/Picture/Test.hs 9;" f arcTest' src/Picture/Test.hs 21;" f argV src/Geometry/Vector.hs 80;" f @@ -3438,7 +3438,7 @@ basicDrawBeam src/Dodge/Beam/Draw.hs 11;" f basicItemDisplay src/Dodge/Item/Display.hs 34;" f basicMachineApplyDamage src/Dodge/Machine/Damage.hs 6;" f basicMachineUpdate src/Dodge/Machine.hs 13;" f -basicMuzFlare src/Dodge/HeldUse.hs 267;" f +basicMuzFlare src/Dodge/HeldUse.hs 269;" f basicTerminal src/Dodge/Terminal.hs 35;" f battery src/Dodge/Item/Ammo.hs 91;" f batteryPack src/Dodge/Item/Equipment.hs 55;" f @@ -3524,7 +3524,7 @@ centroid src/Geometry/Polygon.hs 130;" f centroidNum src/Geometry/Polygon.hs 133;" f chainCreatureUpdates src/Dodge/Creature/ChainUpdates.hs 6;" f chainLinkOrientation src/Dodge/Creature/State.hs 266;" f -chainPairs src/Geometry.hs 363;" f +chainPairs src/Geometry.hs 377;" f changeSwapOther src/Dodge/Inventory.hs 149;" f changeSwapSel src/Dodge/Inventory.hs 141;" f changeSwapWith src/Dodge/Inventory.hs 184;" f @@ -3693,7 +3693,7 @@ crZoneSize src/Dodge/Zoning/Creature.hs 39;" f craftInfo src/Dodge/Item/Info.hs 123;" f craftItemSPic src/Dodge/Item/Draw/SPic.hs 44;" f crankSlowS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 434;" f -createArc src/Dodge/Tesla/Arc.hs 67;" f +createArc src/Dodge/Tesla/Arc.hs 78;" f createBarrelSpark src/Dodge/Spark.hs 44;" f createFlIt src/Dodge/Placement/PlaceSpot.hs 180;" f createForceField src/Dodge/ForceField.hs 7;" f @@ -3701,9 +3701,9 @@ 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/Arc.hs 76;" f +createNewArc src/Dodge/Tesla/Arc.hs 87;" f createPathGrid src/Dodge/Room/Path.hs 21;" f -createProjectile src/Dodge/HeldUse.hs 573;" f +createProjectile src/Dodge/HeldUse.hs 575;" f createShell src/Dodge/Projectile/Create.hs 19;" f createShieldWall src/Dodge/Euse.hs 110;" f createUnusedLinkPos src/Dodge/Tree/Shift.hs 117;" f @@ -3903,13 +3903,13 @@ detector src/Dodge/Item/Held/Utility.hs 41;" f detectorColor src/Dodge/Item/Draw/SPic.hs 429;" f detectorEffect src/Dodge/Item/Weapon/Radar.hs 20;" f detectorInfo src/Dodge/Item/Info.hs 178;" f -determineProjectileTracking src/Dodge/HeldUse.hs 562;" f +determineProjectileTracking src/Dodge/HeldUse.hs 564;" f diagonalLinesRect src/Dodge/Room/Foreground.hs 52;" f did src/Dodge/Item/InvSize.hs 53;" f -diffAngles src/Geometry.hs 196;" f +diffAngles src/Geometry.hs 210;" f difference src/Geometry.hs 130;" f -digitalLine src/Geometry.hs 288;" f -digitalRect src/Geometry.hs 305;" f +digitalLine src/Geometry.hs 302;" f +digitalRect src/Geometry.hs 319;" f dim src/Color.hs 112;" f dirtColor src/Dodge/Block/Debris.hs 160;" f dirtDebris src/Dodge/Block/Debris.hs 154;" f @@ -3928,11 +3928,11 @@ displayTerminalLineString src/Dodge/Update.hs 443;" f dist src/Geometry/Vector.hs 179;" f dist3 src/Geometry/Vector3D.hs 101;" f divTo src/Geometry/Zone.hs 6;" f -divideCircle src/Geometry.hs 324;" f +divideCircle src/Geometry.hs 338;" f divideDoorPane src/Dodge/Placement/Instance/Door.hs 59;" f -divideLine src/Geometry.hs 251;" f -divideLineExact src/Geometry.hs 279;" f -divideLineOddNumPoints src/Geometry.hs 264;" f +divideLine src/Geometry.hs 265;" f +divideLineExact src/Geometry.hs 293;" f +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 @@ -3959,7 +3959,7 @@ doDrag src/Dodge/Update/Input/InGame.hs 98;" f doDrawing src/Dodge/Render.hs 35;" f doDrawing' src/Dodge/Render.hs 46;" f doFloatFloat src/Dodge/FloatFunction.hs 5;" f -doGenFloat src/Dodge/HeldUse.hs 517;" f +doGenFloat src/Dodge/HeldUse.hs 519;" f doHeldUseEffect src/Dodge/HeldUse.hs 94;" f doInPlacements src/Dodge/Layout.hs 92;" f doIndividualPlacements src/Dodge/Layout.hs 117;" f @@ -4010,7 +4010,7 @@ doWdCrBl src/Dodge/CreatureEffect.hs 37;" f doWdCrCr src/Dodge/CreatureEffect.hs 12;" f doWdP2f src/Dodge/WdP2f.hs 12;" f doWdWd src/Dodge/WorldEffect.hs 25;" f -doWeaponRepetitions src/Dodge/HeldUse.hs 104;" f +doWeaponRepetitions src/Dodge/HeldUse.hs 106;" f doWorldEvents src/Dodge/Update.hs 425;" f doWorldPos src/Dodge/WorldPos.hs 7;" f door src/Dodge/Room/Door.hs 13;" f @@ -4021,10 +4021,10 @@ dotV src/Geometry/Vector.hs 75;" f dotV3 src/Geometry/Vector3D.hs 119;" f doubleCorridorBarrels src/Dodge/Room/Room.hs 265;" f doubleLampCover src/Dodge/Placement/Instance/LightSource/Cover.hs 28;" f -doublePair src/Geometry.hs 149;" f -doublePairSet src/Geometry.hs 153;" f +doublePair src/Geometry.hs 163;" f +doublePairSet src/Geometry.hs 167;" f doubleTreeToIndentList src/Dodge/DoubleTree.hs 72;" f -doubleV2 src/Geometry.hs 156;" f +doubleV2 src/Geometry.hs 170;" f drawAllShadows src/Dodge/Shadows.hs 5;" f drawAugmentedHUD src/Dodge/Creature/State.hs 293;" f drawBaseMachine src/Dodge/Machine/Draw.hs 57;" f @@ -4247,7 +4247,7 @@ flameThrower src/Dodge/Item/Held/SprayGuns.hs 72;" f flameTorrent src/Dodge/Item/Held/SprayGuns.hs 40;" f flameWall src/Dodge/Item/Held/SprayGuns.hs 56;" f flamerPic src/Dodge/Item/Draw/SPic.hs 366;" f -flareCircleAt src/Dodge/HeldUse.hs 248;" f +flareCircleAt src/Dodge/HeldUse.hs 250;" f flatItemCombinations src/Dodge/Combine/Combinations.hs 50;" f flatLookupItems src/Dodge/Combine.hs 38;" f flatShield src/Dodge/Item/Held/Utility.hs 20;" f @@ -4314,7 +4314,7 @@ gameRoomViewpoints src/Dodge/Viewpoints.hs 35;" f gameRoomsFromRooms src/Dodge/Layout.hs 158;" f gameplayMenu src/Dodge/Menu.hs 131;" f gameplayMenuOptions src/Dodge/Menu.hs 134;" f -gasCreate src/Dodge/HeldUse.hs 514;" f +gasCreate src/Dodge/HeldUse.hs 516;" f generateGenParams src/Dodge/LevelGen/LevelStructure.hs 22;" f generateGraphs src/Dodge/LevelGen.hs 39;" f generateLayout src/Dodge/Layout/Generate.hs 10;" f @@ -4329,8 +4329,8 @@ getAmmoLinks src/Dodge/Item/Grammar.hs 81;" f getArguments src/Dodge/Update/Scroll.hs 152;" f getArguments' src/Dodge/Update/Scroll.hs 140;" f getAvailableListLines src/Dodge/SelectionList.hs 10;" f -getBulletTrajectory src/Dodge/HeldUse.hs 425;" f -getBulletType src/Dodge/HeldUse.hs 399;" f +getBulletTrajectory src/Dodge/HeldUse.hs 427;" f +getBulletType src/Dodge/HeldUse.hs 401;" f getCommands src/Dodge/Terminal.hs 117;" f getCommandsHelp src/Dodge/Terminal.hs 75;" f getCrDexterity src/Dodge/Creature/Statistics.hs 11;" f @@ -4339,9 +4339,9 @@ getCrMoveSpeed src/Dodge/Creature/Statistics.hs 14;" f getDamageCoding src/Dodge/Terminal.hs 177;" f getDistortions src/Dodge/Render.hs 383;" f getEquipmentAllocation src/Dodge/Inventory/RBList.hs 45;" f -getLaserColor src/Dodge/HeldUse.hs 264;" f -getLaserDamage src/Dodge/HeldUse.hs 261;" f -getLaserPhaseV src/Dodge/HeldUse.hs 258;" f +getLaserColor src/Dodge/HeldUse.hs 266;" f +getLaserDamage src/Dodge/HeldUse.hs 263;" f +getLaserPhaseV src/Dodge/HeldUse.hs 260;" f getLinksOfType src/Dodge/RoomLink.hs 39;" f getMaxLinesTM src/Dodge/Terminal/Type.hs 11;" f getMenuMouseContext src/Dodge/Update.hs 372;" f @@ -4441,7 +4441,7 @@ heldItemSPic src/Dodge/Item/Draw/SPic.hs 208;" f heldPositionInfo src/Dodge/Item/Info.hs 194;" f helpCommand src/Dodge/Terminal.hs 66;" f helpPoly3D src/Polyhedra.hs 125;" f -heron src/Geometry.hs 221;" f +heron src/Geometry.hs 235;" f hiToFloat src/Dodge/Room/Modify/Girder.hs 171;" f highBar src/Dodge/Room/Foreground.hs 89;" f highDiagonalMesh src/Dodge/Room/Foreground.hs 35;" f @@ -4521,7 +4521,7 @@ intersectSegSegFullTest src/Geometry/Intersect.hs 103;" f intersectSegSegPreTest src/Geometry/Intersect.hs 136;" f intersectSegSegTest src/Geometry/Intersect.hs 122;" f intersectSegsSeg src/Geometry/Intersect.hs 232;" f -intervalList src/Geometry.hs 315;" f +intervalList src/Geometry.hs 329;" f interweave src/Justify.hs 17;" f intsToPos src/Dodge/Room/Modify/Girder.hs 160;" f invAdj src/Dodge/Item/Grammar.hs 206;" f @@ -4549,7 +4549,7 @@ invertIntMap src/Multiset.hs 67;" f invertInventoryToMap src/Dodge/Combine.hs 56;" f invisibleChaseCrit src/Dodge/Creature/ChaseCrit.hs 23;" f invisibleWall src/Dodge/Placement/Instance/Wall.hs 16;" f -isAmmoIntLink src/Dodge/HeldUse.hs 275;" f +isAmmoIntLink src/Dodge/HeldUse.hs 277;" f isAnimate src/Dodge/Creature/Test.hs 136;" f isCognizant src/Dodge/Creature/Perception.hs 105;" f isConnected src/Dodge/Inventory/Swap.hs 95;" f @@ -4559,10 +4559,10 @@ isGroupSelectableSection src/Dodge/Update/Input/InGame.hs 169;" f isInLnk src/Dodge/PlacementSpot.hs 160;" f isJust' src/MaybeHelp.hs 29;" f isLHS src/Geometry/LHS.hs 8;" f -isLeftOf src/Geometry.hs 189;" f -isLeftOfA src/Geometry.hs 181;" f +isLeftOf src/Geometry.hs 203;" f +isLeftOfA src/Geometry.hs 195;" f isNothing' src/MaybeHelp.hs 33;" f -isOnSeg src/Geometry.hs 240;" f +isOnSeg src/Geometry.hs 254;" f isOutLnk src/Dodge/PlacementSpot.hs 164;" f isOverTerminalScreen src/Dodge/Update.hs 393;" f isPutID src/Dodge/Placement/Instance/Wall.hs 129;" f @@ -4582,7 +4582,7 @@ itemBaseName src/Dodge/Item/Display.hs 45;" f itemBlips src/Dodge/RadarSweep.hs 75;" f itemCombinations src/Dodge/Combine/Combinations.hs 55;" f itemCombinationsEdges src/Dodge/Combine/Graph.hs 60;" f -itemDetectorEffect src/Dodge/HeldUse.hs 305;" f +itemDetectorEffect src/Dodge/HeldUse.hs 307;" f itemDisplay src/Dodge/Item/Display.hs 16;" f itemDisplayPad src/Dodge/Item/Display.hs 29;" f itemEquipPict src/Dodge/Item/Draw.hs 16;" f @@ -4637,7 +4637,7 @@ lampCrSPic src/Dodge/Render/ShapePicture.hs 58;" f lasCenSensEdge src/Dodge/Room/LasTurret.hs 111;" f lasDronesPic src/Dodge/Item/Weapon/Drone.hs 22;" f lasGunPic src/Dodge/Item/Draw/SPic.hs 389;" f -lasRayAt src/Dodge/HeldUse.hs 376;" f +lasRayAt src/Dodge/HeldUse.hs 378;" f lasSensorTurretTest src/Dodge/Room/LasTurret.hs 104;" f lasTunnel src/Dodge/Room/LasTurret.hs 123;" f lasTunnelRunPast src/Dodge/Room/LasTurret.hs 164;" f @@ -4699,7 +4699,7 @@ lnkMidPosInvSelsCol src/Dodge/Render/HUD.hs 380;" f lnkPosDir src/Dodge/RoomLink.hs 97;" f loadDodgeConfig src/Dodge/Config/Load.hs 9;" f loadMusic src/Dodge/SoundLogic/LoadSound.hs 21;" f -loadMuzzle src/Dodge/HeldUse.hs 184;" f +loadMuzzle src/Dodge/HeldUse.hs 186;" f loadSaveSlot src/Dodge/Save.hs 74;" f loadSeed src/Dodge/LoadSeed.hs 7;" f loadSound src/Dodge/SoundLogic/LoadSound.hs 11;" f @@ -4754,7 +4754,7 @@ makeAttach src/Dodge/Item/Attach.hs 10;" f makeBlip src/Dodge/RadarSweep.hs 51;" f makeBlockDebris src/Dodge/Block/Debris.hs 28;" f makeBoolOption src/Dodge/Menu/OptionType.hs 8;" f -makeBullet src/Dodge/HeldUse.hs 458;" f +makeBullet src/Dodge/HeldUse.hs 460;" f makeButton src/Dodge/LevelGen/Switch.hs 16;" f makeByteStringShaderUsingVAO src/Shader/Compile.hs 128;" f makeCloudAt src/Dodge/WorldEvent/Cloud.hs 18;" f @@ -4780,7 +4780,7 @@ makeFragBullets src/Dodge/Bullet.hs 107;" f makeGasCloud src/Dodge/WorldEvent/SpawnParticle.hs 80;" f makeGrid src/Grid.hs 46;" f makeIntInterval src/Dodge/Zoning/Base.hs 33;" f -makeMuzzleFlare src/Dodge/HeldUse.hs 206;" f +makeMuzzleFlare src/Dodge/HeldUse.hs 208;" f makeParagraph src/Justify.hs 6;" f makePathBetween src/Dodge/Path.hs 35;" f makePathBetweenPs src/Dodge/Path.hs 54;" f @@ -4801,7 +4801,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/Arc.hs 57;" f +makeTeslaArc src/Dodge/Tesla/Arc.hs 68;" f makeTeslaBallAt src/Dodge/Tesla/Ball.hs 6;" f makeTeslaExplosionAt src/Dodge/WorldEvent/Explosion.hs 40;" f makeThickSmokeAt src/Dodge/WorldEvent/Cloud.hs 54;" f @@ -4835,10 +4835,10 @@ mcProximitySensorUpdate src/Dodge/Machine/Update.hs 124;" f mcSPic src/Dodge/Render/ShapePicture.hs 132;" f mcSensorTriggerUpdate src/Dodge/Machine/Update.hs 87;" f mcSensorUpdate src/Dodge/Machine/Update.hs 119;" f -mcShootLaser src/Dodge/HeldUse.hs 541;" f +mcShootLaser src/Dodge/HeldUse.hs 543;" f mcTriggerVal src/Dodge/Machine/Update.hs 93;" f mcTypeUpdate src/Dodge/Machine/Update.hs 27;" f -mcUseHeld src/Dodge/HeldUse.hs 484;" f +mcUseHeld src/Dodge/HeldUse.hs 486;" f mcUseItem src/Dodge/Machine/Update.hs 79;" f medkit src/Dodge/Item/Consumable.hs 8;" f megaBattery src/Dodge/Item/Ammo.hs 79;" f @@ -4889,7 +4889,7 @@ mirrorXAxis src/Geometry/Polygon.hs 49;" f mirrorxz src/Picture/Base.hs 335;" f mirroryz src/Picture/Base.hs 340;" f missileLaunchS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 500;" f -mixAngles src/Geometry.hs 205;" f +mixAngles src/Geometry.hs 219;" f mixColors src/Color.hs 86;" f mixColorsFrac src/Color.hs 82;" f mixColorsLinear src/Color.hs 95;" f @@ -4932,7 +4932,7 @@ multiArrow src/Picture/Composite.hs 11;" f multiLookupTrie src/SimpleTrie.hs 34;" f multiLookupTrieI src/SimpleTrie.hs 43;" f muout src/Dodge/RoomLink.hs 129;" f -muzFlareAt src/Dodge/HeldUse.hs 234;" f +muzFlareAt src/Dodge/HeldUse.hs 236;" f mvButton src/Dodge/Placement/PlaceSpot.hs 176;" f mvCr src/Dodge/Placement/PlaceSpot.hs 186;" f mvFS src/Dodge/Placement/PlaceSpot.hs 189;" f @@ -4949,13 +4949,14 @@ mvPs src/Dodge/Wall/Move.hs 58;" f myIntersectLineLine src/Geometry/Intersect.hs 177;" f myIntersectSegSeg src/Geometry/Intersect.hs 155;" f myParams src/Dodge/Combine/Graph.hs 102;" f -nRays src/Geometry.hs 170;" f -nRaysRad src/Geometry.hs 174;" f +nRays src/Geometry.hs 184;" f +nRaysRad src/Geometry.hs 188;" f nearCollinear src/Dodge/LevelGen/StaticWalls/Deprecated.hs 19;" f nearParallel src/Dodge/LevelGen/StaticWalls/Deprecated.hs 14;" f nearPoint src/Dodge/Zoning/Common.hs 8;" f nearRect src/Dodge/Zoning/Common.hs 16;" f nearSeg src/Dodge/Zoning/Common.hs 12;" f +nearestAngleRep src/Geometry.hs 149;" f newExtraAwareness src/Dodge/Creature/Perception.hs 137;" f newHotkey src/Dodge/Hotkey.hs 17;" f newKey src/IntMapHelp.hs 60;" f @@ -5124,11 +5125,11 @@ pnsNearPoint src/Dodge/Zoning/Pathing.hs 12;" f pnsNearRect src/Dodge/Zoning/Pathing.hs 18;" f pnsNearSeg src/Dodge/Zoning/Pathing.hs 15;" f pointIfNotClose src/Dodge/LevelGen/StaticWalls/Deprecated.hs 68;" f -pointInCircle src/Geometry.hs 212;" f +pointInCircle src/Geometry.hs 226;" f pointInOrOnPolygon src/Geometry/Polygon.hs 59;" f pointInPolyPoints src/Geometry/ConvexPoly.hs 70;" f pointInPolygon src/Geometry/Polygon.hs 66;" f -pointIsInCone src/Geometry.hs 378;" f +pointIsInCone src/Geometry.hs 392;" f pointIsOnScreen src/Dodge/Base/Window.hs 59;" f pointTowardsImpulse src/Dodge/Path.hs 63;" f pointerToItem src/Dodge/Item/Location.hs 36;" f @@ -5178,7 +5179,7 @@ polyToEdges src/Polyhedra.hs 133;" f polyToGeoRender src/Polyhedra.hs 142;" f polyToPics src/Polyhedra.hs 122;" f polyToTris src/Geometry/Triangulate.hs 7;" f -polyToTris' src/Geometry.hs 160;" f +polyToTris' src/Geometry.hs 174;" f polyToTris'' src/Geometry/Triangulate.hs 15;" f polygon src/Picture/Base.hs 72;" f polygonCol src/Picture/Base.hs 78;" f @@ -5205,7 +5206,7 @@ ppLevelReset src/Dodge/PressPlate.hs 13;" f preCritStart src/Dodge/Room/Start.hs 82;" f preloadRender src/Preload/Render.hs 30;" f premapMaybe src/FoldlHelp.hs 24;" f -prependTwo src/Geometry.hs 165;" f +prependTwo src/Geometry.hs 179;" f pressedMBEffectsTopInventory src/Dodge/Creature/YourControl.hs 174;" f prettyDT src/Dodge/DoubleTree.hs 179;" f prettyLDT src/Dodge/DoubleTree.hs 183;" f @@ -5293,8 +5294,11 @@ randInHemisphere src/RandomHelp.hs 99;" f randInRect src/RandomHelp.hs 105;" f randOnHemisphere src/RandomHelp.hs 92;" f randOnUnitSphere src/RandomHelp.hs 85;" f +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/Arc.hs 60;" f randomChallenges src/Dodge/Room/Start.hs 62;" f randomCompass src/Dodge/Layout.hs 59;" f randomFourCornerRoom src/Dodge/Room/Procedural.hs 266;" f @@ -5323,8 +5327,9 @@ reduceSpinBy src/Dodge/Projectile/Update.hs 139;" f reflDirWall src/Dodge/Base/Wall.hs 16;" f reflVelWall src/Dodge/Base/Wall.hs 24;" f reflVelWallDamp src/Dodge/Base/Wall.hs 20;" f +reflectAngle src/Geometry.hs 144;" f reflectIn src/Geometry.hs 139;" f -reflectInParam src/Geometry.hs 233;" f +reflectInParam src/Geometry.hs 247;" f reflectLaserAlong src/Dodge/Item/Weapon/LaserPath.hs 13;" f refract src/Dodge/Item/Weapon/LaserPath.hs 40;" f refreshOptionsSelectionList src/Dodge/Menu/Option.hs 39;" f @@ -5336,7 +5341,7 @@ reloadS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 440;" f rememberSounds src/Dodge/Creature/Perception.hs 177;" f remoteScreen src/Dodge/Item/Scope.hs 50;" f remoteShellShape src/Dodge/Projectile/Draw.hs 42;" f -removeAmmoFromMag src/Dodge/HeldUse.hs 386;" f +removeAmmoFromMag src/Dodge/HeldUse.hs 388;" f removeDot src/ShortShow.hs 30;" f removeHotkey src/Dodge/Hotkey.hs 40;" f removeInverseWalls src/Dodge/LevelGen/StaticWalls.hs 25;" f @@ -5614,14 +5619,14 @@ shiftRoomShiftToLink src/Dodge/Room/Link.hs 70;" f shiftedGrid src/Grid.hs 25;" f shineTargetLaser src/Dodge/Creature/State.hs 298;" f shineTorch src/Dodge/Creature/State.hs 340;" f -shootBullet src/Dodge/HeldUse.hs 445;" f +shootBullet src/Dodge/HeldUse.hs 447;" f shootFirstMiss src/Dodge/Creature/Volition.hs 33;" f -shootLaser src/Dodge/HeldUse.hs 356;" f +shootLaser src/Dodge/HeldUse.hs 358;" f shootOutPassage src/Dodge/Room/RezBox.hs 74;" f shootShatter src/Dodge/Item/Weapon/Shatter.hs 11;" f -shootTeslaArc src/Dodge/HeldUse.hs 550;" f +shootTeslaArc src/Dodge/HeldUse.hs 552;" f shootTillEmpty src/Dodge/Creature/Volition.hs 18;" f -shootTractorBeam src/Dodge/HeldUse.hs 335;" f +shootTractorBeam src/Dodge/HeldUse.hs 337;" f shootersRoom src/Dodge/Room/Room.hs 315;" f shootersRoom' src/Dodge/Room/Room.hs 280;" f shootersRoom1 src/Dodge/Room/Room.hs 305;" f @@ -5905,7 +5910,7 @@ torqueCr src/Dodge/WorldEffect.hs 63;" f 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 345;" f +tractorBeamAt src/Dodge/HeldUse.hs 347;" f tractorGun src/Dodge/Item/Held/BatteryGuns.hs 60;" f tractorGunPic src/Dodge/Item/Draw/SPic.hs 413;" f tractorPullPos src/Dodge/TractorBeam/Update.hs 33;" f @@ -6008,7 +6013,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/Arc.hs 86;" f +updateArc src/Dodge/Tesla/Arc.hs 97;" f updateAttachedItems src/Dodge/Creature/State.hs 256;" f updateBackspaceRegex src/Dodge/Update/Input/InGame.hs 455;" f updateBarrel src/Dodge/Barreloid.hs 45;" f @@ -6144,23 +6149,23 @@ useBulletPayload src/Dodge/Bullet.hs 96;" f useC src/Dodge/Cuse.hs 8;" f useC' src/Dodge/Cuse.hs 13;" f useE src/Dodge/Euse.hs 34;" f -useGasParams src/Dodge/HeldUse.hs 489;" f +useGasParams src/Dodge/HeldUse.hs 491;" f useHotkey src/Dodge/Creature/YourControl.hs 54;" f useLnkRoomPos src/Dodge/PlacementSpot.hs 244;" f -useLoadedAmmo src/Dodge/HeldUse.hs 279;" f +useLoadedAmmo src/Dodge/HeldUse.hs 281;" f useMagShield src/Dodge/Euse.hs 45;" f useNormalCamera src/Dodge/Camera.hs 6;" f usePayload src/Dodge/Payload.hs 7;" f -useRewindGun src/Dodge/HeldUse.hs 634;" f +useRewindGun src/Dodge/HeldUse.hs 636;" f useRewindGun src/Dodge/Luse.hs 40;" f useRoomPosCond src/Dodge/PlacementSpot.hs 178;" f useRoomPosRoomCond src/Dodge/PlacementSpot.hs 181;" f useSelectedItem src/Dodge/Creature/Impulse/UseItem.hs 20;" f -useStopWatch src/Dodge/HeldUse.hs 615;" f +useStopWatch src/Dodge/HeldUse.hs 617;" f useStopWatch src/Dodge/Luse.hs 21;" f useTimeCheck src/Dodge/HeldUse.hs 58;" f useTimeCheck src/Dodge/Item/Weapon/TriggerType.hs 127;" f -useTimeScrollGun src/Dodge/HeldUse.hs 623;" f +useTimeScrollGun src/Dodge/HeldUse.hs 625;" f useTimeScrollGun src/Dodge/Luse.hs 29;" f useUnusedLnk src/Dodge/PlacementSpot.hs 169;" f useUpdate src/Dodge/Creature/State.hs 423;" f @@ -6196,7 +6201,7 @@ vocalizationTest src/Dodge/Creature/Vocalization.hs 8;" f volleyGun src/Dodge/Item/Held/Cane.hs 30;" f volleyGunShape src/Dodge/Item/Draw/SPic.hs 327;" f waistSP src/Dodge/Creature/HandPos.hs 173;" f -walkNozzle src/Dodge/HeldUse.hs 313;" f +walkNozzle src/Dodge/HeldUse.hs 315;" f walkableNodeNear src/Dodge/Path.hs 48;" f wallBlips src/Dodge/RadarSweep.hs 80;" f wallBuffer src/Dodge/WallCreatureCollisions.hs 50;" f @@ -6284,7 +6289,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/Arc.hs 96;" f +zipArcs src/Dodge/Tesla/Arc.hs 107;" f zipCount src/Dodge/Tree/Shift.hs 129;" f zipCountDown src/Dodge/Room/Procedural.hs 118;" f zipWithDefaults src/Dodge/Item/Display.hs 22;" f