From 771516f7e45602a66053c9a2cdc3ca84c89b5a7a Mon Sep 17 00:00:00 2001 From: Alula Date: Fri, 30 Oct 2020 09:49:30 +0100 Subject: [PATCH] Add intro scene --- src/npc/santa.rs | 0 src/scene/game_scene.rs | 11 +++++++++-- src/scene/loading_scene.rs | 2 +- src/shared_game_state.rs | 14 ++++++++++++++ 4 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 src/npc/santa.rs diff --git a/src/npc/santa.rs b/src/npc/santa.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/scene/game_scene.rs b/src/scene/game_scene.rs index 97daa87..bb2493f 100644 --- a/src/scene/game_scene.rs +++ b/src/scene/game_scene.rs @@ -3,7 +3,7 @@ use log::info; use crate::bullet::BulletManager; use crate::caret::CaretType; -use crate::common::{Direction, FadeDirection, FadeState, Rect, fix9_scale}; +use crate::common::{Direction, FadeDirection, FadeState, fix9_scale, Rect}; use crate::entity::GameEntity; use crate::frame::Frame; use crate::ggez::{Context, GameResult, graphics, timer}; @@ -15,6 +15,7 @@ use crate::physics::PhysicalEntity; use crate::player::Player; use crate::rng::RNG; use crate::scene::Scene; +use crate::scene::title_scene::TitleScene; use crate::shared_game_state::SharedGameState; use crate::stage::{BackgroundType, Stage}; use crate::text_script::{ConfirmSelection, ScriptMode, TextScriptExecutionState, TextScriptVM}; @@ -31,6 +32,7 @@ pub struct GameScene { pub npc_map: NPCMap, pub bullet_manager: BulletManager, pub current_teleport_slot: u8, + pub intro_mode: bool, tex_background_name: String, tex_tileset_name: String, life_bar: u16, @@ -79,13 +81,14 @@ impl GameScene { stage_id: id, npc_map: NPCMap::new(), bullet_manager: BulletManager::new(), + current_teleport_slot: 0, + intro_mode: false, tex_background_name, tex_tileset_name, life_bar: 0, life_bar_counter: 0, map_name_counter: 0, stage_select_text_y_pos: 54, - current_teleport_slot: 0, weapon_x_pos: 16, }) } @@ -1100,6 +1103,10 @@ impl Scene for GameScene { fn tick(&mut self, state: &mut SharedGameState, ctx: &mut Context) -> GameResult { state.update_key_trigger(); + if self.intro_mode && (state.key_trigger.jump() || self.tick >= 500){ + state.next_scene = Some(Box::new(TitleScene::new())); + } + match state.textscript_vm.mode { ScriptMode::Map if state.control_flags.tick_world() => self.tick_world(state)?, ScriptMode::StageSelect => self.tick_stage_select(state)?, diff --git a/src/scene/loading_scene.rs b/src/scene/loading_scene.rs index 1d0f579..9cf57a8 100644 --- a/src/scene/loading_scene.rs +++ b/src/scene/loading_scene.rs @@ -39,7 +39,7 @@ impl Scene for LoadingScene { let stage_select_script = TextScript::load_from(stage_select_tsc, &state.constants)?; state.textscript_vm.set_stage_select_script(stage_select_script); - state.next_scene = Some(Box::new(TitleScene::new())); + state.start_intro(ctx)?; } self.tick += 1; diff --git a/src/shared_game_state.rs b/src/shared_game_state.rs index 12919fa..86b4614 100644 --- a/src/shared_game_state.rs +++ b/src/shared_game_state.rs @@ -164,6 +164,20 @@ impl SharedGameState { Ok(()) } + pub fn start_intro(&mut self, ctx: &mut Context) -> GameResult { + let mut next_scene = GameScene::new(self, ctx, 72)?; + next_scene.player.cond.set_hidden(true); + next_scene.player.x = 3 * 16 * 0x200; + next_scene.player.y = 3 * 16 * 0x200; + next_scene.intro_mode = true; + self.fade_state = FadeState::Hidden; + self.textscript_vm.state = TextScriptExecutionState::Running(100, 0); + + self.next_scene = Some(Box::new(next_scene)); + + Ok(()) + } + pub fn save_game(&mut self, game_scene: &mut GameScene, ctx: &mut Context) -> GameResult { if let Ok(data) = filesystem::open_options(ctx, "/Profile.dat", OpenOptions::new().write(true).create(true)) { let profile = GameProfile::dump(self, game_scene);