Unify bullet creation

This commit is contained in:
2022-02-28 21:36:42 +00:00
parent 419fcd0ff0
commit fd62b5a3b7
13 changed files with 78 additions and 274 deletions
+3 -6
View File
@@ -10,7 +10,6 @@ import Dodge.Item.Weapon.BulletGuns
import Dodge.Item.Weapon.BatteryGuns
import Dodge.Item.Weapon.Launcher
import Dodge.Item.Weapon.SprayGuns
import Dodge.Item.Weapon.Bezier
import Dodge.Item.Weapon.TriggerType
import Dodge.Item.Weapon.ExtraEffect
import Dodge.Base
@@ -41,7 +40,6 @@ itemCombinations =
, po [BANGCANE,TIN] rifle
, po [RIFLE,PLANK] repeater
, po [REPEATER,SPRING,HARDWARE] autoRifle
, po [AUTORIFLE,MICROCHIP,MAGNET] bezierGun
, po [REPEATER,SPRING,CAN] burstRifle
, po [BURSTRIFLE,SPRING,HARDWARE] fastBurstRifle
, po [FASTBURSTRIFLE,SPRING,HARDWARE] completeBurstRifle
@@ -120,13 +118,12 @@ moduleCombinations =
)
, ( ModBulletTrajectory
, bulletWeapons
, [amod [TELEPORTMODULE,MICROCHIP] "+TELEPORT" (itUse . useMods .:~ withPositionWallCheck (const . const mouseWorldPos))
,amod [TELEPORTMODULE] "+DIRECTEDTELE" makeDirectedTele
, [amod [TELEPORTMODULE,MICROCHIP] "+DIRECTEDTELE" makeDirectedTele
,amod [MAGNET,MICROCHIP,HARDWARE] "+MAGNETTRAJECTORY"
(itConsumption . aoType . amBulTraj .~ MagnetTrajectory)
( (itConsumption . aoType . amBulTraj .~ MagnetTrajectory) )
,amod [MICROCHIP,HARDWARE] "+FLECHETTETRAJECTORY"
(itConsumption . aoType . amBulTraj .~ FlechetteTrajectory)
,amod [MAGNET,AIUNIT,HARDWARE] "+BEZIERTRAJECTORY"
,amod [ANTIMATTER,HARDWARE] "+BEZIERTRAJECTORY"
(itConsumption . aoType . amBulTraj .~ BezierTrajectory)
]
)
+1
View File
@@ -82,6 +82,7 @@ data CombineType
| PRISM
| LIGHTER
| MAGNET
| ANTIMATTER
| PLATE
| MICROCHIP
| AIUNIT
-1
View File
@@ -197,7 +197,6 @@ stackedInventory = IM.fromList $ zip [0..]
,teslaGun
,blinkGun
,miniGunX 3
,bezierGun
-- ,multGun
,boosterGun
,remoteLauncher
-2
View File
@@ -13,7 +13,6 @@ module Dodge.Item.Weapon
, module Dodge.Item.Weapon.SprayGuns
, module Dodge.Item.Weapon.BatteryGuns
, module Dodge.Item.Weapon.Launcher
, module Dodge.Item.Weapon.Bezier
) where
import Dodge.Item.Weapon.BulletGuns
import Dodge.Item.Weapon.TriggerType
@@ -28,4 +27,3 @@ import Dodge.Item.Weapon.Radar
import Dodge.Item.Weapon.SprayGuns
import Dodge.Item.Weapon.BatteryGuns
import Dodge.Item.Weapon.Launcher
import Dodge.Item.Weapon.Bezier
+35 -67
View File
@@ -1,31 +1,29 @@
module Dodge.Item.Weapon.AmmoParams
( useAmmoParams
, useAmmoParamsRate
-- , loadedAmmo
, useAmmoParamsVelMod
, ruseAmmoParamsRate
, fractionLoadedAmmo
, fractionLoadedAmmo2
) where
import Dodge.Data
import Dodge.Base
import Dodge.Particle.Bullet.Spawn
import Dodge.Creature.HandPos
import Dodge.Item.Weapon.Targeting
import Dodge.Item.Weapon.Bezier
import Dodge.Movement.Turn
import Geometry
import LensHelp
import Data.Maybe
--import Control.Lens
useAmmoParamsRate :: Int
ruseAmmoParamsRate :: Int
-> HammerType
-> [(Item -> Creature -> World -> World) -> Item -> Creature -> World -> World]
-> ItemUse
useAmmoParamsRate rate ht usemods = RightUse
{ _rUse = useAmmoParams
ruseAmmoParamsRate rate ht usemods = RightUse
{ _rUse = useAmmoParams Nothing
, _useDelay = FixedRate {_rateMax = rate,_rateTime = 0}
, _useMods = usemods
, _useHammer = ht
, _useHammer = ht
, _useAim = defaultAimParams
}
defaultAimParams :: AimParams
@@ -36,67 +34,37 @@ defaultAimParams = AimParams
, _aimStance = OneHand
}
useAmmoParams :: Item -> Creature -> World -> World
useAmmoParams it cr = case _amBulTraj b of
BasicBulletTrajectory -> withVelWthHiteff
(muzvel *.* _amBulVel b)
(_rifling $ _itParams it)
(_amBulWth b)
muzlength
(_amBulEff b)
cr
BezierTrajectory -> useTargetPos (\p -> shootBezier $ fromJust p) cr
FlechetteTrajectory -> undefined
MagnetTrajectory -> undefined
useAmmoParams :: Maybe Float -> Item -> Creature -> World -> World
useAmmoParams vfact it cr w = w & particles .:~ aBulAt
vfact
thetraj -- extra update
Nothing -- color (default)
(Just cid) -- pass through creature
sp
(rotateV dir (muzvel *.* _amBulVel bultype)) -- vel
(_rifling $ _itParams it) -- drag
(_amBulEff bultype)
(_amBulWth bultype)
where
muzlength = aimingMuzzlePos cr it
muzvel = _muzVel $ _itParams it
b = _aoType $ _itConsumption it
-- bulHitEff = fromMaybe (destroyOnImpact bulHitCr bulHitWall)
-- $ it ^? itModules . modHitEffect . theModule
useAmmoParamsVelMod :: Float -> Item -> Creature -> World -> World
useAmmoParamsVelMod vfact it = withDelayedVelWthHiteff vfact (_amBulVel b) (_rifling $ _itParams it)
(_amBulWth b)
(_amBulEff b)
-- bulHitEff
where
b = _aoType $ _itConsumption it
-- bulHitEff = fromMaybe (destroyOnImpact bulHitCr bulHitWall)
-- $ it ^? itModules . modHitEffect . theModule
{- | Creates a bullet with a given velocity, width, and 'HitEffect' -}
withVelWthHiteff
:: Point2 -- ^ Velocity, x direction is forward with respect to the creature
-> Float -- ^ drag
-> Float -- ^ Bullet width
-> Float -- ^ Distance away from creature to create
-> HitEffect -- ^ Bullet effect when hitting creature, wall etc
-> Creature
-> World
-> World
withVelWthHiteff vel drag width muzlength hiteff cr = particles .:~ newbul
where
newbul = aGenBulAt (Just (_crID cr)) pos (rotateV dir vel) drag hiteff width
pos = _crPos cr +.+ muzlength *.* unitVectorAtAngle dir
dir = _crDir cr
{- | Creates a bullet with a given velocity, width, and 'HitEffect' -}
withDelayedVelWthHiteff
:: Float -- ^ Velocity factor for first step
-> Point2 -- ^ Velocity, x direction is forward with respect to the creature
-> Float -- ^ Drag
-> Float -- ^ Bullet width
-> HitEffect -- ^ Bullet effect when hitting creature, wall etc
-> Creature -- ^ Creature id
-> World
-> World
withDelayedVelWthHiteff vfact vel drag width hiteff cr = particles .:~ newbul
where
sp = _crPos cr +.+ muzlength *.* unitVectorAtAngle dir
cid = _crID cr
newbul = aDelayedBulAt vfact (Just cid) pos (rotateV dir vel) drag hiteff width
dir = _crDir cr
pos = _crPos cr +.+ _crRad cr *.* unitVectorAtAngle (_crDir cr)
bultype = _aoType $ _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 & ptVel .+.+~ 5 *.* normalizeV (tpos -.- head (_ptTrail pt))
FlechetteTrajectory -> fromMaybe id $ do
tpos <- it ^? itTargeting . tgPos . _Just
return $ \pt -> pt & ptVel %~ vecTurnTo 0.1 (head $ _ptTrail 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
& ptVel .~ bf (fromIntegral $ _ptTimer pt - 1) -.- bf (fromIntegral $ _ptTimer pt)
-- this shouldn't really be used
loadedAmmo :: Item -> Int
-68
View File
@@ -1,68 +0,0 @@
module Dodge.Item.Weapon.Bezier
( bezierGun
, shootBezier
) where
import Dodge.Data
import Dodge.Base
import Dodge.Default.Weapon
import Dodge.Item.Weapon.Targeting
--import Dodge.Item.Weapon.BulletGuns
import Dodge.Item.Weapon.TriggerType
import Dodge.Item.Weapon.ExtraEffect
--import Dodge.Default
import Dodge.Particle.Bullet.Spawn
import Dodge.Particle.Bullet.HitEffect
import Dodge.WorldEvent.HitEffect
import Dodge.RandomHelp
import Dodge.SoundLogic.LoadSound
import Geometry
--import ShapePicture
import LensHelp
import Data.Maybe
import Control.Monad.State
bezierGun :: Item
bezierGun = defaultGun
{ _itName = "BEZIERGUN"
, _itUse = ruseRate 6 (\_ -> useTargetPos $ \p -> shootBezier $ fromJust p) -- <- the start point
NoHammer
[ ammoCheckI
, useTimeCheck
, withSoundStart tap2S
, useAmmoAmount 1
, withMuzFlareI
. withRecoilI 40
. torqueBefore 0.05
]
& useAim . aimSpeed .~ 0.4
& useAim . aimRange .~ 0
& useAim . aimStance .~ TwoHandTwist
-- & useAim . aimZoom .~ defaultItZoom {_itZoomFac = 1.5}
-- , _itFloorPict = bezierGunSPic
, _itAttachment = NoItAttachment
, _itScroll = \_ _ -> removeItTarget
-- , _itEffect = rbSetTarget
-- , _itZoom = defaultItZoom
, _itConsumption = defaultAmmo
{ _ammoBaseMax = 15
}
, _itTargeting = targetRBPress
}
shootBezier :: Point2 -> Creature -> World -> World
shootBezier targetp cr w = w & particles .:~ aCurveBulAt
(Just cid)
(V4 200 200 200 1)
startp
(controlp +.+ randPos)
(targetp +.+ randPos')
(destroyOnImpact bulHitCr bulHitWall)
5
where
controlp = mouseWorldPos w
cid = _crID cr
dir = _crDir cr
startp = _crPos cr +.+ rotateV dir (V2 (_crRad cr + 1) 0)
(randPos,randPos') = flip evalState (_randGen w) $ do
a <- randInCirc 10
b <- randInCirc 20
return (a,b)
+4 -4
View File
@@ -58,7 +58,7 @@ bangCane = defaultGun
, _reloadTime = 20
, _reloadType = ActivePartial 1
}
, _itUse = useAmmoParamsRate 6 upHammer
, _itUse = ruseAmmoParamsRate 6 upHammer
[ ammoHammerCheck
, useTimeCheck
, withSoundStart tap3S
@@ -88,7 +88,7 @@ bangCaneX :: Int -> Item
bangCaneX i = bangCane
{ _itName = "BANGCANEx"++show i
, _itType = BANGCANEX i
, _itUse = useAmmoParamsRate 6 upHammer
, _itUse = ruseAmmoParamsRate 6 upHammer
[ ammoHammerCheck
, useTimeCheck
, withSoundItemChoiceStart caneStickSoundChoice
@@ -233,7 +233,7 @@ completeBurstRifle = repeater
, withRecoilI 50
]
miniGunUse :: Int -> ItemUse
miniGunUse i = ruseInstant (useAmmoParamsVelMod 1) NoHammer $
miniGunUse i = ruseInstant (useAmmoParams $ Just 1) NoHammer $
[ ammoCheckI
, withWarmUp crankSlowS
, withSoundForI mini1S 2
@@ -248,7 +248,7 @@ miniGunUse i = ruseInstant (useAmmoParamsVelMod 1) NoHammer $
, afterRecoil recoilAmount
, withRandomOffsetI 10
, withOldDir x
, trigDoAlso (useAmmoParamsVelMod x)
, trigDoAlso (useAmmoParams $ Just x)
] | x <- map ((/fromIntegral i) . fromIntegral) [1..i-1]
]
<>
+1 -1
View File
@@ -43,7 +43,7 @@ bangRod = defaultGun
, _bore = 2
, _gunBarrels = SingleBarrel 0.1
}
, _itUse = useAmmoParamsRate 6 upHammer
, _itUse = ruseAmmoParamsRate 6 upHammer
[ ammoHammerCheck
, useTimeCheck
, withSoundStart autoGunS
+3 -3
View File
@@ -52,7 +52,7 @@ bangStick i = defaultGun
, _reloadTime = 15
, _reloadType = ActivePartial 1
}
, _itUse = useAmmoParamsRate 8 upHammer
, _itUse = ruseAmmoParamsRate 8 upHammer
[ ammoHammerCheck
, useTimeCheck
, withSoundItemChoiceStart bangStickSoundChoice
@@ -178,7 +178,7 @@ pistol = (bangStick 1)
, _reloadTime = 70
, _reloadType = ActiveClear
}
, _itUse = useAmmoParamsRate 6 upHammer
, _itUse = ruseAmmoParamsRate 6 upHammer
(ammoHammerCheck : pistolAfterHamMods)
-- , _itZoom = defaultItZoom
-- , _itEquipPict = pictureWeaponAim pistolPic
@@ -218,7 +218,7 @@ revolverX :: Int -> Item
revolverX i = revolver
{ _itName = "REVx"++show i
, _itType = REVOLVERX i
, _itUse = useAmmoParamsRate 8 upHammer
, _itUse = ruseAmmoParamsRate 8 upHammer
[ ammoHammerCheck
, useTimeCheck
-- rather than locking the inventory, a better solution may be to check
+12 -12
View File
@@ -59,7 +59,7 @@ autoGun = defaultAutoGun
, _ammoLoaded = 30
, _reloadTime = 80
}
, _itUse = useAmmoParamsRate 4 NoHammer
, _itUse = ruseAmmoParamsRate 4 NoHammer
[ ammoCheckI
, charFiringStratI
[('S', hammerCheckI)
@@ -113,7 +113,7 @@ bangCone = defaultGun
, _reloadTime = 25
, _reloadType = ActiveClear
}
, _itUse = useAmmoParamsRate 20 upHammer
, _itUse = ruseAmmoParamsRate 20 upHammer
[ ammoCheckI
, hammerCheckI
, useTimeCheck
@@ -166,7 +166,7 @@ blunderbuss :: Item
blunderbuss = bangCone
{_itName = "BLUNDERBUSS"
,_itType = BLUNDERBUSS
,_itUse = useAmmoParamsRate 20 upHammer
,_itUse = ruseAmmoParamsRate 20 upHammer
[ ammoCheckI
, hammerCheckI
, useTimeCheck
@@ -200,7 +200,7 @@ bigBlunderbuss :: Item
bigBlunderbuss = blunderbuss
{_itName = "BIGBLUNDERBUSS"
,_itType = BIGBLUNDERBUSS
,_itUse = useAmmoParamsRate 20 upHammer
,_itUse = ruseAmmoParamsRate 20 upHammer
[ ammoCheckI
, hammerCheckI
, useTimeCheck
@@ -224,7 +224,7 @@ biggerBlunderbuss :: Item
biggerBlunderbuss = bigBlunderbuss
{_itName = "BIGGERBLUNDERBUSS"
,_itType = BIGGERBLUNDERBUSS
,_itUse = useAmmoParamsRate 20 upHammer
,_itUse = ruseAmmoParamsRate 20 upHammer
[ ammoCheckI
, hammerCheckI
, useTimeCheck
@@ -248,7 +248,7 @@ biggestBlunderbuss :: Item
biggestBlunderbuss = biggerBlunderbuss
{_itName = "BIGGESTBLUNDERBUSS"
,_itType = BIGGESTBLUNDERBUSS
,_itUse = useAmmoParamsRate 20 upHammer
,_itUse = ruseAmmoParamsRate 20 upHammer
[ ammoCheckI
, hammerCheckI
, useTimeCheck
@@ -273,7 +273,7 @@ grapeShotCannon :: Item
grapeShotCannon = blunderbuss
{_itName = "GRAPESHOTCANNON"
,_itType = GRAPESHOTCANNON
,_itUse = useAmmoParamsRate 20 upHammer
,_itUse = ruseAmmoParamsRate 20 upHammer
[ ammoCheckI
, hammerCheckI
, useTimeCheck
@@ -309,7 +309,7 @@ hvAutoGun = defaultAutoGun
, _ammoLoaded = 100
, _reloadTime = 200
}
, _itUse = useAmmoParamsRate 25 NoHammer
, _itUse = ruseAmmoParamsRate 25 NoHammer
[ ammoCheckI
, rateIncAB (torqueBeforeAtLeast 0.1 0.1) (torqueAfterI 0.2)
, withSoundStart bangEchoS
@@ -338,7 +338,7 @@ ltAutoGun = defaultAutoGun
, _ammoLoaded = 0
, _reloadTime = 90
}
, _itUse = useAmmoParamsRate 2 NoHammer
, _itUse = ruseAmmoParamsRate 2 NoHammer
[ ammoCheckI
, useTimeCheck
, withSoundStart tap1S
@@ -367,7 +367,7 @@ spreadGun = defaultGun
, _ammoLoaded = 5
, _reloadTime = 80
}
, _itUse = useAmmoParamsRate 20 upHammer
, _itUse = ruseAmmoParamsRate 20 upHammer
[ ammoCheckI
, hammerCheckI
, useTimeCheck
@@ -401,7 +401,7 @@ multGun = defaultGun
, _reloadTime = 10
, _reloadType = ActivePartial 1
}
, _itUse = useAmmoParamsRate 20 upHammer
, _itUse = ruseAmmoParamsRate 20 upHammer
[ ammoCheckI
, hammerCheckI
, useTimeCheck
@@ -439,7 +439,7 @@ longGun = defaultGun
, _reloadTime = 100
, _reloadType = PassiveReload skwareFadeTwoSecS
}
, _itUse = useAmmoParamsRate 100 upHammer
, _itUse = ruseAmmoParamsRate 100 upHammer
[ ammoCheckI
, hammerCheckI
, useTimeCheck
+1 -1
View File
@@ -15,7 +15,7 @@ turnTo turnSpeed sp tp a
vecTurnTo :: Float -> Point2 -> Point2 -> Point2 -> Point2
vecTurnTo turnSpeed sp tp vdir
| angleVV vToTarg vdir <= turnSpeed
= argV vdir *.* normalizeV vToTarg
= magV vdir *.* normalizeV vToTarg
| isLHS (sp +.+ vdir) sp tp = rotateV (negate turnSpeed) vdir
| otherwise = rotateV turnSpeed vdir
where
+3 -3
View File
@@ -51,7 +51,7 @@ bulBounceArmCr' bt p cr w
pOut = p +.+ 2 *.* newDir
reflectVel = magV bulVel *.* newDir
addBouncer = instantParticles .:~ bouncer
bouncer = (aGenBulAt Nothing pOut reflectVel (_btDrag bt)
bouncer = (aBulAt Nothing id (Just (_ptColor bt)) Nothing pOut reflectVel (_btDrag bt)
(_ptHitEff bt) (_ptWidth bt)
) {_ptTimer = _ptTimer bt - 1}
{- | Bullet pass through creatures. -}
@@ -70,7 +70,7 @@ bulPenCr' bt p cr w = w
cid = _crID cr
sp = head $ _ptTrail bt
ep = sp +.+ _ptVel bt
piercer = (aGenBulAt (Just cid) p (_ptVel bt) (_btDrag bt)
piercer = (aBulAt Nothing id (Just (_ptColor bt)) (Just cid) p (_ptVel bt) (_btDrag bt)
(_ptHitEff bt) (_ptWidth bt)
) {_ptTimer = _ptTimer bt - 1}
{- | Heavy bullet effects when hitting creature:
@@ -123,7 +123,7 @@ bulBounceWall bt p wl = damageWall (Blunt 50 sp p ep) wl
ep = sp +.+ _ptVel bt
sp = head $ _ptTrail bt
pOut = p +.+ squashNormalizeV (sp -.- p)
bouncer = (aGenBulAt Nothing pOut reflectVel (_btDrag bt) (_ptHitEff bt) (_ptWidth bt)
bouncer = (aBulAt Nothing id (Just (_ptColor bt)) Nothing pOut reflectVel (_btDrag bt) (_ptHitEff bt) (_ptWidth bt)
) {_ptTimer = _ptTimer bt - 1}
reflectVel = reflVelWall wl (_ptVel bt)
-- the hack is to get around the fact that the particles list gets reset after
+15 -106
View File
@@ -1,41 +1,20 @@
module Dodge.Particle.Bullet.Spawn
( aGenBulAt
, aDelayedBulAt
, aCurveBulAt
, accelBulAt
( aBulAt
) where
import Dodge.Data
import Dodge.Particle.Bullet.Draw
import Dodge.Particle.Bullet.Update
import Dodge.Movement.Turn
import Geometry
import Picture
import LensHelp
import Data.Maybe
import Data.Bifunctor
aGenBulAt
:: Maybe Int -- ^ Pass-through creature id
-> Point2 -- ^ Start position
-> Point2 -- ^ Velocity
-> Float -- ^ Slowdown
-> HitEffect
-> Float -- ^ Bullet width
-> Particle
aGenBulAt maycid pos vel drag hiteff width = BulletPt
{ _ptDraw = drawBul
, _ptUpdate = mvBullet
, _ptVel = vel
, _btDrag = drag
, _ptColor = V4 2 2 2 2
, _ptTrail = [pos]
, _ptCrIgnore = maycid
, _ptWidth = width
, _ptTimer = 100
, _ptHitEff = hiteff
}
aDelayedBulAt
:: Float -- ^ Start velocity step factor
aBulAt
:: Maybe Float -- ^ Start velocity step factor
-> (Particle -> Particle)
-> Maybe Color
-> Maybe Int -- ^ Pass-through creature id
-> Point2 -- ^ Start position
-> Point2 -- ^ Velocity
@@ -43,12 +22,13 @@ aDelayedBulAt
-> HitEffect
-> Float -- ^ Bullet width
-> Particle
aDelayedBulAt vfact maycid pos vel drag hiteff width = BulletPt
aBulAt vfact updatemod mcol maycid pos vel drag hiteff width = BulletPt
{ _ptDraw = drawBul
, _ptUpdate = \w -> resetVel . mvBullet w
, _ptVel = vfact *.* vel
, _ptUpdate = theupdate
, _ptVel = fromMaybe 1 vfact *.* vel
, _btDrag = drag
, _ptColor = V4 2 2 2 2
, _ptColor = fromMaybe (V4 200 200 200 2) mcol
-- , _ptColor = V4 2 2 2 2
, _ptTrail = [pos]
, _ptCrIgnore = maycid
, _ptWidth = width
@@ -56,78 +36,7 @@ aDelayedBulAt vfact maycid pos vel drag hiteff width = BulletPt
, _ptHitEff = hiteff
}
where
resetVel = second $ fmap $ (ptUpdate .~ mvBullet) . (ptVel .~ vel)
aCurveBulAt
:: Maybe Int -- ^ Pass-through creature id
-> Color
-> Point2 -- ^ Start position
-> Point2 -- ^ Control position
-> Point2 -- ^ Target position
-> HitEffect
-> Float -- ^ Bullet width
-> Particle
aCurveBulAt maycid col pos control targ hiteff width = BulletPt
{ _ptDraw = drawBul
, _ptUpdate = \w -> mvBullet w . setVel
, _ptVel = V2 0 0
, _btDrag = 1
, _ptColor = col
, _ptTrail = [pos]
, _ptCrIgnore = maycid
, _ptWidth = width
, _ptTimer = 100
, _ptHitEff = hiteff
}
where
setVel pt = pt & ptVel .~ bf (fromIntegral $ _ptTimer pt - 1) -.- bf (fromIntegral $ _ptTimer pt)
bf t = bQuadToF (pos,control,targ) $ (100 - t) * 0.05
accelBulAt
:: Maybe Int -- ^ Pass-through creature id
-> Color
-> Point2 -- ^ Start position
-> Point2 -- ^ Velocity
-> Point2 -- ^ Acceleration
-> HitEffect
-> Float -- ^ Bullet width
-> Particle
accelBulAt maycid col pos vel acc hiteff width = BulletPt
{ _ptDraw = drawBul
, _ptUpdate = \w -> mvBullet w . setVel
, _ptVel = vel
, _btDrag = 1
, _ptColor = col
, _ptTrail = [pos]
, _ptCrIgnore = maycid
, _ptWidth = width
, _ptTimer = 100
, _ptHitEff = hiteff
}
where
setVel pt = pt & ptVel .+.+~ acc
turnBulAt
:: Maybe Int -- ^ Pass-through creature id
-> Color
-> Point2 -- ^ Start position
-> Point2 -- ^ Velocity
-> Point2 -- ^ Acceleration
-> HitEffect
-> Float -- ^ Bullet width
-> Point2 -- ^ Target position
-> Particle
turnBulAt maycid col pos vel acc hiteff width tpos = BulletPt
{ _ptDraw = drawBul
, _ptUpdate = \w -> mvBullet w . setVel
, _ptVel = vel
, _btDrag = 1
, _ptColor = col
, _ptTrail = [pos]
, _ptCrIgnore = maycid
, _ptWidth = width
, _ptTimer = 100
, _ptHitEff = hiteff
}
where
setVel pt = pt & ptVel %~ vecTurnTo 0.1 (head $ _ptTrail pt) tpos
theupdate = case vfact of
Just _ -> \w -> resetVel . mvBullet w . updatemod
Nothing -> \w -> mvBullet w . updatemod
resetVel = second $ fmap $ (ptUpdate .~ (\w -> mvBullet w . updatemod)) . (ptVel .~ vel)