Store past damages in vector form
This commit is contained in:
@@ -31,6 +31,8 @@ import System.Random
|
|||||||
--import qualified Data.Set as S
|
--import qualified Data.Set as S
|
||||||
--import qualified Data.Map as M
|
--import qualified Data.Map as M
|
||||||
import Data.Monoid
|
import Data.Monoid
|
||||||
|
import qualified Data.Vector as V
|
||||||
|
import qualified Data.Vector.Mutable as MV
|
||||||
|
|
||||||
dummyUpdate :: CRUpdate
|
dummyUpdate :: CRUpdate
|
||||||
dummyUpdate cr _ = (Endo id, Just cr)
|
dummyUpdate cr _ = (Endo id, Just cr)
|
||||||
@@ -80,10 +82,18 @@ crFriction _ _ = V2 0 0
|
|||||||
|
|
||||||
doDamage :: Creature -> Creature
|
doDamage :: Creature -> Creature
|
||||||
doDamage cr = set (crState . crDamage) []
|
doDamage cr = set (crState . crDamage) []
|
||||||
$ over (crState . crPastDamage) (forceFoldable . take 10 . (dams :) ) damagedCr
|
. over (crState . crPastDamage) (advancePastDamages dams)
|
||||||
|
$ snd $ _crApplyDamage cr dams cr
|
||||||
where
|
where
|
||||||
dams = _crDamage $ _crState cr
|
dams = _crDamage $ _crState cr
|
||||||
damagedCr = snd $ _crApplyDamage cr dams cr
|
|
||||||
|
advancePastDamages :: [DamageType] -> V.Vector [DamageType] -> V.Vector [DamageType]
|
||||||
|
advancePastDamages newDs v = f $ V.backpermute v bpVector
|
||||||
|
where
|
||||||
|
f = V.modify $ \v' -> MV.write v' 0 newDs
|
||||||
|
|
||||||
|
bpVector :: V.Vector Int
|
||||||
|
bpVector = V.fromList $ 0 : [0 .. 18]
|
||||||
|
|
||||||
movementSideEff :: Creature -> World -> World
|
movementSideEff :: Creature -> World -> World
|
||||||
movementSideEff cr w
|
movementSideEff cr w
|
||||||
|
|||||||
@@ -10,9 +10,10 @@ import Picture.Data
|
|||||||
|
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
import qualified Data.IntSet as IS
|
import qualified Data.IntSet as IS
|
||||||
|
import qualified Data.Vector as V
|
||||||
data CreatureState = CrSt
|
data CreatureState = CrSt
|
||||||
{ _crDamage :: [DamageType]
|
{ _crDamage :: [DamageType]
|
||||||
, _crPastDamage :: [[DamageType]]
|
, _crPastDamage :: V.Vector [DamageType]
|
||||||
, _crSpState :: CrSpState
|
, _crSpState :: CrSpState
|
||||||
, _crDropsOnDeath :: CreatureDropType
|
, _crDropsOnDeath :: CreatureDropType
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -72,7 +72,7 @@ data World = World
|
|||||||
, _mousePos :: !Point2
|
, _mousePos :: !Point2
|
||||||
, _testString :: String
|
, _testString :: String
|
||||||
, _yourID :: !Int
|
, _yourID :: !Int
|
||||||
, _worldEvents :: (World -> World)
|
, _worldEvents :: World -> World
|
||||||
, _pressPlates :: IM.IntMap PressPlate
|
, _pressPlates :: IM.IntMap PressPlate
|
||||||
, _buttons :: IM.IntMap Button
|
, _buttons :: IM.IntMap Button
|
||||||
, _soundQueue :: [(Int,Int16)]
|
, _soundQueue :: [(Int,Int16)]
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import Picture
|
|||||||
|
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
import qualified Data.IntMap.Strict as IM
|
import qualified Data.IntMap.Strict as IM
|
||||||
|
import qualified Data.Vector as V
|
||||||
import Data.List
|
import Data.List
|
||||||
import Data.Monoid
|
import Data.Monoid
|
||||||
|
|
||||||
@@ -58,7 +59,7 @@ defaultCreature = Creature
|
|||||||
defaultState :: CreatureState
|
defaultState :: CreatureState
|
||||||
defaultState = CrSt
|
defaultState = CrSt
|
||||||
{ _crDamage = []
|
{ _crDamage = []
|
||||||
, _crPastDamage = []
|
, _crPastDamage = V.fromList $ replicate 20 []
|
||||||
, _crSpState = GenCr
|
, _crSpState = GenCr
|
||||||
, _crDropsOnDeath = DropAll
|
, _crDropsOnDeath = DropAll
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import qualified Data.IntMap.Strict as IM
|
|||||||
import qualified Data.Map as M
|
import qualified Data.Map as M
|
||||||
import qualified Data.Set as S
|
import qualified Data.Set as S
|
||||||
import Data.Graph.Inductive.Graph hiding ((&))
|
import Data.Graph.Inductive.Graph hiding ((&))
|
||||||
|
--import qualified Data.Vector.Fusion.Stream.Monadic as VS
|
||||||
defaultWorld :: World
|
defaultWorld :: World
|
||||||
defaultWorld = World
|
defaultWorld = World
|
||||||
{ _keys = S.empty
|
{ _keys = S.empty
|
||||||
|
|||||||
@@ -43,7 +43,6 @@ initialWorld = defaultWorld
|
|||||||
[V2 x y | x <- [-5,-3..5] , y <- [-5,-3..5]]
|
[V2 x y | x <- [-5,-3..5] , y <- [-5,-3..5]]
|
||||||
, _pressPlates = IM.empty
|
, _pressPlates = IM.empty
|
||||||
, _buttons = IM.empty
|
, _buttons = IM.empty
|
||||||
, _soundQueue = []
|
|
||||||
, _sounds = M.empty
|
, _sounds = M.empty
|
||||||
, _decorations = IM.empty
|
, _decorations = IM.empty
|
||||||
, _storedLevel = Nothing
|
, _storedLevel = Nothing
|
||||||
|
|||||||
+4
-2
@@ -24,6 +24,7 @@ import qualified SDL.Mixer as Mix
|
|||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import qualified Data.IntMap.Strict as IM
|
import qualified Data.IntMap.Strict as IM
|
||||||
import qualified Data.Map as M
|
import qualified Data.Map as M
|
||||||
|
import qualified Data.Vector.Fusion.Stream.Monadic as VS
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
import Control.Monad.Trans
|
import Control.Monad.Trans
|
||||||
import Control.Monad.Trans.Maybe
|
import Control.Monad.Trans.Maybe
|
||||||
@@ -147,8 +148,9 @@ playIfFree c times = do
|
|||||||
As for 'playSoundQueue', but with positional information in the form of an Int16.
|
As for 'playSoundQueue', but with positional information in the form of an Int16.
|
||||||
-}
|
-}
|
||||||
playPositionalSoundQueue :: IM.IntMap Mix.Chunk -> [(Int,Int16)] -> IO ()
|
playPositionalSoundQueue :: IM.IntMap Mix.Chunk -> [(Int,Int16)] -> IO ()
|
||||||
playPositionalSoundQueue chunkMap ns = forM_ ns $ \(n,a) ->
|
playPositionalSoundQueue chunkMap = VS.mapM_ ( \(n,a) ->
|
||||||
runMaybeT $ playIfFree (chunkMap IM.! n) Mix.Once >>= setChannelPos a
|
runMaybeT $ playIfFree (chunkMap IM.! n) Mix.Once >>= setChannelPos a )
|
||||||
|
. VS.fromList
|
||||||
|
|
||||||
setChannelPos :: Int16 -> Mix.Channel -> MaybeT IO Mix.Channel
|
setChannelPos :: Int16 -> Mix.Channel -> MaybeT IO Mix.Channel
|
||||||
setChannelPos a i = do
|
setChannelPos a i = do
|
||||||
|
|||||||
Reference in New Issue
Block a user