diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index d7ce173..1045fdd 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -48,12 +48,19 @@
 		},
 		{
 			"type": "cargo",
-			"subcommand": "build",
+			"command": "run",
+			"args": [
+				"--features",
+				"collider_debug"
+			],
 			"problemMatcher": [
 				"$rustc"
 			],
 			"group": "build",
-			"label": "Rust: cargo build - ludum-dare-49"
+			"label": "Rust: Run Game - DEBUG COLLIDERS",
+			"env": {
+				"RUST_LOG": "debug"
+			}
 		}
 	]
 }
diff --git a/game/Cargo.toml b/game/Cargo.toml
index d20822c..4538ee0 100644
--- a/game/Cargo.toml
+++ b/game/Cargo.toml
@@ -33,6 +33,7 @@ num-derive = "0.3"
 num = "0.4"
 tiled = { version  ="0.9.5", default-features = false }
 async-trait = "0.1.51"
+webbrowser = "0.5"
 
 [dev-dependencies]
 puffin_viewer = "0.6"
@@ -40,3 +41,7 @@ puffin_viewer = "0.6"
 [build-dependencies]
 vergen = "5"
 anyhow = "1.0"
+
+[features]
+default = []
+collider_debug = []
diff --git a/game/assets/levels/level_0/colliders.json b/game/assets/levels/level_0/colliders.json
index 21920a4..513a595 100644
--- a/game/assets/levels/level_0/colliders.json
+++ b/game/assets/levels/level_0/colliders.json
@@ -1,4 +1,10 @@
 [
+    {
+        "x": -500,
+        "y": 1000,
+        "width": 16000,
+        "height": 10
+    },
     {
         "x": 322,
         "y": 926,
@@ -7,13 +13,13 @@
     },
     {
         "x": 852,
-        "y": 882,
+        "y": 823,
         "width": 81,
         "height": 178
     },
     {
         "x": 852,
-        "y": 882,
+        "y": 823,
         "width": 258,
         "height": 33
     },
diff --git a/game/src/character/collisions.rs b/game/src/character/collisions.rs
index f28bd79..f2c632c 100644
--- a/game/src/character/collisions.rs
+++ b/game/src/character/collisions.rs
@@ -1,6 +1,7 @@
 use std::ops::Mul;
 
 use raylib::math::{Rectangle, Vector2};
+use tracing::trace;
 
 use crate::scenes::ingame_scene::world::WORLD_LEVEL_X_OFFSET;
 
@@ -14,6 +15,8 @@ pub fn modify_player_based_on_forces(
     colliders: &Vec<Rectangle>,
     level_height_offset: f32,
 ) -> Result<(), ()> {
+    trace!("Player state: {:?}", player.current_state);
+
     // Modify the player's velocity by the forces
     player.movement_force += player.base_velocity;
     player.velocity = player.movement_force;
@@ -22,26 +25,27 @@ pub fn modify_player_based_on_forces(
     let predicted_player_position = player.position + player.velocity;
 
     // Calculate a bounding rect around the player both now, and one frame in the future
-    let player_rect = Rectangle::new(
+    let mut player_rect = Rectangle::new(
+        predicted_player_position.x - (player.size.x / 2.0),
+        predicted_player_position.y - (player.size.x / 2.0),
+        player.size.x,
+        player.size.y,
+    );
+    let predicted_player_rect = Rectangle::new(
         predicted_player_position.x - (player.size.x / 2.0),
         predicted_player_position.y - (player.size.x / 2.0),
         player.size.x,
         player.size.y,
     );
 
-    // Calculate a generic "floor" to always collide with
-    let floor_rect = Rectangle::new(f32::MIN, 0.0, f32::MAX, 1.0);
-
     // Check collision conditions
-    let check_player_colliding_with_floor = || floor_rect.check_collision_recs(&player_rect);
-    let check_player_colliding_with_floor_next_frame =
-        || player_rect.y + player_rect.height > floor_rect.y;
     let check_player_colliding_with_colliders = || {
         colliders.iter().any(|rect| {
             let mut translated_rect = rect.clone();
             translated_rect.y += level_height_offset;
             translated_rect.x += WORLD_LEVEL_X_OFFSET;
             translated_rect.check_collision_recs(&player_rect)
+                || translated_rect.check_collision_recs(&predicted_player_rect)
         })
     };
     let check_player_colliding_with_colliders_forwards = || {
@@ -49,9 +53,9 @@ pub fn modify_player_based_on_forces(
             let mut translated_rect = rect.clone();
             translated_rect.y += level_height_offset;
             translated_rect.x += WORLD_LEVEL_X_OFFSET;
-            translated_rect.check_collision_recs(&Rectangle{
+            translated_rect.check_collision_recs(&Rectangle {
                 x: player_rect.x + 1.0,
-                y: player_rect.y - 1.0 ,
+                y: player_rect.y - 1.0,
                 width: player_rect.width,
                 height: player_rect.height,
             })
@@ -59,10 +63,9 @@ pub fn modify_player_based_on_forces(
     };
 
     // If the player is colliding, only apply the x force
-    if (check_player_colliding_with_floor()
-        || check_player_colliding_with_floor_next_frame()
-        || check_player_colliding_with_colliders())
-        && player.velocity.y != 0.0
+    if player.velocity.y != 0.0
+        && (check_player_colliding_with_colliders()
+            || check_player_colliding_with_colliders_forwards())
     {
         player.velocity.y = 0.0;
 
@@ -76,15 +79,30 @@ pub fn modify_player_based_on_forces(
                 level_height_offset,
             );
         }
-    }
-
-    // Check sideways collisions
-    if player.velocity.y == 0.0 && check_player_colliding_with_colliders_forwards(){
-        return Err(());
+    }else if player.current_state == CharacterState::Running {
+        player.override_state(CharacterState::Jumping);
     }
 
     // Finally apply the velocity to the player
     player.position += player.velocity;
 
+    // Re-calculate the player rect
+    player_rect = Rectangle::new(
+        player.position.x - (player.size.x / 2.0),
+        player.position.y - (player.size.x / 2.0),
+        player.size.x,
+        player.size.y,
+    );
+
+    if colliders.iter().any(|rect| {
+        let mut translated_rect = rect.clone();
+        translated_rect.y += level_height_offset;
+        translated_rect.x += WORLD_LEVEL_X_OFFSET;
+        translated_rect.check_collision_recs(&player_rect)
+    }) {
+        return Err(());
+    }
+
+
     Ok(())
 }
diff --git a/game/src/character/mod.rs b/game/src/character/mod.rs
index 5f2fd09..a02853b 100644
--- a/game/src/character/mod.rs
+++ b/game/src/character/mod.rs
@@ -53,6 +53,14 @@ impl MainCharacter {
         }
     }
 
+    pub fn override_state(&mut self, state: CharacterState) {
+        // Update the internal state
+        if state != self.current_state {
+            self.current_state = state.clone();
+            self.state_set_timestamp = Utc::now();
+        }
+    }
+
     #[must_use]
     pub fn update_player(
         &mut self,
@@ -61,18 +69,15 @@ impl MainCharacter {
         level_height_offset: f32,
     ) -> Result<(), ()> {
         if let Some(state) = state {
-            // Update the internal state
-            if state != self.current_state {
-                self.current_state = state.clone();
-                self.state_set_timestamp = Utc::now();
-            }
-
             // Handle extra external forces based on the character state
-            self.movement_force = match state {
+            self.movement_force = match &state {
                 CharacterState::Running => Vector2::new(10.0, 0.0),
                 CharacterState::Jumping => Vector2::new(10.0, -30.0),
                 CharacterState::Dashing => Vector2::new(30.0, -20.0),
             };
+
+            // Update the internal state
+            self.override_state(state);
         }
 
         // Update the player based on the new velocity
diff --git a/game/src/character/render.rs b/game/src/character/render.rs
index bae9328..8f1430e 100644
--- a/game/src/character/render.rs
+++ b/game/src/character/render.rs
@@ -41,24 +41,25 @@ pub fn render_character_in_camera_space(
     );
 
     // Possibly render a debug vector
-    // if config.debug_view {
-    raylib.draw_line_v(
-        player.position.sub(player.size.div(2.0)),
-        player
-            .position
-            .sub(player.size.div(2.0))
-            .add(player.velocity.mul(10.0).add(Vector2::new(0.0, 100.0))),
-        Color::RED,
-    );
-    raylib.draw_rectangle_lines_ex(
-        Rectangle::new(
-            player.position.x - (player.size.x / 2.0),
-            player.position.y - (player.size.x / 2.0),
-            player.size.x,
-            player.size.y,
-        ),
-        2,
-        Color::RED,
-    );
-    // }
+    #[cfg(all(debug_assertions, feature = "collider_debug"))]
+    {
+        raylib.draw_line_v(
+            player.position.sub(player.size.div(2.0)),
+            player
+                .position
+                .sub(player.size.div(2.0))
+                .add(player.velocity.mul(10.0).add(Vector2::new(0.0, 100.0))),
+            Color::RED,
+        );
+        raylib.draw_rectangle_lines_ex(
+            Rectangle::new(
+                player.position.x - (player.size.x / 2.0),
+                player.position.y - (player.size.x / 2.0),
+                player.size.x,
+                player.size.y,
+            ),
+            2,
+            Color::RED,
+        );
+    }
 }
diff --git a/game/src/scenes/death_screen.rs b/game/src/scenes/death_screen.rs
index b989a68..19b3582 100644
--- a/game/src/scenes/death_screen.rs
+++ b/game/src/scenes/death_screen.rs
@@ -61,6 +61,7 @@ impl Action<Scenes, ScreenError, GameContext> for DeathScreen {
 
     fn on_finish(&mut self, _interrupted: bool) -> Result<(), ScreenError> {
         debug!("Finished DeathScreen");
+        self.is_retry_pressed = false;
         Ok(())
     }
 }
@@ -86,15 +87,11 @@ impl ScreenSpaceRender for DeathScreen {
 
             "ERR: Corrupted Player Data Detected
 
-The program has detected lowering player integrity, and has halted as a safety precaution.
+The program has detected lowering player integrity,
+and has halted as a safety precaution.
 
-If this is the first time you've seen this error screen, restart the level. If this screen appears \nagain, follow these steps:
-
-Check to make sure any new powerups or abilities are properly installed.
-If this is a new run, ask the game dev for any game updates you might need.
-
-If problems continue, get better or stop being bad at the game.
-If you need to use safemode to actually complete the game, please just get good.
+If this is the first time you've seen this error screen,
+restart the level. If problems continue, simply get good.
 
 --------   Technical information   --------
 *** CALL STACK:
diff --git a/game/src/scenes/how_to_play_screen.rs b/game/src/scenes/how_to_play_screen.rs
index e69ba4b..b41f542 100644
--- a/game/src/scenes/how_to_play_screen.rs
+++ b/game/src/scenes/how_to_play_screen.rs
@@ -105,7 +105,7 @@ impl ScreenSpaceRender for HowToPlayScreen {
         // Render the instructions
         raylib.draw_rgb_split_text(
             Vector2::new(100.0, 300.0),
-            ">> SPACE to jump\n>> SHIFT to dash\n>> Don't die",
+            ">> SPACE to jump\n>> SHIFT to dash\n>> Marcelo made these maps\n>> Marcelo hates you",
             45,
             true,
             Color::WHITE,
diff --git a/game/src/scenes/ingame_scene/mod.rs b/game/src/scenes/ingame_scene/mod.rs
index 72b6b89..f3f5a51 100644
--- a/game/src/scenes/ingame_scene/mod.rs
+++ b/game/src/scenes/ingame_scene/mod.rs
@@ -63,6 +63,10 @@ impl Action<Scenes, ScreenError, GameContext> for InGameScreen {
     fn on_first_run(&mut self, context: &GameContext) -> Result<(), ScreenError> {
         debug!("Running InGameScreen for the first time");
 
+        // Handle cleanup after death
+        self.player_dead = false;
+        self.player.reset();
+
         // Set the player to running
         let cur_level = self.levels.get(self.current_level_idx).unwrap();
         let _ = self.player.update_player(
diff --git a/game/src/scenes/ingame_scene/world.rs b/game/src/scenes/ingame_scene/world.rs
index ea1a30e..1c146a4 100644
--- a/game/src/scenes/ingame_scene/world.rs
+++ b/game/src/scenes/ingame_scene/world.rs
@@ -22,7 +22,9 @@ impl WorldSpaceRender for InGameScreen {
         let cur_level = self.levels.get(self.current_level_idx).unwrap();
 
         // Render the world background
-        cur_level.background_tex.render(raylib, Vector2::new(0.0, -1080.0), &self.camera);
+        cur_level
+            .background_tex
+            .render(raylib, Vector2::new(0.0, -1080.0), &self.camera);
 
         // Render the platform layer
         raylib.draw_texture_v(
@@ -31,7 +33,8 @@ impl WorldSpaceRender for InGameScreen {
             Color::WHITE,
         );
 
-        if config.debug_view {
+        #[cfg(all(debug_assertions, feature = "collider_debug"))]
+        {
             for collider in &cur_level.colliders {
                 let mut translated_collider = collider.clone();
                 translated_collider.y += -cur_level.platform_tex.height as f32;
diff --git a/game/src/scenes/options_screen.rs b/game/src/scenes/options_screen.rs
index 84a9a40..3f85ef6 100644
--- a/game/src/scenes/options_screen.rs
+++ b/game/src/scenes/options_screen.rs
@@ -43,6 +43,9 @@ impl Action<Scenes, ScreenError, GameContext> for OptionsScreen {
     fn on_first_run(&mut self, _context: &GameContext) -> Result<(), ScreenError> {
         debug!("Running OptionsScreen for the first time");
 
+        // Rick-roll the user
+        let _ = webbrowser::open("https://www.youtube.com/watch?v=dQw4w9WgXcQ");
+
         Ok(())
     }
 
@@ -96,12 +99,22 @@ impl ScreenSpaceRender for OptionsScreen {
         // Render the title
         raylib.draw_rgb_split_text(Vector2::new(40.0, 80.0), "Options", 70, true, Color::WHITE);
 
+        // Render the text
+        raylib.draw_rgb_split_text(
+            Vector2::new(100.0, 300.0),
+            ">> The game controls YOU",
+            45,
+            true,
+            Color::WHITE,
+        );
+
+
         //Back to Menu
         let hovering_back = Rectangle::new(35.0, screen_size.y as f32 - 80.0, 200.0, 40.0)
             .check_collision_point_rec(mouse_position);
         raylib.draw_rgb_split_text(
             Vector2::new(25.0, screen_size.y - 50.0),
-            "Options",
+            "BACK TO MENU",
             25,
             hovering_back,
             Color::WHITE,