Implement dual laser tesla
This commit is contained in:
@@ -9,6 +9,7 @@ module Dodge.Item.Weapon.BatteryGuns
|
||||
, lasGunPulse
|
||||
, sparkGun
|
||||
, teslaGun
|
||||
, teslaParams
|
||||
, tractorGun
|
||||
, lasRayAt
|
||||
, flameBeamCombine
|
||||
@@ -17,6 +18,7 @@ module Dodge.Item.Weapon.BatteryGuns
|
||||
) where
|
||||
import Dodge.Data
|
||||
import Dodge.Item.Weapon.LaserPath
|
||||
import Dodge.Item.Location
|
||||
import Dodge.Creature.HandPos
|
||||
import Dodge.Particle.TeslaArc
|
||||
import Dodge.Particle.Flame
|
||||
@@ -93,13 +95,15 @@ teslaGun = defaultBatteryGun
|
||||
}
|
||||
, _dimSPic = teslaGunPic
|
||||
}
|
||||
, _itParams = Arcing
|
||||
{ _currentArc = Nothing
|
||||
, _arcSize = 20
|
||||
, _arcNumber = 10
|
||||
, _newArcStep = defaultArcStep
|
||||
, _previousArcEffect = NoPreviousArcEffect
|
||||
}
|
||||
, _itParams = teslaParams
|
||||
}
|
||||
teslaParams :: ItemParams
|
||||
teslaParams = Arcing
|
||||
{ _currentArc = Nothing
|
||||
, _arcSize = 20
|
||||
, _arcNumber = 10
|
||||
, _newArcStep = defaultArcStep
|
||||
, _previousArcEffect = NoPreviousArcEffect
|
||||
}
|
||||
teslaGunPic :: Item -> SPic
|
||||
teslaGunPic _ = noPic $ colorSH blue $
|
||||
@@ -228,6 +232,7 @@ lasGunDual = lasGun
|
||||
, _lasCycle = 0
|
||||
, _lasDamage = 11
|
||||
, _lasBeam = BeamCombine lasBeamCombine
|
||||
, _subParams = Nothing
|
||||
}
|
||||
& itUse .~ (ruseInstant shootDualLaser NoHammer
|
||||
[ ammoCheckI
|
||||
@@ -483,10 +488,11 @@ shootLaser it cr = instantParticles .:~ lasRayAt (_lasColor $ _itParams it) dam
|
||||
dam = _lasDamage $ _itParams it
|
||||
|
||||
shootDualLaser :: Item -> Creature -> World -> World
|
||||
shootDualLaser it cr w = w
|
||||
& newBeams . positronBeams .:~ dualRayAt (_lasBeam $ _itParams it) w (_lasColor $ _itParams it) dam phasev posl dirl
|
||||
& newBeams . electronBeams .:~ basicBeamAt w (_lasColor2 $ _itParams it) dam phasev posr dirr
|
||||
shootDualLaser it cr w = w'
|
||||
& newBeams . positronBeams .:~ dualRayAt (_lasBeam $ _itParams it) itid w (_lasColor $ _itParams it) dam phasev posl dirl
|
||||
& newBeams . electronBeams .:~ basicBeamAt itid w (_lasColor2 $ _itParams it) dam phasev posr dirr
|
||||
where
|
||||
(w',itid) = getHeldItemLoc cr w
|
||||
dir = _crDir cr
|
||||
pos = _crPos cr +.+ aimlength *.* unitVectorAtAngle dir
|
||||
aimlength = aimingMuzzlePos cr it
|
||||
@@ -509,8 +515,8 @@ drawBeam bm = setLayer 1 $ pictures
|
||||
col = _bmColor bm
|
||||
ps = _bmFirstPoints bm
|
||||
|
||||
basicBeamAt :: World -> Color -> Int -> Float -> Point2 -> Float -> Beam
|
||||
basicBeamAt w col dam phasev pos dir = Beam
|
||||
basicBeamAt :: Int -> World -> Color -> Int -> Float -> Point2 -> Float -> Beam
|
||||
basicBeamAt itid w col dam phasev pos dir = Beam
|
||||
{ _bmDraw = drawBeam
|
||||
, _bmPos = pos
|
||||
, _bmDir = dir
|
||||
@@ -520,13 +526,14 @@ basicBeamAt w col dam phasev pos dir = Beam
|
||||
, _bmColor = col
|
||||
, _bmPoints = pos:ps
|
||||
, _bmFirstPoints = []
|
||||
, _bmOrigin = Just itid
|
||||
, _bmType = BeamCombine $ const id
|
||||
}
|
||||
where
|
||||
(_,ps) = reflectLaserAlong phasev [] pos (pos +.+ 800 *.* unitVectorAtAngle dir) w
|
||||
|
||||
dualRayAt :: BeamType -> World -> Color -> Int -> Float -> Point2 -> Float -> Beam
|
||||
dualRayAt bt w col dam phasev pos dir = basicBeamAt w col dam phasev pos dir
|
||||
dualRayAt :: BeamType -> Int -> World -> Color -> Int -> Float -> Point2 -> Float -> Beam
|
||||
dualRayAt bt itid w col dam phasev pos dir = basicBeamAt itid w col dam phasev pos dir
|
||||
& bmType .~ bt
|
||||
|
||||
flameBeamCombine :: (Point2,(Point2,Point2,Beam),(Point2,Point2,Beam))
|
||||
@@ -550,10 +557,14 @@ splitBeamCombine (p,(a,b,_),(x,y,_))
|
||||
teslaBeamCombine :: (Point2,(Point2,Point2,Beam),(Point2,Point2,Beam))
|
||||
-> World -> World
|
||||
teslaBeamCombine (p,(a,b,bm),(x,y,_)) w
|
||||
= w'
|
||||
= w' & pointToItem (_itemPositions w IM.! itid) . itParams . subParams ?~ ip
|
||||
where
|
||||
itid = fromJust $ _bmOrigin bm
|
||||
dir = argV (normalizeV (b-.-a)+.+normalizeV (y-.-x))
|
||||
(w',ip) = shootTeslaArc' (_beamItemParams $ _bmType bm) p dir w
|
||||
(w',ip) = shootTeslaArc' (fromJust . _subParams $ _itParams it) p dir w
|
||||
it = case getItem itid w of
|
||||
Nothing -> error "tried to get item use teslaBeamCombine that doesn't exist"
|
||||
Just itm -> itm
|
||||
|
||||
lasRayAt :: Color -> Int -> Float -> Point2 -> Float -> Particle
|
||||
lasRayAt col dam phasev pos dir = LaserParticle
|
||||
|
||||
Reference in New Issue
Block a user