Cleanup projectile firing
This commit is contained in:
@@ -729,15 +729,13 @@ useLoadedAmmo loc cr mz m w =
|
||||
MuzzlePulseBall -> creatureShootPulseBall loc cr mz w
|
||||
MuzzleTesla -> shootTeslaArc loc cr mz w
|
||||
MuzzleTractor -> shootTractorBeam cr w
|
||||
MuzzleRLauncher -> createProjectileR loc magtree mz cr w
|
||||
MuzzleRLauncher -> createProjectileR pq loc magtree cr w
|
||||
MuzzleGLauncher ->
|
||||
createProjectile
|
||||
pq
|
||||
-- (itmtree ^. dtValue . _3)
|
||||
(Grenade (getGrenadeHitEffect itmtree))
|
||||
magtree
|
||||
(getPJStabiliser itmtree)
|
||||
mz
|
||||
cr
|
||||
w
|
||||
MuzzleNozzle{} -> useGasParams mitid mz loc cr $ walkNozzle mz itm w
|
||||
@@ -1267,15 +1265,15 @@ determineProjectileTracking magtree itmtree =
|
||||
_ -> False
|
||||
|
||||
createProjectileR ::
|
||||
Point3Q ->
|
||||
LocationDT OItem ->
|
||||
DTree OItem ->
|
||||
Muzzle ->
|
||||
Creature ->
|
||||
World ->
|
||||
World
|
||||
createProjectileR loc magtree =
|
||||
createProjectileR pq loc magtree =
|
||||
createProjectile
|
||||
(loc ^. locDT . dtValue . _3)
|
||||
pq
|
||||
( Rocket
|
||||
(determineProjectileTracking magtree itmtree)
|
||||
smoke
|
||||
@@ -1322,11 +1320,10 @@ createProjectile ::
|
||||
ProjectileType ->
|
||||
DTree OItem ->
|
||||
Maybe PJStabiliser ->
|
||||
Muzzle ->
|
||||
Creature ->
|
||||
World ->
|
||||
World
|
||||
createProjectile x pjtype mtree stab muz cr w = fromMaybe (failsound w) $ do
|
||||
createProjectile x pjtype mtree stab cr w = fromMaybe (failsound w) $ do
|
||||
magitid <- mtree ^? dtValue . _1 . itID . unNInt
|
||||
ammoitem <- w ^? cWorld . lWorld . items . ix magitid
|
||||
let rdetonate =
|
||||
@@ -1336,7 +1333,7 @@ createProjectile x pjtype mtree stab muz cr w = fromMaybe (failsound w) $ do
|
||||
aparams <-
|
||||
((mtree ^? dtLeft) >>= find isampay >>= (^? dtValue . _1 . itType . ibtAttach . shellPayload))
|
||||
<|> magAmmoParams ammoitem ^? _Just . ampPayload
|
||||
return . makesound $ createShell x rdetonate rscreen stab pjtype aparams muz cr w
|
||||
return . makesound $ createShell x rdetonate rscreen stab pjtype aparams cr w
|
||||
where
|
||||
isrdet :: DTree OItem -> Bool
|
||||
isrdet y = case y ^. dtValue . _2 of
|
||||
|
||||
@@ -3,16 +3,15 @@ module Dodge.Projectile.Create (
|
||||
PJStabiliser (..),
|
||||
) where
|
||||
|
||||
import qualified Quaternion as Q
|
||||
import Dodge.Data.Muzzle
|
||||
import Data.Maybe
|
||||
import Dodge.Data.World
|
||||
import Dodge.Item.Location
|
||||
import Geometry
|
||||
import qualified IntMapHelp as IM
|
||||
import LensHelp
|
||||
import NewInt
|
||||
import Linear
|
||||
import NewInt
|
||||
import qualified Quaternion as Q
|
||||
|
||||
data PJStabiliser
|
||||
= StabOrthReduce
|
||||
@@ -20,41 +19,38 @@ data PJStabiliser
|
||||
|
||||
-- assumes the mscreen is in your inventory
|
||||
createShell ::
|
||||
(Point3, Q.Quaternion Float) ->
|
||||
Point3Q ->
|
||||
Maybe (NewInt ItmInt) ->
|
||||
Maybe (NewInt ItmInt) ->
|
||||
Maybe PJStabiliser ->
|
||||
ProjectileType ->
|
||||
Payload ->
|
||||
Muzzle ->
|
||||
Creature ->
|
||||
World ->
|
||||
World
|
||||
createShell (p,q) mdetonator mscreen stab pjtype payload muz cr w =
|
||||
createShell (p, q) mdetonator mscreen stab pjtype payload cr w =
|
||||
w
|
||||
& updatescreen
|
||||
& updatedetonator
|
||||
& setuaparam mscreen
|
||||
& setuaparam mdetonator
|
||||
& cWorld . lWorld . projectiles . at i
|
||||
?~ Shell
|
||||
-- { _pjPos = pos
|
||||
{ _pjPos = p
|
||||
-- , _pjVel = (rotateV dir' (V2 speed 0) + crvelcomponent) `v2z` 0
|
||||
, _pjVel = (rotateV ddd (V2 speed 0) + crvelcomponent) `v2z` 0
|
||||
, _pjVel = (rotateV dir (V2 speed 0) + crvelcomponent) `v2z` 0
|
||||
, _pjID = i
|
||||
-- , _pjDir = dir'
|
||||
, _pjDir = ddd
|
||||
, _pjDir = dir
|
||||
, _pjSpin = 0
|
||||
, _pjPayload = payload
|
||||
, _pjTimer = lifespan
|
||||
, _pjTimer = 350
|
||||
, _pjBarrelSpin = bs
|
||||
, _pjType = pjtype
|
||||
, _pjDetonatorID = mdetonator
|
||||
, _pjScreenID = mscreen
|
||||
}
|
||||
where
|
||||
ddd = Q.qToAng q
|
||||
dir = Q.qToAng q
|
||||
crvelcomponent = case stab of
|
||||
Just StabOrthReduce -> projV (cr ^. crPos . _xy - cr ^. crOldPos . _xy) (unitVectorAtAngle dir)
|
||||
Just StabOrthReduce ->
|
||||
projV (cr ^. crPos . _xy - cr ^. crOldPos . _xy) (unitVectorAtAngle dir)
|
||||
_ -> (cr ^. crPos - cr ^. crOldPos) ^. _xy
|
||||
bs = case stab of
|
||||
Just StabOrthReduce -> Nothing
|
||||
@@ -64,21 +60,7 @@ createShell (p,q) mdetonator mscreen stab pjtype payload muz cr w =
|
||||
Grenade{} -> 4
|
||||
Rocket{} -> 1
|
||||
RetiredProjectile -> 0
|
||||
lifespan = 350
|
||||
updatedetonator = fromMaybe id $ do
|
||||
screenid <- mdetonator
|
||||
return $
|
||||
pointerToItemID screenid . itUse . uaParams
|
||||
. apProjectiles
|
||||
.:~ i
|
||||
updatescreen = fromMaybe id $ do
|
||||
screenid <- mscreen
|
||||
return $
|
||||
pointerToItemID screenid . itUse . uaParams
|
||||
. apProjectiles
|
||||
.:~ i
|
||||
setuaparam m = fromMaybe id $ do
|
||||
j <- m
|
||||
return $ pointerToItemID j . itUse . uaParams . apProjectiles .:~ i
|
||||
i = IM.newKey $ w ^. cWorld . lWorld . projectiles
|
||||
dir = _crDir cr + _mzRot muz
|
||||
--pos = _crPos cr + rotateV dir (xyV3 p + rotateV (argV (Q.qToV2 q)) (_mzPos muz))
|
||||
pos = _crPos cr + over _xy (rotateV dir) (p + addZ 0 (rotateV (argV (Q.qToV2 q)) (_mzPos muz)))
|
||||
dir' = dir + argV (Q.qToV2 q)
|
||||
|
||||
@@ -279,10 +279,10 @@ moveProjectile' pj w
|
||||
shellHitWall p n wl pj w
|
||||
| (p, Just (_, OFloor)) <- collide3 sp (sp + 2*^ _pjVel pj) w =
|
||||
shellHitFloor p pj w
|
||||
| (p, Just (_, OCreature cr)) <- collide3 sp (sp + _pjVel pj) w =
|
||||
| (p, Just (_, OCreature cr)) <- collide3 sp (sp + 2 *^ _pjVel pj) w =
|
||||
shellHitCreature p cr pj w
|
||||
& cWorld . lWorld . flares <>~ test p cr w sp (_pjVel pj)
|
||||
| (_, Just (_, OChasmWall)) <- collide3 sp (sp + _pjVel pj) w =
|
||||
| (_, Just (_, OChasmWall)) <- collide3 sp (sp + 2 *^_pjVel pj) w =
|
||||
-- no stick or bounce for now
|
||||
w & cWorld . lWorld . projectiles . ix (pj ^. pjID) . pjTimer .~ 0
|
||||
| otherwise =
|
||||
@@ -293,10 +293,11 @@ moveProjectile' pj w
|
||||
where
|
||||
sp = _pjPos pj
|
||||
|
||||
test :: Point3 -> Creature -> World -> Point3 -> Point3 -> Picture
|
||||
test p cr w sp v =
|
||||
(setLayer FixedCoordLayer
|
||||
$ uncurryV translate (worldPosToScreen (w ^. wCam) (p ^. _xy))
|
||||
$ drawList [text (shortShow p),text $shortShow sp, text $ shortShow $ sp + 2*v, text $ shortShow v]
|
||||
$ drawList [text (shortShow p),text $ shortShow sp, text $ shortShow $ sp + 2*v, text $ shortShow v]
|
||||
<> color white (crossPic 5)
|
||||
) <>
|
||||
(setLayer DebugLayer
|
||||
|
||||
Reference in New Issue
Block a user