summaryrefslogtreecommitdiff
path: root/src/engine/config
diff options
context:
space:
mode:
authorElizabeth Hunt <elizabeth.hunt@simponic.xyz>2024-03-07 20:45:47 -0700
committerElizabeth Hunt <elizabeth.hunt@simponic.xyz>2024-03-07 20:45:47 -0700
commite6e29440563e33bb67e0ad51f9fb6c5c2c3fe809 (patch)
tree5deaee322ff1a039dc44a3cb52ecc48a671fda2a /src/engine/config
parent823620b2a6ebb7ece619991e47a37ad46542b69f (diff)
downloadthe-abstraction-engine-e6e29440563e33bb67e0ad51f9fb6c5c2c3fe809.tar.gz
the-abstraction-engine-e6e29440563e33bb67e0ad51f9fb6c5c2c3fe809.zip
level one (applications prototype finished!)
Diffstat (limited to 'src/engine/config')
-rw-r--r--src/engine/config/assets.ts43
-rw-r--r--src/engine/config/index.ts1
-rw-r--r--src/engine/config/sounds.ts84
-rw-r--r--src/engine/config/sprites.ts10
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);