diff options
Diffstat (limited to '2026/framing')
28 files changed, 156 insertions, 47 deletions
diff --git a/2026/framing/art/intro.aseprite b/2026/framing/art/intro.aseprite Binary files differnew file mode 100644 index 0000000..0e7985e --- /dev/null +++ b/2026/framing/art/intro.aseprite diff --git a/2026/framing/art/jamsounds.aup3 b/2026/framing/art/jamsounds.aup3 Binary files differnew file mode 100644 index 0000000..1473fcd --- /dev/null +++ b/2026/framing/art/jamsounds.aup3 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 Binary files differnew file mode 100644 index 0000000..a3d83f0 --- /dev/null +++ b/2026/framing/art/titlescreen.aseprite 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 Binary files differnew file mode 100644 index 0000000..7c32fa2 --- /dev/null +++ b/2026/framing/dist/game_lib-632bc23475e9f6db_bg.wasm diff --git a/2026/framing/dist/game_lib-78ce3a29d0f5620b_bg.wasm b/2026/framing/dist/game_lib-78ce3a29d0f5620b_bg.wasm Binary files differdeleted file mode 100644 index 76b4bee..0000000 --- a/2026/framing/dist/game_lib-78ce3a29d0f5620b_bg.wasm +++ /dev/null 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 Binary files differnew file mode 100644 index 0000000..6df8dd8 --- /dev/null +++ b/2026/framing/src/assets/audio/aww.wav diff --git a/2026/framing/src/assets/audio/boo.wav b/2026/framing/src/assets/audio/boo.wav Binary files differnew file mode 100644 index 0000000..d06c162 --- /dev/null +++ b/2026/framing/src/assets/audio/boo.wav diff --git a/2026/framing/src/assets/audio/booyah.wav b/2026/framing/src/assets/audio/booyah.wav Binary files differnew file mode 100644 index 0000000..82d2bdf --- /dev/null +++ b/2026/framing/src/assets/audio/booyah.wav diff --git a/2026/framing/src/assets/audio/epicwin.wav b/2026/framing/src/assets/audio/epicwin.wav Binary files differnew file mode 100644 index 0000000..d55964e --- /dev/null +++ b/2026/framing/src/assets/audio/epicwin.wav diff --git a/2026/framing/src/assets/audio/excellent.wav b/2026/framing/src/assets/audio/excellent.wav Binary files differnew file mode 100644 index 0000000..9067c75 --- /dev/null +++ b/2026/framing/src/assets/audio/excellent.wav diff --git a/2026/framing/src/assets/audio/explosion.wav b/2026/framing/src/assets/audio/explosion.wav Binary files differnew file mode 100644 index 0000000..32c9db9 --- /dev/null +++ b/2026/framing/src/assets/audio/explosion.wav diff --git a/2026/framing/src/assets/audio/gamingtime.wav b/2026/framing/src/assets/audio/gamingtime.wav Binary files differnew file mode 100644 index 0000000..4c3dc70 --- /dev/null +++ b/2026/framing/src/assets/audio/gamingtime.wav diff --git a/2026/framing/src/assets/audio/itsover.wav b/2026/framing/src/assets/audio/itsover.wav Binary files differnew file mode 100644 index 0000000..b495ac8 --- /dev/null +++ b/2026/framing/src/assets/audio/itsover.wav diff --git a/2026/framing/src/assets/audio/jam2026.wav b/2026/framing/src/assets/audio/jam2026.wav Binary files differnew file mode 100644 index 0000000..84239cf --- /dev/null +++ b/2026/framing/src/assets/audio/jam2026.wav diff --git a/2026/framing/src/assets/audio/test.wav b/2026/framing/src/assets/audio/test.wav Binary files differdeleted file mode 100644 index 0eabe85..0000000 --- a/2026/framing/src/assets/audio/test.wav +++ /dev/null diff --git a/2026/framing/src/assets/audio/wind.wav b/2026/framing/src/assets/audio/wind.wav Binary files differnew file mode 100644 index 0000000..652fdde --- /dev/null +++ b/2026/framing/src/assets/audio/wind.wav diff --git a/2026/framing/src/assets/audio/wow.wav b/2026/framing/src/assets/audio/wow.wav Binary files differnew file mode 100644 index 0000000..11cb807 --- /dev/null +++ b/2026/framing/src/assets/audio/wow.wav diff --git a/2026/framing/src/assets/audio/youlose.wav b/2026/framing/src/assets/audio/youlose.wav Binary files differnew file mode 100644 index 0000000..6d4c935 --- /dev/null +++ b/2026/framing/src/assets/audio/youlose.wav diff --git a/2026/framing/src/assets/audio/yousuck.wav b/2026/framing/src/assets/audio/yousuck.wav Binary files differnew file mode 100644 index 0000000..8b96229 --- /dev/null +++ b/2026/framing/src/assets/audio/yousuck.wav diff --git a/2026/framing/src/assets/textures/intro.png b/2026/framing/src/assets/textures/intro.png Binary files differnew file mode 100644 index 0000000..5625316 --- /dev/null +++ b/2026/framing/src/assets/textures/intro.png diff --git a/2026/framing/src/assets/textures/titlescreen.png b/2026/framing/src/assets/textures/titlescreen.png Binary files differnew file mode 100644 index 0000000..6111223 --- /dev/null +++ b/2026/framing/src/assets/textures/titlescreen.png 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); } }); } |
