1
0
Fork 0
mirror of https://github.com/doukutsu-rs/doukutsu-rs synced 2024-11-25 15:03:34 +00:00

Add lighting engine option, improve JP translations

This commit is contained in:
Alula 2024-08-12 22:58:24 +02:00
parent 256437bec6
commit 87da45192d
No known key found for this signature in database
GPG key ID: 3E00485503A1D8BA
6 changed files with 106 additions and 42 deletions

View file

@ -68,7 +68,13 @@
"windowed": "Windowed", "windowed": "Windowed",
"fullscreen": "Fullscreen" "fullscreen": "Fullscreen"
}, },
"lighting_effects": "Lighting effects:", "lighting_engine": {
"entry": "Lighting engine:",
"default": "Default for game edition",
"disabled": "Disabled",
"basic": "Basic (CS+ Remastered)",
"raytraced_drs": "Raytraced (d-rs, GPU heavy)"
},
"weapon_light_cone": "Weapon light cone:", "weapon_light_cone": "Weapon light cone:",
"screen_shake": { "screen_shake": {
"entry": "Screen shake intensity:", "entry": "Screen shake intensity:",
@ -84,15 +90,13 @@
"vsync_mode": { "vsync_mode": {
"entry": "V-Sync:", "entry": "V-Sync:",
"uncapped": "Uncapped", "uncapped": "Uncapped",
"uncapped_desc": "V-Sync Off.", "uncapped_desc": "V-Sync is disabled (may cause tearing).",
"vsync": "Enabled", "vsync": "Enabled",
"vsync_desc": "V-Sync On.", "vsync_desc": "Synchronized to monitor refresh rate.",
"vrr_1x": "Variable Refresh Rate (1x)", "vrr_1x": "Variable Refresh Rate (1x)",
"vrr_1x_desc": "Uses (G-/Free)Sync if available.",
"vrr_2x": "Variable Refresh Rate (2x)", "vrr_2x": "Variable Refresh Rate (2x)",
"vrr_2x_desc": "Uses (G-/Free)Sync if available.",
"vrr_3x": "Variable Refresh Rate (3x)", "vrr_3x": "Variable Refresh Rate (3x)",
"vrr_3x_desc": "Uses (G-/Free)Sync if available." "vrr_desc": "Uses (G-/Free)Sync if available."
} }
}, },
"sound": "Sound...", "sound": "Sound...",

View file

@ -68,7 +68,13 @@
"windowed": "ウィンドウ", "windowed": "ウィンドウ",
"fullscreen": "フルスクリーン" "fullscreen": "フルスクリーン"
}, },
"lighting_effects": "ライティング効果:", "lighting_engine": {
"entry": "ライティング エンジン:",
"default": "ゲーム エディションのデフォルト",
"disabled": "無効",
"basic": "基本 (CS+ リマスター)",
"raytraced_drs": "レイトレース (d-rs、GPU 重視)"
},
"weapon_light_cone": "兵器のライトコーン:", "weapon_light_cone": "兵器のライトコーン:",
"screen_shake": { "screen_shake": {
"entry": "画面の揺れ:", "entry": "画面の揺れ:",
@ -82,17 +88,15 @@
"seasonal_textures": "季節ものテクスチャ:", "seasonal_textures": "季節ものテクスチャ:",
"renderer": "レンダラ:", "renderer": "レンダラ:",
"vsync_mode": { "vsync_mode": {
"entry": "V-Sync:", "entry": "V-Sync",
"uncapped": "Uncapped", "uncapped": "上限なし",
"uncapped_desc": "V-Sync Off.", "uncapped_desc": "V-Syncは無効ティアリングが発生する可能性があります。",
"vsync": "Enabled", "vsync": "有効",
"vsync_desc": "V-Sync On.", "vsync_desc": "モニターのリフレッシュ レートに同期します。",
"vrr_1x": "Variable Refresh Rate (1x)", "vrr_1x": "可変リフレッシュレート (1x)",
"vrr_1x_desc": "Uses (G-/Free)Sync if available.", "vrr_2x": "可変リフレッシュレート (2x)",
"vrr_2x": "Variable Refresh Rate (2x)", "vrr_3x": "可変リフレッシュレート (3x)",
"vrr_2x_desc": "Uses (G-/Free)Sync if available.", "vrr_desc": "利用可能であれば、(G-/Free)Syncを使用。"
"vrr_3x": "Variable Refresh Rate (3x)",
"vrr_3x_desc": "Uses (G-/Free)Sync if available."
} }
}, },
"sound": "サウンド", "sound": "サウンド",
@ -130,7 +134,8 @@
"cutscene_skip_method": { "cutscene_skip_method": {
"entry": "カットシーンをスキップ", "entry": "カットシーンをスキップ",
"hold": "を押し続け", "hold": "を押し続け",
"fastforward": "はやおくり" "fastforward": "はやおくり",
"auto": "自動"
}, },
"discord_rpc": "Discord Rich Presence:", "discord_rpc": "Discord Rich Presence:",
"allow_strafe": "ストレイフを許可する:" "allow_strafe": "ストレイフを許可する:"

