Unify bullet creation
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -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]
|
||||
]
|
||||
<>
|
||||
|
||||
@@ -43,7 +43,7 @@ bangRod = defaultGun
|
||||
, _bore = 2
|
||||
, _gunBarrels = SingleBarrel 0.1
|
||||
}
|
||||
, _itUse = useAmmoParamsRate 6 upHammer
|
||||
, _itUse = ruseAmmoParamsRate 6 upHammer
|
||||
[ ammoHammerCheck
|
||||
, useTimeCheck
|
||||
, withSoundStart autoGunS
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user