From 2c4da6fefeb13e40be3948dd24524b82adcac3df Mon Sep 17 00:00:00 2001 From: LLLL Colonq Date: Sun, 16 Feb 2025 04:46:35 -0500 Subject: Fix saves --- src/font.rs | 2 +- src/lib.rs | 64 ++++++++++++++++++++++++++++++++---------------------------- src/main.rs | 2 +- src/save.rs | 40 +++++++++++++++++++++++++++++++++++++ src/state.rs | 3 --- 5 files changed, 76 insertions(+), 35 deletions(-) create mode 100644 src/save.rs (limited to 'src') diff --git a/src/font.rs b/src/font.rs index 3074dff..e431896 100644 --- a/src/font.rs +++ b/src/font.rs @@ -92,7 +92,7 @@ impl Bitmap { texcoords.push(tcbase + glam::Vec2::new(cwidth, cheight)); texcoords.push(tcbase + glam::Vec2::new(cwidth, 0.0)); texcoords.push(tcbase); - let c = if let Some(c) = color.get(i) { + let c = if let Some(c) = color.get(if color.len() == 0 { 0 } else { i % color.len() }) { *c } else { glam::Vec3::new(1.0, 1.0, 1.0) diff --git a/src/lib.rs b/src/lib.rs index 6d6fc9d..d0ee6d9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,6 +11,7 @@ pub mod font; pub mod shadow; pub mod audio; pub mod net; +pub mod save; use std::ops::Rem; @@ -29,6 +30,14 @@ use glfw::Context; #[cfg(not(target_arch = "wasm32"))] use bitflags::bitflags; +#[cfg(not(target_arch = "wasm32"))] +bitflags! { + pub struct Options: u32 { + const OVERLAY = 0b00000001; + const HIDDEN = 0b00000010; + } +} + static mut CTX: Option<*const context::Context> = None; static mut ST: Option<*mut state::State> = None; static mut G: Option<*mut std::ffi::c_void> = None; @@ -45,13 +54,6 @@ where } } -bitflags! { - pub struct Options: u32 { - const OVERLAY = 0b00000001; - const HIDDEN = 0b00000010; - } -} - #[cfg(not(target_arch = "wasm32"))] pub async fn run<'a, F, G, Fut>(title: &str, w: u32, h: u32, options: Options, gnew: F) where @@ -100,6 +102,10 @@ where }); window.make_current(); window.set_key_polling(true); + window.set_mouse_button_polling(true); + window.set_size_polling(true); + window.set_focus_polling(true); + window.set_cursor_pos_polling(true); let gl = unsafe { glow::Context::from_loader_function(|s| window.get_proc_address(s) as *const _) }; @@ -126,27 +132,25 @@ where ctx.glfw.borrow_mut().poll_events(); for (_, event) in glfw::flush_messages(&events) { match event { - // sdl2::event::Event::Window { win_event: sdl2::event::WindowEvent::Resized(_, _), .. } => { - // st.handle_resize(&ctx); - // }, - // sdl2::event::Event::Window { win_event: sdl2::event::WindowEvent::FocusLost, .. } => { - // st.keys = state::Keys::new(); - // }, - // sdl2::event::Event::MouseMotion { x, y, .. } => { - // st.mouse_moved(&ctx, x as f32, y as f32, game); - // }, - // sdl2::event::Event::MouseButtonDown {..} => { - // st.mouse_pressed(&ctx, game) - // }, - // sdl2::event::Event::MouseButtonUp {..} => { - // st.mouse_released(&ctx) - // }, - // sdl2::event::Event::KeyDown { keycode: Some(key), repeat: false, .. } => { - // st.key_pressed(&ctx, state::Keycode::new(key)) - // }, - // sdl2::event::Event::KeyUp { keycode: Some(key), repeat: false, .. } => { - // st.key_released(&ctx, state::Keycode::new(key)) - // }, + glfw::WindowEvent::Size(_, _) => st.handle_resize(&ctx), + glfw::WindowEvent::Focus(false) => { + st.keys = state::Keys::new(); + }, + glfw::WindowEvent::CursorPos(x, y) => { + st.mouse_moved(&ctx, x as f32, y as f32, game); + } + glfw::WindowEvent::MouseButton(_, glfw::Action::Press, _) => { + st.mouse_pressed(&ctx, game) + }, + glfw::WindowEvent::MouseButton(_, glfw::Action::Release, _) => { + st.mouse_released(&ctx) + }, + glfw::WindowEvent::Key(key, _, glfw::Action::Press, _) => { + st.key_pressed(&ctx, state::Keycode::new(key)) + }, + glfw::WindowEvent::Key(key, _, glfw::Action::Release, _) => { + st.key_released(&ctx, state::Keycode::new(key)) + }, _ => {}, } } @@ -312,7 +316,7 @@ use wasm_bindgen::prelude::*; pub struct TestGame { font: font::Bitmap, tt: font::TrueType, - cube: mesh::Mesh, + // cube: mesh::Mesh, fox: scene::Scene, tex: texture::Texture, shader: shader::Shader, @@ -323,7 +327,7 @@ impl TestGame { Self { font: font::Bitmap::new(ctx), tt: font::TrueType::new(ctx, 12.0, include_bytes!("assets/fonts/ComicNeue-Regular.ttf")), - cube: mesh::Mesh::from_obj(ctx, include_bytes!("assets/meshes/cube.obj")), + // cube: mesh::Mesh::from_obj(ctx, include_bytes!("assets/meshes/cube.obj")), fox: scene::Scene::from_gltf(ctx, include_bytes!("assets/scenes/fox.glb")), // fox: scene::Scene::from_gltf(ctx, include_bytes!("/home/llll/src/colonq/assets/lcolonq_flat.vrm")), tex: texture::Texture::new(ctx, include_bytes!("assets/textures/test.png")), diff --git a/src/main.rs b/src/main.rs index 5bbebd1..f7c2a88 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,5 +4,5 @@ pub fn main() {} #[cfg(not(target_arch = "wasm32"))] #[tokio::main] pub async fn main() { - teleia::run("teleia test", 240, 160, teleia::TestGame::new).await; + teleia::run("teleia test", 240, 160, teleia::Options::empty(), teleia::TestGame::new).await; } diff --git a/src/save.rs b/src/save.rs new file mode 100644 index 0000000..0f0d20b --- /dev/null +++ b/src/save.rs @@ -0,0 +1,40 @@ +#[cfg(target_arch = "wasm32")] +pub fn save(id: &str, data: &W) where W: serde::Serialize { + let window = web_sys::window().expect("failed to get window object"); + let storage = window.local_storage() + .expect("failed to get local storage") + .expect("local storage not present"); + let key = format!("{}_save", id); + let val = serde_json::to_string(data).expect("failed to serialize save"); + storage.set_item(&key, &val).expect("failed to set save"); +} + +#[cfg(target_arch = "wasm32")] +pub fn load(id: &str) -> Option where W: serde::de::DeserializeOwned { + let window = web_sys::window().expect("failed to get window object"); + let storage = window.local_storage() + .expect("failed to get local storage") + .expect("local storage not present"); + let key = format!("{}_save", id); + let s = storage.get_item(&key).expect("failed to get save").expect("save not present"); + let mut cur = std::io::Cursor::new(s); + serde_json::from_reader(&mut cur).ok() +} + +#[cfg(not(target_arch = "wasm32"))] +pub fn save(id: &str, data: &W) where W: serde::Serialize { + let pd = directories::ProjectDirs::from("", "milkfat", id).expect("failed to get save directory"); + let _ = std::fs::create_dir_all(pd.data_dir()); + let path = pd.data_dir().join("teleia.save"); + let file = std::fs::File::create(&path).expect("failed to open save file"); + serde_json::to_writer(file, data).expect("failed to write save file"); +} + +#[cfg(not(target_arch = "wasm32"))] +pub fn load(id: &str) -> Option where W: serde::de::DeserializeOwned { + let pd = directories::ProjectDirs::from("", "milkfat", id).expect("failed to get save directory"); + let _ = std::fs::create_dir_all(pd.data_dir()); + let path = pd.data_dir().join("teleia.save"); + let file = std::fs::File::open(&path).ok()?; + serde_json::from_reader(file).ok() +} diff --git a/src/state.rs b/src/state.rs index 2ac6d4b..4d23af6 100644 --- a/src/state.rs +++ b/src/state.rs @@ -504,9 +504,6 @@ impl State { pub fn run_render(&mut self, ctx: &context::Context, game: &mut G) where G: Game { self.render_framebuffer.bind(&ctx); - ctx.clear_color(glam::Vec4::new(0.1, 0.1, 0.1, 0.0)); - ctx.clear(); - game.render(ctx, self); self.screen.bind(&ctx); -- cgit v1.2.3