Add new bullet trajectories
This commit is contained in:
@@ -5,10 +5,11 @@ module Dodge.Item.Weapon.BatteryGuns
|
||||
, lasRayAt
|
||||
) where
|
||||
import Dodge.Data
|
||||
import Dodge.Item.Weapon.LaserPath
|
||||
import Dodge.Creature.HandPos
|
||||
import Dodge.Particle.TeslaArc
|
||||
import Dodge.SoundLogic.LoadSound
|
||||
import Dodge.WorldEvent
|
||||
--import Dodge.WorldEvent
|
||||
import Dodge.WorldEvent.Damage
|
||||
--import Dodge.Default
|
||||
--import Dodge.Item.Weapon.InventoryDisplay
|
||||
@@ -25,10 +26,10 @@ import Shape
|
||||
import ShapePicture
|
||||
import LensHelp
|
||||
|
||||
import Data.List
|
||||
import Data.Bifunctor
|
||||
--import Data.List
|
||||
--import Data.Bifunctor
|
||||
import System.Random
|
||||
import Data.Tuple
|
||||
--import Data.Tuple
|
||||
import qualified Data.IntMap.Strict as IM
|
||||
teslaGun :: Item
|
||||
teslaGun = defaultGun
|
||||
@@ -178,45 +179,13 @@ mvLaser phasev pos dir w pt
|
||||
)
|
||||
where
|
||||
xp = pos +.+ 800 *.* unitVectorAtAngle dir
|
||||
(thHit, ps) = f [] pos xp
|
||||
f :: [Wall] -> Point2 -> Point2 -> (Maybe (Point2,Either Creature Wall),[Point2])
|
||||
f seenWs x y = case find (notseen seenWs) $ thingsHitExceptCrLongLine Nothing x y w of
|
||||
--f seenWs x y = case find (notseen seenWs) $ thingsHitExceptCr Nothing x y w of
|
||||
Just (p,Right wl)
|
||||
| _wlOpacity wl == SeeThrough -> second (p:) $ f (wl:seenWs) p (refract x y wl p)
|
||||
| otherwise -> (Just (p,Right wl), [p])
|
||||
Just (p,obj) -> (Just (p,obj), [p])
|
||||
Nothing -> (Nothing, [y])
|
||||
refract x y wl p
|
||||
| isEntering = p +.+ rotateV angleRef (normalDist wlNormal)
|
||||
| otherwise = p +.+ rotateV angleRef' (normalDist wlNormal')
|
||||
where
|
||||
wlNormal = vNormal $ uncurry (-.-) $ swap (_wlLine wl)
|
||||
wlNormal' = vNormal $ uncurry (-.-) (_wlLine wl)
|
||||
normalDist wlnormal = magV (p -.- y) *.* normalizeV wlnormal
|
||||
angleInc = piRange $ argV wlNormal - argV (x -.- y)
|
||||
angleRef
|
||||
| reflectExternal = angleInc
|
||||
| otherwise = asin $ sin angleInc / phasev
|
||||
piRange a'
|
||||
| a' > pi = a' - 2 * pi
|
||||
| a' > negate pi = a'
|
||||
| otherwise = a' + 2 * pi
|
||||
isEntering = not $ isLeftOf (x -.- y) (uncurry (-.-) (_wlLine wl))
|
||||
angleInc' = piRange $ argV wlNormal' - argV (x -.- y)
|
||||
angleRef'
|
||||
| reflectInternal = angleInc'
|
||||
| otherwise = asin $ phasev * sin angleInc'
|
||||
reflectInternal = 1 < abs (phasev * sin angleInc')
|
||||
reflectExternal = 1 < abs (sin angleInc / phasev)
|
||||
|
||||
notseen ws (_,Right wl) = not $ any (\w' -> _wlID w' == _wlID wl) ws
|
||||
notseen _ _ = True
|
||||
(thHit, ps) = reflectLaserAlong phasev [] pos xp w
|
||||
pic = setLayer 1 $ pictures
|
||||
[ setDepth 19 . color (brightX 0 0.5 yellow) $ thickLine 20 (pos:ps)
|
||||
, setDepth 19.5 . color (brightX 10 1 yellow) $ thickLine 3 (pos:ps)
|
||||
]
|
||||
|
||||
|
||||
aTractorBeam :: Item -> Creature -> World -> World
|
||||
aTractorBeam _ cr w = w & props . at i ?~ tractorBeamAt i spos outpos dir
|
||||
where
|
||||
|
||||
Reference in New Issue
Block a user