This commit is contained in:
biroder 2023-10-30 09:35:35 +00:00
parent 06ae269b7b
commit 45443dfa23
5 changed files with 30 additions and 19 deletions

View File

@ -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<TargetPlayer>) -> 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);
}
}

View File

@ -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;
}

View File

@ -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<TargetPlayer>) -> 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.");

View File

@ -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") {

View File

@ -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(());
}