diff options
Diffstat (limited to 'src/engine/config')
-rw-r--r-- | src/engine/config/assets.ts | 43 | ||||
-rw-r--r-- | src/engine/config/index.ts | 1 | ||||
-rw-r--r-- | src/engine/config/sounds.ts | 84 | ||||
-rw-r--r-- | src/engine/config/sprites.ts | 10 |
4 files changed, 137 insertions, 1 deletions
diff --git a/src/engine/config/assets.ts b/src/engine/config/assets.ts index 5ce13e8..fbfab2f 100644 --- a/src/engine/config/assets.ts +++ b/src/engine/config/assets.ts @@ -1,4 +1,5 @@ import { type SpriteSpec, SPRITE_SPECS } from "."; +import { SOUND_SPECS, SoundSpec } from "./sounds"; export const FONT = new FontFace("scientifica", "url(/fonts/scientifica.ttf)"); FONT.load().then((font) => { @@ -6,6 +7,7 @@ FONT.load().then((font) => { }); export const IMAGES = new Map<string, HTMLImageElement>(); +export const SOUNDS = new Map<string, HTMLAudioElement>(); export const loadSpritesIntoImageElements = ( spriteSpecs: Partial<SpriteSpec>[], @@ -35,6 +37,45 @@ export const loadSpritesIntoImageElements = ( return spritePromises; }; +export const loadSoundsIntoAudioElements = ( + soundSpecs: SoundSpec[], +): Promise<void>[] => { + const soundPromises: Promise<void>[] = []; + + for (const soundSpec of soundSpecs) { + if (soundSpec.url) { + const promise = fetch(soundSpec.url) + .then((response) => response.blob()) + .then((blob) => { + const audio = new Audio(); + audio.src = URL.createObjectURL(blob); + audio.volume = soundSpec.volume ?? 1; + + SOUNDS.set(soundSpec.name, audio); + return new Promise<void>((resolve, rej) => { + audio.oncanplaythrough = () => { + resolve(); + }; + + audio.onerror = (e) => { + console.error(soundSpec); + rej(e); + }; + }); + }); + soundPromises.push(promise); + } + + if (soundSpec.states) { + soundPromises.push( + ...loadSoundsIntoAudioElements(Array.from(soundSpec.states.values())), + ); + } + } + + return soundPromises; +}; + export const loadAssets = () => Promise.all([ ...loadSpritesIntoImageElements( @@ -43,5 +84,5 @@ export const loadAssets = () => ), ), FONT.load(), - // TODO: Sound + ...loadSoundsIntoAudioElements(Array.from(SOUND_SPECS.values())), ]); diff --git a/src/engine/config/index.ts b/src/engine/config/index.ts index a574965..9b69740 100644 --- a/src/engine/config/index.ts +++ b/src/engine/config/index.ts @@ -1,3 +1,4 @@ export * from "./constants"; export * from "./assets"; export * from "./sprites"; +export * from "./sounds"; diff --git a/src/engine/config/sounds.ts b/src/engine/config/sounds.ts new file mode 100644 index 0000000..b182c86 --- /dev/null +++ b/src/engine/config/sounds.ts @@ -0,0 +1,84 @@ +export type SoundSpec = { + name: string; + url?: string; + volume?: number; + states?: Map<string | number, SoundSpec>; +}; + +export const MovingSound: SoundSpec = { + name: "moving", + states: new Map([ + [1, { name: "moving_1", url: "/assets/sound/move_1.wav" }], + // [2, { name: "moving_2", url: "/assets/sound/move_2.wav" }], + // [3, { name: "moving_3", url: "/assets/sound/move_3.wav" }], + [4, { name: "moving_4", url: "/assets/sound/move_4.wav" }], + ]), +}; + +export const LambdaTransformSound: SoundSpec = { + name: "lambdaTransform", + url: "/assets/sound/lambda_transform.wav", + volume: 0.3, +}; + +export const LambdaSave: SoundSpec = { + name: "lambdaSave", + url: "/assets/sound/lambda_save.wav", +}; + +export const Failure: SoundSpec = { + name: "failure", + url: "/assets/sound/failure.wav", + volume: 0.5, +}; + +export const ModalOpen: SoundSpec = { + name: "modalOpen", + url: "/assets/sound/modal_open.wav", + volume: 0.5, +}; + +export const ModalClose: SoundSpec = { + name: "modalClose", + url: "/assets/sound/modal_close.wav", + volume: 0.5, +}; + +export const KeyOpen: SoundSpec = { + name: "keyOpen", + url: "/assets/sound/keyopen.wav", +}; + +export const Music: SoundSpec = { + name: "music", + states: new Map([ + [ + "hope", + { name: "hope", url: "/assets/sound/music/hope.mp3", volume: 0.5 }, + ], + ["jul", { name: "jul", url: "/assets/sound/music/jul.mp3", volume: 0.5 }], + [ + "reverie", + { name: "reverie", url: "/assets/sound/music/reverie.mp3", volume: 0.5 }, + ], + [ + "moonlight", + { + name: "moonlight", + url: "/assets/sound/music/moonlight.mp3", + volume: 0.5, + }, + ], + ]), +}; + +export const SOUND_SPECS: SoundSpec[] = [ + MovingSound, + LambdaTransformSound, + LambdaSave, + Failure, + ModalOpen, + ModalClose, + KeyOpen, + Music, +]; diff --git a/src/engine/config/sprites.ts b/src/engine/config/sprites.ts index cca5961..83bf0a0 100644 --- a/src/engine/config/sprites.ts +++ b/src/engine/config/sprites.ts @@ -8,6 +8,7 @@ export enum Sprites { KEY, LOCKED_DOOR, CURRY, + BUBBLE, } export interface SpriteSpec { @@ -96,3 +97,12 @@ const currySpriteSpec = { sheet: "/assets/curry.png", }; SPRITE_SPECS.set(Sprites.CURRY, currySpriteSpec); + +const bubbleSpriteSpec = { + msPerFrame: 200, + width: 64, + height: 64, + frames: 3, + sheet: "/assets/bubble.png", +}; +SPRITE_SPECS.set(Sprites.BUBBLE, bubbleSpriteSpec); |