From 45443dfa23d26b0ad3956fde4217f11c4d5d1a99 Mon Sep 17 00:00:00 2001 From: biroder <107300789+biroder@users.noreply.github.com> Date: Mon, 30 Oct 2023 09:35:35 +0000 Subject: [PATCH] Fix #221 --- src/game/profile.rs | 38 +++++++++++++++++---------- src/game/scripting/tsc/text_script.rs | 2 +- src/game/shared_game_state.rs | 5 ++-- src/live_debugger/mod.rs | 2 +- src/scene/game_scene.rs | 2 +- 5 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/game/profile.rs b/src/game/profile.rs index e5c0fde..f060e5a 100644 --- a/src/game/profile.rs +++ b/src/game/profile.rs @@ -7,7 +7,7 @@ use crate::common::{Direction, FadeState, get_timestamp}; use crate::framework::context::Context; use crate::framework::error::GameError::ResourceLoadError; use crate::framework::error::GameResult; -use crate::game::player::ControlMode; +use crate::game::player::{ControlMode, TargetPlayer}; use crate::game::shared_game_state::{GameDifficulty, SharedGameState}; use crate::game::weapon::{WeaponLevel, WeaponType}; use crate::scene::game_scene::GameScene; @@ -157,19 +157,29 @@ impl GameProfile { game_scene.player2.skin.apply_gamestate(state); } - pub fn dump(state: &mut SharedGameState, game_scene: &mut GameScene) -> GameProfile { + pub fn dump(state: &mut SharedGameState, game_scene: &mut GameScene, target_player: Option) -> GameProfile { + let player = match target_player.unwrap_or(TargetPlayer::Player1) { + TargetPlayer::Player1 => &game_scene.player1, + TargetPlayer::Player2 => &game_scene.player2, + }; + + let inventory_player = match target_player.unwrap_or(TargetPlayer::Player1) { + TargetPlayer::Player1 => &game_scene.inventory_player1, + TargetPlayer::Player2 => &game_scene.inventory_player2, + }; + let current_map = game_scene.stage_id as u32; let current_song = state.sound_manager.current_song() as u32; - let pos_x = game_scene.player1.x as i32; - let pos_y = game_scene.player1.y as i32; - let direction = game_scene.player1.direction; - let max_life = game_scene.player1.max_life; - let stars = game_scene.player1.stars as u16; - let life = game_scene.player1.life; - let current_weapon = game_scene.inventory_player1.current_weapon as u32; - let current_item = game_scene.inventory_player1.current_item as u32; - let equipment = game_scene.player1.equip.0 as u32; - let control_mode = game_scene.player1.control_mode as u32; + let pos_x = player.x as i32; + let pos_y = player.y as i32; + let direction = player.direction; + let max_life = player.max_life; + let stars = player.stars as u16; + let life = player.life; + let current_weapon = inventory_player.current_weapon as u32; + let current_item = inventory_player.current_item as u32; + let equipment = player.equip.0 as u32; + let control_mode = player.control_mode as u32; let counter = 0; // TODO let mut weapon_data = [ WeaponData { weapon_id: 0, level: 0, exp: 0, max_ammo: 0, ammo: 0 }, @@ -194,7 +204,7 @@ impl GameProfile { ]; for (idx, weap) in weapon_data.iter_mut().enumerate() { - if let Some(weapon) = game_scene.inventory_player1.get_weapon(idx) { + if let Some(weapon) = inventory_player.get_weapon(idx) { weap.weapon_id = weapon.wtype as u32; weap.level = weapon.level as u32; weap.exp = weapon.experience as u32; @@ -204,7 +214,7 @@ impl GameProfile { } for (idx, item) in items.iter_mut().enumerate() { - if let Some(sitem) = game_scene.inventory_player1.get_item_idx(idx) { + if let Some(sitem) = inventory_player.get_item_idx(idx) { *item = sitem.0 as u32 + (((sitem.1 - 1) as u32) << 16); } } diff --git a/src/game/scripting/tsc/text_script.rs b/src/game/scripting/tsc/text_script.rs index 02e0410..0275c16 100644 --- a/src/game/scripting/tsc/text_script.rs +++ b/src/game/scripting/tsc/text_script.rs @@ -643,7 +643,7 @@ impl TextScriptVM { break; } TextScriptExecutionState::SaveProfile(event, ip) => { - state.save_game(game_scene, ctx)?; + state.save_game(game_scene, ctx, Some(state.textscript_vm.executor_player))?; state.textscript_vm.state = TextScriptExecutionState::Running(event, ip); break; } diff --git a/src/game/shared_game_state.rs b/src/game/shared_game_state.rs index 6f2c416..a1f0d4d 100644 --- a/src/game/shared_game_state.rs +++ b/src/game/shared_game_state.rs @@ -16,6 +16,7 @@ use crate::framework::vfs::OpenOptions; use crate::framework::{filesystem, graphics}; use crate::game::caret::{Caret, CaretType}; use crate::game::npc::NPCTable; +use crate::game::player::TargetPlayer; use crate::game::profile::GameProfile; #[cfg(feature = "scripting-lua")] use crate::game::scripting::lua::LuaScriptingState; @@ -645,10 +646,10 @@ impl SharedGameState { Ok(()) } - pub fn save_game(&mut self, game_scene: &mut GameScene, ctx: &mut Context) -> GameResult { + pub fn save_game(&mut self, game_scene: &mut GameScene, ctx: &mut Context, target_player: Option) -> GameResult { if let Some(save_path) = self.get_save_filename(self.save_slot) { if let Ok(data) = filesystem::open_options(ctx, save_path, OpenOptions::new().write(true).create(true)) { - let profile = GameProfile::dump(self, game_scene); + let profile = GameProfile::dump(self, game_scene, target_player); profile.write_save(data)?; } else { log::warn!("Cannot open save file."); diff --git a/src/live_debugger/mod.rs b/src/live_debugger/mod.rs index ed3d2f5..8bf3b96 100644 --- a/src/live_debugger/mod.rs +++ b/src/live_debugger/mod.rs @@ -225,7 +225,7 @@ impl LiveDebugger { if state.textscript_vm.state == TextScriptExecutionState::Ended { if ui.button("Save") { - let _ = state.save_game(game_scene, ctx); + let _ = state.save_game(game_scene, ctx, None); state.sound_manager.play_sfx(18); } } else if ui.button("Busy") { diff --git a/src/scene/game_scene.rs b/src/scene/game_scene.rs index e5de813..9deb26a 100644 --- a/src/scene/game_scene.rs +++ b/src/scene/game_scene.rs @@ -2319,7 +2319,7 @@ impl Scene for GameScene { } if key_code == ScanCode::S && ctx.keyboard_context.active_mods().ctrl() { - let _ = state.save_game(self, ctx); + let _ = state.save_game(self, ctx, None); state.sound_manager.play_sfx(18); return Ok(()); }