summaryrefslogtreecommitdiff
path: root/2026/framing
diff options
context:
space:
mode:
Diffstat (limited to '2026/framing')
-rw-r--r--2026/framing/art/intro.asepritebin0 -> 82393 bytes
-rw-r--r--2026/framing/art/jamsounds.aup3bin0 -> 88330240 bytes
-rw-r--r--2026/framing/art/music.org2
-rw-r--r--2026/framing/art/titlescreen.asepritebin0 -> 17090 bytes
-rw-r--r--2026/framing/dist/game_lib-632bc23475e9f6db.js (renamed from 2026/framing/dist/game_lib-78ce3a29d0f5620b.js)49
-rw-r--r--2026/framing/dist/game_lib-632bc23475e9f6db_bg.wasmbin0 -> 21761231 bytes
-rw-r--r--2026/framing/dist/game_lib-78ce3a29d0f5620b_bg.wasmbin3552530 -> 0 bytes
-rw-r--r--2026/framing/dist/index.html9
-rw-r--r--2026/framing/dist/snippets/game_lib-09da6449fcb9d06e/src/bindings.js3
-rw-r--r--2026/framing/index.html3
-rw-r--r--2026/framing/src/assets/audio/aww.wavbin0 -> 199814 bytes
-rw-r--r--2026/framing/src/assets/audio/boo.wavbin0 -> 272788 bytes
-rw-r--r--2026/framing/src/assets/audio/booyah.wavbin0 -> 167182 bytes
-rw-r--r--2026/framing/src/assets/audio/epicwin.wavbin0 -> 243982 bytes
-rw-r--r--2026/framing/src/assets/audio/excellent.wavbin0 -> 147986 bytes
-rw-r--r--2026/framing/src/assets/audio/explosion.wavbin0 -> 20026 bytes
-rw-r--r--2026/framing/src/assets/audio/gamingtime.wavbin0 -> 240150 bytes
-rw-r--r--2026/framing/src/assets/audio/itsover.wavbin0 -> 138382 bytes
-rw-r--r--2026/framing/src/assets/audio/jam2026.wavbin0 -> 8426100 bytes
-rw-r--r--2026/framing/src/assets/audio/test.wavbin924 -> 0 bytes
-rw-r--r--2026/framing/src/assets/audio/wind.wavbin0 -> 7480864 bytes
-rw-r--r--2026/framing/src/assets/audio/wow.wavbin0 -> 165254 bytes
-rw-r--r--2026/framing/src/assets/audio/youlose.wavbin0 -> 224782 bytes
-rw-r--r--2026/framing/src/assets/audio/yousuck.wavbin0 -> 186382 bytes
-rw-r--r--2026/framing/src/assets/textures/intro.pngbin0 -> 162584 bytes
-rw-r--r--2026/framing/src/assets/textures/titlescreen.pngbin0 -> 12030 bytes
-rw-r--r--2026/framing/src/bindings.js3
-rw-r--r--2026/framing/src/game.rs134
28 files changed, 156 insertions, 47 deletions
diff --git a/2026/framing/art/intro.aseprite b/2026/framing/art/intro.aseprite
new file mode 100644
index 0000000..0e7985e
--- /dev/null
+++ b/2026/framing/art/intro.aseprite
Binary files differ
diff --git a/2026/framing/art/jamsounds.aup3 b/2026/framing/art/jamsounds.aup3
new file mode 100644
index 0000000..1473fcd
--- /dev/null
+++ b/2026/framing/art/jamsounds.aup3
Binary files differ
diff --git a/2026/framing/art/music.org b/2026/framing/art/music.org
index ed108c9..a924a9d 100644
--- a/2026/framing/art/music.org
+++ b/2026/framing/art/music.org
@@ -1,2 +1,4 @@
* start game jingle
https://ultraabox.github.io/#u5N08Untitledn310s1k02l00e00t1Ua7g0fj07r1O_U00000000i0o321T1v0wuh5f150qg500O00d030A0F0B0Q4544Pf800R0000E2c01211T0v0Aug3f0000q0C010l5000O05d390w50h5y0000000000000w000000E1c0b6T1v0pu56f0000qwB18310O01d030A5F5B9Q4445PfaedR0000E4c0b962863979T2v0pu15f180q040O0d030w0h0E0c0b40000000000w0000000001000000000040000000000p1uFAuG8QNsz82Ux27wE1erj8ZcWs0000
+* main theme
+https://ultraabox.github.io/#u5N07jam2026n320s7k02l00e0ft2La7g0fj07r1O_U0000000000i0o321T5v0pug6f0000qE5130O0ld420H07000000000000h2E1c01nT1v0pufbf0000q040O0d020A0F0B0Qf444Pf000R0000E2c050819T1v0puh5f150qg500O00d030A0F0B0Q4544Pf800R0000E2c01211T3v0iugef0000q0B1610O00d080S9aiiqjriHSDSSKIh0E1c0bdT4v0puf0f1a0q050O00z8888onapap4oSBKSJJAArriiiiii07JCABrzrrrrrrr00YrkqHrsrrrrjr005zrAqzrjzrrqr1jRjrqGGrrzsrsA099ijrABJJJIAzrrtirqrqjqixzsrAjrqjiqaqqysttAJqjikikrizrHtBJJAzArzrIsRCITKSS099ijrAJS____Qg99habbCAYrDzh00E0c0bkid1kS4zgioh4h4h4h4h4h8i4x8i4x8i4h4h4h4h4h4h8h8i4x4x4wp23xFB-9Qx1kp6hwWKCGg5aHkFQdhkGmp6zjHqiFlFladeFFGdqNiHkWuEFRad6FiFBczOwzE4t0zHkp0zE4t0zEkg5czO0zAyewhROe08W44hQie2Rx78g5czFAteDjEkOeChwkOcnlC6hycYFiEM56BhEQszf9pemi0m6hyJ2p68V138Qa6gzAq538jOd2xA9p7A9GcqcYzgO4GcIzA9QpQpV78jEPEPO80
diff --git a/2026/framing/art/titlescreen.aseprite b/2026/framing/art/titlescreen.aseprite
new file mode 100644
index 0000000..a3d83f0
--- /dev/null
+++ b/2026/framing/art/titlescreen.aseprite
Binary files differ
diff --git a/2026/framing/dist/game_lib-78ce3a29d0f5620b.js b/2026/framing/dist/game_lib-632bc23475e9f6db.js
index 95c2c03..ef71c3c 100644
--- a/2026/framing/dist/game_lib-78ce3a29d0f5620b.js
+++ b/2026/framing/dist/game_lib-632bc23475e9f6db.js
@@ -215,6 +215,10 @@ function debugString(val) {
return className;
}
+export function titlescreen_click() {
+ wasm.titlescreen_click();
+}
+
export function start_game() {
wasm.start_game();
}
@@ -243,7 +247,7 @@ function __wbg_adapter_40(arg0, arg1, arg2) {
}
function __wbg_adapter_43(arg0, arg1, arg2) {
- wasm.closure522_externref_shim(arg0, arg1, arg2);
+ wasm.closure529_externref_shim(arg0, arg1, arg2);
}
function __wbg_adapter_54(arg0, arg1) {
@@ -251,7 +255,7 @@ function __wbg_adapter_54(arg0, arg1) {
}
function __wbg_adapter_57(arg0, arg1, arg2) {
- wasm.closure597_externref_shim(arg0, arg1, arg2);
+ wasm.closure604_externref_shim(arg0, arg1, arg2);
}
const __wbindgen_enum_VisibilityState = ["hidden", "visible"];
@@ -1235,6 +1239,10 @@ function __wbg_get_imports() {
imports.wbg.__wbg_setProperty_9a56f92c3dfbaa30 = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {
arg0.setProperty(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4));
}, arguments) };
+ imports.wbg.__wbg_setTargetAtTime_95bf62b9eef6de02 = function() { return handleError(function (arg0, arg1, arg2, arg3) {
+ const ret = arg0.setTargetAtTime(arg1, arg2, arg3);
+ return ret;
+ }, arguments) };
imports.wbg.__wbg_setTimeout_5356cabf3c726313 = function() { return handleError(function (arg0, arg1, arg2) {
const ret = arg0.setTimeout(arg1, arg2);
return ret;
@@ -1316,6 +1324,9 @@ function __wbg_get_imports() {
imports.wbg.__wbg_stencilMask_dada3773f3d5f226 = function(arg0, arg1) {
arg0.stencilMask(arg1 >>> 0);
};
+ imports.wbg.__wbg_stop_6d875c19a6df48fc = function() { return handleError(function (arg0) {
+ arg0.stop();
+ }, arguments) };
imports.wbg.__wbg_style_59ace31f3c27e375 = function(arg0) {
const ret = arg0.style;
return ret;
@@ -1457,43 +1468,43 @@ function __wbg_get_imports() {
const ret = false;
return ret;
};
- imports.wbg.__wbindgen_closure_wrapper3073 = function(arg0, arg1, arg2) {
- const ret = makeMutClosure(arg0, arg1, 523, __wbg_adapter_43);
+ imports.wbg.__wbindgen_closure_wrapper3165 = function(arg0, arg1, arg2) {
+ const ret = makeMutClosure(arg0, arg1, 530, __wbg_adapter_43);
return ret;
};
- imports.wbg.__wbindgen_closure_wrapper3074 = function(arg0, arg1, arg2) {
- const ret = makeMutClosure(arg0, arg1, 523, __wbg_adapter_43);
+ imports.wbg.__wbindgen_closure_wrapper3166 = function(arg0, arg1, arg2) {
+ const ret = makeMutClosure(arg0, arg1, 530, __wbg_adapter_43);
return ret;
};
- imports.wbg.__wbindgen_closure_wrapper3075 = function(arg0, arg1, arg2) {
- const ret = makeMutClosure(arg0, arg1, 523, __wbg_adapter_43);
+ imports.wbg.__wbindgen_closure_wrapper3167 = function(arg0, arg1, arg2) {
+ const ret = makeMutClosure(arg0, arg1, 530, __wbg_adapter_43);
return ret;
};
- imports.wbg.__wbindgen_closure_wrapper3076 = function(arg0, arg1, arg2) {
- const ret = makeMutClosure(arg0, arg1, 523, __wbg_adapter_43);
+ imports.wbg.__wbindgen_closure_wrapper3168 = function(arg0, arg1, arg2) {
+ const ret = makeMutClosure(arg0, arg1, 530, __wbg_adapter_43);
return ret;
};
- imports.wbg.__wbindgen_closure_wrapper3077 = function(arg0, arg1, arg2) {
- const ret = makeMutClosure(arg0, arg1, 523, __wbg_adapter_43);
+ imports.wbg.__wbindgen_closure_wrapper3169 = function(arg0, arg1, arg2) {
+ const ret = makeMutClosure(arg0, arg1, 530, __wbg_adapter_43);
return ret;
};
- imports.wbg.__wbindgen_closure_wrapper3078 = function(arg0, arg1, arg2) {
- const ret = makeMutClosure(arg0, arg1, 523, __wbg_adapter_54);
+ imports.wbg.__wbindgen_closure_wrapper3170 = function(arg0, arg1, arg2) {
+ const ret = makeMutClosure(arg0, arg1, 530, __wbg_adapter_54);
return ret;
};
- imports.wbg.__wbindgen_closure_wrapper3304 = function(arg0, arg1, arg2) {
- const ret = makeMutClosure(arg0, arg1, 598, __wbg_adapter_57);
+ imports.wbg.__wbindgen_closure_wrapper3396 = function(arg0, arg1, arg2) {
+ const ret = makeMutClosure(arg0, arg1, 605, __wbg_adapter_57);
return ret;
};
- imports.wbg.__wbindgen_closure_wrapper460 = function(arg0, arg1, arg2) {
+ imports.wbg.__wbindgen_closure_wrapper463 = function(arg0, arg1, arg2) {
const ret = makeMutClosure(arg0, arg1, 113, __wbg_adapter_34);
return ret;
};
- imports.wbg.__wbindgen_closure_wrapper462 = function(arg0, arg1, arg2) {
+ imports.wbg.__wbindgen_closure_wrapper465 = function(arg0, arg1, arg2) {
const ret = makeMutClosure(arg0, arg1, 117, __wbg_adapter_37);
return ret;
};
- imports.wbg.__wbindgen_closure_wrapper464 = function(arg0, arg1, arg2) {
+ imports.wbg.__wbindgen_closure_wrapper467 = function(arg0, arg1, arg2) {
const ret = makeMutClosure(arg0, arg1, 115, __wbg_adapter_40);
return ret;
};
diff --git a/2026/framing/dist/game_lib-632bc23475e9f6db_bg.wasm b/2026/framing/dist/game_lib-632bc23475e9f6db_bg.wasm
new file mode 100644
index 0000000..7c32fa2
--- /dev/null
+++ b/2026/framing/dist/game_lib-632bc23475e9f6db_bg.wasm
Binary files differ
diff --git a/2026/framing/dist/game_lib-78ce3a29d0f5620b_bg.wasm b/2026/framing/dist/game_lib-78ce3a29d0f5620b_bg.wasm
deleted file mode 100644
index 76b4bee..0000000
--- a/2026/framing/dist/game_lib-78ce3a29d0f5620b_bg.wasm
+++ /dev/null
Binary files differ
diff --git a/2026/framing/dist/index.html b/2026/framing/dist/index.html
index be343d4..4e46e09 100644
--- a/2026/framing/dist/index.html
+++ b/2026/framing/dist/index.html
@@ -6,8 +6,8 @@
<meta charset="UTF-8">
<script type="module">
-import init, * as bindings from '/framing/dist/game_lib-78ce3a29d0f5620b.js';
-const wasm = await init({ module_or_path: '/framing/dist/game_lib-78ce3a29d0f5620b_bg.wasm' });
+import init, * as bindings from '/framing/dist/game_lib-632bc23475e9f6db.js';
+const wasm = await init({ module_or_path: '/framing/dist/game_lib-632bc23475e9f6db_bg.wasm' });
window.wasmBindings = bindings;
@@ -23,7 +23,7 @@ dispatchEvent(new CustomEvent("TrunkApplicationStarted", {detail: {wasm}}));
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
<link rel="stylesheet" href="/framing/dist/index-1e3cd2ca0ba4d1ec.css" integrity="sha384-1q3UDTmLdOyf9/QxW+Imap//HWhTWNfvn7j2iwuUap3HSD6IOGG7pDS9VJMk7nKv"/>
<title>TODO TITLE</title>
- <link rel="modulepreload" href="/framing/dist/game_lib-78ce3a29d0f5620b.js" crossorigin="anonymous" integrity="sha384-j/ezI19C1/9urd+eyiEyjiBH7hD3nF6IlprOjtj9hqdoQYfnLImA5suIKmtTRKGs"><link rel="modulepreload" href="/framing/dist/snippets/teleia-727bf4351691f1c8/src/helpers.js" crossorigin="anonymous" integrity="sha384-HhtEY2WfGmhyPUSRWKZvqsRxYsdT/DLEdFUqWyDZt6G6lrNHmE1zMlw4BJ3RycRd"><link rel="preload" href="/framing/dist/game_lib-78ce3a29d0f5620b_bg.wasm" crossorigin="anonymous" integrity="sha384-9BDBXfrtsdl5kNmiZ1gASQnzZQOtXW7orQlZxVAwJBW44JFXUdTUc0foCjLJ6fqs" as="fetch" type="application/wasm"></head>
+ <link rel="modulepreload" href="/framing/dist/game_lib-632bc23475e9f6db.js" crossorigin="anonymous" integrity="sha384-wB3zF5FUBj4GzDXiAKthCzMd74wJmz9oHSr/4HCFLcoCjFLmCPiBqXtQiPKpTYaD"><link rel="modulepreload" href="/framing/dist/snippets/game_lib-09da6449fcb9d06e/src/bindings.js" crossorigin="anonymous" integrity="sha384-Dpb3ctNH+2/9pBmnYvFi51S+PB475HUMu/0Sm9buFrBKpJMf6WI/rwH94aMAAaxG"><link rel="modulepreload" href="/framing/dist/snippets/teleia-727bf4351691f1c8/src/helpers.js" crossorigin="anonymous" integrity="sha384-HhtEY2WfGmhyPUSRWKZvqsRxYsdT/DLEdFUqWyDZt6G6lrNHmE1zMlw4BJ3RycRd"><link rel="preload" href="/framing/dist/game_lib-632bc23475e9f6db_bg.wasm" crossorigin="anonymous" integrity="sha384-V6RbIHd2D2OX3mjNLY1lHJQtMKAl0bPzVL+yzEhuqVP4cWc9eK/99BRlKCpxs1Ds" as="fetch" type="application/wasm"></head>
<body>
<script type="module">
window.addEventListener("TrunkApplicationStarted", async (event) => {
@@ -32,6 +32,9 @@ dispatchEvent(new CustomEvent("TrunkApplicationStarted", {detail: {wasm}}));
});
window.addEventListener("message", ev => {
switch (ev.data.op) {
+ case "titlescreenclick":
+ window.wasmBindings.titlescreen_click();
+ break;
case "startgame":
window.wasmBindings.start_game();
break;
diff --git a/2026/framing/dist/snippets/game_lib-09da6449fcb9d06e/src/bindings.js b/2026/framing/dist/snippets/game_lib-09da6449fcb9d06e/src/bindings.js
new file mode 100644
index 0000000..1f17e14
--- /dev/null
+++ b/2026/framing/dist/snippets/game_lib-09da6449fcb9d06e/src/bindings.js
@@ -0,0 +1,3 @@
+export function js_test() {
+ console.log("test");
+}
diff --git a/2026/framing/index.html b/2026/framing/index.html
index c4bb579..a554795 100644
--- a/2026/framing/index.html
+++ b/2026/framing/index.html
@@ -21,6 +21,9 @@
});
window.addEventListener("message", ev => {
switch (ev.data.op) {
+ case "titlescreenclick":
+ window.wasmBindings.titlescreen_click();
+ break;
case "startgame":
window.wasmBindings.start_game();
break;
diff --git a/2026/framing/src/assets/audio/aww.wav b/2026/framing/src/assets/audio/aww.wav
new file mode 100644
index 0000000..6df8dd8
--- /dev/null
+++ b/2026/framing/src/assets/audio/aww.wav
Binary files differ
diff --git a/2026/framing/src/assets/audio/boo.wav b/2026/framing/src/assets/audio/boo.wav
new file mode 100644
index 0000000..d06c162
--- /dev/null
+++ b/2026/framing/src/assets/audio/boo.wav
Binary files differ
diff --git a/2026/framing/src/assets/audio/booyah.wav b/2026/framing/src/assets/audio/booyah.wav
new file mode 100644
index 0000000..82d2bdf
--- /dev/null
+++ b/2026/framing/src/assets/audio/booyah.wav
Binary files differ
diff --git a/2026/framing/src/assets/audio/epicwin.wav b/2026/framing/src/assets/audio/epicwin.wav
new file mode 100644
index 0000000..d55964e
--- /dev/null
+++ b/2026/framing/src/assets/audio/epicwin.wav
Binary files differ
diff --git a/2026/framing/src/assets/audio/excellent.wav b/2026/framing/src/assets/audio/excellent.wav
new file mode 100644
index 0000000..9067c75
--- /dev/null
+++ b/2026/framing/src/assets/audio/excellent.wav
Binary files differ
diff --git a/2026/framing/src/assets/audio/explosion.wav b/2026/framing/src/assets/audio/explosion.wav
new file mode 100644
index 0000000..32c9db9
--- /dev/null
+++ b/2026/framing/src/assets/audio/explosion.wav
Binary files differ
diff --git a/2026/framing/src/assets/audio/gamingtime.wav b/2026/framing/src/assets/audio/gamingtime.wav
new file mode 100644
index 0000000..4c3dc70
--- /dev/null
+++ b/2026/framing/src/assets/audio/gamingtime.wav
Binary files differ
diff --git a/2026/framing/src/assets/audio/itsover.wav b/2026/framing/src/assets/audio/itsover.wav
new file mode 100644
index 0000000..b495ac8
--- /dev/null
+++ b/2026/framing/src/assets/audio/itsover.wav
Binary files differ
diff --git a/2026/framing/src/assets/audio/jam2026.wav b/2026/framing/src/assets/audio/jam2026.wav
new file mode 100644
index 0000000..84239cf
--- /dev/null
+++ b/2026/framing/src/assets/audio/jam2026.wav
Binary files differ
diff --git a/2026/framing/src/assets/audio/test.wav b/2026/framing/src/assets/audio/test.wav
deleted file mode 100644
index 0eabe85..0000000
--- a/2026/framing/src/assets/audio/test.wav
+++ /dev/null
Binary files differ
diff --git a/2026/framing/src/assets/audio/wind.wav b/2026/framing/src/assets/audio/wind.wav
new file mode 100644
index 0000000..652fdde
--- /dev/null
+++ b/2026/framing/src/assets/audio/wind.wav
Binary files differ
diff --git a/2026/framing/src/assets/audio/wow.wav b/2026/framing/src/assets/audio/wow.wav
new file mode 100644
index 0000000..11cb807
--- /dev/null
+++ b/2026/framing/src/assets/audio/wow.wav
Binary files differ
diff --git a/2026/framing/src/assets/audio/youlose.wav b/2026/framing/src/assets/audio/youlose.wav
new file mode 100644
index 0000000..6d4c935
--- /dev/null
+++ b/2026/framing/src/assets/audio/youlose.wav
Binary files differ
diff --git a/2026/framing/src/assets/audio/yousuck.wav b/2026/framing/src/assets/audio/yousuck.wav
new file mode 100644
index 0000000..8b96229
--- /dev/null
+++ b/2026/framing/src/assets/audio/yousuck.wav
Binary files differ
diff --git a/2026/framing/src/assets/textures/intro.png b/2026/framing/src/assets/textures/intro.png
new file mode 100644
index 0000000..5625316
--- /dev/null
+++ b/2026/framing/src/assets/textures/intro.png
Binary files differ
diff --git a/2026/framing/src/assets/textures/titlescreen.png b/2026/framing/src/assets/textures/titlescreen.png
new file mode 100644
index 0000000..6111223
--- /dev/null
+++ b/2026/framing/src/assets/textures/titlescreen.png
Binary files differ
diff --git a/2026/framing/src/bindings.js b/2026/framing/src/bindings.js
new file mode 100644
index 0000000..1f17e14
--- /dev/null
+++ b/2026/framing/src/bindings.js
@@ -0,0 +1,3 @@
+export function js_test() {
+ console.log("test");
+}
diff --git a/2026/framing/src/game.rs b/2026/framing/src/game.rs
index b8fb5ce..6c2df1b 100644
--- a/2026/framing/src/game.rs
+++ b/2026/framing/src/game.rs
@@ -3,12 +3,16 @@ use std::collections::HashMap;
use teleia::*;
use teleia::renderer::UberFlags;
use wasm_bindgen::prelude::*;
+use rand::seq::SliceRandom;
use crate::assets;
const NUM_LIVES: usize = 4;
const LIFE_LOSS_FRAMES: u64 = 120;
+const SOUND_POSITIVE: &[&str] = &["booyah", "excellent", "epicwin", "wow"];
+const SOUND_NEGATIVE: &[&str] = &["boo", "aww", "itsover", "youlose", "yousuck"];
+
#[derive(PartialEq, Eq)]
enum MrColor {
Green,
@@ -146,8 +150,11 @@ fn draw_mr_armed(
}
pub enum Mode {
+ Titlescreen,
+ Intro,
BetweenGames,
InGame,
+ PostGames,
}
pub struct Game {
@@ -160,55 +167,116 @@ pub struct Game {
impl Game {
pub fn new(ctx: &context::Context, st: &mut state::State) -> Self {
Self {
- mode: Mode::BetweenGames,
+ mode: Mode::Titlescreen,
mode_started: 0,
renderer: renderer::Renderer::new(ctx, st, assets::Assets::new),
lives: Lives::new(),
}
}
+ pub fn switch(&mut self, _ctx: &context::Context, st: &mut state::State, m: Mode) {
+ self.mode = m;
+ self.mode_started = st.tick;
+ }
+ fn draw_mrworld(&mut self, ctx: &context::Context, st: &mut state::State, fadeout: Option<Tick>) -> Erm<()> {
+ self.renderer.bind_uber_2d(ctx, st, UberFlags::TEXTURE_COLOR | UberFlags::TEXTURE_FLIP | UberFlags::SPRITE | UberFlags::OPACITY);
+ self.renderer.bind_texture(ctx, st, assets::Texture::Mrworld);
+ self.renderer.set_position_2d(ctx, st, Vec2::ZERO, st.render_dims);
+ self.renderer.set_vec2(ctx, st, "texture_flip", glam::Vec2::new(0.0, 1.0));
+ if let Some(t) = fadeout {
+ if t < 35 {
+ self.renderer.set_texture_offset(ctx, st, 8, 1, 2 + (t / 5).clamp(0, 5) as i32, 0);
+ self.renderer.set_f32(ctx, st, "opacity", 1.0);
+ } else if t < 70 {
+ let since = ((t - 35) as f32).clamp(0.0, 34.0);
+ let opacity = (34.0 - since) / 34.0;
+ self.renderer.set_texture_offset(ctx, st, 8, 1, 7, 0);
+ self.renderer.set_f32(ctx, st, "opacity", opacity);
+ }
+ } else {
+ self.renderer.set_texture_offset(ctx, st, 8, 1, (st.tick as i32 / 20) % 2, 0);
+ self.renderer.set_f32(ctx, st, "opacity", 1.0);
+ }
+ self.renderer.render_square(ctx, st);
+ Ok(())
+ }
+ fn play_random_sound(&mut self, ctx: &context::Context, st: &mut state::State, sounds: &[&str]) {
+ st.audio.play_sfx(sounds.choose(&mut rand::thread_rng()).unwrap());
+ }
}
impl teleia::state::Game for Game {
fn initialize_audio(&self, ctx: &context::Context, st: &state::State, actx: &audio::Context) -> HashMap<String, audio::Audio> {
HashMap::from_iter(vec![
+ ("jam2026".to_owned(), audio::Audio::new(actx, include_bytes!("assets/audio/jam2026.wav"))),
+ ("wind".to_owned(), audio::Audio::new(actx, include_bytes!("assets/audio/wind.wav"))),
("footsteps".to_owned(), audio::Audio::new(actx, include_bytes!("assets/audio/footsteps.wav"))),
+ ("explosion".to_owned(), audio::Audio::new(actx, include_bytes!("assets/audio/explosion.wav"))),
+ ("gamingtime".to_owned(), audio::Audio::new(actx, include_bytes!("assets/audio/gamingtime.wav"))),
+ ("booyah".to_owned(), audio::Audio::new(actx, include_bytes!("assets/audio/booyah.wav"))),
+ ("excellent".to_owned(), audio::Audio::new(actx, include_bytes!("assets/audio/excellent.wav"))),
+ ("epicwin".to_owned(), audio::Audio::new(actx, include_bytes!("assets/audio/epicwin.wav"))),
+ ("wow".to_owned(), audio::Audio::new(actx, include_bytes!("assets/audio/wow.wav"))),
+ ("boo".to_owned(), audio::Audio::new(actx, include_bytes!("assets/audio/boo.wav"))),
+ ("aww".to_owned(), audio::Audio::new(actx, include_bytes!("assets/audio/aww.wav"))),
+ ("itsover".to_owned(), audio::Audio::new(actx, include_bytes!("assets/audio/itsover.wav"))),
+ ("youlose".to_owned(), audio::Audio::new(actx, include_bytes!("assets/audio/youlose.wav"))),
+ ("yousuck".to_owned(), audio::Audio::new(actx, include_bytes!("assets/audio/yousuck.wav"))),
])
}
fn update(&mut self, ctx: &context::Context, st: &mut state::State) -> Erm<()> {
+ let t = st.tick - self.mode_started;
+ match self.mode {
+ Mode::Intro => {
+ if t == 43 * 5 {
+ st.audio.play_sfx("explosion");
+ st.audio.play_music("jam2026", None, None);
+ }
+ if t >= 57 * 5 {
+ self.switch(ctx, st, Mode::BetweenGames);
+ }
+ },
+ _ => {},
+ }
Ok(())
}
fn render(&mut self, ctx: &context::Context, st: &mut state::State) -> Erm<()> {
let t = st.tick - self.mode_started;
match self.mode {
- Mode::BetweenGames => {
+ Mode::Titlescreen => {
self.renderer.begin_frame(ctx, st, Vec4::ZERO);
self.renderer.bind_uber_2d(ctx, st, UberFlags::TEXTURE_COLOR | UberFlags::TEXTURE_FLIP | UberFlags::SPRITE);
- self.renderer.bind_texture(ctx, st, assets::Texture::Mrworld);
- self.renderer.set_texture_offset(ctx, st, 8, 1, (t / 20 % 2) as i32, 0);
+ self.renderer.bind_texture(ctx, st, assets::Texture::Titlescreen);
+ self.renderer.set_texture_offset(ctx, st, 2, 1, (t / 60 % 2) as i32, 0);
self.renderer.set_position_2d(ctx, st, Vec2::ZERO, st.render_dims);
self.renderer.set_vec2(ctx, st, "texture_flip", glam::Vec2::new(0.0, 1.0));
self.renderer.render_square(ctx, st);
- self.lives.render(ctx, st, &mut self.renderer)?;
},
- Mode::InGame => {
+ Mode::Intro => {
self.renderer.begin_frame(ctx, st, Vec4::ZERO);
- self.renderer.bind_uber_2d(ctx, st, UberFlags::TEXTURE_COLOR | UberFlags::TEXTURE_FLIP | UberFlags::SPRITE | UberFlags::OPACITY);
- self.renderer.bind_texture(ctx, st, assets::Texture::Mrworld);
+ self.draw_mrworld(ctx, st, None)?;
+ self.lives.render(ctx, st, &mut self.renderer)?;
+ let f = t / 5;
+ let sx = f % 8;
+ let sy = f / 8;
+ self.renderer.bind_uber_2d(ctx, st, UberFlags::TEXTURE_COLOR | UberFlags::TEXTURE_FLIP | UberFlags::SPRITE);
+ self.renderer.bind_texture(ctx, st, assets::Texture::Intro);
+ self.renderer.set_texture_offset(ctx, st, 8, 8, sx as i32, sy as i32);
self.renderer.set_position_2d(ctx, st, Vec2::ZERO, st.render_dims);
self.renderer.set_vec2(ctx, st, "texture_flip", glam::Vec2::new(0.0, 1.0));
- if t < 35 {
- self.renderer.set_texture_offset(ctx, st, 8, 1, 2 + (t / 5).clamp(0, 5) as i32, 0);
- self.renderer.set_f32(ctx, st, "opacity", 1.0);
- self.renderer.render_square(ctx, st);
- } else if t < 70 {
- let since = ((t - 35) as f32).clamp(0.0, 34.0);
- let opacity = (34.0 - since) / 34.0;
- self.renderer.set_texture_offset(ctx, st, 8, 1, 7, 0);
- self.renderer.set_f32(ctx, st, "opacity", opacity);
- self.renderer.render_square(ctx, st);
- }
- // self.lives.render(ctx, st, &mut self.renderer)?;
+ self.renderer.render_square(ctx, st);
}
+ Mode::BetweenGames => {
+ self.renderer.begin_frame(ctx, st, Vec4::ZERO);
+ self.draw_mrworld(ctx, st, None)?;
+ self.lives.render(ctx, st, &mut self.renderer)?;
+ },
+ Mode::InGame => {
+ self.renderer.begin_frame(ctx, st, Vec4::ZERO);
+ self.draw_mrworld(ctx, st, Some(t))?;
+ // self.lives.render(ctx, st, &mut self.renderer)?;
+ },
+ Mode::PostGames => {
+ },
}
Ok(())
}
@@ -217,22 +285,38 @@ impl teleia::state::Game for Game {
}
}
+#[wasm_bindgen(module = "/src/bindings.js")]
+extern {
+ fn js_test();
+}
+
+#[wasm_bindgen]
+pub fn titlescreen_click() {
+ contextualize(|ctx, st, g: &mut Game| {
+ g.switch(ctx, st, Mode::Intro);
+ st.audio.play_music("wind", None, None);
+ });
+}
+
#[wasm_bindgen]
pub fn start_game() {
contextualize(|ctx, st, g: &mut Game| {
- g.mode = Mode::InGame;
- g.mode_started = st.tick;
+ g.switch(ctx, st, Mode::InGame);
+ st.audio.mute_music(0.0);
});
}
#[wasm_bindgen]
pub fn end_game(win: bool) {
contextualize(|ctx, st, g: &mut Game| {
- g.mode = Mode::BetweenGames;
- g.mode_started = st.tick;
- if !win {
+ g.switch(ctx, st, Mode::BetweenGames);
+ st.audio.unmute_music(0.0);
+ if win {
+ g.play_random_sound(ctx, st, SOUND_POSITIVE);
+ } else {
g.lives.lose_life(ctx, st);
st.audio.play_sfx("footsteps");
+ g.play_random_sound(ctx, st, SOUND_NEGATIVE);
}
});
}