From 3a8b28a916f4651170739c013291c67e79402ece Mon Sep 17 00:00:00 2001 From: justin Date: Sat, 28 Aug 2021 14:33:23 +0100 Subject: [PATCH] Trippy flamer --- src/Dodge/Data.hs | 1 + src/Dodge/Default.hs | 14 ++++++- src/Dodge/Default/World.hs | 3 +- src/Dodge/Item/Weapon.hs | 13 +++--- src/Dodge/Item/Weapon/AutoGun.hs | 2 +- src/Dodge/Item/Weapon/Bezier.hs | 2 +- src/Dodge/Item/Weapon/TriggerType.hs | 57 +++++++++++++++++++++------ src/Dodge/LightSources.hs | 4 ++ src/Dodge/WorldEvent.hs | 2 +- src/Dodge/WorldEvent/SpawnParticle.hs | 11 ++++-- 10 files changed, 81 insertions(+), 28 deletions(-) diff --git a/src/Dodge/Data.hs b/src/Dodge/Data.hs index eda7c1fdd..ec0a85e4a 100644 --- a/src/Dodge/Data.hs +++ b/src/Dodge/Data.hs @@ -149,6 +149,7 @@ data TempLightSource = TLS , _tlsRad :: !Float , _tlsIntensity :: !Point3 , _tlsUpdate :: World -> TempLightSource -> (World, Maybe TempLightSource) + , _tlsTime :: !Int } data Creature = Creature { _crPos :: Point2 diff --git a/src/Dodge/Default.hs b/src/Dodge/Default.hs index 3e45f6a67..66792aaec 100644 --- a/src/Dodge/Default.hs +++ b/src/Dodge/Default.hs @@ -179,5 +179,17 @@ defaultPP = PressPlate , _ppText = "Pressure plate" } - +defaultTLS :: TempLightSource +defaultTLS = TLS + { _tlsPos = 0 + , _tlsRad = 0 + , _tlsIntensity = 0.5 + , _tlsUpdate = f + , _tlsTime = 1 + } + where + f w t + | _tlsTime t <= 0 + = (w, Nothing) + | otherwise = (w, Just $ t & tlsTime -~ 1) diff --git a/src/Dodge/Default/World.hs b/src/Dodge/Default/World.hs index 3e5b97750..e3338f732 100644 --- a/src/Dodge/Default/World.hs +++ b/src/Dodge/Default/World.hs @@ -94,6 +94,7 @@ youLight = ,_tlsRad = 300 ,_tlsIntensity = 0.1 ,_tlsUpdate = \w _ -> (w, Just (youLight {_tlsPos = f $ _crPos (you w)})) + ,_tlsTime = 0 } where - f (V2 x y) = V3 x y 0 + f (V2 x y) = V3 x y 25 diff --git a/src/Dodge/Item/Weapon.hs b/src/Dodge/Item/Weapon.hs index 88ff96941..f3308f40d 100644 --- a/src/Dodge/Item/Weapon.hs +++ b/src/Dodge/Item/Weapon.hs @@ -290,7 +290,7 @@ hvAutoGun = defaultAutoGun , _itUse = useAmmoParams , _itUseModifiers = [ ammoCheckI - , rateIncABI 24 7 (torqueBeforeForcedI 0.1) (torqueAfterI 0.2) + , rateIncABI 24 7 (torqueBeforeAtLeast 0.1 0.1) (torqueAfterI 0.2) , withSoundI longGunSound , withThinSmokeI , withMuzFlareI @@ -347,8 +347,8 @@ miniGun = defaultAutoGun , _wpLoadedAmmo = 1500 , _wpReloadTime = 200 , _wpReloadState = 0 - , _wpMaxWarmUp = 50 - , _itUseRate = 1 + , _wpMaxWarmUp = 100 + , _itUseRate = 0 , _itUseTime = 0 , _itUse = useAmmoParamsVelMod vm4 , _itUseModifiers = @@ -358,8 +358,8 @@ miniGun = defaultAutoGun , withRecoilI 25 , withSoundForI 28 2 , torqueAfterI 0.05 - --, withSidePushI 53 - --, withRandomOffsetI 12 + , withSidePushI 53 + , withRandomOffsetI 12 , trigDoAlso (useAmmoParamsVelMod vm1) --, torqueBeforeForcedI 0.001 , withSidePushI 52 @@ -565,7 +565,8 @@ flamer = defaultAutoGun , _itUseModifiers = [ ammoUseCheckI , withSidePushI 5 - , withSidePushAfterI 10 + , withTempLight 1 100 (V3 1 0 0) + --, withSidePushAfterI 20 ] , _wpSpread = 0 , _wpRange = 8 diff --git a/src/Dodge/Item/Weapon/AutoGun.hs b/src/Dodge/Item/Weapon/AutoGun.hs index d0d02d456..88f97cbac 100644 --- a/src/Dodge/Item/Weapon/AutoGun.hs +++ b/src/Dodge/Item/Weapon/AutoGun.hs @@ -34,7 +34,7 @@ autoGun = defaultAutoGun [ ammoCheckI , useTimeCheckI , charFiringStratI - [('M', torqueBeforeForcedI 0.05) + [('M', torqueBefore 0.05) ,('S', hammerCheckI) ] , withSoundI autoGunSound diff --git a/src/Dodge/Item/Weapon/Bezier.hs b/src/Dodge/Item/Weapon/Bezier.hs index dcf2ff887..bb58e3668 100644 --- a/src/Dodge/Item/Weapon/Bezier.hs +++ b/src/Dodge/Item/Weapon/Bezier.hs @@ -31,7 +31,7 @@ bezierGun = defaultGun , useAmmo 1 , withMuzFlareI . withRecoilI 40 - . torqueBeforeForcedI 0.05 + . torqueBefore 0.05 ] , _itFloorPict = onLayer FlItLayer bezierGunPic , _itEquipPict = pictureWeaponOnAim bezierGunPic diff --git a/src/Dodge/Item/Weapon/TriggerType.hs b/src/Dodge/Item/Weapon/TriggerType.hs index aae2596e6..b4f152a1a 100644 --- a/src/Dodge/Item/Weapon/TriggerType.hs +++ b/src/Dodge/Item/Weapon/TriggerType.hs @@ -5,10 +5,12 @@ module Dodge.Item.Weapon.TriggerType , withMuzFlareI , withOldDir , trigDoAlso + , withTempLight --, withVelWthHiteff , ammoUseCheckI , rateIncABI - , torqueBeforeForcedI + , torqueBefore + , torqueBeforeAtLeast , torqueAfterI , withSoundI , withSoundForI @@ -38,6 +40,7 @@ import Dodge.WorldEvent.Cloud import Dodge.RandomHelp import Dodge.Item.Attachment.Data import Dodge.Item.Data +import Dodge.Default import Geometry import System.Random @@ -162,23 +165,25 @@ Applied before the underlying effect. -} withSidePushI :: Float -- ^ Maximal possible side push amount -> ChainEffect -withSidePushI maxSide eff item cr w = eff item cr $ +withSidePushI maxSide eff item cr w = eff item (push cr) $ w & creatures . ix cid %~ push + & randGen .~ g where cid = _crID cr push = over crPos (+.+ rotateV (_crDir cr) (V2 0 (pushAmount / _crMass cr))) - (pushAmount, _) = randomR (-maxSide,maxSide) $ _randGen w + (pushAmount, g) = randomR (-maxSide,maxSide) $ _randGen w -- consider unifying the pushes using a direction vector {- | Pushes a creature sideways by a random amount. Applied after the underlying effect. -} withSidePushAfterI :: Float -- ^ Maximal possible side push amount -> ChainEffect -withSidePushAfterI maxSide eff item cr w = over (creatures . ix cid) push . eff item cr $ w +withSidePushAfterI maxSide eff item cr w = over (creatures . ix cid) push . eff item cr $ + w & randGen .~ g where cid = _crID cr push = over crPos (+.+ rotateV (_crDir cr) (V2 0 (pushAmount / _crMass cr))) - (pushAmount, _) = randomR (-maxSide,maxSide) $ _randGen w + (pushAmount, g) = randomR (-maxSide,maxSide) $ _randGen w useAmmo :: Int -- ^ amount of ammo to use -> ChainEffect @@ -253,6 +258,18 @@ shootL f cr invid w && _itUseTime item == 0 && _wpLoadedAmmo item > 0 reloadCondition = _wpLoadedAmmo item == 0 +withTempLight :: Int -> Float -> V3 Float -> ChainEffect +withTempLight time rad col eff item cr = eff item cr + . over tempLightSources (theTLS :) + where + theTLS = defaultTLS + { _tlsPos = V3 x y 20 + , _tlsRad=rad + , _tlsIntensity = col + , _tlsTime = time + } + V2 x y = _crPos cr +.+ 5 *.* unitVectorAtAngle (_crDir cr) + withMuzFlareI :: ChainEffect withMuzFlareI f it cr w = tempLightForAt 3 pos . muzzleFlashAt pos2 $ f it cr w where @@ -278,12 +295,26 @@ withRandomOffsetI offsetAmount f item cr w = f item (cr & crPos %~ (+.+ offV)) $ where (offsetVal , g) = randomR (-offsetAmount,offsetAmount) $ _randGen w offV = rotateV (_crDir cr) (V2 0 offsetVal) --- | Rotates a creature with minimum rotation at least 0.1. --- Rotates the player creature before applying the effect, other creatures after. -torqueBeforeForcedI - :: Float -- ^ Max possible rotation (less the 0.1 forced rotation) +-- | Rotates a creature +torqueBefore + :: Float -- ^ Max possible rotation -> ChainEffect -torqueBeforeForcedI torque feff item cr w +torqueBefore torque feff item cr w + | cid == 0 = feff item (cr & crDir +~ rot) $ w + & randGen .~ g + & creatures . ix cid . crDir +~ rot + & cameraRot +~ rot + | otherwise = feff item cr $ set randGen g $ over (creatures . ix cid . crDir) (+rot) w + where + cid = _crID cr + (rot, g) = randomR (-torque,torque) $ _randGen w +-- | Rotates a creature with minimum rotation +-- Rotates the player creature before applying the effect, other creatures after. +torqueBeforeAtLeast + :: Float -- ^ Minimal possible rotation + -> Float -- ^ Extra possible rotation + -> ChainEffect +torqueBeforeAtLeast minTorque exTorque feff item cr w | cid == 0 = feff item (cr & crDir +~ rot') $ w & randGen .~ g & creatures . ix cid . crDir +~ rot' @@ -291,9 +322,9 @@ torqueBeforeForcedI torque feff item cr w | otherwise = feff item cr $ set randGen g $ over (creatures . ix cid . crDir) (+rot') w where cid = _crID cr - (rot, g) = randomR (-torque,torque) $ _randGen w - rot' | rot < 0 = rot - 0.1 - | otherwise = rot + 0.1 + (rot, g) = randomR (-exTorque,exTorque) $ _randGen w + rot' | rot < 0 = rot - minTorque + | otherwise = rot + minTorque -- | Rotate a randomly creature after applying an effect. torqueAfterI :: Float -- ^ Max possible rotation diff --git a/src/Dodge/LightSources.hs b/src/Dodge/LightSources.hs index d0e03627c..db111cc9e 100644 --- a/src/Dodge/LightSources.hs +++ b/src/Dodge/LightSources.hs @@ -26,6 +26,7 @@ tLightFade 0 rmax intensityF (V2 x y) = TLS , _tlsRad = rmax , _tlsIntensity = f $ intensityF 0 , _tlsUpdate = \w _ -> (w, Nothing) + , _tlsTime = 0 } where f x' = V3 x' x' x' @@ -34,6 +35,7 @@ tLightFade i rmax intensityF p@(V2 x y) = TLS , _tlsRad = rmax , _tlsIntensity = f $ intensityF i , _tlsUpdate = \w _ -> (w, Just $ tLightFade (i-1) rmax intensityF p) + , _tlsTime = 0 } where f x' = V3 x' x' x' @@ -49,12 +51,14 @@ tLightRad 0 rmax _ (V2 x y) = TLS , _tlsRad = rmax , _tlsIntensity = 0.5 , _tlsUpdate = \w _ -> (w, Nothing) + , _tlsTime = 0 } tLightRad i rmax rmin p@(V2 x y) = TLS { _tlsPos = V3 x y 0 , _tlsRad = rmax , _tlsIntensity = V3 0.5 0.5 0 , _tlsUpdate = \w _ -> (w, Just $ tLightRad (i-1) rmax rmin p) + , _tlsTime = 0 } tLightAt :: Int -> Point2 -> TempLightSource diff --git a/src/Dodge/WorldEvent.hs b/src/Dodge/WorldEvent.hs index 02de45f59..5e579913a 100644 --- a/src/Dodge/WorldEvent.hs +++ b/src/Dodge/WorldEvent.hs @@ -61,4 +61,4 @@ damCrsOnLine dam p1 p2 = over creatures (IM.map damIfOnLine) | otherwise = cr tempLightForAt :: Int -> Point2 -> World -> World -tempLightForAt i p w = w & tempLightSources %~ (:) (tLightAt i p) +tempLightForAt i p w = w & tempLightSources %~ (tLightAt i p :) diff --git a/src/Dodge/WorldEvent/SpawnParticle.hs b/src/Dodge/WorldEvent/SpawnParticle.hs index 470e9c35a..e8e077419 100644 --- a/src/Dodge/WorldEvent/SpawnParticle.hs +++ b/src/Dodge/WorldEvent/SpawnParticle.hs @@ -59,9 +59,12 @@ drawFlame rotd pt = thePic ep = _btPos' pt thePic = pictures [ glow - , aPic 3 prot2 18 (V2 (scaleChange + 1) 2 ) red - , aPic 4 prot 19 (V2 (scaleChange + 0.5) 1.5) orange - , aPic 5 prot3 20 (V2 scaleChange 1 ) white + , aPic 1 prot2 18 (V2 (scaleChange + 1) 2 ) $ V4 2 0 (-10) 0.5 + , aPic 1 prot 19 (V2 (scaleChange + 0.5) 1.5) $ V4 2 0.5 (-10) 2 + , aPic 1 prot3 20 (V2 scaleChange 1 ) $ V4 1 1 1 2 + --, aPic 3 prot2 18 (V2 (scaleChange + 1) 2 ) red + --, aPic 4 prot 19 (V2 (scaleChange + 0.5) 1.5) orange + --, aPic 5 prot3 20 (V2 scaleChange 1 ) white ] aPic :: Int -> (Point2 -> Point2) -> Float -> Point2 -> Color -> Picture aPic lay offset depth (V2 scalex scaley) col @@ -96,7 +99,7 @@ moveFlame rotd w pt _ -> (soundAndGlare damcrs , mvPt) where time = _btTimer' pt - soundAndGlare = soundFrom Flame fireSound 2 500 . over worldEvents ((.) $ flameGlareAt ep) + soundAndGlare = soundFrom Flame fireSound 2 500 -- . over worldEvents ((.) $ flameGlareAt ep) sp = _btPos' pt vel = _btVel' pt ep = sp +.+ vel