From 94552ff658684825c740562e2e1b693aabdfe084 Mon Sep 17 00:00:00 2001 From: justin Date: Thu, 18 Nov 2021 02:42:12 +0000 Subject: [PATCH] Make creature vocalizations stop on death --- src/Dodge/Creature/ChaseCrit.hs | 2 +- src/Dodge/Creature/Impulse.hs | 5 +---- src/Dodge/Creature/Perception.hs | 8 ++------ src/Dodge/Creature/Vocalization.hs | 15 +++++++++++++++ src/Dodge/SoundLogic.hs | 3 +++ src/Dodge/Update.hs | 18 ++++++++++++++++++ src/Sound/Data.hs | 5 +++-- 7 files changed, 43 insertions(+), 13 deletions(-) create mode 100644 src/Dodge/Creature/Vocalization.hs diff --git a/src/Dodge/Creature/ChaseCrit.hs b/src/Dodge/Creature/ChaseCrit.hs index a03ed418c..0d82fb2a3 100644 --- a/src/Dodge/Creature/ChaseCrit.hs +++ b/src/Dodge/Creature/ChaseCrit.hs @@ -50,7 +50,7 @@ chaseCrit = defaultCreature , _crInv = IM.fromList [(0,medkit 200)] , _crMeleeCooldown = 0 , _crFaction = ColorFaction green - , _crVocalization = Vocalization seagullBarkS 50 0 + , _crVocalization = Vocalization seagullChatterS 50 0 , _crMvType = ChaseMvType { _mvSpeed = 3 , _mvTurnRad = f diff --git a/src/Dodge/Creature/Impulse.hs b/src/Dodge/Creature/Impulse.hs index fb3226651..019bd36fc 100644 --- a/src/Dodge/Creature/Impulse.hs +++ b/src/Dodge/Creature/Impulse.hs @@ -3,6 +3,7 @@ module Dodge.Creature.Impulse ) where import Dodge.Data +import Dodge.Creature.Vocalization import Dodge.Data.SoundOrigin import Dodge.Creature.Impulse.Movement import Dodge.Creature.Impulse.UseItem @@ -86,7 +87,3 @@ followImpulse cr w imp = case imp of . soundStart (CrSound cid) cpos hitS Nothing addDam i dams = Blunt 100 cpos (posFromID i) (posFromID i) : dams -resetCrVocCoolDown :: Creature -> Creature -resetCrVocCoolDown cr = case cr ^? crVocalization . vcMaxCoolDown of - Just i -> cr & crVocalization . vcCoolDown .~ i - Nothing -> cr diff --git a/src/Dodge/Creature/Perception.hs b/src/Dodge/Creature/Perception.hs index 72ed1fa2c..21876b353 100644 --- a/src/Dodge/Creature/Perception.hs +++ b/src/Dodge/Creature/Perception.hs @@ -6,9 +6,10 @@ module Dodge.Creature.Perception where import Dodge.Data import Dodge.Creature.Perception.Data +import Dodge.Creature.Vocalization import Dodge.Creature.Memory.Data import Dodge.Base.Collide -import Dodge.SoundLogic +--import Dodge.SoundLogic import Geometry.Vector --import Geometry.Data import Geometry.Data @@ -50,11 +51,6 @@ basicAwarenessUpdate cr = case _crAttentionDir $ _crPerception cr of Fixated i -> pure $ cr & crPerception . crAwarenessLevel %~ ( IM.insert i (Cognizant 10000) . IM.mapMaybe decreaseAwareness) -vocalizationTest :: Creature -> Maybe SoundID -vocalizationTest cr = case cr ^? crVocalization . vcCoolDown of - Just 0 -> Just $ _vcSound $ _crVocalization cr - Nothing -> Nothing - cogRaised :: AwarenessLevel -> AwarenessLevel -> AwarenessLevel cogRaised Suspicious{} Cognizant{} = Cognizant 100 cogRaised _ _ = Suspicious 0 diff --git a/src/Dodge/Creature/Vocalization.hs b/src/Dodge/Creature/Vocalization.hs new file mode 100644 index 000000000..3bbede8b2 --- /dev/null +++ b/src/Dodge/Creature/Vocalization.hs @@ -0,0 +1,15 @@ +module Dodge.Creature.Vocalization where +import Dodge.Data +import Sound.Data + +import Control.Lens + +vocalizationTest :: Creature -> Maybe SoundID +vocalizationTest cr = case cr ^? crVocalization . vcCoolDown of + Just 0 -> Just $ _vcSound $ _crVocalization cr + _ -> Nothing + +resetCrVocCoolDown :: Creature -> Creature +resetCrVocCoolDown cr = case cr ^? crVocalization . vcMaxCoolDown of + Just i -> cr & crVocalization . vcCoolDown .~ i + Nothing -> cr diff --git a/src/Dodge/SoundLogic.hs b/src/Dodge/SoundLogic.hs index 9d21a3127..f51f839ae 100644 --- a/src/Dodge/SoundLogic.hs +++ b/src/Dodge/SoundLogic.hs @@ -12,6 +12,9 @@ module Dodge.SoundLogic ( , soundMultiFrom , stopSoundFrom + -- * helper to determine the angle of a sound given a world position + , soundAngle + -- * Manipulation of all sounds , haltSound , resumeSound diff --git a/src/Dodge/Update.hs b/src/Dodge/Update.hs index dfaaeb1cf..9c15bfa71 100644 --- a/src/Dodge/Update.hs +++ b/src/Dodge/Update.hs @@ -6,6 +6,8 @@ module Dodge.Update ( update ) where import Dodge.Data +import Dodge.Data.SoundOrigin +import Dodge.SoundLogic import Dodge.Menu import Dodge.Config.Data import Dodge.Base @@ -18,6 +20,7 @@ import Dodge.WorldEvent.Sound import Dodge.Wall.Delete import Dodge.Wall.Dust import Dodge.RandomHelp +import Sound.Data import Geometry import Geometry.ConvexPoly import Geometry.Vector3D @@ -29,6 +32,7 @@ import Data.Function import qualified Data.Set as S import qualified Data.IntSet as IS import qualified Data.IntMap.Strict as IM +import qualified Data.Map.Strict as M import Control.Lens import Control.Monad import Control.Monad.State @@ -53,6 +57,7 @@ functionalUpdate w = case _menuLayers w of (_ : _) -> w [] -> checkEndGame . updateRadialDistortions + . updateCreatureSoundPositions . ppEvents . updateCamera . colCrsWalls @@ -87,6 +92,19 @@ functionalUpdate w = case _menuLayers w of where (x,y) = cloudZoneOfPoint $ stripZ $ _clPos cl +updateCreatureSoundPositions :: World -> World +updateCreatureSoundPositions w = M.foldrWithKey insertSound w soundsToUpdate + where + insertSound k s w' = w & toPlaySounds %~ M.insertWith (\_ -> id) k (updateSound k s) + updateSound (CrMouth cid) s = case w ^? creatures . ix cid . crPos of + Just p -> s {_soundPos = p, _soundAngDist = Just (soundAngle p w,0)} + Nothing -> s {_soundTime = Just 0} + soundsToUpdate = M.filterWithKey (\k _ -> isCrMouth k) $ _playingSounds w + +isCrMouth :: SoundOrigin -> Bool +isCrMouth CrMouth{} = True +isCrMouth _ = False + updateModifications :: World -> World updateModifications w = foldr f w (_modifications w) where diff --git a/src/Sound/Data.hs b/src/Sound/Data.hs index 1ba202080..190cb1cc2 100644 --- a/src/Sound/Data.hs +++ b/src/Sound/Data.hs @@ -13,6 +13,7 @@ data SoundStatus | Playing | ToStart | ToContinueStart + | ToStop deriving (Eq,Ord,Show) newtype SoundID = SoundID { _getSoundID :: Int } deriving (Eq,Ord,Show) @@ -23,8 +24,8 @@ data Sound = Sound { _soundTime :: Maybe Int , _soundStatus :: SoundStatus , _soundChannel :: Maybe Mix.Channel - , _soundAngDist :: Maybe (Int16,Word8) - , _soundPos :: Point2 + , _soundAngDist :: Maybe (Int16,Word8) -- why do BOTH of + , _soundPos :: Point2 -- these exist? , _soundVolume :: Float , _soundChunkID :: SoundID }