From 4360c3b53009269386c9dae8f4d379fb12f3fcea Mon Sep 17 00:00:00 2001 From: jgk Date: Sat, 27 Mar 2021 22:22:50 +0100 Subject: [PATCH] Cleanup and tweak new explosions --- src/Dodge/Item/Weapon.hs | 117 ++++++++++++++------------------------- 1 file changed, 43 insertions(+), 74 deletions(-) diff --git a/src/Dodge/Item/Weapon.hs b/src/Dodge/Item/Weapon.hs index 47d87e27c..12846e785 100644 --- a/src/Dodge/Item/Weapon.hs +++ b/src/Dodge/Item/Weapon.hs @@ -929,87 +929,56 @@ aFlame a cid w resetAngle = set (creatures . ix cid . crInv . ix (_crInvSel cr) . wpFire) (shoot $ aFlame angle) --- The following should be improved.... +-- The following should be improved.... I've made a first pass makePoisonExplosionAt :: Point2 -> World -> World -makePoisonExplosionAt p w = soundOnce grenadeBang - $ makeGasCloud p (velocities!!1) - $ makeGasCloud p (velocities!!2) - $ makeGasCloud p (velocities!!3) - w - where - xs = randomRs (-2,2) $ _randGen w -- one infinite list of randoms - velocities = zip (take 10 xs) (drop 10 xs) +makePoisonExplosionAt p w = soundOnce grenadeBang $ foldr (makeGasCloud p) w vels + where + vels = evalState (sequence ( replicate 25 (randInCirc 2) )) (_randGen w) +-- just change the number after replicate to get more or less clouds +-- suggested change: use random positions, offset from p, rather than velocities +-- so, p +.+ randomOffset +-- currently the clouds push away from each other rather hard if they are close makeTeslaExplosionAt :: Point2 -> World -> World -makeTeslaExplosionAt pos w = soundOnce grenadeBang - -- This is obviously the best way.... - $ over projectiles (IM.insert (pks!!1) (makeTeslaArcAt (pks!!1) pos (xs!!1))) - $ over projectiles (IM.insert (pks!!2) (makeTeslaArcAt (pks!!2) pos (xs!!2))) - $ over projectiles (IM.insert (pks!!3) (makeTeslaArcAt (pks!!3) pos (xs!!3))) - $ over projectiles (IM.insert (pks!!4) (makeTeslaArcAt (pks!!4) pos (xs!!4))) - $ over projectiles (IM.insert (pks!!5) (makeTeslaArcAt (pks!!5) pos (xs!!5))) - $ over projectiles (IM.insert (pks!!6) (makeTeslaArcAt (pks!!6) pos (xs!!6))) - $ over projectiles (IM.insert (pks!!7) (makeTeslaArcAt (pks!!7) pos (xs!!7))) - $ over projectiles (IM.insert (pks!!8) (makeTeslaArcAt (pks!!8) pos (xs!!8))) - $ over projectiles (IM.insert (pks!!9) (makeTeslaArcAt (pks!!9) pos (xs!!9))) - $ over projectiles (IM.insert (pks!!10) (makeTeslaArcAt (pks!!10) pos (xs!!10))) - $ over projectiles (IM.insert (pks!!11) (makeTeslaArcAt (pks!!11) pos (xs!!11))) - $ over projectiles (IM.insert (pks!!12) (makeTeslaArcAt (pks!!12) pos (xs!!12))) - $ over projectiles (IM.insert (pks!!13) (makeTeslaArcAt (pks!!13) pos (xs!!13))) - $ over projectiles (IM.insert (pks!!14) (makeTeslaArcAt (pks!!14) pos (xs!!14))) - $ over projectiles (IM.insert (pks!!15) (makeTeslaArcAt (pks!!15) pos (xs!!15))) - $ over projectiles (IM.insert (pks!!16) (makeTeslaArcAt (pks!!16) pos (xs!!16))) - $ over projectiles (IM.insert (pks!!17) (makeTeslaArcAt (pks!!17) pos (xs!!17))) - $ over projectiles (IM.insert (pks!!18) (makeTeslaArcAt (pks!!18) pos (xs!!18))) - $ over projectiles (IM.insert (pks!!19) (makeTeslaArcAt (pks!!19) pos (xs!!19))) - $ over projectiles (IM.insert (pks!!20) (makeTeslaArcAt (pks!!20) pos (xs!!20))) - $ over projectiles (IM.insert (pks!!21) (makeTeslaArcAt (pks!!21) pos (xs!!21))) - $ over projectiles (IM.insert (pks!!22) (makeTeslaArcAt (pks!!22) pos (xs!!22))) - $ over projectiles (IM.insert (pks!!23) (makeTeslaArcAt (pks!!23) pos (xs!!23))) - $ over projectiles (IM.insert (pks!!24) (makeTeslaArcAt (pks!!24) pos (xs!!24))) - $ over projectiles (IM.insert (pks!!25) (makeTeslaArcAt (pks!!25) pos (xs!!25))) - $ over projectiles (IM.insert (pks!!26) (makeTeslaArcAt (pks!!26) pos (xs!!26))) - $ over projectiles (IM.insert (pks!!27) (makeTeslaArcAt (pks!!27) pos (xs!!27))) - $ over projectiles (IM.insert (pks!!28) (makeTeslaArcAt (pks!!28) pos (xs!!28))) - $ over projectiles (IM.insert (pks!!29) (makeTeslaArcAt (pks!!29) pos (xs!!29))) - w - where - -- rad or 360? - xs = randomRs (0,7) $ _randGen w - p = newProjectileKey w - pks = [p..] - +makeTeslaExplosionAt pos w = soundOnce grenadeBang $ foldr ($) w listOfFunctions -- a bit shorter + where + -- rad or 360? Radians (hopefully) everywhere + xs = randomRs (0, 2*pi) $ _randGen w + p = newProjectileKey w + pks = [p..] + listOfFunctions = map + (\i -> over projectiles (IM.insert (pks!!i) (makeTeslaArcAt (pks!!i) pos (xs!!i)))) + [1 .. 29] + +-- slightly more work done on this one, want the flames to last for different +-- times +-- the new flames are directly added to the list of particles makeFlameExplosionAt :: Point2 -> World -> World -makeFlameExplosionAt p w = soundOnce grenadeBang - $ makeFlame p (velocities!!1) (Just 0) - $ makeFlame p (velocities!!2) (Just 90) - $ makeFlame p (velocities!!3) (Just 180) - $ makeFlame p (velocities!!4) (Just 0) - $ makeFlame p (velocities!!5) (Just 0) - $ makeFlame p (velocities!!6) (Just 0) - $ makeFlame p (velocities!!7) (Just 0) - $ makeFlame p (velocities!!8) (Just 0) - $ makeFlame p (velocities!!9) (Just 0) - $ makeFlame p (velocities!!0) (Just 0) - $ w - where - xs = randomRs (-2,2) $ _randGen w -- one infinite list of randoms - velocities = zip (take 10 xs) (drop 10 xs) +makeFlameExplosionAt p w = soundOnce grenadeBang $ over particles' (newFlames ++ ) w + where + newFlames = zipWith makeFlameWithVelAndTime velocities timers + makeFlameWithVelAndTime vel time = aFlameParticle time p vel Nothing + velocities = evalState (sequence ( replicate 15 (randInCirc 1) )) (_randGen w) + timers = randomRs (80,100) $ _randGen w + -- the ( Nthing :: Maybe Int ) here is "maybe" a creature id that the + -- particle passes through for the first frame of its existence +-- take out the flame particle from makeFlame +aFlameParticle :: Int -> Point2 -> Point2 -> Maybe Int -> Particle' +aFlameParticle t pos vel maycid = Pt' + { _ptDraw = drawFlame vel + , _ptUpdate' = moveFlame vel + , _btVel' = vel + , _btColor' = red + , _btPos' = pos + , _btPassThrough' = maycid + , _btWidth' = 4 + , _btTimer' = t + , _btHitEffect' = destroyOnImpact (doFlameDam 1) noEff noEff + } makeFlame :: Point2 -> Point2 -> Maybe Int -> World -> World -makeFlame pos vel maycid = over particles' ((:) theFlame) - where theFlame = - Pt' { _ptDraw = drawFlame vel - , _ptUpdate' = moveFlame vel - , _btVel' = vel - , _btColor' = red - , _btPos' = pos - , _btPassThrough' = maycid - , _btWidth' = 4 - , _btTimer' = 100 - , _btHitEffect' = destroyOnImpact (doFlameDam 1) noEff noEff - } +makeFlame pos vel maycid = over particles' (aFlameParticle 100 pos vel maycid : ) drawFlame :: Point2 -> Particle' -> Picture drawFlame rotd pt = thePic