]> git.seodisparate.com - LudumDare45_StartWithNothing/commitdiff
Fixes, still kind of broken
authorStephen Seo <seo.disparate@gmail.com>
Tue, 21 Feb 2023 07:53:36 +0000 (16:53 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Tue, 21 Feb 2023 07:53:36 +0000 (16:53 +0900)
src/agnostic_interface.rs
src/agnostic_interface/raylib_impl.rs
src/faux_quicksilver.rs
src/main.rs
src/original_impl.rs
src/shaders.rs
static/transform.vs

index 1fe08a9061127f7d2a52c15c11fb6e52ce140225..acb725053b40933f6b1ec7ebaa1a447cb347a248 100644 (file)
@@ -66,9 +66,12 @@ pub trait GameInterface {
     fn get_dimensions(&self) -> Result<(f32, f32), String>;
     fn get_key_pressed(&mut self, key: char) -> Result<bool, String>;
     fn get_mouse_pressed(&mut self) -> Result<Option<(f32, f32)>, String>;
+    fn get_mouse_released(&mut self) -> Result<bool, String>;
     fn get_mouse_down(&mut self) -> Result<Option<(f32, f32)>, String>;
     fn get_mouse_xy(&self) -> Result<(f32, f32), String>;
     fn get_mouse_xy_vec(&self) -> Result<Vector, String>;
+    fn xy_to_world(&self, x: f32, y: f32) -> Result<Vector, String>;
+    fn vec_to_world(&self, vec: Vector) -> Result<Vector, String>;
     fn get_delta_time(&self) -> f32;
     fn clear_window(&mut self, color: Color) -> Result<(), String>;
     fn begin_drawing(&mut self) -> Result<(), String>;
index 67a24a9faabbbb43a6475692765a84b531f62f09..1e345ba37bf5413068a6a56d92089676e811bd28 100644 (file)
@@ -1,4 +1,4 @@
-mod ffi {
+pub mod ffi {
     #![allow(non_upper_case_globals)]
     #![allow(non_camel_case_types)]
     #![allow(non_snake_case)]
@@ -167,8 +167,8 @@ impl RaylibImageHandler {
     fn image_to_texture(&mut self) -> Result<(), String> {
         if self.image.borrow().texture.is_none() {
             unsafe {
-                self.image.borrow_mut().texture =
-                    Some(ffi::LoadTextureFromImage(self.image.borrow().image));
+                let texture = ffi::LoadTextureFromImage(self.image.borrow().image);
+                self.image.borrow_mut().texture = Some(texture);
             }
         }
         Ok(())
@@ -545,7 +545,7 @@ impl CameraInterface for Camera {
     }
 }
 
-struct RaylibGame {
+pub struct RaylibGame {
     images: HashMap<String, Rc<RefCell<RaylibImage>>>,
     fonts: HashMap<String, Rc<RaylibFont>>,
     sounds: HashMap<String, Rc<RaylibSound>>,
@@ -574,7 +574,12 @@ impl RaylibGame {
                 string.as_ptr() as *const c_char,
             );
         }
+
         Self::native_setup();
+        unsafe {
+            ffi::InitAudioDevice();
+        }
+
         let mut self_unboxed = Self {
             images: HashMap::new(),
             fonts: HashMap::new(),
@@ -638,6 +643,16 @@ impl GameInterface for RaylibGame {
         }
     }
 
+    fn get_mouse_released(&mut self) -> Result<bool, String> {
+        unsafe {
+            if ffi::IsMouseButtonReleased(0) {
+                Ok(true)
+            } else {
+                Ok(false)
+            }
+        }
+    }
+
     fn get_mouse_down(&mut self) -> Result<Option<(f32, f32)>, String> {
         unsafe {
             if ffi::IsMouseButtonDown(0) {
@@ -1019,6 +1034,20 @@ impl GameInterface for RaylibGame {
         self.camera.borrow_mut().pos = Vector { x, y };
         Ok(())
     }
+
+    fn xy_to_world(&self, x: f32, y: f32) -> Result<Vector, String> {
+        Ok(Vector {
+            x: x + self.camera.borrow().pos.x,
+            y: y + self.camera.borrow().pos.y,
+        })
+    }
+
+    fn vec_to_world(&self, vec: Vector) -> Result<Vector, String> {
+        Ok(Vector {
+            x: vec.x + self.camera.borrow().pos.x,
+            y: vec.y + self.camera.borrow().pos.y,
+        })
+    }
 }
 
 impl RaylibGame {
index 3d8eb2f9f0f63165c386cc2df5e22bfc23aaf7e4..704a2c3d43cb73ce3a5b072a20d74a8f9c8dd5a4 100644 (file)
@@ -335,4 +335,11 @@ impl Window {
             .ok_or_else(|| format!("Music \"{name}\" not found"))?
             .as_mut())
     }
+
+    pub fn update_music(&mut self) -> Result<(), String> {
+        for (_, music) in &mut self.music {
+            music.update()?;
+        }
+        Ok(())
+    }
 }
index 4b66d33fbd4d9a2bc6c4637715301af94fe6be43..6241b62232fba3a499adb17b83e3ad75a1c0deda 100644 (file)
@@ -1,8 +1,16 @@
+use agnostic_interface::raylib_impl::RaylibGame;
+use faux_quicksilver::Window;
+use original_impl::GameState;
+
 mod agnostic_interface;
 mod faux_quicksilver;
 mod original_impl;
 mod shaders;
 
+fn will_close() -> bool {
+    unsafe { agnostic_interface::raylib_impl::ffi::WindowShouldClose() }
+}
+
 fn main() {
     // TODO
     //run::<GameState>(
@@ -10,4 +18,14 @@ fn main() {
     //    Vector::new(800, 600),
     //    Settings::default(),
     //);
+
+    let game_interface = RaylibGame::new_boxed(800, 600);
+    let mut window = Window::new(game_interface);
+    let mut game_state = GameState::new(&mut window).unwrap();
+
+    while !will_close() {
+        window.update_music().unwrap();
+        game_state.update(&mut window).unwrap();
+        game_state.draw(&mut window).unwrap();
+    }
 }
index 28c1ca478ee268715ce7d553db0ce326bd724650..fe2b1669e7760d4eea1488c467b350148e51cbac 100644 (file)
@@ -8,15 +8,15 @@ use serde::{Deserialize, Serialize};
 const WIDTH_F: f32 = 800.0;
 const HEIGHT_F: f32 = 600.0;
 const MUSIC2_LENGTH: f32 = 2.0 * 60.0 * 1000.0;
-const TEXT_RATE: f32 = 100.0;
-const PP_GEN_RATE: f32 = 75.0;
+const TEXT_RATE: f32 = 0.1;
+const PP_GEN_RATE: f32 = 0.075;
 const PARTICLE_RAND_VEL_RANGE: f32 = 0.2;
 const PARTICLE_RAND_VEL_DIST: f32 = 0.2828427; // dist where x and y = 0.2
 const PARTICLE_RAND_ROT_RANGE: f32 = 0.5;
 const JOINING_OPACITY_RATE: f32 = 0.00013;
 const JOINING_FAR_DIST: f32 = 700.0;
 const JOINING_NEAR_DIST: f32 = 150.0;
-const DOUBLE_CLICK_TIME: f32 = 350.0;
+const DOUBLE_CLICK_TIME: f32 = 0.350;
 const SL_NOTIF_TIME: f32 = 5000.0;
 const MAX_MOONS: usize = 5;
 
@@ -218,9 +218,9 @@ impl Menu {
     fn s_01() -> Menu {
         Menu {
             items: vec![
-                Menu::pause(500.0, true),
+                Menu::pause(0.500, true),
                 Menu::text(50.0, HEIGHT_F - 140.0, 40.0, false, "This is how it is."),
-                Menu::pause(500.0, false),
+                Menu::pause(0.500, false),
                 Menu::text(
                     50.0,
                     HEIGHT_F - 100.0,
@@ -228,9 +228,9 @@ impl Menu {
                     false,
                     "Nothing is, and everything is nothing.",
                 ),
-                Menu::pause(500.0, false),
+                Menu::pause(0.500, false),
                 Menu::text(50.0, HEIGHT_F - 60.0, 40.0, false, "...until you appeared."),
-                Menu::pause(100.0, false),
+                Menu::pause(0.100, false),
                 Menu::text(
                     570.0,
                     HEIGHT_F - 50.0,
@@ -252,7 +252,7 @@ impl Menu {
                     true,
                     "Just by being, you brought light into existence.",
                 ),
-                Menu::pause(500.0, false),
+                Menu::pause(0.500, false),
                 Menu::text(
                     50.0,
                     HEIGHT_F - 110.0,
@@ -260,7 +260,7 @@ impl Menu {
                     false,
                     "What brings you here? What drives you?",
                 ),
-                Menu::pause(500.0, false),
+                Menu::pause(0.500, false),
                 Menu::text(
                     50.0,
                     HEIGHT_F - 70.0,
@@ -327,7 +327,7 @@ impl Menu {
                     true,
                     "Hope... hope that your actions will inspire others..",
                 ),
-                Menu::pause(500.0, false),
+                Menu::pause(0.500, false),
                 Menu::text(
                     50.0,
                     HEIGHT_F - 130.0,
@@ -335,7 +335,7 @@ impl Menu {
                     false,
                     "Hope that a brighter future will come tomorrow...",
                 ),
-                Menu::pause(500.0, false),
+                Menu::pause(0.500, false),
                 Menu::text(
                     50.0,
                     HEIGHT_F - 90.0,
@@ -358,7 +358,7 @@ impl Menu {
                     true,
                     "Miracles huh?.. I see, then your appearance is special.",
                 ),
-                Menu::pause(500.0, false),
+                Menu::pause(0.500, false),
                 Menu::text(
                     30.0,
                     HEIGHT_F - 130.0,
@@ -366,7 +366,7 @@ impl Menu {
                     false,
                     "With your appearance, things may change for the better..",
                 ),
-                Menu::pause(500.0, false),
+                Menu::pause(0.500, false),
                 Menu::text(
                     30.0,
                     HEIGHT_F - 90.0,
@@ -389,7 +389,7 @@ impl Menu {
                     true,
                     "Kindness?.. I am in your debt.",
                 ),
-                Menu::pause(250.0, false),
+                Menu::pause(0.250, false),
                 Menu::text(
                     50.0,
                     HEIGHT_F - 130.0,
@@ -398,7 +398,7 @@ impl Menu {
                     "It has been a long time since I have encountered",
                 ),
                 Menu::text(50.0, HEIGHT_F - 90.0, 40.0, false, "another being..."),
-                Menu::pause(500.0, false),
+                Menu::pause(0.500, false),
                 Menu::text(270.0, HEIGHT_F - 90.0, 40.0, false, "... Thank you..."),
             ],
         }
@@ -415,7 +415,7 @@ impl Menu {
                     true,
                     "Determination.. I see...",
                 ),
-                Menu::pause(500.0, false),
+                Menu::pause(0.500, false),
                 Menu::text(
                     400.0,
                     HEIGHT_F - 170.0,
@@ -430,7 +430,7 @@ impl Menu {
                     false,
                     "must have been difficult to come here..",
                 ),
-                Menu::pause(500.0, false),
+                Menu::pause(0.500, false),
                 Menu::text(
                     50.0,
                     HEIGHT_F - 90.0,
@@ -459,7 +459,7 @@ impl Menu {
                     false,
                     "creation for all that will be.",
                 ),
-                Menu::pause(200.0, false),
+                Menu::pause(0.200, false),
                 Menu::text(
                     50.0,
                     HEIGHT_F - 50.0,
@@ -486,7 +486,7 @@ impl Menu {
     fn s_09() -> Menu {
         Menu {
             items: vec![
-                Menu::pause(400.0, true),
+                Menu::pause(0.400, true),
                 Menu::text(
                     50.0,
                     HEIGHT_F - 140.0,
@@ -494,7 +494,7 @@ impl Menu {
                     false,
                     "A new planet... It has most certainly been a while.",
                 ),
-                Menu::pause(500.0, false),
+                Menu::pause(0.500, false),
                 Menu::text(
                     50.0,
                     HEIGHT_F - 100.0,
@@ -502,7 +502,7 @@ impl Menu {
                     false,
                     "Please, go out and create the new universe, and again..",
                 ),
-                Menu::pause(300.0, false),
+                Menu::pause(0.300, false),
                 Menu::text(50.0, HEIGHT_F - 60.0, 40.0, false, "Thank you."),
             ],
         }
@@ -914,8 +914,8 @@ impl Planet {
             circle,
             color,
             particle_system: ParticleSystem::new(
-                rand::thread_rng().gen_range(2000.0, 3800.0),
-                900.0,
+                rand::thread_rng().gen_range(2.0, 3.8),
+                0.9,
                 Rectangle::new(0.0, 0.0, 1.0, 1.0),
                 circle,
                 false,
@@ -931,8 +931,8 @@ impl Planet {
         let clockwise = rand::thread_rng().gen_bool(0.5);
         for i in 0..rand::thread_rng().gen_range(0, MAX_MOONS) {
             planet.moons.push(RotatingParticleSystem::new(
-                rand::thread_rng().gen_range(1000.0, 2600.0),
-                600.0,
+                rand::thread_rng().gen_range(1.0, 2.6),
+                0.6,
                 Rectangle::new(0.0, 0.0, 1.0, 1.0),
                 smaller_circle,
                 false,
@@ -997,8 +997,8 @@ impl Star {
         let mut star = Star {
             color,
             particle_system: ParticleSystem::new(
-                rand::thread_rng().gen_range(80.0, 200.0),
-                850.0,
+                rand::thread_rng().gen_range(0.08, 0.2),
+                0.85,
                 Rectangle::new(0.0, 0.0, 1.0, 1.0),
                 circle,
                 false,
@@ -1073,12 +1073,12 @@ enum FishState {
 
 impl Fish {
     fn new(pos: Vector, r: f32, color: Color) -> Self {
-        let anim_timer = rand::thread_rng().gen_range(800.0, 1000.0);
+        let anim_timer = rand::thread_rng().gen_range(0.8, 1.0);
         Self {
             pos,
             r,
-            swim_time: 800.0,
-            swim_timer: 800.0,
+            swim_time: 0.8,
+            swim_timer: 0.8,
             swim_v: 0.2,
             anim_timer,
             anim_time: anim_timer,
@@ -1101,26 +1101,26 @@ impl Fish {
     fn set_next(&mut self, state: FishState) {
         match state {
             FishState::Idle => {
-                self.swim_time = rand::thread_rng().gen_range(1100.0, 2400.0);
+                self.swim_time = rand::thread_rng().gen_range(1.1, 2.4);
                 self.swim_timer = self.swim_time;
-                self.anim_timer = 1600.0;
-                self.anim_time = 1600.0;
+                self.anim_timer = 1.6;
+                self.anim_time = 1.6;
                 self.swim_v = 0.0;
             }
             FishState::Swim => {
-                self.swim_time = rand::thread_rng().gen_range(1400.0, 2300.0);
+                self.swim_time = rand::thread_rng().gen_range(1.4, 2.3);
                 self.swim_timer = self.swim_time;
                 self.r = rand::thread_rng().gen_range(0.0, 360.0);
-                self.anim_timer = rand::thread_rng().gen_range(600.0, 1000.0);
+                self.anim_timer = rand::thread_rng().gen_range(0.6, 1.0);
                 self.anim_time = self.anim_timer;
-                self.swim_v = (self.anim_timer / 8000.0) as f32;
+                self.swim_v = (self.anim_timer / 8.0) as f32;
             }
         }
     }
 
     fn update(&mut self, dt: f32) {
         self.swim_time -= dt;
-        if self.swim_time < 220.0 {
+        if self.swim_time < 0.22 {
             self.swim_v /= 1.1;
         }
         if self.swim_time <= 0.0 {
@@ -1201,7 +1201,7 @@ enum SaveLoadNotification {
     Load { text: Option<String>, timer: f32 },
 }
 
-struct GameState {
+pub struct GameState {
     s_boom: String,
     s_get: String,
     s_power_up: String,
@@ -1239,7 +1239,7 @@ struct GameState {
 }
 
 impl GameState {
-    fn new(window: &mut Window) -> Result<Self, String> {
+    pub fn new(window: &mut Window) -> Result<Self, String> {
         let s_boom = String::from("boom.mp3");
         window.load_sound(
             &PathBuf::from_str("static/boom.mp3")
@@ -1329,7 +1329,7 @@ impl GameState {
             player_r: 0.0,
             player_particles: ParticleSystem::new(
                 PP_GEN_RATE,
-                1000.0,
+                1.0,
                 Rectangle::new(400.0, 300.0, 32.0, 32.0),
                 Circle::new(100.0, 100.0, 32.0),
                 true,
@@ -1340,7 +1340,7 @@ impl GameState {
             ),
             joining_particles: RotatingParticleSystem::new(
                 PP_GEN_RATE,
-                1000.0,
+                1.0,
                 Rectangle::new(400.0, 300.0, 16.0, 16.0),
                 Circle::new(100.0, 100.0, 32.0),
                 true,
@@ -1368,12 +1368,13 @@ impl GameState {
         })
     }
 
-    fn update(&mut self, window: &mut Window) -> Result<(), String> {
+    pub fn update(&mut self, window: &mut Window) -> Result<(), String> {
         let dt = window.get_gi().get_delta_time();
 
         // check mouse pos
         {
             self.mouse_pos = window.get_gi().get_mouse_xy_vec()?;
+            //self.mouse_pos = window.get_gi().vec_to_world(self.mouse_pos)?;
             let mut hovered = false;
             for i in 0..self.menu.items.len() {
                 if self.menu.items[i].is_inside(self.mouse_pos.x, self.mouse_pos.y) {
@@ -1390,11 +1391,11 @@ impl GameState {
         }
 
         // check mouse down
-        if window.get_gi_mut().get_mouse_down()?.is_none() {
+        if window.get_gi_mut().get_mouse_released()? {
             if self.dbl_click_timeout.is_none() {
                 self.click_release_time = 0.0;
             }
-        } else {
+        } else if window.get_gi_mut().get_mouse_pressed()?.is_some() {
             if self.current_finished {
                 if self.is_create_mode {
                     if self.click_release_time < DOUBLE_CLICK_TIME {
@@ -1403,12 +1404,12 @@ impl GameState {
                         self.click_time = None;
                         if self.state == 8 {
                             let mut expl_conv_system = ExplConvParticleSystem::new(
-                                1500.0,
+                                1.5,
                                 Circle::new(self.mouse_pos.x, self.mouse_pos.y, 20.0),
                                 Color::from_rgba(0x99, 0xFF, 0x99, 255),
                                 1.0,
                             );
-                            expl_conv_system.activate(30, 200.0);
+                            expl_conv_system.activate(30, 0.2);
                             self.expl_conv_p_systems.push(expl_conv_system);
                             self.state = 9;
                             self.state_dirty = true;
@@ -1419,7 +1420,7 @@ impl GameState {
                             if rand_out < 0.6 {
                                 // spawn planet
                                 let mut expl_conv_system = ExplConvParticleSystem::new(
-                                    rng.gen_range(1200.0, 1600.0),
+                                    rng.gen_range(1.2, 1.6),
                                     Circle::new(
                                         self.mouse_pos.x,
                                         self.mouse_pos.y,
@@ -1434,7 +1435,7 @@ impl GameState {
                                     1.0,
                                 );
                                 expl_conv_system
-                                    .activate(rng.gen_range(13, 40), rng.gen_range(150.0, 300.0));
+                                    .activate(rng.gen_range(13, 40), rng.gen_range(0.15, 0.3));
                                 self.expl_conv_p_systems.push(expl_conv_system);
                             } else if rand_out < 0.85 {
                                 // spawn star
@@ -1613,6 +1614,8 @@ impl GameState {
             if self.state == 10 {
                 self.state = 0;
                 self.state_dirty = true;
+                window.get_music_mut(&self.music2)?.stop()?;
+                self.music_on = false;
             }
         }
 
@@ -1626,7 +1629,7 @@ impl GameState {
 
         if let Some(t) = &mut self.dbl_click_timeout {
             *t += dt;
-            if *t > 300.0 {
+            if *t > 0.3 {
                 self.dbl_click_timeout = None;
             }
         }
@@ -1641,8 +1644,8 @@ impl GameState {
             (self.player.y - self.joining_particles.particle_system.host_rect.y) / 30.0;
         let (cx, cy) = self.camera.get_view_xy()?;
         self.camera.set_view_xy(
-            (self.player.x - WIDTH_F / 2.0 - cx) / 40.0,
-            (self.player.y - HEIGHT_F / 2.0 - cy) / 40.0,
+            cx + (self.player.x - WIDTH_F / 2.0 - cx) / 40.0,
+            cy + (self.player.y - HEIGHT_F / 2.0 - cy) / 40.0,
         )?;
         window.get_gi_mut().set_camera(&self.camera)?;
 
@@ -1742,7 +1745,7 @@ impl GameState {
         }
 
         if self.player_particles.opacity < 1.0 && self.state > 1 {
-            self.player_particles.opacity += dt as f32 / 7000.0;
+            self.player_particles.opacity += dt as f32 / 7.0;
             if self.player_particles.opacity > 1.0 {
                 self.player_particles.opacity = 1.0;
             }
@@ -1792,6 +1795,7 @@ impl GameState {
                         if *timer > TEXT_RATE {
                             *timer -= TEXT_RATE;
                             *text_idx += 1;
+                            window.get_sound_mut(&self.s_tap).unwrap().play(0.2)?;
                             if *text_idx >= text.len() {
                                 mi.is_loaded = true;
                                 if i + 1 < self.menu.items.len() {
@@ -1898,7 +1902,8 @@ impl GameState {
         Ok(())
     }
 
-    fn draw(&mut self, window: &mut Window) -> Result<(), String> {
+    pub fn draw(&mut self, window: &mut Window) -> Result<(), String> {
+        window.get_gi_mut().begin_drawing()?;
         window.get_gi_mut().clear_window(Color::BLACK)?;
         let mut rect = Rectangle::default();
         for mi in &mut self.menu.items {
@@ -2000,6 +2005,7 @@ impl GameState {
         //        }
         //    }
         //}
+        window.get_gi_mut().end_drawing()?;
 
         Ok(())
     }
index 5a309001279f1faf9704bb75d58dd8de6404cb8d..7e367946194937fb2b016137862608092c515810 100644 (file)
@@ -28,13 +28,13 @@ pub fn get_attrib_location(raylib_shader: &RaylibShader, name: &CStr) -> ::std::
 
 pub fn set_transform_3f(index: ::std::os::raw::c_uint, transform: Transform) {
     // OpenGL stores matrix indices in column major order.
-    for idx in index..(index + 3) {
+    for (i, idx) in (index..(index + 3)).enumerate() {
         unsafe {
             glVertexAttrib3f(
                 idx,
-                transform.mat[0 + idx as usize],
-                transform.mat[3 + idx as usize],
-                transform.mat[6 + idx as usize],
+                transform.mat[0 + i as usize],
+                transform.mat[3 + i as usize],
+                transform.mat[6 + i as usize],
             );
         }
     }
index 9cd3c072c5c525d3559b5604df6c3672c6092051..1df0de6dad51c987e91fa7366e5c53710ccaa8b6 100644 (file)
@@ -22,5 +22,5 @@ void main() {
   fragColor = vertexColor;
 
   vec3 pos = transform * (vertexPosition - vec3(origin, 0.0)) + vec3(origin, 0.0);
-  gl_Position = mvp * vec4(pos - camera, 1.0);
+  gl_Position = mvp * vec4(pos - vec3(camera, 0.0), 1.0);
 }