Cleanup projectile firing

This commit is contained in:
2025-10-12 10:46:27 +01:00
parent 33de1f79b6
commit bbda28cbc1
4 changed files with 45 additions and 64 deletions
+6 -9
View File
@@ -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
+15 -33
View File
@@ -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)
+4 -3
View File
@@ -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