Cleanup and tweak new explosions
This commit is contained in:
+42
-73
@@ -929,87 +929,56 @@ aFlame a cid w
|
|||||||
resetAngle = set (creatures . ix cid . crInv . ix (_crInvSel cr) . wpFire)
|
resetAngle = set (creatures . ix cid . crInv . ix (_crInvSel cr) . wpFire)
|
||||||
(shoot $ aFlame angle)
|
(shoot $ aFlame angle)
|
||||||
|
|
||||||
-- The following should be improved....
|
-- The following should be improved.... I've made a first pass
|
||||||
makePoisonExplosionAt :: Point2 -> World -> World
|
makePoisonExplosionAt :: Point2 -> World -> World
|
||||||
makePoisonExplosionAt p w = soundOnce grenadeBang
|
makePoisonExplosionAt p w = soundOnce grenadeBang $ foldr (makeGasCloud p) w vels
|
||||||
$ makeGasCloud p (velocities!!1)
|
where
|
||||||
$ makeGasCloud p (velocities!!2)
|
vels = evalState (sequence ( replicate 25 (randInCirc 2) )) (_randGen w)
|
||||||
$ makeGasCloud p (velocities!!3)
|
-- just change the number after replicate to get more or less clouds
|
||||||
w
|
-- suggested change: use random positions, offset from p, rather than velocities
|
||||||
where
|
-- so, p +.+ randomOffset
|
||||||
xs = randomRs (-2,2) $ _randGen w -- one infinite list of randoms
|
-- currently the clouds push away from each other rather hard if they are close
|
||||||
velocities = zip (take 10 xs) (drop 10 xs)
|
|
||||||
|
|
||||||
makeTeslaExplosionAt :: Point2 -> World -> World
|
makeTeslaExplosionAt :: Point2 -> World -> World
|
||||||
makeTeslaExplosionAt pos w = soundOnce grenadeBang
|
makeTeslaExplosionAt pos w = soundOnce grenadeBang $ foldr ($) w listOfFunctions -- a bit shorter
|
||||||
-- This is obviously the best way....
|
where
|
||||||
$ over projectiles (IM.insert (pks!!1) (makeTeslaArcAt (pks!!1) pos (xs!!1)))
|
-- rad or 360? Radians (hopefully) everywhere
|
||||||
$ over projectiles (IM.insert (pks!!2) (makeTeslaArcAt (pks!!2) pos (xs!!2)))
|
xs = randomRs (0, 2*pi) $ _randGen w
|
||||||
$ over projectiles (IM.insert (pks!!3) (makeTeslaArcAt (pks!!3) pos (xs!!3)))
|
p = newProjectileKey w
|
||||||
$ over projectiles (IM.insert (pks!!4) (makeTeslaArcAt (pks!!4) pos (xs!!4)))
|
pks = [p..]
|
||||||
$ over projectiles (IM.insert (pks!!5) (makeTeslaArcAt (pks!!5) pos (xs!!5)))
|
listOfFunctions = map
|
||||||
$ over projectiles (IM.insert (pks!!6) (makeTeslaArcAt (pks!!6) pos (xs!!6)))
|
(\i -> over projectiles (IM.insert (pks!!i) (makeTeslaArcAt (pks!!i) pos (xs!!i))))
|
||||||
$ over projectiles (IM.insert (pks!!7) (makeTeslaArcAt (pks!!7) pos (xs!!7)))
|
[1 .. 29]
|
||||||
$ 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..]
|
|
||||||
|
|
||||||
|
-- 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 :: Point2 -> World -> World
|
||||||
makeFlameExplosionAt p w = soundOnce grenadeBang
|
makeFlameExplosionAt p w = soundOnce grenadeBang $ over particles' (newFlames ++ ) w
|
||||||
$ makeFlame p (velocities!!1) (Just 0)
|
where
|
||||||
$ makeFlame p (velocities!!2) (Just 90)
|
newFlames = zipWith makeFlameWithVelAndTime velocities timers
|
||||||
$ makeFlame p (velocities!!3) (Just 180)
|
makeFlameWithVelAndTime vel time = aFlameParticle time p vel Nothing
|
||||||
$ makeFlame p (velocities!!4) (Just 0)
|
velocities = evalState (sequence ( replicate 15 (randInCirc 1) )) (_randGen w)
|
||||||
$ makeFlame p (velocities!!5) (Just 0)
|
timers = randomRs (80,100) $ _randGen w
|
||||||
$ makeFlame p (velocities!!6) (Just 0)
|
-- the ( Nthing :: Maybe Int ) here is "maybe" a creature id that the
|
||||||
$ makeFlame p (velocities!!7) (Just 0)
|
-- particle passes through for the first frame of its existence
|
||||||
$ 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)
|
|
||||||
|
|
||||||
|
-- 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 :: Point2 -> Point2 -> Maybe Int -> World -> World
|
||||||
makeFlame pos vel maycid = over particles' ((:) theFlame)
|
makeFlame pos vel maycid = over particles' (aFlameParticle 100 pos vel maycid : )
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
drawFlame :: Point2 -> Particle' -> Picture
|
drawFlame :: Point2 -> Particle' -> Picture
|
||||||
drawFlame rotd pt = thePic
|
drawFlame rotd pt = thePic
|
||||||
|
|||||||
Reference in New Issue
Block a user