Add missing file
This commit is contained in:
@@ -0,0 +1,153 @@
|
|||||||
|
module Dodge.Item.Weapon.SonicGuns where
|
||||||
|
import Dodge.Data
|
||||||
|
import Dodge.Creature.HandPos
|
||||||
|
--import Dodge.Particle.TeslaArc
|
||||||
|
--import Dodge.SoundLogic.LoadSound
|
||||||
|
--import Dodge.WorldEvent
|
||||||
|
import Dodge.WorldEvent.ThingsHit
|
||||||
|
--import Dodge.Default
|
||||||
|
--import Dodge.Item.Weapon.InventoryDisplay
|
||||||
|
import Dodge.Item.Weapon.TriggerType
|
||||||
|
--import Dodge.Item.Weapon.AmmoParams
|
||||||
|
import Dodge.Default.Weapon
|
||||||
|
--import Dodge.Item.Attachment
|
||||||
|
--import Dodge.WorldEvent.HelperParticle
|
||||||
|
--import Dodge.Base
|
||||||
|
--import Dodge.Zone
|
||||||
|
import Geometry
|
||||||
|
import Picture
|
||||||
|
import Shape
|
||||||
|
import ShapePicture
|
||||||
|
--import Dodge.Picture
|
||||||
|
import LensHelp
|
||||||
|
|
||||||
|
--import Data.Maybe
|
||||||
|
--import Data.List
|
||||||
|
--import Data.Bifunctor
|
||||||
|
--import System.Random
|
||||||
|
--import Data.Tuple
|
||||||
|
--import qualified Data.IntMap.Strict as IM
|
||||||
|
|
||||||
|
sonicGun :: Item
|
||||||
|
sonicGun = defaultAutoGun
|
||||||
|
{ _itName = "SONICGUN"
|
||||||
|
, _itType = SONICGUN
|
||||||
|
, _itConsumption = defaultAmmo
|
||||||
|
{ _ammoMax = 10
|
||||||
|
, _ammoLoaded = 10
|
||||||
|
, _reloadTime = 80
|
||||||
|
}
|
||||||
|
, _itUse = ruseRate 8 aSonicWave (HasHammer HammerUp)
|
||||||
|
[ ammoHammerCheck
|
||||||
|
, useTimeCheck
|
||||||
|
, useAmmoAmount 1
|
||||||
|
]
|
||||||
|
& useAim . aimSpeed .~ 0.4
|
||||||
|
& useAim . aimRange .~ 1
|
||||||
|
& useAim . aimStance .~ TwoHandTwist
|
||||||
|
, _itParams = NoParams
|
||||||
|
, _itTweaks = NoTweaks
|
||||||
|
, _itDimension = ItemDimension
|
||||||
|
{ _dimRad = 10
|
||||||
|
, _dimCenter = V3 15 0 0
|
||||||
|
, _dimPortage = HeldItem 5 25
|
||||||
|
, _dimSPic = const $ noPic baseSonicShape
|
||||||
|
}
|
||||||
|
}
|
||||||
|
baseSonicShape :: Shape
|
||||||
|
baseSonicShape = colorSH rose $ upperPrismPoly 3 $ rectXH 25 2
|
||||||
|
|
||||||
|
aSonicWave :: Item -> Creature -> World -> World
|
||||||
|
aSonicWave it cr = instantParticles .:~ sonicWave pos dir cpos
|
||||||
|
where
|
||||||
|
pos = _crPos cr +.+ aimingMuzzlePos cr it *.* unitVectorAtAngle dir
|
||||||
|
cpos = _crPos cr
|
||||||
|
dir = _crDir cr
|
||||||
|
|
||||||
|
sonicWave :: Point2 -> Float -> Point2 -> Particle
|
||||||
|
sonicWave pos dir cpos = ShockLine
|
||||||
|
{ _ptDraw = drawSonicWave
|
||||||
|
, _ptUpdate = mvSonicWave
|
||||||
|
, _ptPointDirs = [[makePointDir $ pos +.+ clockOrth,makePointDir $ pos -.- clockOrth]]
|
||||||
|
, _ptTimer = 1000
|
||||||
|
, _ptColor = white
|
||||||
|
, _ptCenter = cpos
|
||||||
|
}
|
||||||
|
where
|
||||||
|
clockOrth = 10 *.* unitVectorAtAngle (dir + pi*0.5)
|
||||||
|
makePointDir p = (p, argV $ p -.- cpos)
|
||||||
|
|
||||||
|
drawSonicWave :: Particle -> Picture
|
||||||
|
drawSonicWave pt = foldMap (color (_ptColor pt) . setLayer 1 . setDepth 20
|
||||||
|
. lineThick 20
|
||||||
|
. map fst)
|
||||||
|
$ _ptPointDirs pt
|
||||||
|
|
||||||
|
mvSonicWave :: World -> Particle -> (World, Maybe Particle)
|
||||||
|
mvSonicWave w pt
|
||||||
|
| _ptTimer pt <= 0 = (w,Nothing)
|
||||||
|
| otherwise = (w, Just pt')
|
||||||
|
where
|
||||||
|
mvPointDir (p,a) = case wallsHit p ep w of
|
||||||
|
[] -> Just ((ep, a), (True,True))
|
||||||
|
(hp,wl):_ -> reflectShockLine wl p hp ep
|
||||||
|
where
|
||||||
|
ep = p +.+ 5 *.* unitVectorAtAngle a
|
||||||
|
dividePointDir (x:y:xs) = f x y ++ dividePointDir (y:xs)
|
||||||
|
dividePointDir xs = xs
|
||||||
|
f (p,a) (q,b)
|
||||||
|
| dist p q > 10 = [(p,a),(0.5 *.* (p +.+ q),mixAngles 0.5 a b)]
|
||||||
|
| otherwise = [(p,a)]
|
||||||
|
combineClose ((p,a):(q,b):pairs)
|
||||||
|
| dist p q < 5 = combineClose (( 0.5 *.* (p+.+q), mixa) : pairs)
|
||||||
|
| otherwise = (p,a) : combineClose ((q,b):pairs)
|
||||||
|
where
|
||||||
|
mixa = mixAngles 0.5 a b
|
||||||
|
combineClose pairs = pairs
|
||||||
|
pt' = pt & ptTimer -~ 10
|
||||||
|
-- & ptPointDirs %~ (map dividePointDir . filter (not . null) . dosplit . map mvPointDir)
|
||||||
|
& ptPointDirs %~ (map (dividePointDir . combineClose) . filter (not . null)
|
||||||
|
. concatMap (dosplit . map mvPointDir))
|
||||||
|
-- & ptPointDirs %~ (filter (not . null) . concatMap (dosplit . map mvPointDir))
|
||||||
|
dosplit :: [Maybe ((Point2,Float),(Bool,Bool))] -> [[(Point2,Float)]]
|
||||||
|
dosplit (x:xs) = case x of
|
||||||
|
Nothing -> [] : dosplit xs
|
||||||
|
Just (pair,(True,True)) -> onHead (pair:) $ dosplit xs
|
||||||
|
Just (pair,(False,True)) -> [] : onHead (pair:) (dosplit xs)
|
||||||
|
Just (pair,(True,False)) -> [pair] : dosplit xs
|
||||||
|
Just (_,(False,False)) -> [] : dosplit xs
|
||||||
|
dosplit [] = [[]]
|
||||||
|
|
||||||
|
onHead :: (a -> a) -> [a] -> [a]
|
||||||
|
onHead f (x:xs) = f x: xs
|
||||||
|
onHead _ [] = []
|
||||||
|
|
||||||
|
|
||||||
|
reflectShockLine :: Wall -> Point2 -> Point2 -> Point2 -> Maybe ((Point2,Float),(Bool,Bool))
|
||||||
|
reflectShockLine wl sp hitp ep
|
||||||
|
| angleVV wlV v < pi/3 = Just (pair, (False,True))
|
||||||
|
| angleVV wlV v < 2 *pi/3 = Nothing
|
||||||
|
| otherwise = Just (pair, (True,False))
|
||||||
|
where
|
||||||
|
reflv = reflectIn wlV (ep -.- hitp)
|
||||||
|
np = hitp +.+ reflv
|
||||||
|
pair = (np, argV reflv)
|
||||||
|
wlV = uncurry (-.-) $ _wlLine wl
|
||||||
|
v = hitp -.- sp
|
||||||
|
|
||||||
|
reflectShockLine' :: Wall -> Point2 -> Point2 -> Point2 -> Maybe ((Point2,Float),(Bool,Bool))
|
||||||
|
reflectShockLine' wl sp hitp ep
|
||||||
|
| angleVV wlV v < pi/3 = Just ((np +.+ wlVN,argV wlV), (False,True))
|
||||||
|
| angleVV wlV v < 2 *pi/3 = Nothing
|
||||||
|
| otherwise = Just ((np -.- wlVN,argV $ V2 0 0 -.- wlV), (True,False))
|
||||||
|
where
|
||||||
|
np = hitp +.+ normalizeV (sp -.- hitp)
|
||||||
|
wlV = uncurry (-.-) $ _wlLine wl
|
||||||
|
wlVN = dist hitp ep *.* normalizeV wlV
|
||||||
|
v = hitp -.- sp
|
||||||
|
|
||||||
|
dividePoly :: Float -> [Point2] -> [Point2]
|
||||||
|
dividePoly x (a:b:bs) = init (divideLine x a b) ++ dividePoly x (b:bs)
|
||||||
|
dividePoly _ [a] = [a]
|
||||||
|
dividePoly _ _ = []
|
||||||
|
|
||||||
Reference in New Issue
Block a user