From 51a85bd1ec1714e09db81f14eb465000a0c91027 Mon Sep 17 00:00:00 2001 From: justin Date: Sun, 12 Sep 2021 17:52:34 +0100 Subject: [PATCH] Refactor sound --- .../sound/{autoB.wav => autoB.TATATA.100.wav} | Bin .../{autoGun.wav => autoGun.BRAP.100.wav} | Bin data/sound/{grenade.wav => bang.BANG.150.wav} | Bin .../{longTap.wav => bangEcho.BANGG.150.wav} | Bin data/sound/{buzz.wav => buzz.ZMM.80.wav} | Bin .../sound/{click1.wav => click1.CLICK.50.wav} | Bin ...low.wav => crankSlow.CHNKCHNKCHUNK.50.wav} | Bin ...Welding.wav => elecCrackle.CRAKLE.100.wav} | Bin data/sound/endFootStep.wav | Bin 26372 -> 0 bytes .../{explosion.wav => explosion.BOOM.200.wav} | Bin data/sound/{fire.wav => fire.WRR.50.wav} | Bin .../{fire1.wav => fireLoud.WRRR.100.wav} | Bin ...adeOut.wav => foamSprayFadeOut.HSS.50.wav} | Bin ...prayLoop.wav => foamSprayLoop.HSSS.50.wav} | Bin data/sound/{foot1.wav => foot1.TIP.30.wav} | Bin data/sound/{foot2.wav => foot2.TAP.30.wav} | Bin .../sound/{footStep.wav => foot3.TAPP.40.wav} | Bin ...ttering-A1.wav => glassShat1.CRSNK.80.wav} | Bin ...ttering-A2.wav => glassShat2.CRNKL.80.wav} | Bin ...attering-A3.wav => glassShat3.CRNK.80.wav} | Bin ...attering-A4.wav => glassShat4.CRSK.80.wav} | Bin data/sound/{grunt.wav => grunt.HNH.50.wav} | Bin data/sound/{heal.wav => heal.BLIH.20.wav} | Bin data/sound/{hit.wav => hit.THUD.30.wav} | Bin data/sound/{hit1.wav => hit1.SMACK.40.wav} | Bin .../{Impact-A.wav => impact1.CRASH.80.wav} | Bin .../{Impact-B.wav => impact2.CRUNK.80.wav} | Bin .../{Impact-C.wav => impact3.CRUMPLE.80.wav} | Bin .../{Impact-D.wav => impact4.CRISH.80.wav} | Bin data/sound/{knife.wav => knife.SWSH.20.wav} | Bin .../{mini.wav => mini.BRPBRPBRP.120.wav} | Bin .../{mini1.wav => mini1.BRDBRDBRD.120.wav} | Bin ...Launch.wav => missileLaunch.WHSSH.100.wav} | Bin ...-Gear--Faster--www.fesliyanstudios.com.mp3 | Bin ...g-Gears--Fast--www.fesliyanstudios.com.mp3 | Bin ...Gears--Medium--www.fesliyanstudios.com.mp3 | Bin ...g-Gears--Slow--www.fesliyanstudios.com.mp3 | Bin ...-Metal-Long-A1-www.fesliyanstudios.com.mp3 | Bin .../{ => nondata}/Electrical-Welding.mp3 | Bin ...tomatic-Fire-B-www.fesliyanstudios.com.mp3 | Bin data/sound/{ => nondata}/reload.aup | 0 data/sound/{ => nondata}/tap.aup | 0 data/sound/{ => nondata}/twoStep.aup | 0 .../sound/{pickUp.wav => pickUp.SHUHP.20.wav} | Bin .../{reload.wav => reload.TNKTNKTNK.30.wav} | Bin .../{reload1.wav => reload1.CHPCHPCHP.30.wav} | Bin data/sound/reload2.wav | Bin 88108 -> 0 bytes .../{shotgun.wav => shotgun.BRAHCHCH.100.wav} | Bin ...c.wav => sineRaisePitchOneSec.BWAH.30.wav} | Bin ....wav => sineRaisePitchTwoSec.BWAAH.30.wav} | Bin ...oSec.wav => skwareFadeTwoSec.DWAAH.30.wav} | Bin .../{slideDoor.wav => slideDoor.DRR.30.wav} | Bin ...ering-A2.wav => smallGlass1.TRINKL.50.wav} | Bin ...ering-A4.wav => smallGlass2.KRTNKL.50.wav} | Bin ...ering-A3.wav => smallGlass3.CRTINK.50.wav} | Bin ...ering-A1.wav => smallGlass4.TINKLE.50.wav} | Bin data/sound/{tap1.wav => tap1.TAK.80.wav} | Bin data/sound/{tap2.wav => tap2.TAKH.80.wav} | Bin data/sound/{tap3.wav => tap3.BRAP.80.wav} | Bin data/sound/{tap4.wav => tap4.THUD.50.wav} | Bin .../{tapQuiet.wav => tapQuiet.BRAP.40.wav} | Bin data/sound/{tele.wav => tele.ZHM.100.wav} | Bin .../{tinitus.wav => tinitus.RINGGG.80.wav} | Bin .../sound/{tone440.wav => tone440.BEP.80.wav} | Bin ...ooth.wav => tone440sawtooth.SCREE.100.wav} | Bin .../{twoStep.wav => twoStep.TIPTAP.40.wav} | Bin .../{twoStep1.wav => twoStep1.TAPTIP.60.wav} | Bin ...StepSlow.wav => twoStepSlow.TIPTOP.40.wav} | Bin ...FadeIn.wav => whiteNoiseFadeIn.FHP.20.wav} | Bin ...deOut.wav => whiteNoiseFadeOut.PHF.20.wav} | Bin src/Dodge/Creature/Action.hs | 8 +- src/Dodge/Creature/Impulse.hs | 4 +- src/Dodge/Creature/State.hs | 6 +- src/Dodge/Creature/State/WalkCycle.hs | 8 +- src/Dodge/Creature/Volition.hs | 6 +- src/Dodge/Data.hs | 4 +- src/Dodge/Default.hs | 3 +- src/Dodge/Initialisation.hs | 4 +- src/Dodge/Item/Consumable.hs | 4 +- src/Dodge/Item/Weapon.hs | 34 +- src/Dodge/Item/Weapon/AutoGun.hs | 4 +- src/Dodge/Item/Weapon/Bezier.hs | 3 +- src/Dodge/Item/Weapon/Grenade.hs | 4 +- src/Dodge/Item/Weapon/Launcher.hs | 6 +- src/Dodge/Item/Weapon/TriggerType.hs | 7 +- src/Dodge/LevelGen/Block.hs | 8 +- src/Dodge/LevelGen/MoveDoor.hs | 4 +- src/Dodge/LevelGen/Switch.hs | 5 +- src/Dodge/Particle/Bullet/HitEffect.hs | 13 +- src/Dodge/Render/Picture.hs | 3 +- src/Dodge/SoundLogic.hs | 17 +- src/Dodge/SoundLogic/LoadSound.hs | 402 ++++++++++++++---- src/Dodge/WorldEvent/Explosion.hs | 8 +- src/Dodge/WorldEvent/Sound.hs | 10 +- src/Dodge/WorldEvent/SpawnParticle.hs | 4 +- src/Sound.hs | 2 +- src/Sound/Data.hs | 5 +- 97 files changed, 409 insertions(+), 177 deletions(-) rename data/sound/{autoB.wav => autoB.TATATA.100.wav} (100%) rename data/sound/{autoGun.wav => autoGun.BRAP.100.wav} (100%) rename data/sound/{grenade.wav => bang.BANG.150.wav} (100%) rename data/sound/{longTap.wav => bangEcho.BANGG.150.wav} (100%) rename data/sound/{buzz.wav => buzz.ZMM.80.wav} (100%) rename data/sound/{click1.wav => click1.CLICK.50.wav} (100%) rename data/sound/{crankSlow.wav => crankSlow.CHNKCHNKCHUNK.50.wav} (100%) rename data/sound/{Electrical-Welding.wav => elecCrackle.CRAKLE.100.wav} (100%) delete mode 100644 data/sound/endFootStep.wav rename data/sound/{explosion.wav => explosion.BOOM.200.wav} (100%) rename data/sound/{fire.wav => fire.WRR.50.wav} (100%) rename data/sound/{fire1.wav => fireLoud.WRRR.100.wav} (100%) rename data/sound/{foamSprayFadeOut.wav => foamSprayFadeOut.HSS.50.wav} (100%) rename data/sound/{foamSprayLoop.wav => foamSprayLoop.HSSS.50.wav} (100%) rename data/sound/{foot1.wav => foot1.TIP.30.wav} (100%) rename data/sound/{foot2.wav => foot2.TAP.30.wav} (100%) rename data/sound/{footStep.wav => foot3.TAPP.40.wav} (100%) rename data/sound/{Glass-Bottle-Shattering-A1.wav => glassShat1.CRSNK.80.wav} (100%) rename data/sound/{Glass-Bottle-Shattering-A2.wav => glassShat2.CRNKL.80.wav} (100%) rename data/sound/{Glass-Bottle-Shattering-A3.wav => glassShat3.CRNK.80.wav} (100%) rename data/sound/{Glass-Bottle-Shattering-A4.wav => glassShat4.CRSK.80.wav} (100%) rename data/sound/{grunt.wav => grunt.HNH.50.wav} (100%) rename data/sound/{heal.wav => heal.BLIH.20.wav} (100%) rename data/sound/{hit.wav => hit.THUD.30.wav} (100%) rename data/sound/{hit1.wav => hit1.SMACK.40.wav} (100%) rename data/sound/{Impact-A.wav => impact1.CRASH.80.wav} (100%) rename data/sound/{Impact-B.wav => impact2.CRUNK.80.wav} (100%) rename data/sound/{Impact-C.wav => impact3.CRUMPLE.80.wav} (100%) rename data/sound/{Impact-D.wav => impact4.CRISH.80.wav} (100%) rename data/sound/{knife.wav => knife.SWSH.20.wav} (100%) rename data/sound/{mini.wav => mini.BRPBRPBRP.120.wav} (100%) rename data/sound/{mini1.wav => mini1.BRDBRDBRD.120.wav} (100%) rename data/sound/{missileLaunch.wav => missileLaunch.WHSSH.100.wav} (100%) rename data/sound/{ => nondata}/Cranking-Gear--Faster--www.fesliyanstudios.com.mp3 (100%) rename data/sound/{ => nondata}/Cranking-Gears--Fast--www.fesliyanstudios.com.mp3 (100%) rename data/sound/{ => nondata}/Cranking-Gears--Medium--www.fesliyanstudios.com.mp3 (100%) rename data/sound/{ => nondata}/Cranking-Gears--Slow--www.fesliyanstudios.com.mp3 (100%) rename data/sound/{ => nondata}/Electrical-Welding-Metal-Long-A1-www.fesliyanstudios.com.mp3 (100%) rename data/sound/{ => nondata}/Electrical-Welding.mp3 (100%) rename data/sound/{ => nondata}/Rifle-Automatic-Fire-B-www.fesliyanstudios.com.mp3 (100%) rename data/sound/{ => nondata}/reload.aup (100%) rename data/sound/{ => nondata}/tap.aup (100%) rename data/sound/{ => nondata}/twoStep.aup (100%) rename data/sound/{pickUp.wav => pickUp.SHUHP.20.wav} (100%) rename data/sound/{reload.wav => reload.TNKTNKTNK.30.wav} (100%) rename data/sound/{reload1.wav => reload1.CHPCHPCHP.30.wav} (100%) delete mode 100644 data/sound/reload2.wav rename data/sound/{shotgun.wav => shotgun.BRAHCHCH.100.wav} (100%) rename data/sound/{sineRaisePitchOneSec.wav => sineRaisePitchOneSec.BWAH.30.wav} (100%) rename data/sound/{sineRaisePitchTwoSec.wav => sineRaisePitchTwoSec.BWAAH.30.wav} (100%) rename data/sound/{skwareFadeTwoSec.wav => skwareFadeTwoSec.DWAAH.30.wav} (100%) rename data/sound/{slideDoor.wav => slideDoor.DRR.30.wav} (100%) rename data/sound/{Small-Piece-Of-Glass-Shattering-A2.wav => smallGlass1.TRINKL.50.wav} (100%) rename data/sound/{Small-Piece-Of-Glass-Shattering-A4.wav => smallGlass2.KRTNKL.50.wav} (100%) rename data/sound/{Small-Piece-Of-Glass-Shattering-A3.wav => smallGlass3.CRTINK.50.wav} (100%) rename data/sound/{Small-Piece-Of-Glass-Shattering-A1.wav => smallGlass4.TINKLE.50.wav} (100%) rename data/sound/{tap1.wav => tap1.TAK.80.wav} (100%) rename data/sound/{tap2.wav => tap2.TAKH.80.wav} (100%) rename data/sound/{tap3.wav => tap3.BRAP.80.wav} (100%) rename data/sound/{tap4.wav => tap4.THUD.50.wav} (100%) rename data/sound/{tapQuiet.wav => tapQuiet.BRAP.40.wav} (100%) rename data/sound/{tele.wav => tele.ZHM.100.wav} (100%) rename data/sound/{tinitus.wav => tinitus.RINGGG.80.wav} (100%) rename data/sound/{tone440.wav => tone440.BEP.80.wav} (100%) rename data/sound/{tone440sawtooth.wav => tone440sawtooth.SCREE.100.wav} (100%) rename data/sound/{twoStep.wav => twoStep.TIPTAP.40.wav} (100%) rename data/sound/{twoStep1.wav => twoStep1.TAPTIP.60.wav} (100%) rename data/sound/{twoStepSlow.wav => twoStepSlow.TIPTOP.40.wav} (100%) rename data/sound/{whiteNoiseFadeIn.wav => whiteNoiseFadeIn.FHP.20.wav} (100%) rename data/sound/{whiteNoiseFadeOut.wav => whiteNoiseFadeOut.PHF.20.wav} (100%) diff --git a/data/sound/autoB.wav b/data/sound/autoB.TATATA.100.wav similarity index 100% rename from data/sound/autoB.wav rename to data/sound/autoB.TATATA.100.wav diff --git a/data/sound/autoGun.wav b/data/sound/autoGun.BRAP.100.wav similarity index 100% rename from data/sound/autoGun.wav rename to data/sound/autoGun.BRAP.100.wav diff --git a/data/sound/grenade.wav b/data/sound/bang.BANG.150.wav similarity index 100% rename from data/sound/grenade.wav rename to data/sound/bang.BANG.150.wav diff --git a/data/sound/longTap.wav b/data/sound/bangEcho.BANGG.150.wav similarity index 100% rename from data/sound/longTap.wav rename to data/sound/bangEcho.BANGG.150.wav diff --git a/data/sound/buzz.wav b/data/sound/buzz.ZMM.80.wav similarity index 100% rename from data/sound/buzz.wav rename to data/sound/buzz.ZMM.80.wav diff --git a/data/sound/click1.wav b/data/sound/click1.CLICK.50.wav similarity index 100% rename from data/sound/click1.wav rename to data/sound/click1.CLICK.50.wav diff --git a/data/sound/crankSlow.wav b/data/sound/crankSlow.CHNKCHNKCHUNK.50.wav similarity index 100% rename from data/sound/crankSlow.wav rename to data/sound/crankSlow.CHNKCHNKCHUNK.50.wav diff --git a/data/sound/Electrical-Welding.wav b/data/sound/elecCrackle.CRAKLE.100.wav similarity index 100% rename from data/sound/Electrical-Welding.wav rename to data/sound/elecCrackle.CRAKLE.100.wav diff --git a/data/sound/endFootStep.wav b/data/sound/endFootStep.wav deleted file mode 100644 index b7b3912080afa9ae2a45c6c575bae1cb1e253175..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26372 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 U_RhyIKlQ$^z2wXI=`|Gg6bNvf^?&%2O~)C= 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 LhWFvSw$%Rt9tK(_ diff --git a/data/sound/shotgun.wav b/data/sound/shotgun.BRAHCHCH.100.wav similarity index 100% rename from data/sound/shotgun.wav rename to data/sound/shotgun.BRAHCHCH.100.wav diff --git a/data/sound/sineRaisePitchOneSec.wav b/data/sound/sineRaisePitchOneSec.BWAH.30.wav similarity index 100% rename from data/sound/sineRaisePitchOneSec.wav rename to data/sound/sineRaisePitchOneSec.BWAH.30.wav diff --git a/data/sound/sineRaisePitchTwoSec.wav b/data/sound/sineRaisePitchTwoSec.BWAAH.30.wav similarity index 100% rename from data/sound/sineRaisePitchTwoSec.wav rename to data/sound/sineRaisePitchTwoSec.BWAAH.30.wav diff --git a/data/sound/skwareFadeTwoSec.wav b/data/sound/skwareFadeTwoSec.DWAAH.30.wav similarity index 100% rename from data/sound/skwareFadeTwoSec.wav rename to data/sound/skwareFadeTwoSec.DWAAH.30.wav diff --git a/data/sound/slideDoor.wav b/data/sound/slideDoor.DRR.30.wav similarity index 100% rename from data/sound/slideDoor.wav rename to data/sound/slideDoor.DRR.30.wav diff --git a/data/sound/Small-Piece-Of-Glass-Shattering-A2.wav b/data/sound/smallGlass1.TRINKL.50.wav similarity index 100% rename from data/sound/Small-Piece-Of-Glass-Shattering-A2.wav rename to data/sound/smallGlass1.TRINKL.50.wav diff --git a/data/sound/Small-Piece-Of-Glass-Shattering-A4.wav b/data/sound/smallGlass2.KRTNKL.50.wav similarity index 100% rename from data/sound/Small-Piece-Of-Glass-Shattering-A4.wav rename to data/sound/smallGlass2.KRTNKL.50.wav diff --git a/data/sound/Small-Piece-Of-Glass-Shattering-A3.wav b/data/sound/smallGlass3.CRTINK.50.wav similarity index 100% rename from data/sound/Small-Piece-Of-Glass-Shattering-A3.wav rename to data/sound/smallGlass3.CRTINK.50.wav diff --git a/data/sound/Small-Piece-Of-Glass-Shattering-A1.wav b/data/sound/smallGlass4.TINKLE.50.wav similarity index 100% rename from data/sound/Small-Piece-Of-Glass-Shattering-A1.wav rename to data/sound/smallGlass4.TINKLE.50.wav diff --git a/data/sound/tap1.wav b/data/sound/tap1.TAK.80.wav similarity index 100% rename from data/sound/tap1.wav rename to data/sound/tap1.TAK.80.wav diff --git a/data/sound/tap2.wav b/data/sound/tap2.TAKH.80.wav similarity index 100% rename from data/sound/tap2.wav rename to data/sound/tap2.TAKH.80.wav diff --git a/data/sound/tap3.wav b/data/sound/tap3.BRAP.80.wav similarity index 100% rename from data/sound/tap3.wav rename to data/sound/tap3.BRAP.80.wav diff --git a/data/sound/tap4.wav b/data/sound/tap4.THUD.50.wav similarity index 100% rename from data/sound/tap4.wav rename to data/sound/tap4.THUD.50.wav diff --git a/data/sound/tapQuiet.wav b/data/sound/tapQuiet.BRAP.40.wav similarity index 100% rename from data/sound/tapQuiet.wav rename to data/sound/tapQuiet.BRAP.40.wav diff --git a/data/sound/tele.wav b/data/sound/tele.ZHM.100.wav similarity index 100% rename from data/sound/tele.wav rename to data/sound/tele.ZHM.100.wav diff --git a/data/sound/tinitus.wav b/data/sound/tinitus.RINGGG.80.wav similarity index 100% rename from data/sound/tinitus.wav rename to data/sound/tinitus.RINGGG.80.wav diff --git a/data/sound/tone440.wav b/data/sound/tone440.BEP.80.wav similarity index 100% rename from data/sound/tone440.wav rename to data/sound/tone440.BEP.80.wav diff --git a/data/sound/tone440sawtooth.wav b/data/sound/tone440sawtooth.SCREE.100.wav similarity index 100% rename from data/sound/tone440sawtooth.wav rename to data/sound/tone440sawtooth.SCREE.100.wav diff --git a/data/sound/twoStep.wav b/data/sound/twoStep.TIPTAP.40.wav similarity index 100% rename from data/sound/twoStep.wav rename to data/sound/twoStep.TIPTAP.40.wav diff --git a/data/sound/twoStep1.wav b/data/sound/twoStep1.TAPTIP.60.wav similarity index 100% rename from data/sound/twoStep1.wav rename to data/sound/twoStep1.TAPTIP.60.wav diff --git a/data/sound/twoStepSlow.wav b/data/sound/twoStepSlow.TIPTOP.40.wav similarity index 100% rename from data/sound/twoStepSlow.wav rename to data/sound/twoStepSlow.TIPTOP.40.wav diff --git a/data/sound/whiteNoiseFadeIn.wav b/data/sound/whiteNoiseFadeIn.FHP.20.wav similarity index 100% rename from data/sound/whiteNoiseFadeIn.wav rename to data/sound/whiteNoiseFadeIn.FHP.20.wav diff --git a/data/sound/whiteNoiseFadeOut.wav b/data/sound/whiteNoiseFadeOut.PHF.20.wav similarity index 100% rename from data/sound/whiteNoiseFadeOut.wav rename to data/sound/whiteNoiseFadeOut.PHF.20.wav diff --git a/src/Dodge/Creature/Action.hs b/src/Dodge/Creature/Action.hs index 49a8d2ed5..d547362d3 100644 --- a/src/Dodge/Creature/Action.hs +++ b/src/Dodge/Creature/Action.hs @@ -19,7 +19,7 @@ import Dodge.Base import Dodge.Zone import Dodge.Base.Collide import Dodge.SoundLogic -import Dodge.SoundLogic.Synonyms +import Dodge.SoundLogic.LoadSound --import Dodge.WorldEvent import Dodge.Inventory --import Dodge.LightSources @@ -167,7 +167,7 @@ blinkAction -> World -> World blinkAction cr w - = soundMultiFrom [TeleSound 0,TeleSound 1] p3 teleSound Nothing + = soundMultiFrom [TeleSound 0,TeleSound 1] p3 teleS Nothing . over radDistortion (distortionBulge ++) . set (creatures . ix cid . crPos) p3 . blinkShockwave cid p3 @@ -198,7 +198,7 @@ youDropItem w = case yourItem w of NoItem -> w _ -> rmSelectedInvItem (_yourID w) . copyItemToFloor (you w) (_crInvSel cr) - $ soundFrom (CrSound (_crID cr)) (_crPos cr) putDownSound Nothing + $ soundFrom (CrSound (_crID cr)) (_crPos cr) whiteNoiseFadeOutS Nothing w where cr = you w @@ -233,7 +233,7 @@ pickUpItem pickUpItem cid flit w = case maybeInvSlot of Nothing -> w Just i -> w - & soundFrom (CrSound cid) (_flItPos flit) pickUpSound Nothing + & soundFrom (CrSound cid) (_flItPos flit) pickUpS Nothing & updateItLocation i & floorItems %~ IM.delete (_flItID flit) & creatures . ix cid . crInv . ix i %~ addItem it diff --git a/src/Dodge/Creature/Impulse.hs b/src/Dodge/Creature/Impulse.hs index cc525ec87..e6d7b036c 100644 --- a/src/Dodge/Creature/Impulse.hs +++ b/src/Dodge/Creature/Impulse.hs @@ -11,7 +11,7 @@ import Dodge.Data.DamageType import Dodge.Creature.State.Data import Dodge.Creature.Stance.Data import Dodge.SoundLogic -import Dodge.SoundLogic.Synonyms +import Dodge.SoundLogic.LoadSound import Geometry import qualified Data.IntMap.Strict as IM @@ -84,5 +84,5 @@ followImpulse cr w imp = case imp of posFromID cid' = _crPos $ _creatures w IM.! cid' rr a = fst $ randomR (-a,a) $ _randGen w hitCr i = over (creatures . ix i . crState . crDamage) (addDam i) - . soundFrom (CrSound cid) cpos hitSound Nothing + . soundFrom (CrSound cid) cpos hitS Nothing addDam i dams = Blunt 100 cpos (posFromID i) (posFromID i) : dams diff --git a/src/Dodge/Creature/State.hs b/src/Dodge/Creature/State.hs index 54730e5cd..55a1d0343 100644 --- a/src/Dodge/Creature/State.hs +++ b/src/Dodge/Creature/State.hs @@ -9,7 +9,7 @@ import Dodge.Creature.Stance.Data --import Dodge.Creature.Test --import Dodge.Base import Dodge.SoundLogic -import Dodge.SoundLogic.Synonyms +import Dodge.SoundLogic.LoadSound import Dodge.RandomHelp import Dodge.WorldEvent --import Dodge.WallCreatureCollisions @@ -141,7 +141,7 @@ weaponReloadSounds cr w = case _crInv cr IM.!? _crInvSel cr of | otherwise -> w Just Weapon{_wpReloadState = 0} -> w Just Weapon{_wpReloadState = 1} -> stopSoundFrom (CrReloadSound cid) w - Just Weapon{} -> soundFrom (CrReloadSound cid) (_crPos cr) reloadSound (Just 1) w + Just Weapon{} -> soundFrom (CrReloadSound cid) (_crPos cr) reloadS (Just 1) w _ -> w where cid = _crID cr @@ -223,7 +223,7 @@ updateExpBarrel cr w applyFuseDamage cr' = cr' & crHP %~ subtract (length . _piercedPoints . _crSpState $ _crState cr') hiss | null poss = id - | otherwise = soundMultiFrom [BarrelHiss 0,BarrelHiss 1] (_crPos cr) 41 (Just 1) + | otherwise = soundMultiFrom [BarrelHiss 0,BarrelHiss 1] (_crPos cr) foamSprayLoopS (Just 1) stopSounds = stopSoundFrom (BarrelHiss 0) . stopSoundFrom (BarrelHiss 1) damToExpBarrel :: [DamageType] -> Creature -> Creature diff --git a/src/Dodge/Creature/State/WalkCycle.hs b/src/Dodge/Creature/State/WalkCycle.hs index 522491aec..adf6fa354 100644 --- a/src/Dodge/Creature/State/WalkCycle.hs +++ b/src/Dodge/Creature/State/WalkCycle.hs @@ -4,7 +4,9 @@ import Dodge.Data import Dodge.Data.SoundOrigin import Dodge.Creature.Stance.Data import Dodge.SoundLogic +import Dodge.SoundLogic.LoadSound import Geometry.Data +import Sound.Data import Control.Lens @@ -36,6 +38,6 @@ makeFootstepSound currentStride maxStride ff p where footor = [FootstepSound 0,FootstepSound 1] -chooseFootSound :: FootForward -> Int -chooseFootSound LeftForward = 22 -chooseFootSound _ = 23 +chooseFootSound :: FootForward -> SoundID +chooseFootSound LeftForward = foot1S +chooseFootSound _ = foot2S diff --git a/src/Dodge/Creature/Volition.hs b/src/Dodge/Creature/Volition.hs index 80da0d64f..3d586a3a6 100644 --- a/src/Dodge/Creature/Volition.hs +++ b/src/Dodge/Creature/Volition.hs @@ -5,12 +5,12 @@ import Dodge.Data import Dodge.Base.Collide import Dodge.Creature.Test import Dodge.Creature.Stance.Data -import Dodge.SoundLogic.Synonyms +import Dodge.SoundLogic.LoadSound import Geometry holsterWeapon, drawWeapon :: Action -holsterWeapon = DoImpulses [ChangePosture AtEase, MakeSound putDownSound] -drawWeapon = DoImpulses [ChangePosture Aiming, MakeSound pickUpSound] +holsterWeapon = DoImpulses [ChangePosture AtEase, MakeSound whiteNoiseFadeOutS] +drawWeapon = DoImpulses [ChangePosture Aiming, MakeSound whiteNoiseFadeInS] fleeFrom :: Creature -> Maybe Creature -> Action fleeFrom cr mtcr = case mtcr of diff --git a/src/Dodge/Data.hs b/src/Dodge/Data.hs index d0f66e0bd..7f079c5ff 100644 --- a/src/Dodge/Data.hs +++ b/src/Dodge/Data.hs @@ -378,7 +378,7 @@ data Item } | NoItem -data ReloadType = ActiveReload | PassiveReload Int +data ReloadType = ActiveReload | PassiveReload SoundID data ItEffect = NoItEffect | ItInvEffect @@ -581,7 +581,7 @@ data Impulse -- | UseIntrinsicAbility | Melee Int | ChangePosture Posture - | MakeSound Int + | MakeSound SoundID | ChangeStrategy Strategy | AddGoal Goal | ArbitraryImpulseFunction (World -> Creature -> Creature) diff --git a/src/Dodge/Default.hs b/src/Dodge/Default.hs index ac127e3ab..388726e9a 100644 --- a/src/Dodge/Default.hs +++ b/src/Dodge/Default.hs @@ -15,6 +15,7 @@ import Dodge.Creature.State.Data import Dodge.Creature.Perception.Data import Dodge.Creature.Memory.Data import Dodge.SoundLogic +import Dodge.SoundLogic.LoadSound import Dodge.Picture.Layer import Geometry import Picture @@ -214,7 +215,7 @@ defaultButton = Button , _btEvent = \b w -> set (buttons . ix (_btID b) . btPict) (onLayer WlLayer $ color red $ polygon $ rectNSEW (-4) (-5) 10 (-10)) . set (buttons . ix (_btID b) . btState) BtNoLabel - . soundFrom (LeverSound 0) (_btPos b) 1 Nothing $ w + . soundFrom (LeverSound 0) (_btPos b) click1S Nothing $ w , _btID = 0 , _btText = "Button" , _btState = BtOff diff --git a/src/Dodge/Initialisation.hs b/src/Dodge/Initialisation.hs index 81514442a..f85430a9e 100644 --- a/src/Dodge/Initialisation.hs +++ b/src/Dodge/Initialisation.hs @@ -9,7 +9,7 @@ import Dodge.Layout import Dodge.Story import Dodge.WorldEvent.Cloud import Dodge.SoundLogic -import Dodge.SoundLogic.Synonyms +import Dodge.SoundLogic.LoadSound --import Dodge.Creature.Perception import Geometry.Data --import Picture @@ -47,7 +47,7 @@ initialWorld = defaultWorld , _mousePos = V2 0 0 , _testString = testStringInit , _yourID = 0 - , _worldEvents = soundFrom BackgroundSound (V2 0 0) foamSprayFadeOutSound Nothing + , _worldEvents = soundFrom BackgroundSound (V2 0 0) foamSprayFadeOutS Nothing . foldr ((.) . makeStartCloudAt) id [V3 x y 5 | x <- [-5,-3..5] , y <- [-5,-3..5]] , _pressPlates = IM.empty , _buttons = IM.empty diff --git a/src/Dodge/Item/Consumable.hs b/src/Dodge/Item/Consumable.hs index f01d0f8c1..51883a211 100644 --- a/src/Dodge/Item/Consumable.hs +++ b/src/Dodge/Item/Consumable.hs @@ -6,7 +6,7 @@ import Dodge.Item.Data import Dodge.Picture.Layer import Dodge.Default import Dodge.SoundLogic -import Dodge.SoundLogic.Synonyms +import Dodge.SoundLogic.LoadSound import Dodge.Item.Draw @@ -32,7 +32,7 @@ heal25 :: Int -> World -> Maybe World heal25 = heal 25 heal :: Int -> Int -> World -> Maybe World heal hp n w | _crHP (_creatures w IM.! n) >= 10000 = Nothing - | otherwise = Just $ soundFrom (CrSound $ _crID cr) (_crPos cr) healSound Nothing w + | otherwise = Just $ soundFrom (CrSound $ _crID cr) (_crPos cr) healS Nothing w & creatures . ix n . crHP %~ min 10000 . (+ hp) where cr = _creatures w IM.! n diff --git a/src/Dodge/Item/Weapon.hs b/src/Dodge/Item/Weapon.hs index e565e7dbb..59231572d 100644 --- a/src/Dodge/Item/Weapon.hs +++ b/src/Dodge/Item/Weapon.hs @@ -8,7 +8,7 @@ import Dodge.Base import Dodge.Zone import Dodge.Picture.Layer import Dodge.SoundLogic -import Dodge.SoundLogic.Synonyms +import Dodge.SoundLogic.LoadSound import Dodge.Creature.Action import Dodge.RandomHelp import Dodge.WorldEvent @@ -66,7 +66,7 @@ pistol = defaultGun [ ammoCheckI , hammerCheckI , useTimeCheckI - , withSoundI 0 + , withSoundI tap3S , useAmmo 1 , randSpreadDir , withMuzFlareI @@ -145,7 +145,7 @@ teslaGun = defaultGun [ ammoCheckI , useTimeCheckI , withTempLight 1 100 (V3 0 0 1) - , withSoundForI 25 1 + , withSoundForI elecCrackleS 1 , useAmmo 1 ] , _wpSpread = 0.001 @@ -180,7 +180,7 @@ lasGun = defaultAutoGun [ ammoCheckI , useTimeCheckI , withTempLight 1 100 (V3 1 1 0) - , withSoundForI 24 1 + , withSoundForI tone440sawtoothS 1 , useAmmo 1 ] , _wpSpread = 0.001 @@ -296,7 +296,7 @@ hvAutoGun = defaultAutoGun , _itUseModifiers = [ ammoCheckI , rateIncABI 24 7 (torqueBeforeAtLeast 0.1 0.1) (torqueAfterI 0.2) - , withSoundI longGunSound + , withSoundI bangEchoS , withThinSmokeI , withMuzFlareI ] @@ -323,7 +323,7 @@ ltAutoGun = defaultAutoGun , _itUseModifiers = [ ammoCheckI , useTimeCheckI - , withSoundI 0 + , withSoundI tap1S , useAmmo 1 , withRandomDirI 0.1 , torqueAfterI 0.2 @@ -359,10 +359,10 @@ miniGun = defaultAutoGun , _itUse = useAmmoParamsVelMod vm4 , _itUseModifiers = [ ammoCheckI - , withWarmUpI 26 + , withWarmUpI crankSlowS , useTimeCheckI --, afterRecoil recoilAmount - , withSoundForI 28 2 + , withSoundForI mini1S 2 --, withThinSmokeI , torqueAfterI 0.05 , withSidePushI 53 @@ -429,7 +429,7 @@ spreadGun = defaultGun [ ammoCheckI , hammerCheckI , useTimeCheckI - , withSoundI shotgunSound + , withSoundI shotgunS , useAmmo 1 , withRecoilI 100 , withMuzFlareI @@ -461,7 +461,7 @@ multGun = defaultGun [ ammoCheckI , hammerCheckI , useTimeCheckI - , withSoundI shotgunSound + , withSoundI shotgunS , useAmmo 1 , withRecoilI 200 , withMuzFlareI @@ -499,7 +499,7 @@ longGun = defaultGun , _wpLoadedAmmo = 1 , _wpReloadTime = 100 , _wpReloadState = 0 - , _wpReloadType = PassiveReload skwareFadeTwoSecSound + , _wpReloadType = PassiveReload skwareFadeTwoSecS , _itUseRate = 100 , _itUseTime = 0 , _itUse = useAmmoParams @@ -507,7 +507,7 @@ longGun = defaultGun [ ammoCheckI , hammerCheckI , useTimeCheckI - , withSoundI longGunSound + , withSoundI bangEchoS , useAmmo 1 , withThickSmokeI , torqueAfterI 0.05 @@ -553,7 +553,7 @@ poisonSprayer = defaultAutoGun , _itUseModifiers = [ ammoCheckI , useTimeCheckI - , withSoundForI foamSpray 5 + , withSoundForI foamSprayLoopS 5 , useAmmo 1 , spreadNumI ] @@ -752,10 +752,10 @@ moveRemoteBomb itid time pID w $ set (projectiles .ix pID.pjUpdate) (\_ -> moveRemoteBomb itid (f time) pID) w | time < 2 = case hitWl of - Just (p,_) -> soundFrom (Tap 0) p tapQuiet Nothing $ halfV updatedWorld + Just (p,_) -> soundFrom (Tap 0) p tapQuietS Nothing $ halfV updatedWorld _ -> halfV updatedWorld | otherwise = case hitWl of - Just (p,_) -> soundFrom (Tap 0) p tapQuiet Nothing updatedWorld + Just (p,_) -> soundFrom (Tap 0) p tapQuietS Nothing updatedWorld _ -> updatedWorld where updatedWorld @@ -875,7 +875,7 @@ fireRemoteLauncher :: Creature -> World -> World fireRemoteLauncher cr w = setLocation $ resetFire $ resetName - $ soundFrom (CrWeaponSound cid) pos launcherSound Nothing + $ soundFrom (CrWeaponSound cid) pos tap4S Nothing $ over projectiles addRemRocket w where i = IM.newKey $ _projectiles w @@ -923,7 +923,7 @@ moveRemoteShell cid itid pj w ( ( pjVel %~ ( (accel +.+) . (frict *.*) ) ) . ( pjDir .~ newdir ) ) - & soundFrom (ShellSound i) newPos smokeTrailSound (Just 1) + & soundFrom (ShellSound i) newPos missileLaunchS (Just 1) & smokeGen & makeFlameletTimed oldPos 20 (0.5 *.* rotateV (pi+sparkD) accel) Nothing 3 10 | time > -200 = case thingHit of diff --git a/src/Dodge/Item/Weapon/AutoGun.hs b/src/Dodge/Item/Weapon/AutoGun.hs index 153ac65bc..6a0f24c5c 100644 --- a/src/Dodge/Item/Weapon/AutoGun.hs +++ b/src/Dodge/Item/Weapon/AutoGun.hs @@ -13,7 +13,7 @@ import Dodge.Picture.Layer import Dodge.Item.Draw import Dodge.Item.Weapon.Bullet import Dodge.Item.Weapon.TriggerType -import Dodge.SoundLogic.Synonyms +import Dodge.SoundLogic.LoadSound import Picture import Geometry @@ -40,7 +40,7 @@ autoGun = defaultAutoGun [('M', torqueBefore 0.08) ,('S', torqueBefore 0.05) ] - , withSoundI autoGunSound + , withSoundForI autoBS 5 , useAmmo 1 , withRandomDirI (autogunSpread/2) , withMuzFlareI diff --git a/src/Dodge/Item/Weapon/Bezier.hs b/src/Dodge/Item/Weapon/Bezier.hs index b6f7e3056..d7e217e3a 100644 --- a/src/Dodge/Item/Weapon/Bezier.hs +++ b/src/Dodge/Item/Weapon/Bezier.hs @@ -15,6 +15,7 @@ import Dodge.Particle.Bullet.HitEffect import Dodge.WorldEvent.HitEffect import Dodge.RandomHelp import Dodge.Picture.Layer +import Dodge.SoundLogic.LoadSound import Picture import Geometry @@ -28,7 +29,7 @@ bezierGun = defaultGun , _itUse = \_ -> useTargetPos $ \p -> shootBezier $ fromJust p -- <- the start point , _itUseModifiers = [ useTimeCheckI - , withSoundI 0 + , withSoundI tap2S , useAmmo 1 , withMuzFlareI . withRecoilI 40 diff --git a/src/Dodge/Item/Weapon/Grenade.hs b/src/Dodge/Item/Weapon/Grenade.hs index d2645b180..b876916a8 100644 --- a/src/Dodge/Item/Weapon/Grenade.hs +++ b/src/Dodge/Item/Weapon/Grenade.hs @@ -7,7 +7,7 @@ import Dodge.Base import Dodge.Zone import Dodge.Picture.Layer import Dodge.SoundLogic -import Dodge.SoundLogic.Synonyms +import Dodge.SoundLogic.LoadSound import Dodge.Item.Attachment.Data import Dodge.Item.Draw import Dodge.Default.Shell @@ -32,7 +32,7 @@ moveGrenade 0 _ pID w = over projectiles (IM.delete pID) pj = _projectiles w IM.! pID explosion = _pjPayload pj moveGrenade time dir pID w = case hitWl of - Just (p,_) -> soundFrom (Tap 0) p tapQuiet Nothing updatedWorld + Just (p,_) -> soundFrom (Tap 0) p tapQuietS Nothing updatedWorld _ -> updatedWorld where updatedWorld = updateV $ set (projectiles . ix pID . pjPos) finalPos diff --git a/src/Dodge/Item/Weapon/Launcher.hs b/src/Dodge/Item/Weapon/Launcher.hs index c1481f366..675be0b29 100644 --- a/src/Dodge/Item/Weapon/Launcher.hs +++ b/src/Dodge/Item/Weapon/Launcher.hs @@ -4,7 +4,7 @@ import Dodge.Data import Dodge.Data.SoundOrigin import Dodge.Default.Weapon import Dodge.Default.Shell -import Dodge.SoundLogic.Synonyms +import Dodge.SoundLogic.LoadSound import Dodge.WorldEvent.Explosion import Dodge.Picture.Layer import Dodge.Item.Data @@ -43,7 +43,7 @@ launcher = defaultGun , _itUseModifiers = [ ammoCheckI , useTimeCheckI - , withSoundI launcherSound + , withSoundI tap4S , useAmmo 1 ] , _wpSpread = 0.02 @@ -107,7 +107,7 @@ doThrust :: Projectile -> World -> World doThrust pj w = w & randGen .~ g & projectiles . ix i . pjVel %~ (\v -> accel +.+ frict *.* v) - & soundFrom (ShellSound i) newPos smokeTrailSound (Just 1) + & soundFrom (ShellSound i) newPos missileLaunchS (Just 1) & makeFlameletTimed (oldPos -.- vel) 0 (vel +.+ rotateV (pi+sparkD) accel) Nothing 3 10 & smokeGen where diff --git a/src/Dodge/Item/Weapon/TriggerType.hs b/src/Dodge/Item/Weapon/TriggerType.hs index 0e4aa36db..70087f1f6 100644 --- a/src/Dodge/Item/Weapon/TriggerType.hs +++ b/src/Dodge/Item/Weapon/TriggerType.hs @@ -44,6 +44,7 @@ import Dodge.RandomHelp import Dodge.Item.Attachment.Data import Dodge.Item.Data import Dodge.Default +import Sound.Data import Geometry import Geometry.Vector3D @@ -121,7 +122,7 @@ rateIncABI startRate fastRate exeffFirst exeffCont eff item cr w && _itUseTime item == 0 {- | Apply effect after a warm up. -} withWarmUpI - :: Int -- ^ warm up sound id + :: SoundID -- ^ warm up sound id -> ChainEffect withWarmUpI soundID f item cr w | _wpReloadState item /= 0 = w @@ -140,7 +141,7 @@ withWarmUpI soundID f item cr w {- | Adds a sound to a creature based world effect. The sound is emitted from the creature's position. -} withSoundI - :: Int -- ^ Sound id + :: SoundID -- ^ Sound id -> ChainEffect withSoundI soundid f item cr = soundFrom (CrWeaponSound cid) (_crPos cr) soundid Nothing @@ -151,7 +152,7 @@ withSoundI soundid f item cr {- | Adds a sound to a creature based world effect. The sound is emitted from the creature's position. -} withSoundForI - :: Int -- ^ Sound id + :: SoundID -- ^ Sound id -> Int -- ^ Frames to play -> ChainEffect withSoundForI soundid playTime f item cr diff --git a/src/Dodge/LevelGen/Block.hs b/src/Dodge/LevelGen/Block.hs index 46b8f9bc8..792330b92 100644 --- a/src/Dodge/LevelGen/Block.hs +++ b/src/Dodge/LevelGen/Block.hs @@ -6,8 +6,10 @@ import Dodge.Base import Dodge.Zone import Dodge.Zone.Data import Dodge.SoundLogic +import Dodge.SoundLogic.LoadSound import Dodge.WorldEvent.Sound import Dodge.LevelGen.Pathing +import Dodge.RandomHelp import Geometry import Picture.Data import qualified IntMapHelp as IM @@ -46,12 +48,12 @@ killBlock bl w = f bl . flip (foldr unshadow) (_blShadows bl) $ w pos = fst $ _wlLine bl breakHitSound bl' | _wlIsSeeThrough bl' = mkSoundBreakGlass pos - | otherwise = soundMultiFrom sos (fst $ _wlLine bl') (soundid + 4) Nothing + | otherwise = soundMultiFrom sos (fst $ _wlLine bl') impactSound Nothing hitSound' bl' | _wlIsSeeThrough bl' = mkSoundSplinterGlass pos - | otherwise = soundMultiFrom sos (fst $ _wlLine bl') soundid Nothing + | otherwise = soundMultiFrom sos (fst $ _wlLine bl') impactSound Nothing sos = [BlockDegradeSound 0,BlockDegradeSound 1] - (soundid,_) = randomR (29,32) $ _randGen w + impactSound = evalState (takeOne [impact1S,impact2S,impact3S,impact4S]) $ _randGen w unshadow :: Int -> World -> World unshadow bid w' = case w' ^? walls . ix bid of Just b -> diff --git a/src/Dodge/LevelGen/MoveDoor.hs b/src/Dodge/LevelGen/MoveDoor.hs index 5a7296e2e..299adbf15 100644 --- a/src/Dodge/LevelGen/MoveDoor.hs +++ b/src/Dodge/LevelGen/MoveDoor.hs @@ -11,7 +11,7 @@ import Dodge.Base import Dodge.Zone import Dodge.Zone.Data import Dodge.SoundLogic -import Dodge.SoundLogic.Synonyms +import Dodge.SoundLogic.LoadSound import Geometry import qualified Data.IntMap.Strict as IM @@ -70,7 +70,7 @@ addSoundToDoor i pld hwd (x:ys) = f x : ys where g dm w | dist wp pld > 2 && dist wp hwd > 2 - = soundFrom (WallSound i) wp doorSound (Just 1) $ dm w + = soundFrom (WallSound i) wp slideDoorS (Just 1) $ dm w | otherwise = dm w where wp = fst $ _wlLine (_walls w IM.! i) diff --git a/src/Dodge/LevelGen/Switch.hs b/src/Dodge/LevelGen/Switch.hs index da35c8ccb..ea2cfbeb9 100644 --- a/src/Dodge/LevelGen/Switch.hs +++ b/src/Dodge/LevelGen/Switch.hs @@ -3,6 +3,7 @@ module Dodge.LevelGen.Switch import Dodge.Data import Dodge.Data.SoundOrigin import Dodge.SoundLogic +import Dodge.SoundLogic.LoadSound import Dodge.Picture.Layer import Picture import Geometry @@ -19,7 +20,7 @@ makeButton c eff = Button , _btPos = V2 0 0 , _btRot = 0 , _btEvent = \b w -> eff . over buttons (IM.adjust turnOn (_btID b)) - . soundFromGeneral (LeverSound 0) (btpos b) 1 Nothing $ w + . soundFromGeneral (LeverSound 0) (btpos b) click1S Nothing $ w , _btID = 0 , _btText = "Button" --, _btText = "Button" @@ -45,7 +46,7 @@ makeSwitch c effOn effOff = Button , _btState = BtOff } where - flipSwitch b w = switchEffect b . soundFromGeneral (LeverSound 0) (bpos b) 1 Nothing $ w + flipSwitch b w = switchEffect b . soundFromGeneral (LeverSound 0) (bpos b) click1S Nothing $ w bpos b w = _btPos $ _buttons w IM.! _btID b switchEffect b = case _btState b of BtOff -> effOn . over buttons (IM.adjust turnOn (_btID b)) diff --git a/src/Dodge/Particle/Bullet/HitEffect.hs b/src/Dodge/Particle/Bullet/HitEffect.hs index 8fa2920a9..e17859f7c 100644 --- a/src/Dodge/Particle/Bullet/HitEffect.hs +++ b/src/Dodge/Particle/Bullet/HitEffect.hs @@ -11,6 +11,7 @@ import Dodge.WorldEvent import Dodge.Particle.Bullet.Spawn import Dodge.WorldEvent.DamageBlock import Dodge.SoundLogic +import Dodge.SoundLogic.LoadSound import Dodge.RandomHelp import Dodge.WorldEvent.Shockwave import Dodge.Creature.State.Data @@ -37,7 +38,7 @@ bulHitCr bt p cr w mvDams = [ PushDam 1 $ 2 *.* bulVel ] addDamage = creatures . ix cid . crState . crDamage %~ ((Piercing 100 sp p ep : mvDams) ++ ) addDamageArmoured = creatures . ix cid . crState . crDamage %~ (mvDams ++) - makeHitSound = soundMultiFrom [CrHitSound 0] p 15 (Just 10) + makeHitSound = soundMultiFrom [CrHitSound 0] p hit1S (Just 10) flashEff = over worldEvents (bloodFlashAt p . ) cid = _crID cr (d1,_) = randomR (-0.7,0.7) $ _randGen w @@ -55,7 +56,7 @@ bulBounceArmCr' bt p cr w mvDams = [ PushDam 1 $ 2 *.* bulVel ] addDamage = creatures . ix cid . crState . crDamage %~ ((Piercing 100 sp p ep : mvDams) ++ ) addDamageArmoured = creatures . ix cid . crState . crDamage %~ (mvDams ++) - makeHitSound = soundMultiFrom [CrHitSound 0] p 15 (Just 10) + makeHitSound = soundMultiFrom [CrHitSound 0] p hit1S (Just 10) flashEff = over worldEvents ((.) $ bloodFlashAt p) cid = _crID cr newDir = safeNormalizeV (p -.- _crPos cr) @@ -76,7 +77,7 @@ bulPenCr' bt p cr w ] ++ ) - $ soundMultiFrom [CrHitSound 0] ep 15 (Just 10) + $ soundMultiFrom [CrHitSound 0] ep hit1S (Just 10) $ over worldEvents (addPiercer . ) w where @@ -100,7 +101,7 @@ hvBulHitCr bt p cr w ] ++ ) - $ soundMultiFrom [CrHitSound 0] ep 15 (Just 10) + $ soundMultiFrom [CrHitSound 0] ep hit1S (Just 10) w where (d1,_) = randomR (-0.7,0.7) $ _randGen w @@ -112,7 +113,7 @@ bulIncCr' :: Particle -> Point2 -> Creature -> World -> World bulIncCr' bt p cr w = over (creatures . ix cid . crState . crDamage) ( Piercing 60 sp p ep : ) - . soundMultiFrom [CrHitSound 0] p 15 (Just 10) + . soundMultiFrom [CrHitSound 0] p hit1S (Just 10) $ incFlamelets w where @@ -126,7 +127,7 @@ bulConCr' :: Particle -> Point2 -> Creature -> World -> World bulConCr' bt p cr w = over (creatures . ix cid . crState . crDamage) ( Piercing 60 sp p ep : ) - . soundMultiFrom [CrHitSound 0] p 15 (Just 10) + . soundMultiFrom [CrHitSound 0] p hit1S (Just 10) $ mkwave w where diff --git a/src/Dodge/Render/Picture.hs b/src/Dodge/Render/Picture.hs index 8580acd14..a00bec1a3 100644 --- a/src/Dodge/Render/Picture.hs +++ b/src/Dodge/Render/Picture.hs @@ -10,6 +10,7 @@ import Dodge.Picture.SizeInvariant import Dodge.Picture.Layer import Dodge.Render.HUD import Dodge.Render.MenuScreen +import Dodge.SoundLogic.LoadSound import Sound.Data import Geometry import Picture @@ -77,7 +78,7 @@ soundPic :: World -> Sound -> Picture soundPic w s = fixedSizePicClampArrow 50 50 thePic p w where p = _soundPos s - thePic = scale 0.15 0.15 $ text "SOUND" + thePic = scale 0.15 0.15 $ text $ soundToOnomato $ _soundChunkID s crDraw :: World -> Creature -> Picture crDraw w c = _crPict c c w diff --git a/src/Dodge/SoundLogic.hs b/src/Dodge/SoundLogic.hs index 3c2e5a97e..db20eff70 100644 --- a/src/Dodge/SoundLogic.hs +++ b/src/Dodge/SoundLogic.hs @@ -23,6 +23,7 @@ import Sound.Data import Geometry.Data import Geometry.Vector import Dodge.SoundLogic.Synonyms +import Dodge.SoundLogic.LoadSound import Control.Lens import qualified Data.Map as M @@ -44,7 +45,7 @@ resumeSound w = w For each origin only one sound will play at a time. -} soundOnceOrigin - :: Int -- ^ ID of the sound to be played + :: SoundID -- ^ ID of the sound to be played -> SoundOrigin -- ^ The \"creator\" of the sound -> Point2 -- ^ The position of the sound in the world -> World @@ -58,14 +59,14 @@ soundOnceOrigin sType so p w = w & sounds %~ M.insertWith (\ _ x -> x) so theSou , _soundChannel = Nothing , _soundAngDist = Just (a,0) , _soundPos = p - , _soundVolume = soundVolID sType + , _soundVolume = soundToVol sType } a = soundAngle p w soundFrom :: SoundOrigin -- ^ \"Creator\" of sound -> Point2 -- ^ Position of sound - -> Int -- ^ ID of sound to be played + -> SoundID -- ^ ID of sound to be played -> Maybe Int -- ^ Frames to play sound for, Nothing for until finished -> World -> World @@ -78,7 +79,7 @@ soundFrom so pos sType mtime w = over sounds (M.insertWith f so sound) w , _soundChannel = Nothing , _soundAngDist = Just (a,0) , _soundPos = pos - , _soundVolume = soundVolID sType + , _soundVolume = soundToVol sType } f _ s = s {_soundTime = mtime } a = soundAngle pos w @@ -86,7 +87,7 @@ soundFrom so pos sType mtime w = over sounds (M.insertWith f so sound) w soundFromGeneral :: SoundOrigin -- ^ \"Creator\" of sound -> (World -> Point2) -- ^ Position of sound - -> Int -- ^ ID of sound to be played + -> SoundID -- ^ ID of sound to be played -> Maybe Int -- ^ Frames to play sound for, Nothing for until finished -> World -> World @@ -99,7 +100,7 @@ soundFromGeneral so fpos sType mtime w = over sounds (M.insertWith f so sound) w , _soundChannel = Nothing , _soundAngDist = Just (a,0) , _soundPos = fpos w - , _soundVolume = soundVolID sType + , _soundVolume = soundToVol sType } f _ s = s {_soundTime = mtime } a = soundAngle (fpos w) w @@ -124,7 +125,7 @@ Does nothing if all origins are already creating sounds. -} soundMultiFrom :: [SoundOrigin] -> Point2 -- ^ Position - -> Int -- ^ Sound ID + -> SoundID -- ^ Sound ID -> Maybe Int -- ^ Frames to play for, Nothing for full length -> World -> World @@ -140,7 +141,7 @@ soundMultiFrom (so:sos) pos sType mtime w , _soundChannel = Nothing , _soundAngDist = Just (a,0) , _soundPos = pos - , _soundVolume = soundVolID sType + , _soundVolume = soundToVol sType } a = soundAngle pos w {- | Sets '_soundTime' to 0. -} diff --git a/src/Dodge/SoundLogic/LoadSound.hs b/src/Dodge/SoundLogic/LoadSound.hs index 6db55cf26..6f2e27d45 100644 --- a/src/Dodge/SoundLogic/LoadSound.hs +++ b/src/Dodge/SoundLogic/LoadSound.hs @@ -1,104 +1,318 @@ module Dodge.SoundLogic.LoadSound where +import Sound.Data + import qualified Data.IntMap.Strict as IM import qualified SDL.Mixer as Mix +loadSound :: (Int,String) -> IO (Int, Mix.Chunk) +loadSound (i,s) = do + chnk <- Mix.load $ "./data/sound/" ++ s + return (i,chnk) + loadSounds :: IO (IM.IntMap Mix.Chunk) loadSounds = do Mix.openAudio Mix.defaultAudio 128 - pFireSound <- Mix.load "./data/sound/tap3.wav" - click <- Mix.load "./data/sound/click1.wav" - reloadSound' <- Mix.load "./data/sound/reload1.wav" - tone440 <- Mix.load "./data/sound/tone440.wav" - pickupSound' <- Mix.load "./data/sound/pickUp.wav" - putdownSound' <- Mix.load "./data/sound/whiteNoiseFadeOut.wav" - fireSound' <- Mix.load "./data/sound/fire1.wav" - grenadeBang' <- Mix.load "./data/sound/grenade.wav" - tapQuiet' <- Mix.load "./data/sound/tapQuiet.wav" - twoStep' <- Mix.load "./data/sound/twoStep.wav" - healSound' <- Mix.load "./data/sound/heal.wav" - doorSound' <- Mix.load "./data/sound/slideDoor.wav" - twoStepSlow' <- Mix.load "./data/sound/twoStepSlow.wav" - knifeSound' <- Mix.load "./data/sound/knife.wav" - buzzSound' <- Mix.load "./data/sound/buzz.wav" - hitSound' <- Mix.load "./data/sound/hit1.wav" - autoGunSound' <- Mix.load "./data/sound/autoGun.wav" - shotgunSound' <- Mix.load "./data/sound/shotgun.wav" - teleSound' <- Mix.load "./data/sound/tele.wav" - longGunSound' <- Mix.load "./data/sound/longTap.wav" - launcherSound' <- Mix.load "./data/sound/tap4.wav" - smokeTrailSound' <- Mix.load "./data/sound/missileLaunch.wav" - foot1Sound' <- Mix.load "./data/sound/foot1.wav" - foot2Sound' <- Mix.load "./data/sound/foot2.wav" - lasSound' <- Mix.load "./data/sound/tone440sawtooth.wav" - teslaSound' <- Mix.load "./data/sound/Electrical-Welding.wav" - crankSlow' <- Mix.load "./data/sound/crankSlow.wav" - autoB' <- Mix.load "./data/sound/autoB.wav" - mini' <- Mix.load "./data/sound/mini1.wav" - impactA' <- Mix.load "./data/sound/Impact-A.wav" - impactB' <- Mix.load "./data/sound/Impact-B.wav" - impactC' <- Mix.load "./data/sound/Impact-C.wav" - impactD' <- Mix.load "./data/sound/Impact-D.wav" - glassShat1' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A1.wav" - glassShat2' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A2.wav" - glassShat3' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A3.wav" - glassShat4' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A4.wav" - glass1' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A1.wav" - glass2' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A2.wav" - glass3' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A3.wav" - glass4' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A4.wav" - foamSpray <- Mix.load "./data/sound/foamSprayLoop.wav" - foamSprayFadeOut <- Mix.load "./data/sound/foamSprayFadeOut.wav" - sineRaisePitchOneSec <- Mix.load "./data/sound/sineRaisePitchOneSec.wav" - sineRaisePitchTwoSec <- Mix.load "./data/sound/sineRaisePitchTwoSec.wav" - skwareFadeTwoSec <- Mix.load "./data/sound/skwareFadeTwoSec.wav" - return $ IM.fromList $ zip [0..] - [ pFireSound - , click - , reloadSound' - , tone440 - , pickupSound' - , putdownSound' - , fireSound' - , grenadeBang' - , tapQuiet' - , twoStep' - , healSound' - , doorSound' - , twoStepSlow' - , knifeSound' - , buzzSound' - , hitSound' --15 - , autoGunSound' - , shotgunSound' - , teleSound' - , longGunSound' - , launcherSound' - , smokeTrailSound' - , foot1Sound' - , foot2Sound' - , lasSound' - , teslaSound' --25 - , crankSlow' - , autoB' - , mini' - , impactA' - , impactB' --30 - , impactC' - , impactD' - , glassShat1' --33 - , glassShat2' - , glassShat3' - , glassShat4' - , glass1' --37 - , glass2' - , glass3' - , glass4' --40 - , foamSpray - , foamSprayFadeOut - , sineRaisePitchOneSec - , sineRaisePitchTwoSec - , skwareFadeTwoSec - ] + fmap IM.fromList $ mapM loadSound $ zip [0..] soundPathList + +soundToVol :: SoundID -> Float +soundToVol v = case _getSoundID v of + 0 -> 20 + 1 -> 80 + 2 -> 40 + 3 -> 30 + 4 -> 30 + 5 -> 100 + 6 -> 50 + 7 -> 20 + 8 -> 200 + 9 -> 100 + 10 -> 50 + 11 -> 80 + 12 -> 30 + 13 -> 80 + 14 -> 120 + 15 -> 50 + 16 -> 30 + 17 -> 100 + 18 -> 80 + 19 -> 50 + 20 -> 100 + 21 -> 120 + 22 -> 20 + 23 -> 20 + 24 -> 80 + 25 -> 30 + 26 -> 80 + 27 -> 80 + 28 -> 80 + 29 -> 50 + 30 -> 30 + 31 -> 40 + 32 -> 50 + 33 -> 50 + 34 -> 80 + 35 -> 80 + 36 -> 60 + 37 -> 40 + 38 -> 150 + 39 -> 40 + 40 -> 50 + 41 -> 40 + 42 -> 30 + 43 -> 80 + 44 -> 80 + 45 -> 20 + 46 -> 80 + 47 -> 50 + 48 -> 50 + 49 -> 30 + 50 -> 100 + 51 -> 50 + 52 -> 150 + 53 -> 100 + 54 -> 80 + 55 -> 30 + 56 -> 100 + 57 -> 100 + _ -> 50 +soundToOnomato :: SoundID -> String +soundToOnomato v = case _getSoundID v of + 0 -> "BLIH" + 1 -> "CRNK" + 2 -> "BRAP" + 3 -> "TIP" + 4 -> "THUD" + 5 -> "BRAP" + 6 -> "CRTINK" + 7 -> "SHUHP" + 8 -> "BOOM" + 9 -> "WHSSH" + 10 -> "KRTNKL" + 11 -> "CRUMPLE" + 12 -> "TAP" + 13 -> "CRUNK" + 14 -> "BRDBRDBRD" + 15 -> "WRR" + 16 -> "DRR" + 17 -> "TATATA" + 18 -> "TAK" + 19 -> "TRINKL" + 20 -> "SCREE" + 21 -> "BRPBRPBRP" + 22 -> "PHF" + 23 -> "FHP" + 24 -> "CRSNK" + 25 -> "BWAAH" + 26 -> "RINGGG" + 27 -> "ZMM" + 28 -> "BRAP" + 29 -> "HNH" + 30 -> "CHPCHPCHP" + 31 -> "SMACK" + 32 -> "HSSS" + 33 -> "HSS" + 34 -> "CRSK" + 35 -> "CRASH" + 36 -> "TAPTIP" + 37 -> "TIPTOP" + 38 -> "BANG" + 39 -> "TIPTAP" + 40 -> "THUD" + 41 -> "TAPP" + 42 -> "DWAAH" + 43 -> "TAKH" + 44 -> "BEP" + 45 -> "SWSH" + 46 -> "CRNKL" + 47 -> "CHNKCHNKCHUNK" + 48 -> "TINKLE" + 49 -> "TNKTNKTNK" + 50 -> "BRAHCHCH" + 51 -> "CLICK" + 52 -> "BANGG" + 53 -> "WRRR" + 54 -> "CRISH" + 55 -> "BWAH" + 56 -> "CRAKLE" + 57 -> "ZHM" + _ -> error "unitialised sound" +soundPathList :: [String] +soundPathList = + [ "heal.BLIH.20.wav" + , "glassShat3.CRNK.80.wav" + , "tapQuiet.BRAP.40.wav" + , "foot1.TIP.30.wav" + , "hit.THUD.30.wav" + , "autoGun.BRAP.100.wav" + , "smallGlass3.CRTINK.50.wav" + , "pickUp.SHUHP.20.wav" + , "explosion.BOOM.200.wav" + , "missileLaunch.WHSSH.100.wav" + , "smallGlass2.KRTNKL.50.wav" + , "impact3.CRUMPLE.80.wav" + , "foot2.TAP.30.wav" + , "impact2.CRUNK.80.wav" + , "mini1.BRDBRDBRD.120.wav" + , "fire.WRR.50.wav" + , "slideDoor.DRR.30.wav" + , "autoB.TATATA.100.wav" + , "tap1.TAK.80.wav" + , "smallGlass1.TRINKL.50.wav" + , "tone440sawtooth.SCREE.100.wav" + , "mini.BRPBRPBRP.120.wav" + , "whiteNoiseFadeOut.PHF.20.wav" + , "whiteNoiseFadeIn.FHP.20.wav" + , "glassShat1.CRSNK.80.wav" + , "sineRaisePitchTwoSec.BWAAH.30.wav" + , "tinitus.RINGGG.80.wav" + , "buzz.ZMM.80.wav" + , "tap3.BRAP.80.wav" + , "grunt.HNH.50.wav" + , "reload1.CHPCHPCHP.30.wav" + , "hit1.SMACK.40.wav" + , "foamSprayLoop.HSSS.50.wav" + , "foamSprayFadeOut.HSS.50.wav" + , "glassShat4.CRSK.80.wav" + , "impact1.CRASH.80.wav" + , "twoStep1.TAPTIP.60.wav" + , "twoStepSlow.TIPTOP.40.wav" + , "bang.BANG.150.wav" + , "twoStep.TIPTAP.40.wav" + , "tap4.THUD.50.wav" + , "foot3.TAPP.40.wav" + , "skwareFadeTwoSec.DWAAH.30.wav" + , "tap2.TAKH.80.wav" + , "tone440.BEP.80.wav" + , "knife.SWSH.20.wav" + , "glassShat2.CRNKL.80.wav" + , "crankSlow.CHNKCHNKCHUNK.50.wav" + , "smallGlass4.TINKLE.50.wav" + , "reload.TNKTNKTNK.30.wav" + , "shotgun.BRAHCHCH.100.wav" + , "click1.CLICK.50.wav" + , "bangEcho.BANGG.150.wav" + , "fireLoud.WRRR.100.wav" + , "impact4.CRISH.80.wav" + , "sineRaisePitchOneSec.BWAH.30.wav" + , "elecCrackle.CRAKLE.100.wav" + , "tele.ZHM.100.wav" + ] +healS :: SoundID +healS = SoundID 0 +glassShat3S :: SoundID +glassShat3S = SoundID 1 +tapQuietS :: SoundID +tapQuietS = SoundID 2 +foot1S :: SoundID +foot1S = SoundID 3 +hitS :: SoundID +hitS = SoundID 4 +autoGunS :: SoundID +autoGunS = SoundID 5 +smallGlass3S :: SoundID +smallGlass3S = SoundID 6 +pickUpS :: SoundID +pickUpS = SoundID 7 +explosionS :: SoundID +explosionS = SoundID 8 +missileLaunchS :: SoundID +missileLaunchS = SoundID 9 +smallGlass2S :: SoundID +smallGlass2S = SoundID 10 +impact3S :: SoundID +impact3S = SoundID 11 +foot2S :: SoundID +foot2S = SoundID 12 +impact2S :: SoundID +impact2S = SoundID 13 +mini1S :: SoundID +mini1S = SoundID 14 +fireS :: SoundID +fireS = SoundID 15 +slideDoorS :: SoundID +slideDoorS = SoundID 16 +autoBS :: SoundID +autoBS = SoundID 17 +tap1S :: SoundID +tap1S = SoundID 18 +smallGlass1S :: SoundID +smallGlass1S = SoundID 19 +tone440sawtoothS :: SoundID +tone440sawtoothS = SoundID 20 +miniS :: SoundID +miniS = SoundID 21 +whiteNoiseFadeOutS :: SoundID +whiteNoiseFadeOutS = SoundID 22 +whiteNoiseFadeInS :: SoundID +whiteNoiseFadeInS = SoundID 23 +glassShat1S :: SoundID +glassShat1S = SoundID 24 +sineRaisePitchTwoSecS :: SoundID +sineRaisePitchTwoSecS = SoundID 25 +tinitusS :: SoundID +tinitusS = SoundID 26 +buzzS :: SoundID +buzzS = SoundID 27 +tap3S :: SoundID +tap3S = SoundID 28 +gruntS :: SoundID +gruntS = SoundID 29 +reload1S :: SoundID +reload1S = SoundID 30 +hit1S :: SoundID +hit1S = SoundID 31 +foamSprayLoopS :: SoundID +foamSprayLoopS = SoundID 32 +foamSprayFadeOutS :: SoundID +foamSprayFadeOutS = SoundID 33 +glassShat4S :: SoundID +glassShat4S = SoundID 34 +impact1S :: SoundID +impact1S = SoundID 35 +twoStep1S :: SoundID +twoStep1S = SoundID 36 +twoStepSlowS :: SoundID +twoStepSlowS = SoundID 37 +bangS :: SoundID +bangS = SoundID 38 +twoStepS :: SoundID +twoStepS = SoundID 39 +tap4S :: SoundID +tap4S = SoundID 40 +foot3S :: SoundID +foot3S = SoundID 41 +skwareFadeTwoSecS :: SoundID +skwareFadeTwoSecS = SoundID 42 +tap2S :: SoundID +tap2S = SoundID 43 +tone440S :: SoundID +tone440S = SoundID 44 +knifeS :: SoundID +knifeS = SoundID 45 +glassShat2S :: SoundID +glassShat2S = SoundID 46 +crankSlowS :: SoundID +crankSlowS = SoundID 47 +smallGlass4S :: SoundID +smallGlass4S = SoundID 48 +reloadS :: SoundID +reloadS = SoundID 49 +shotgunS :: SoundID +shotgunS = SoundID 50 +click1S :: SoundID +click1S = SoundID 51 +bangEchoS :: SoundID +bangEchoS = SoundID 52 +fireLoudS :: SoundID +fireLoudS = SoundID 53 +impact4S :: SoundID +impact4S = SoundID 54 +sineRaisePitchOneSecS :: SoundID +sineRaisePitchOneSecS = SoundID 55 +elecCrackleS :: SoundID +elecCrackleS = SoundID 56 +teleS :: SoundID +teleS = SoundID 57 loadMusic :: IO (IM.IntMap Mix.Music) loadMusic = do diff --git a/src/Dodge/WorldEvent/Explosion.hs b/src/Dodge/WorldEvent/Explosion.hs index bedc1dae0..a503adbb6 100644 --- a/src/Dodge/WorldEvent/Explosion.hs +++ b/src/Dodge/WorldEvent/Explosion.hs @@ -12,7 +12,7 @@ import Dodge.WorldEvent.SpawnParticle --import Dodge.WorldEvent.Flash import Dodge.RandomHelp import Dodge.SoundLogic -import Dodge.SoundLogic.Synonyms +import Dodge.SoundLogic.LoadSound import Dodge.WorldEvent.Shockwave import Geometry import Geometry.Vector3D @@ -30,7 +30,7 @@ makePoisonExplosionAt -> World -> World makePoisonExplosionAt p w - = soundMultiFrom [Explosion 0,Explosion 1] p grenadeBang Nothing + = soundMultiFrom [Explosion 0,Explosion 1] p bangS Nothing $ foldr (makeGasCloud p) w vels where vels = replicateM 25 (randInCirc 2) & evalState $ _randGen w @@ -58,7 +58,7 @@ makeFlameExplosionAt -> World -> World makeFlameExplosionAt p w - = soundMultiFrom [Explosion 0,Explosion 1] p grenadeBang Nothing + = soundMultiFrom [Explosion 0,Explosion 1] p bangS Nothing $ over particles (newFlames ++ ) w where newFlames = zipWith makeFlameWithVelAndTime velocities timers @@ -73,7 +73,7 @@ makeExplosionAt -> World -> World makeExplosionAt p w - = soundMultiFrom [Explosion 0,Explosion 1] p grenadeBang Nothing + = soundMultiFrom [Explosion 0,Explosion 1] p bangS Nothing . addFlames -- . explosionFlashAt p . over tempLightSources (theTLS :) diff --git a/src/Dodge/WorldEvent/Sound.hs b/src/Dodge/WorldEvent/Sound.hs index 53acf8bf7..8a6a2238a 100644 --- a/src/Dodge/WorldEvent/Sound.hs +++ b/src/Dodge/WorldEvent/Sound.hs @@ -3,17 +3,21 @@ module Dodge.WorldEvent.Sound import Dodge.Data import Dodge.Data.SoundOrigin import Dodge.SoundLogic -import System.Random +import Dodge.SoundLogic.LoadSound import Geometry.Data +import Dodge.RandomHelp +import System.Random import Control.Lens +import Control.Monad.State.Lazy + mkSoundBreakGlass :: Point2 -> World -> World mkSoundBreakGlass p w = soundOnceOrigin soundid (GlassBreakSound 0) p $ set randGen g w where - (soundid,g) = _randGen w & randomR (37,40) + (soundid,g) = _randGen w & runState (takeOne [glassShat1S,glassShat2S,glassShat3S,glassShat4S]) mkSoundSplinterGlass :: Point2 -> World -> World mkSoundSplinterGlass p w = soundOnceOrigin soundid (GlassBreakSound 1) p $ set randGen g w where - (soundid,g) = _randGen w & randomR (33,36) + (soundid,g) = _randGen w & runState (takeOne [smallGlass1S,smallGlass2S,smallGlass3S,smallGlass4S]) diff --git a/src/Dodge/WorldEvent/SpawnParticle.hs b/src/Dodge/WorldEvent/SpawnParticle.hs index 2deb37db4..894ea8fe0 100644 --- a/src/Dodge/WorldEvent/SpawnParticle.hs +++ b/src/Dodge/WorldEvent/SpawnParticle.hs @@ -20,7 +20,7 @@ import Dodge.WorldEvent.Cloud import Dodge.Particle.Bullet.Draw import Dodge.Particle.Bullet.Update import Dodge.SoundLogic -import Dodge.SoundLogic.Synonyms +import Dodge.SoundLogic.LoadSound import Dodge.RandomHelp --import Dodge.Debug import Picture @@ -99,7 +99,7 @@ moveFlame rotd w pt _ -> (glare $ doSound damcrs , mvPt) where time = _btTimer' pt - doSound = soundFrom Flame (V2 x y) fireSound (Just 2) -- . over worldEvents ((.) $ flameGlareAt ep) + doSound = soundFrom Flame (V2 x y) fireS (Just 2) -- . over worldEvents ((.) $ flameGlareAt ep) glare | time `mod` 5 == 0 = tempLightSources %~ (theTLS :) diff --git a/src/Sound.hs b/src/Sound.hs index 9d8690f82..aa66fad10 100644 --- a/src/Sound.hs +++ b/src/Sound.hs @@ -82,7 +82,7 @@ tryPlay sd s = do i <- tryGetChannel s _ <- liftIO $ do Mix.halt i - Mix.playOn i Mix.Once (sd IM.! _soundChunkID s) + Mix.playOn i Mix.Once (sd IM.! (_getSoundID $ _soundChunkID s)) return $ s & soundChannel ?~ i & soundStatus .~ JustStartedPlaying diff --git a/src/Sound/Data.hs b/src/Sound/Data.hs index 3b9fd70d3..461367f80 100644 --- a/src/Sound/Data.hs +++ b/src/Sound/Data.hs @@ -15,6 +15,9 @@ data SoundStatus | ToStart deriving (Eq,Ord,Show) +newtype SoundID = SoundID { _getSoundID :: Int } + deriving (Eq,Ord,Show) + newtype SoundData = SoundData {_loadedChunks :: IM.IntMap Mix.Chunk } @@ -25,7 +28,7 @@ data Sound = Sound , _soundAngDist :: Maybe (Int16,Word8) , _soundPos :: Point2 , _soundVolume :: Float - , _soundChunkID :: Int + , _soundChunkID :: SoundID } deriving (Eq,Ord,Show)