Unify bullet creation
This commit is contained in:
@@ -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)
|
||||
]
|
||||
)
|
||||
|
||||
@@ -82,6 +82,7 @@ data CombineType
|
||||
| PRISM
|
||||
| LIGHTER
|
||||
| MAGNET
|
||||
| ANTIMATTER
|
||||
| PLATE
|
||||
| MICROCHIP
|
||||
| AIUNIT
|
||||
|
||||
@@ -197,7 +197,6 @@ stackedInventory = IM.fromList $ zip [0..]
|
||||
,teslaGun
|
||||
,blinkGun
|
||||
,miniGunX 3
|
||||
,bezierGun
|
||||
-- ,multGun
|
||||
,boosterGun
|
||||
,remoteLauncher
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user