View file

@ -20,7 +20,7 @@ pub struct Settings {
#[serde(default = "default_true")] #[serde(default = "default_true")]
pub seasonal_textures: bool, pub seasonal_textures: bool,
pub original_textures: bool, pub original_textures: bool,
pub shader_effects: bool, pub lighting_engine: LightingEngine,
#[serde(default = "default_true")] #[serde(default = "default_true")]
pub light_cone: bool, pub light_cone: bool,
#[serde(default = "default_true")] #[serde(default = "default_true")]
@ -350,11 +350,7 @@ impl Settings {
if self.version == 24 { if self.version == 24 {
self.version = 25; self.version = 25;
self.soundtrack = match self.soundtrack.as_str() { self.soundtrack = match self.soundtrack.as_str() {
"Organya" => "organya".to_owned(), "Organya" | "Remastered" | "New" | "Famitracks" | "Ridiculon" => self.soundtrack.to_ascii_lowercase(),
"Remastered" => "remastered".to_owned(),
"New" => "new".to_owned(),
"Famitracks" => "famitracks".to_owned(),
"Ridiculon" => "ridiculon".to_owned(),
_ => self.soundtrack.clone(), _ => self.soundtrack.clone(),
} }
} }
@ -430,7 +426,7 @@ impl Default for Settings {
version: current_version(), version: current_version(),
seasonal_textures: true, seasonal_textures: true,
original_textures: false, original_textures: false,
shader_effects: false, lighting_engine: LightingEngine::default(),
light_cone: true, light_cone: true,
subpixel_coords: true, subpixel_coords: true,
motion_interpolation: true, motion_interpolation: true,
@ -577,3 +573,17 @@ pub fn player_default_controller_button_map() -> PlayerControllerButtonMap {
pub fn default_controller_axis_sensitivity() -> f64 { pub fn default_controller_axis_sensitivity() -> f64 {
0.3 0.3
} }
#[derive(serde::Serialize, serde::Deserialize, Copy, Clone, PartialEq, Eq)]
pub enum LightingEngine {
Default,
Disabled,
Basic,
Raytraced,
}
impl Default for LightingEngine {
fn default() -> Self {
LightingEngine::Default
}
}

View file

@ -38,6 +38,7 @@ use crate::util::bitvec::BitVec;
use crate::util::rng::XorShift; use crate::util::rng::XorShift;
use super::filesystem_container::FilesystemContainer; use super::filesystem_container::FilesystemContainer;
use super::settings::LightingEngine;
#[derive(PartialEq, Eq, Copy, Clone, serde::Serialize, serde::Deserialize)] #[derive(PartialEq, Eq, Copy, Clone, serde::Serialize, serde::Deserialize)]
pub enum TimingMode { pub enum TimingMode {
@ -900,6 +901,18 @@ impl SharedGameState {
.map_or_else(|| id.to_owned(), |s| self.loc.t(format!("soundtrack.{}", s.id).as_str()).to_owned()) .map_or_else(|| id.to_owned(), |s| self.loc.t(format!("soundtrack.{}", s.id).as_str()).to_owned())
} }
pub fn get_lighting_type(&self) -> LightingEngine {
if self.settings.lighting_engine == LightingEngine::Default {
if self.constants.is_switch {
return LightingEngine::Basic;
}
return LightingEngine::Disabled;
}
self.settings.lighting_engine
}
pub fn tt(&self, key: &str, args: &[(&str, &str)]) -> String { pub fn tt(&self, key: &str, args: &[(&str, &str)]) -> String {
return self.loc.tt(key, args); return self.loc.tt(key, args);
} }

View file

@ -4,6 +4,7 @@ use crate::framework::context::Context;
use crate::framework::error::GameResult; use crate::framework::error::GameResult;
use crate::framework::graphics::VSyncMode; use crate::framework::graphics::VSyncMode;
use crate::framework::{filesystem, graphics}; use crate::framework::{filesystem, graphics};
use crate::game::settings::LightingEngine;
use crate::game::shared_game_state::{CutsceneSkipMode, ScreenShakeIntensity, SharedGameState, TimingMode, WindowMode}; use crate::game::shared_game_state::{CutsceneSkipMode, ScreenShakeIntensity, SharedGameState, TimingMode, WindowMode};
use crate::graphics::font::Font; use crate::graphics::font::Font;
use crate::input::combined_menu_controller::CombinedMenuController; use crate::input::combined_menu_controller::CombinedMenuController;
@ -53,7 +54,7 @@ impl Default for MainMenuEntry {
enum GraphicsMenuEntry { enum GraphicsMenuEntry {
VSyncMode, VSyncMode,
WindowMode, WindowMode,
LightingEffects, LightingEngine,
WeaponLightCone, WeaponLightCone,
ScreenShake, ScreenShake,
MotionInterpolation, MotionInterpolation,
@ -241,9 +242,9 @@ impl SettingsMenu {
vec![ vec![
state.loc.t("menus.options_menu.graphics_menu.vsync_mode.uncapped_desc").to_owned(), state.loc.t("menus.options_menu.graphics_menu.vsync_mode.uncapped_desc").to_owned(),
state.loc.t("menus.options_menu.graphics_menu.vsync_mode.vsync_desc").to_owned(), state.loc.t("menus.options_menu.graphics_menu.vsync_mode.vsync_desc").to_owned(),
state.loc.t("menus.options_menu.graphics_menu.vsync_mode.vrr_1x_desc").to_owned(), state.loc.t("menus.options_menu.graphics_menu.vsync_mode.vrr_desc").to_owned(),
state.loc.t("menus.options_menu.graphics_menu.vsync_mode.vrr_2x_desc").to_owned(), state.loc.t("menus.options_menu.graphics_menu.vsync_mode.vrr_desc").to_owned(),
state.loc.t("menus.options_menu.graphics_menu.vsync_mode.vrr_3x_desc").to_owned(), state.loc.t("menus.options_menu.graphics_menu.vsync_mode.vrr_desc").to_owned(),
], ],
), ),
); );
@ -260,10 +261,16 @@ impl SettingsMenu {
), ),
); );
self.graphics.push_entry( self.graphics.push_entry(
GraphicsMenuEntry::LightingEffects, GraphicsMenuEntry::LightingEngine,
MenuEntry::Toggle( MenuEntry::Options(
state.loc.t("menus.options_menu.graphics_menu.lighting_effects").to_owned(), state.loc.t("menus.options_menu.graphics_menu.lighting_engine.entry").to_owned(),
state.settings.shader_effects, state.settings.lighting_engine as usize,
vec![
state.loc.t("menus.options_menu.graphics_menu.lighting_engine.default").to_owned(),
state.loc.t("menus.options_menu.graphics_menu.lighting_engine.disabled").to_owned(),
state.loc.t("menus.options_menu.graphics_menu.lighting_engine.basic").to_owned(),
state.loc.t("menus.options_menu.graphics_menu.lighting_engine.raytraced_drs").to_owned(),
],
), ),
); );
self.graphics.push_entry( self.graphics.push_entry(
@ -660,6 +667,8 @@ impl SettingsMenu {
) -> GameResult { ) -> GameResult {
self.update_sizes(state); self.update_sizes(state);
// holy shit this is utter garbage
// we desperately need a new menu system
match self.current { match self.current {
CurrentMenu::MainMenu => match self.main.tick(controller, state) { CurrentMenu::MainMenu => match self.main.tick(controller, state) {
MenuSelectionResult::Selected(MainMenuEntry::Graphics, _) => { MenuSelectionResult::Selected(MainMenuEntry::Graphics, _) => {
@ -738,12 +747,35 @@ impl SettingsMenu {
let _ = state.settings.save(ctx); let _ = state.settings.save(ctx);
} }
} }
MenuSelectionResult::Selected(GraphicsMenuEntry::LightingEffects, toggle) => { MenuSelectionResult::Selected(GraphicsMenuEntry::LightingEngine, toggle)
if let MenuEntry::Toggle(_, value) = toggle { | MenuSelectionResult::Right(GraphicsMenuEntry::LightingEngine, toggle, _) => {
state.settings.shader_effects = !state.settings.shader_effects; if let MenuEntry::Options(_, value, _) = toggle {
let _ = state.settings.save(ctx); let (new_mode, new_value) = match *value {
0 => (LightingEngine::Disabled, 1),
1 => (LightingEngine::Basic, 2),
2 => (LightingEngine::Raytraced, 3),
_ => (LightingEngine::Default, 0),
};
*value = state.settings.shader_effects; *value = new_value;
state.settings.lighting_engine = new_mode;
let _ = state.settings.save(ctx);
}
}
MenuSelectionResult::Left(GraphicsMenuEntry::LightingEngine, toggle, _) => {
if let MenuEntry::Options(_, value, _) = toggle {
let (new_mode, new_value) = match *value {
0 => (LightingEngine::Raytraced, 3),
1 => (LightingEngine::Default, 0),
2 => (LightingEngine::Disabled, 1),
_ => (LightingEngine::Basic, 2),
};
*value = new_value;
state.settings.lighting_engine = new_mode;
let _ = state.settings.save(ctx);
} }
} }
MenuSelectionResult::Selected(GraphicsMenuEntry::WeaponLightCone, toggle) => { MenuSelectionResult::Selected(GraphicsMenuEntry::WeaponLightCone, toggle) => {

View file

@ -41,7 +41,7 @@ use crate::game::physics::{PhysicalEntity, OFFSETS};
use crate::game::player::{ControlMode, Player, TargetPlayer}; use crate::game::player::{ControlMode, Player, TargetPlayer};
use crate::game::scripting::tsc::credit_script::CreditScriptVM; use crate::game::scripting::tsc::credit_script::CreditScriptVM;
use crate::game::scripting::tsc::text_script::{ScriptMode, TextScriptExecutionState, TextScriptVM}; use crate::game::scripting::tsc::text_script::{ScriptMode, TextScriptExecutionState, TextScriptVM};
use crate::game::settings::ControllerType; use crate::game::settings::{ControllerType, LightingEngine};
use crate::game::shared_game_state::{CutsceneSkipMode, PlayerCount, ReplayState, SharedGameState, TileSize}; use crate::game::shared_game_state::{CutsceneSkipMode, PlayerCount, ReplayState, SharedGameState, TileSize};
use crate::game::stage::{BackgroundType, Stage, StageTexturePaths}; use crate::game::stage::{BackgroundType, Stage, StageTexturePaths};
use crate::game::weapon::bullet::BulletManager; use crate::game::weapon::bullet::BulletManager;
@ -1991,7 +1991,7 @@ impl Scene for GameScene {
self.draw_npc_layer(state, ctx, NPCLayer::Background)?; self.draw_npc_layer(state, ctx, NPCLayer::Background)?;
self.tilemap.draw(state, ctx, &self.frame, TileLayer::Middleground, stage_textures_ref, &self.stage)?; self.tilemap.draw(state, ctx, &self.frame, TileLayer::Middleground, stage_textures_ref, &self.stage)?;
if state.settings.shader_effects && self.lighting_mode == LightingMode::BackgroundOnly { if state.get_lighting_type() == LightingEngine::Basic && self.lighting_mode == LightingMode::BackgroundOnly {
self.draw_light_map(state, ctx)?; self.draw_light_map(state, ctx)?;
} }
@ -2019,7 +2019,7 @@ impl Scene for GameScene {
self.draw_boss_popup(state, ctx)?; self.draw_boss_popup(state, ctx)?;
if !state.control_flags.credits_running() if !state.control_flags.credits_running()
&& state.settings.shader_effects && state.get_lighting_type() == LightingEngine::Basic
&& self.lighting_mode == LightingMode::Ambient && self.lighting_mode == LightingMode::Ambient
{ {
self.draw_light_map(state, ctx)?; self.draw_light_map(state, ctx)?;