diff --git a/src/Dodge/Combine/Combinations.hs b/src/Dodge/Combine/Combinations.hs index 8f6f3e888..ef3cebe44 100644 --- a/src/Dodge/Combine/Combinations.hs +++ b/src/Dodge/Combine/Combinations.hs @@ -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) ] ) diff --git a/src/Dodge/Combine/Data.hs b/src/Dodge/Combine/Data.hs index f328a9c1a..421ab1138 100644 --- a/src/Dodge/Combine/Data.hs +++ b/src/Dodge/Combine/Data.hs @@ -82,6 +82,7 @@ data CombineType | PRISM | LIGHTER | MAGNET + | ANTIMATTER | PLATE | MICROCHIP | AIUNIT diff --git a/src/Dodge/Creature.hs b/src/Dodge/Creature.hs index 3f99da145..43ac73e46 100644 --- a/src/Dodge/Creature.hs +++ b/src/Dodge/Creature.hs @@ -197,7 +197,6 @@ stackedInventory = IM.fromList $ zip [0..] ,teslaGun ,blinkGun ,miniGunX 3 - ,bezierGun -- ,multGun ,boosterGun ,remoteLauncher diff --git a/src/Dodge/Item/Weapon.hs b/src/Dodge/Item/Weapon.hs index ab9f0d6d4..4089458fe 100644 --- a/src/Dodge/Item/Weapon.hs +++ b/src/Dodge/Item/Weapon.hs @@ -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 diff --git a/src/Dodge/Item/Weapon/AmmoParams.hs b/src/Dodge/Item/Weapon/AmmoParams.hs index af1939624..ac44376c8 100644 --- a/src/Dodge/Item/Weapon/AmmoParams.hs +++ b/src/Dodge/Item/Weapon/AmmoParams.hs @@ -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 diff --git a/src/Dodge/Item/Weapon/Bezier.hs b/src/Dodge/Item/Weapon/Bezier.hs deleted file mode 100644 index 2d28e88f1..000000000 --- a/src/Dodge/Item/Weapon/Bezier.hs +++ /dev/null @@ -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) diff --git a/src/Dodge/Item/Weapon/BulletGun/Cane.hs b/src/Dodge/Item/Weapon/BulletGun/Cane.hs index 66b4c66c2..205bd0627 100644 --- a/src/Dodge/Item/Weapon/BulletGun/Cane.hs +++ b/src/Dodge/Item/Weapon/BulletGun/Cane.hs @@ -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] ] <> diff --git a/src/Dodge/Item/Weapon/BulletGun/Rod.hs b/src/Dodge/Item/Weapon/BulletGun/Rod.hs index 248c3580f..7976afd2b 100644 --- a/src/Dodge/Item/Weapon/BulletGun/Rod.hs +++ b/src/Dodge/Item/Weapon/BulletGun/Rod.hs @@ -43,7 +43,7 @@ bangRod = defaultGun , _bore = 2 , _gunBarrels = SingleBarrel 0.1 } - , _itUse = useAmmoParamsRate 6 upHammer + , _itUse = ruseAmmoParamsRate 6 upHammer [ ammoHammerCheck , useTimeCheck , withSoundStart autoGunS diff --git a/src/Dodge/Item/Weapon/BulletGun/Stick.hs b/src/Dodge/Item/Weapon/BulletGun/Stick.hs index 326665800..2f0543238 100644 --- a/src/Dodge/Item/Weapon/BulletGun/Stick.hs +++ b/src/Dodge/Item/Weapon/BulletGun/Stick.hs @@ -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 diff --git a/src/Dodge/Item/Weapon/BulletGuns.hs b/src/Dodge/Item/Weapon/BulletGuns.hs index bcbbbba00..0b0abe650 100644 --- a/src/Dodge/Item/Weapon/BulletGuns.hs +++ b/src/Dodge/Item/Weapon/BulletGuns.hs @@ -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 diff --git a/src/Dodge/Movement/Turn.hs b/src/Dodge/Movement/Turn.hs index 18be39d4a..11b294b60 100644 --- a/src/Dodge/Movement/Turn.hs +++ b/src/Dodge/Movement/Turn.hs @@ -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 diff --git a/src/Dodge/Particle/Bullet/HitEffect.hs b/src/Dodge/Particle/Bullet/HitEffect.hs index 5aaa42bcb..a7047faae 100644 --- a/src/Dodge/Particle/Bullet/HitEffect.hs +++ b/src/Dodge/Particle/Bullet/HitEffect.hs @@ -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 diff --git a/src/Dodge/Particle/Bullet/Spawn.hs b/src/Dodge/Particle/Bullet/Spawn.hs index 4c88e6405..1b40c42f8 100644 --- a/src/Dodge/Particle/Bullet/Spawn.hs +++ b/src/Dodge/Particle/Bullet/Spawn.hs @@ -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)