From 3f9ad235ce345f16720ae8b8d4725f172725b538 Mon Sep 17 00:00:00 2001
From: Alula <6276139+alula@users.noreply.github.com>
Date: Sun, 10 Oct 2021 02:31:07 +0200
Subject: [PATCH] light cone toggle

---
 src/menu/settings_menu.rs | 17 +++++++---
 src/scene/game_scene.rs   | 66 +++++++++++++++++++++++++--------------
 src/settings.rs           |  8 +++++
 3 files changed, 63 insertions(+), 28 deletions(-)

diff --git a/src/menu/settings_menu.rs b/src/menu/settings_menu.rs
index 9e289c6..55ee07a 100644
--- a/src/menu/settings_menu.rs
+++ b/src/menu/settings_menu.rs
@@ -35,6 +35,7 @@ impl SettingsMenu {
 
     pub fn init(&mut self, state: &mut SharedGameState, ctx: &mut Context) -> GameResult {
         self.graphics.push_entry(MenuEntry::Toggle("Lighting effects:".to_string(), state.settings.shader_effects));
+        self.graphics.push_entry(MenuEntry::Toggle("Player's weapon light cone:".to_string(), state.settings.light_cone));
         self.graphics
             .push_entry(MenuEntry::Toggle("Motion interpolation:".to_string(), state.settings.motion_interpolation));
         self.graphics.push_entry(MenuEntry::Toggle("Subpixel scrolling:".to_string(), state.settings.subpixel_coords));
@@ -156,6 +157,14 @@ impl SettingsMenu {
                     }
                 }
                 MenuSelectionResult::Selected(1, toggle) => {
+                    if let MenuEntry::Toggle(_, value) = toggle {
+                        state.settings.light_cone = !state.settings.light_cone;
+                        let _ = state.settings.save(ctx);
+
+                        *value = state.settings.light_cone;
+                    }
+                }
+                MenuSelectionResult::Selected(2, toggle) => {
                     if let MenuEntry::Toggle(_, value) = toggle {
                         state.settings.motion_interpolation = !state.settings.motion_interpolation;
                         let _ = state.settings.save(ctx);
@@ -163,7 +172,7 @@ impl SettingsMenu {
                         *value = state.settings.motion_interpolation;
                     }
                 }
-                MenuSelectionResult::Selected(2, toggle) => {
+                MenuSelectionResult::Selected(3, toggle) => {
                     if let MenuEntry::Toggle(_, value) = toggle {
                         state.settings.subpixel_coords = !state.settings.subpixel_coords;
                         let _ = state.settings.save(ctx);
@@ -171,7 +180,7 @@ impl SettingsMenu {
                         *value = state.settings.subpixel_coords;
                     }
                 }
-                MenuSelectionResult::Selected(3, toggle) => {
+                MenuSelectionResult::Selected(4, toggle) => {
                     if let MenuEntry::Toggle(_, value) = toggle {
                         state.settings.original_textures = !state.settings.original_textures;
                         state.reload_textures();
@@ -180,7 +189,7 @@ impl SettingsMenu {
                         *value = state.settings.original_textures;
                     }
                 }
-                MenuSelectionResult::Selected(4, toggle) => {
+                MenuSelectionResult::Selected(5, toggle) => {
                     if let MenuEntry::Toggle(_, value) = toggle {
                         state.settings.seasonal_textures = !state.settings.seasonal_textures;
                         state.reload_textures();
@@ -189,7 +198,7 @@ impl SettingsMenu {
                         *value = state.settings.seasonal_textures;
                     }
                 }
-                MenuSelectionResult::Selected(6, _) | MenuSelectionResult::Canceled => {
+                MenuSelectionResult::Selected(7, _) | MenuSelectionResult::Canceled => {
                     self.current = CurrentMenu::MainMenu
                 }
                 _ => (),
diff --git a/src/scene/game_scene.rs b/src/scene/game_scene.rs
index 04a645e..30da5dc 100644
--- a/src/scene/game_scene.rs
+++ b/src/scene/game_scene.rs
@@ -809,33 +809,51 @@ impl GameScene {
                 [(&self.player1, &self.inventory_player1), (&self.player2, &self.inventory_player2)].iter()
             {
                 if player.cond.alive() && !player.cond.hidden() && inv.get_current_weapon().is_some() {
-                    let range = match () {
-                        _ if player.up => 60..120,
-                        _ if player.down => 240..300,
-                        _ if player.direction == Direction::Left => -30..30,
-                        _ if player.direction == Direction::Right => 150..210,
-                        _ => continue 'cc,
-                    };
+                    if state.settings.light_cone {
+                        let range = match () {
+                            _ if player.up => 60..120,
+                            _ if player.down => 240..300,
+                            _ if player.direction == Direction::Left => -30..30,
+                            _ if player.direction == Direction::Right => 150..210,
+                            _ => continue 'cc,
+                        };
 
-                    let (color, att) = match inv.get_current_weapon() {
-                        Some(Weapon { wtype: WeaponType::Fireball, .. }) => ((170u8, 80u8, 0u8), 0.92),
-                        Some(Weapon { wtype: WeaponType::PolarStar, .. }) => ((150u8, 150u8, 160u8), 0.92),
-                        Some(Weapon { wtype: WeaponType::Spur, .. }) => ((170u8, 170u8, 200u8), 0.92),
-                        Some(Weapon { wtype: WeaponType::Blade, .. }) => continue 'cc,
-                        _ => ((150u8, 150u8, 150u8), 0.92),
-                    };
+                        let (color, att) = match inv.get_current_weapon() {
+                            Some(Weapon { wtype: WeaponType::Fireball, .. }) => ((170u8, 80u8, 0u8), 0.92),
+                            Some(Weapon { wtype: WeaponType::PolarStar, .. }) => ((150u8, 150u8, 160u8), 0.92),
+                            Some(Weapon { wtype: WeaponType::Spur, .. }) => ((170u8, 170u8, 200u8), 0.92),
+                            Some(Weapon { wtype: WeaponType::Blade, .. }) => continue 'cc,
+                            _ => ((150u8, 150u8, 150u8), 0.92),
+                        };
 
-                    let (_, gun_off_y) = player.skin.get_gun_offset();
+                        let (_, gun_off_y) = player.skin.get_gun_offset();
 
-                    self.draw_light_raycast(
-                        state.tile_size,
-                        player.x + player.direction.vector_x() * 0x800,
-                        player.y + gun_off_y * 0x200 + 0x400,
-                        color,
-                        att,
-                        range,
-                        batch,
-                    );
+                        self.draw_light_raycast(
+                            state.tile_size,
+                            player.x + player.direction.vector_x() * 0x800,
+                            player.y + gun_off_y * 0x200 + 0x400,
+                            color,
+                            att,
+                            range,
+                            batch,
+                        );
+                    } else {
+                        self.draw_light(
+                            interpolate_fix9_scale(
+                                player.prev_x - self.frame.prev_x,
+                                player.x - self.frame.x,
+                                state.frame_time,
+                            ),
+                            interpolate_fix9_scale(
+                                player.prev_y - self.frame.prev_y,
+                                player.y - self.frame.y,
+                                state.frame_time,
+                            ),
+                            5.0,
+                            (150, 150, 150),
+                            batch,
+                        );
+                    }
                 }
             }
 
diff --git a/src/settings.rs b/src/settings.rs
index 3edbdb7..7034051 100644
--- a/src/settings.rs
+++ b/src/settings.rs
@@ -12,10 +12,15 @@ use crate::sound::InterpolationMode;
 pub struct Settings {
     #[serde(default = "current_version")]
     pub version: u32,
+    #[serde(default = "default_true")]
     pub seasonal_textures: bool,
     pub original_textures: bool,
     pub shader_effects: bool,
+    #[serde(default = "default_true")]
+    pub light_cone: bool,
+    #[serde(default = "default_true")]
     pub subpixel_coords: bool,
+    #[serde(default = "default_true")]
     pub motion_interpolation: bool,
     pub touch_controls: bool,
     pub soundtrack: String,
@@ -35,6 +40,8 @@ pub struct Settings {
     pub debug_outlines: bool,
 }
 
+fn default_true() -> bool { true }
+
 #[inline(always)]
 fn current_version() -> u32 { 2 }
 
@@ -84,6 +91,7 @@ impl Default for Settings {
             seasonal_textures: true,
             original_textures: false,
             shader_effects: true,
+            light_cone: true,
             subpixel_coords: true,
             motion_interpolation: true,
             touch_controls: cfg!(target_os = "android"),