Move bullet trajectory into bullet update function

This commit is contained in:
2022-07-17 10:31:34 +01:00
parent c9f7f39f22
commit 7d6407bebc
15 changed files with 159 additions and 121 deletions
+75
View File
@@ -0,0 +1,75 @@
module Dodge.Bullet where
import Dodge.Data
import Dodge.Particle.Bullet.Update
import Dodge.Creature.HandPos
import Dodge.Base.Coordinate
import Geometry
import LensHelp
import Data.Maybe
updateBullet :: World -> Bullet -> (World,Maybe Bullet)
updateBullet w bu = case _buState bu of
DyingBulletState -> (w,Nothing)
DelayedBullet x -> mvBulletSlow x w bu
_ -> mvBullet w bu
aBulAt
:: Maybe Float -- ^ Start velocity step factor
-- -> (Bullet -> Bullet)
-> Point2 -- ^ Start position
-> Point2 -- ^ Velocity
-> Float -- ^ Drag
-> HitEffect'
-> Float -- ^ Bullet width
-> BulletTrajectory
-> Bullet
aBulAt vfact --updatemod
pos vel drag hiteff width butraj = Bullet
{ _buState = bulstate
, _buUpdateMod = NoBulletUpdateMod
, _buTrajectory = butraj
, _buVel = vel
, _buDrag = drag
, _buPos = pos
, _buOldPos = pos
, _buWidth = width
, _buTimer = 100
, _buHitEff = hiteff
}
where
bulstate = fromMaybe NormalBulletState $ DelayedBullet <$> vfact
useAmmoParams :: Maybe Float -> Item -> Creature -> World -> World
useAmmoParams vfact it cr w = w & instantBullets .:~ aBulAt
vfact
-- thetraj -- extra update
sp
(rotateV dir (muzvel *.* _amBulVel bultype)) -- vel
(_rifling $ _itParams it) -- drag
(_amBulEff bultype)
(_amBulWth bultype)
thetraj
-- (_amBulTraj bultype)
where
sp = _crPos cr +.+ (muzlength + 10) *.* unitVectorAtAngle dir
dir = _crDir cr
bultype = _laAmmoType $ _itConsumption it
muzvel = _muzVel $ _itParams it
muzlength = aimingMuzzlePos cr it
thetraj = case _amBulTraj bultype of
BasicBulletTrajectory -> BasicBulletTrajectory
MagnetTrajectory{} -> fromMaybe BasicBulletTrajectory $ do
tpos <- it ^? itTargeting . tgPos . _Just
return $ MagnetTrajectory tpos
--return $ \pt -> pt & buVel .+.+~ 5 *.* normalizeV (tpos -.- _buPos pt)
FlechetteTrajectory{} -> fromMaybe BasicBulletTrajectory $ do
tpos <- it ^? itTargeting . tgPos . _Just
return $ FlechetteTrajectory tpos
--return $ \pt -> pt & buVel %~ vecTurnTo 0.2 (_buPos pt) tpos
BezierTrajectory{} -> fromMaybe BasicBulletTrajectory $ do
tpos <- it ^? itTargeting . tgPos . _Just
return $ BezierTrajectory sp tpos (mouseWorldPos w)
-- let bf t = bQuadToF (sp,mouseWorldPos w,tpos) $ (100 - t) * 0.05
-- return $ \pt -> pt
-- & buVel .~ bf (fromIntegral $ _buTimer pt - 1) -.- bf (fromIntegral $ _buTimer pt)
+3 -3
View File
@@ -27,10 +27,10 @@ moduleModification imt = case imt of
TARGCR -> itTargeting .~ targetRBCreature TARGCR -> itTargeting .~ targetRBCreature
TARGLAS -> itTargeting .~ targetLaser TARGLAS -> itTargeting .~ targetLaser
TARGPOS -> itTargeting .~ targetRBPress TARGPOS -> itTargeting .~ targetRBPress
MAGNETTRAJ -> (itConsumption . laAmmoType . amBulTraj .~ MagnetTrajectory) MAGNETTRAJ -> (itConsumption . laAmmoType . amBulTraj .~ MagnetTrajectory 0)
. (itConsumption . laAmmoType . amBulVel .~ V2 10 0) . (itConsumption . laAmmoType . amBulVel .~ V2 10 0)
FLECHETRAJ -> itConsumption . laAmmoType . amBulTraj .~ FlechetteTrajectory FLECHETRAJ -> itConsumption . laAmmoType . amBulTraj .~ FlechetteTrajectory 0
BEZIERTRAJ -> itConsumption . laAmmoType . amBulTraj .~ BezierTrajectory BEZIERTRAJ -> itConsumption . laAmmoType . amBulTraj .~ BezierTrajectory 0 0 0
INCENDLAS -> itParams . lasBeam .~ BeamCombine flameBeamCombine INCENDLAS -> itParams . lasBeam .~ BeamCombine flameBeamCombine
SPLITLAS -> itParams . lasBeam .~ BeamCombine splitBeamCombine SPLITLAS -> itParams . lasBeam .~ BeamCombine splitBeamCombine
STATICLAS -> (itParams . lasBeam .~ BeamCombine teslaBeamCombine) STATICLAS -> (itParams . lasBeam .~ BeamCombine teslaBeamCombine)
+11
View File
@@ -226,6 +226,17 @@ inventoryX c = case c of
-- , lasWidePulse -- , lasWidePulse
, makeTypeCraftNum 10 TRANSFORMER , makeTypeCraftNum 10 TRANSFORMER
] ]
'K' ->
[ autoRifle
, makeTypeCraftNum 7 MICROCHIP
, makeTypeCraftNum 4 HARDWARE
, makeTypeCraftNum 2 MAGNET
, makeTypeCraftNum 1 MOTOR
, makeTypeCraftNum 2 ANTIMATTER
, makeTypeCraftNum 1 LIGHTSENSOR
, makeTypeCraftNum 1 SOUNDSENSOR
, makeTypeCraftNum 1 HEATSENSOR
]
_ -> [] _ -> []
testInventory :: IM.IntMap Item testInventory :: IM.IntMap Item
+3 -3
View File
@@ -2,7 +2,7 @@ module Dodge.Creature.Damage where
import Dodge.Data import Dodge.Data
import Dodge.Creature.Test import Dodge.Creature.Test
import Dodge.Particle.Spark import Dodge.Particle.Spark
import Dodge.Particle.Bullet.Spawn import Dodge.Bullet
import Color import Color
import Geometry import Geometry
import LensHelp import LensHelp
@@ -44,8 +44,8 @@ applyDamageEffect dm de cr w = case de of
& creatures . ix (_crID cr) . crDir +~ rot & creatures . ix (_crID cr) . crDir +~ rot
BounceBullet bt | crIsArmouredFrom p cr -> w & instantBullets .:~ bouncer BounceBullet bt | crIsArmouredFrom p cr -> w & instantBullets .:~ bouncer
where where
bouncer = (aBulAt Nothing id pOut reflectVel (_buDrag bt) bouncer = (aBulAt Nothing pOut reflectVel (_buDrag bt) (_buHitEff bt) (_buWidth bt)
(_buHitEff bt) (_buWidth bt) BasicBulletTrajectory
) {_buTimer = _buTimer bt - 1} ) {_buTimer = _buTimer bt - 1}
pOut = p +.+ 2 *.* newDir pOut = p +.+ 2 *.* newDir
reflectVel = magV bulVel *.* newDir reflectVel = magV bulVel *.* newDir
+11 -4
View File
@@ -524,8 +524,15 @@ data BeamType
{_beamCombine :: (Point2 , (Point2,Point2,Beam) , (Point2,Point2,Beam)) -> World -> World} {_beamCombine :: (Point2 , (Point2,Point2,Beam) , (Point2,Point2,Beam)) -> World -> World}
| BeamSimple | BeamSimple
data BulletState = NormalBulletState
| DyingBulletState
| DelayedBullet Float
data BulletUpdateMod = NoBulletUpdateMod
data Bullet = Bullet data Bullet = Bullet
{ _buUpdate :: World -> Bullet -> (World, Maybe Bullet) { _buState :: BulletState
, _buUpdateMod :: BulletUpdateMod
, _buTrajectory :: BulletTrajectory
, _buVel :: Point2 , _buVel :: Point2
, _buDrag :: Float , _buDrag :: Float
, _buPos :: Point2 , _buPos :: Point2
@@ -645,9 +652,9 @@ type HitEffect' = Bullet
data BulletTrajectory data BulletTrajectory
= BasicBulletTrajectory = BasicBulletTrajectory
| BezierTrajectory | BezierTrajectory Point2 Point2 Point2
| FlechetteTrajectory | FlechetteTrajectory Point2
| MagnetTrajectory | MagnetTrajectory Point2
data AmmoType data AmmoType
= ProjectileAmmo = ProjectileAmmo
+1 -1
View File
@@ -1,9 +1,9 @@
module Dodge.Default.Weapon module Dodge.Default.Weapon
where where
import Dodge.Data import Dodge.Data
import Dodge.Bullet
import Dodge.Reloading.Action import Dodge.Reloading.Action
import Dodge.Item.Weapon.Bullet import Dodge.Item.Weapon.Bullet
import Dodge.Item.Weapon.AmmoParams
import Dodge.Default.Item import Dodge.Default.Item
import Dodge.Default.AimParams import Dodge.Default.AimParams
--import Dodge.Item.Draw --import Dodge.Item.Draw
+1 -1
View File
@@ -1,6 +1,6 @@
module Dodge.Item.Draw.SPic where module Dodge.Item.Draw.SPic where
import Dodge.Data import Dodge.Data
import Dodge.Item.Weapon.AmmoParams import Dodge.Item.Weapon.FractionLoaded
import ShapePicture import ShapePicture
import Shape import Shape
import LensHelp import LensHelp
-61
View File
@@ -1,61 +0,0 @@
module Dodge.Item.Weapon.AmmoParams
( useAmmoParams
, fractionLoadedAmmo
, fractionLoadedAmmo2
) where
import Dodge.Data
import Dodge.Base
import Dodge.Particle.Bullet.Spawn
import Dodge.Creature.HandPos
import Dodge.Movement.Turn
import Geometry
import LensHelp
import Data.Maybe
--import Control.Lens
useAmmoParams :: Maybe Float -> Item -> Creature -> World -> World
useAmmoParams vfact it cr w = w & instantBullets .:~ aBulAt
vfact
thetraj -- extra update
sp
(rotateV dir (muzvel *.* _amBulVel bultype)) -- vel
(_rifling $ _itParams it) -- drag
(_amBulEff bultype)
(_amBulWth bultype)
where
sp = _crPos cr +.+ (muzlength + 10) *.* unitVectorAtAngle dir
dir = _crDir cr
bultype = _laAmmoType $ _itConsumption it
muzvel = _muzVel $ _itParams it
muzlength = aimingMuzzlePos cr it
thetraj = case _amBulTraj bultype of
BasicBulletTrajectory -> id
MagnetTrajectory -> fromMaybe id $ do
tpos <- it ^? itTargeting . tgPos . _Just
return $ \pt -> pt & buVel .+.+~ 5 *.* normalizeV (tpos -.- _buPos pt)
FlechetteTrajectory -> fromMaybe id $ do
tpos <- it ^? itTargeting . tgPos . _Just
return $ \pt -> pt & buVel %~ vecTurnTo 0.2 (_buPos pt) tpos
BezierTrajectory -> fromMaybe id $ do
tpos <- it ^? itTargeting . tgPos . _Just
let bf t = bQuadToF (sp,mouseWorldPos w,tpos) $ (100 - t) * 0.05
return $ \pt -> pt
& buVel .~ bf (fromIntegral $ _buTimer pt - 1) -.- bf (fromIntegral $ _buTimer pt)
---- this shouldn't really be used
loadedAmmo :: Item -> Int
loadedAmmo = _laLoaded . _itConsumption
-- | _laTransfer (_itConsumption it) == NoTransfer = _laLoaded (_itConsumption it)
-- | otherwise = 0
fractionLoadedAmmo :: Item -> Float
fractionLoadedAmmo it = fromIntegral (loadedAmmo it) / fromIntegral (itmaxammo it)
where
itmaxammo = _laMax . _itConsumption
fractionLoadedAmmo2 :: Item -> Float
fractionLoadedAmmo2 it = 1 -
(1 - fromIntegral (loadedAmmo it) / fromIntegral (itMaxAmmo it))**2
where
itMaxAmmo = _laMax . _itConsumption
+1 -6
View File
@@ -11,14 +11,9 @@ module Dodge.Item.Weapon.BulletGun.Cane
--import Dodge.Particle.Bullet.HitEffect --import Dodge.Particle.Bullet.HitEffect
import Dodge.Reloading.Action import Dodge.Reloading.Action
import Dodge.Data import Dodge.Data
--import Dodge.ChainEffect import Dodge.Bullet
import Dodge.Default.Weapon import Dodge.Default.Weapon
import Dodge.Default import Dodge.Default
--import Dodge.Item.Attachment
--import Dodge.Item.Weapon.ExtraEffect
--import Dodge.Item.Weapon.InventoryDisplay
import Dodge.Item.Weapon.AmmoParams
--import Dodge.Item.Draw
import Dodge.Item.Weapon.TriggerType import Dodge.Item.Weapon.TriggerType
import Dodge.SoundLogic.LoadSound import Dodge.SoundLogic.LoadSound
import Picture import Picture
+22
View File
@@ -0,0 +1,22 @@
module Dodge.Item.Weapon.FractionLoaded
( fractionLoadedAmmo
, fractionLoadedAmmo2
) where
import Dodge.Data
---- this shouldn't really be used
loadedAmmo :: Item -> Int
loadedAmmo = _laLoaded . _itConsumption
-- | _laTransfer (_itConsumption it) == NoTransfer = _laLoaded (_itConsumption it)
-- | otherwise = 0
fractionLoadedAmmo :: Item -> Float
fractionLoadedAmmo it = fromIntegral (loadedAmmo it) / fromIntegral (itmaxammo it)
where
itmaxammo = _laMax . _itConsumption
fractionLoadedAmmo2 :: Item -> Float
fractionLoadedAmmo2 it = 1 -
(1 - fromIntegral (loadedAmmo it) / fromIntegral (itMaxAmmo it))**2
where
itMaxAmmo = _laMax . _itConsumption
-35
View File
@@ -1,35 +0,0 @@
module Dodge.Particle.Bullet.Spawn
( aBulAt
) where
import Dodge.Data
import Dodge.Particle.Bullet.Update
import Geometry
import LensHelp
import Data.Maybe
import Data.Bifunctor
aBulAt
:: Maybe Float -- ^ Start velocity step factor
-> (Bullet -> Bullet)
-> Point2 -- ^ Start position
-> Point2 -- ^ Velocity
-> Float -- ^ Drag
-> HitEffect'
-> Float -- ^ Bullet width
-> Bullet
aBulAt vfact updatemod pos vel drag hiteff width = Bullet
{ _buUpdate = theupdate
, _buVel = fromMaybe 1 vfact *.* vel
, _buDrag = drag
, _buPos = pos
, _buOldPos = pos
, _buWidth = width
, _buTimer = 100
, _buHitEff = hiteff
}
where
theupdate = case vfact of
Just _ -> \w -> resetVel . mvBullet w . updatemod
Nothing -> \w -> mvBullet w . updatemod
resetVel = second $ fmap $ (buUpdate .~ (\w -> mvBullet w . updatemod)) . (buVel .~ vel)
+24 -2
View File
@@ -2,10 +2,11 @@
{- Bullet update. -} {- Bullet update. -}
module Dodge.Particle.Bullet.Update module Dodge.Particle.Bullet.Update
( mvBullet ( mvBullet
, mvBulletSlow
, mvSpark , mvSpark
) where ) where
import Dodge.Data import Dodge.Data
--import Dodge.Base import Dodge.Movement.Turn
import Dodge.WorldEvent.ThingsHit import Dodge.WorldEvent.ThingsHit
--import Picture --import Picture
import Geometry import Geometry
@@ -20,13 +21,34 @@ mvBullet w bt'
hiteff bt (thingsHit p (p +.+ vel) w) w hiteff bt (thingsHit p (p +.+ vel) w) w
where where
bt = foldr (\mg b -> _mgField mg mg b) bt' $ _magnets w bt = foldr (\mg b -> _mgField mg mg b) bt' $ _magnets w
dodrag = buVel .*.*~ drag dodrag = case _buTrajectory bt of
BasicBulletTrajectory -> buVel .*.*~ drag
MagnetTrajectory tpos -> buVel .+.+~ 5 *.* normalizeV (tpos -.- _buPos bt)
FlechetteTrajectory tpos -> buVel %~ vecTurnTo 0.2 (_buPos bt) tpos
BezierTrajectory spos tpos xpos ->
let bf tm = bQuadToF (spos,xpos,tpos) $ (100 - tm) * 0.05
in buVel .~ bf (fromIntegral $ _buTimer bt - 1) -.- bf (fromIntegral $ _buTimer bt)
drag = _buDrag bt drag = _buDrag bt
p = _buPos bt p = _buPos bt
vel = _buVel bt vel = _buVel bt
hiteff = _buHitEff bt hiteff = _buHitEff bt
t = _buTimer bt t = _buTimer bt
mvBulletSlow :: Float -> World -> Bullet -> (World, Maybe Bullet)
mvBulletSlow x w bt'
| t <= 0 || magV (_buVel bt) < 1 = (w,Nothing)
| otherwise = second (fmap dodrag) $
hiteff bt (thingsHit p (p +.+ vel) w) w
where
bt = foldr (\mg b -> _mgField mg mg b) bt' $ _magnets w
dodrag = (buVel .*.*~ drag)
. (buState .~ NormalBulletState)
drag = _buDrag bt
p = _buPos bt
vel = x *.* _buVel bt
hiteff = _buHitEff bt
t = _buTimer bt
mvSpark :: World -> Particle -> (World, Maybe Particle) mvSpark :: World -> Particle -> (World, Maybe Particle)
mvSpark w bt' mvSpark w bt'
| t <= 0 || magV (_ptVel bt) < 1 = (w,Nothing) | t <= 0 || magV (_ptVel bt) < 1 = (w,Nothing)
+1 -1
View File
@@ -23,7 +23,7 @@ destroyAt hitp pt = Just $ pt
& ptTimer %~ (min 3 . subtract 1) & ptTimer %~ (min 3 . subtract 1)
destroyAt' :: Point2 -> Bullet -> Maybe Bullet destroyAt' :: Point2 -> Bullet -> Maybe Bullet
destroyAt' hitp pt = Just $ pt destroyAt' hitp pt = Just $ pt
& buUpdate .~ (\w -> const (w,Nothing)) & buState .~ DyingBulletState
& buPos .~ hitp & buPos .~ hitp
& buOldPos .~ _buPos pt & buOldPos .~ _buPos pt
& buTimer %~ (min 3 . subtract 1) & buTimer %~ (min 3 . subtract 1)
+3 -2
View File
@@ -5,6 +5,7 @@ Description : Simulation update
-} -}
module Dodge.Update ( updateUniverse ) where module Dodge.Update ( updateUniverse ) where
import Dodge.Data import Dodge.Data
import Dodge.Bullet
import Dodge.Update.Cloud import Dodge.Update.Cloud
import Dodge.Machine.Update import Dodge.Machine.Update
import Dodge.RadarBlip import Dodge.RadarBlip
@@ -217,7 +218,7 @@ updateFlares = flares %~ mapMaybe updateFlare
updateBullets :: World -> World updateBullets :: World -> World
updateBullets w = updateInstantBullets $ set bullets (catMaybes ps) w' updateBullets w = updateInstantBullets $ set bullets (catMaybes ps) w'
where where
(w',ps) = mapAccumR (\a b -> _buUpdate b a b) w $ _bullets w (w',ps) = mapAccumR (\a b -> updateBullet a b) w $ _bullets w
{- Apply internal particle updates, delete 'Nothing's. -} {- Apply internal particle updates, delete 'Nothing's. -}
updateParticles :: World -> World updateParticles :: World -> World
@@ -297,7 +298,7 @@ intersectSegSegs' _ _ _ = Nothing
updateInstantBullets :: World -> World updateInstantBullets :: World -> World
updateInstantBullets w = case _instantBullets w of updateInstantBullets w = case _instantBullets w of
[] -> w [] -> w
ps -> let (w',ps') = mapAccumR (\a b -> _buUpdate b a b) (w {_instantBullets=[]}) ps ps -> let (w',ps') = mapAccumR (\a b -> updateBullet a b) (w {_instantBullets=[]}) ps
in updateInstantBullets $ w' & bullets .++~ catMaybes ps' in updateInstantBullets $ w' & bullets .++~ catMaybes ps'
updateInstantParticles :: World -> World updateInstantParticles :: World -> World
+3 -2
View File
@@ -1,7 +1,7 @@
module Dodge.Wall.DamageEffect where module Dodge.Wall.DamageEffect where
import Dodge.Data import Dodge.Data
import Dodge.Bullet
import Dodge.Particle.Spark import Dodge.Particle.Spark
import Dodge.Particle.Bullet.Spawn
import Dodge.Base.Wall import Dodge.Base.Wall
import Dodge.Wall.Dust import Dodge.Wall.Dust
import Dodge.Block import Dodge.Block
@@ -135,7 +135,8 @@ wallDamageEffect dm wl w = case _dmEffect dm of
BounceBullet bt -> w & instantBullets .:~ thebouncer BounceBullet bt -> w & instantBullets .:~ thebouncer
where where
reflectVel = reflVelWall wl (_buVel bt) reflectVel = reflVelWall wl (_buVel bt)
thebouncer = aBulAt Nothing id pOut reflectVel (_buDrag bt) (_buHitEff bt) (_buWidth bt) thebouncer = aBulAt Nothing --id
pOut reflectVel (_buDrag bt) (_buHitEff bt) (_buWidth bt) BasicBulletTrajectory
& buTimer .~ _buTimer bt - 1 & buTimer .~ _buTimer bt - 1
pOut = p +.+ squashNormalizeV (sp -.- p) pOut = p +.+ squashNormalizeV (sp -.- p)
p = _dmAt dm p = _dmAt dm