From 0cb6b911982c88cbe964a2609093ecaae339add6 Mon Sep 17 00:00:00 2001 From: Alula Date: Fri, 4 Dec 2020 18:37:47 +0100 Subject: [PATCH] hide player2 by default, add/drop button in debugger --- src/components/hud.rs | 4 +++ src/live_debugger.rs | 11 ++++++- src/player/mod.rs | 2 +- src/profile.rs | 3 +- src/scene/game_scene.rs | 65 +++++++++++++++++++++++++--------------- src/shared_game_state.rs | 1 + 6 files changed, 59 insertions(+), 27 deletions(-) diff --git a/src/components/hud.rs b/src/components/hud.rs index 609bce3..0ef68db 100644 --- a/src/components/hud.rs +++ b/src/components/hud.rs @@ -108,6 +108,10 @@ impl GameEntity<(&Player, &Inventory)> for HUD { } fn draw(&self, state: &mut SharedGameState, ctx: &mut Context, frame: &Frame) -> GameResult { + if !self.visible { + return Ok(()); + } + // none let weap_x = self.weapon_x_pos as f32; let batch = state.texture_set.get_or_load_batch(ctx, &state.constants, "TextBox")?; diff --git a/src/live_debugger.rs b/src/live_debugger.rs index d44d82b..da36289 100644 --- a/src/live_debugger.rs +++ b/src/live_debugger.rs @@ -60,7 +60,7 @@ impl LiveDebugger { .resizable(false) .collapsed(true, Condition::FirstUseEver) .position([5.0, 5.0], Condition::FirstUseEver) - .size([380.0, 170.0], Condition::FirstUseEver) + .size([400.0, 170.0], Condition::FirstUseEver) .build(ui, || { ui.text(format!( "Player position: ({:.1},{:.1}), velocity: ({:.1},{:.1})", @@ -114,6 +114,15 @@ impl LiveDebugger { if ui.button(im_str!("Flags"), [0.0, 0.0]) { self.flags_visible = !self.flags_visible; } + + ui.same_line(0.0); + if game_scene.player2.cond.alive() { + if ui.button(im_str!("Drop Player 2"), [0.0, 0.0]) { + game_scene.drop_player2(); + } + } else if ui.button(im_str!("Add Player 2"), [0.0, 0.0]) { + game_scene.add_player2(); + } }); if self.map_selector_visible { diff --git a/src/player/mod.rs b/src/player/mod.rs index fd4e4b4..8b3d674 100644 --- a/src/player/mod.rs +++ b/src/player/mod.rs @@ -107,7 +107,7 @@ impl Player { prev_y: 0, life: constants.my_char.life, max_life: constants.my_char.max_life, - cond: Condition(0x80), + cond: Condition(0), flags: Flag(0), equip: Equipment(0), direction: Direction::Right, diff --git a/src/profile.rs b/src/profile.rs index 8aa4120..2826adc 100644 --- a/src/profile.rs +++ b/src/profile.rs @@ -95,7 +95,6 @@ impl GameProfile { } game_scene.player1.equip.0 = self.equipment as u16; - game_scene.player1.cond.0 = 0x80; game_scene.player1.x = self.pos_x as isize; game_scene.player1.y = self.pos_y as isize; @@ -108,6 +107,8 @@ impl GameProfile { game_scene.player2 = game_scene.player1.clone(); game_scene.inventory_player2 = game_scene.inventory_player1.clone(); + + game_scene.player1.cond.0 = 0x80; } pub fn dump(state: &mut SharedGameState, game_scene: &mut GameScene) -> GameProfile { diff --git a/src/scene/game_scene.rs b/src/scene/game_scene.rs index d3bdd3c..9eb1f2a 100644 --- a/src/scene/game_scene.rs +++ b/src/scene/game_scene.rs @@ -110,6 +110,20 @@ impl GameScene { self.map_name_counter = ticks; } + pub fn add_player2(&mut self) { + self.player2.cond.set_alive(true); + self.player2.cond.set_hidden(self.player1.cond.hidden()); + self.player2.appearance = PlayerAppearance::YellowQuote; + self.player2.x = self.player1.x; + self.player2.y = self.player1.y; + self.player2.vel_x = self.player1.vel_x; + self.player2.vel_y = self.player1.vel_y; + } + + pub fn drop_player2(&mut self) { + self.player2.cond.set_alive(false); + } + fn draw_background(&self, state: &mut SharedGameState, ctx: &mut Context) -> GameResult { let batch = state.texture_set.get_or_load_batch(ctx, &state.constants, &self.tex_background_name)?; let scale = state.scale; @@ -965,6 +979,8 @@ impl GameScene { } fn tick_world(&mut self, state: &mut SharedGameState) -> GameResult { + self.hud_player1.visible = self.player1.cond.alive(); + self.hud_player2.visible = self.player2.cond.alive(); self.hud_player1.has_player2 = !self.player2.cond.hidden(); self.hud_player2.has_player2 = self.hud_player1.has_player2; @@ -1051,7 +1067,7 @@ impl GameScene { match self.frame.update_target { UpdateTarget::Player => { - if !self.player2.cond.hidden() + if self.player2.cond.alive() && !self.player2.cond.hidden() && abs(self.player1.x - self.player2.x) < 240 * 0x200 && abs(self.player1.y - self.player2.y) < 200 * 0x200 { self.frame.target_x = (self.player1.target_x * 2 + self.player2.target_x) / 3; @@ -1094,28 +1110,32 @@ impl GameScene { weapon.shoot_bullet(&self.player2, &mut self.bullet_manager, state); } - if self.player1.controller.trigger_next_weapon() { - state.sound_manager.play_sfx(4); - self.inventory_player1.next_weapon(); - self.hud_player1.weapon_x_pos = 32; + if self.player1.cond.alive() { + if self.player1.controller.trigger_next_weapon() { + state.sound_manager.play_sfx(4); + self.inventory_player1.next_weapon(); + self.hud_player1.weapon_x_pos = 32; + } + + if self.player1.controller.trigger_prev_weapon() { + state.sound_manager.play_sfx(4); + self.inventory_player1.prev_weapon(); + self.hud_player1.weapon_x_pos = 0; + } } - if self.player1.controller.trigger_prev_weapon() { - state.sound_manager.play_sfx(4); - self.inventory_player1.prev_weapon(); - self.hud_player1.weapon_x_pos = 0; - } + if self.player2.cond.alive() { + if self.player2.controller.trigger_next_weapon() { + state.sound_manager.play_sfx(4); + self.inventory_player2.next_weapon(); + self.hud_player2.weapon_x_pos = 32; + } - if self.player2.controller.trigger_next_weapon() { - state.sound_manager.play_sfx(4); - self.inventory_player2.next_weapon(); - self.hud_player2.weapon_x_pos = 32; - } - - if self.player2.controller.trigger_prev_weapon() { - state.sound_manager.play_sfx(4); - self.inventory_player2.prev_weapon(); - self.hud_player2.weapon_x_pos = 0; + if self.player2.controller.trigger_prev_weapon() { + state.sound_manager.play_sfx(4); + self.inventory_player2.prev_weapon(); + self.hud_player2.weapon_x_pos = 0; + } } self.hud_player1.tick(state, (&self.player1, &self.inventory_player1))?; @@ -1229,15 +1249,12 @@ impl Scene for GameScene { } } - self.hud_player1.visible = true; - self.hud_player2.visible = true; self.npc_map.boss_map.boss_type = self.stage.data.boss_no as u16; self.player1.target_x = self.player1.x; self.player1.target_y = self.player1.y; self.frame.target_x = self.player1.target_x; self.frame.target_y = self.player1.target_y; self.frame.immediate_update(state, &self.stage); - self.player2.appearance = PlayerAppearance::YellowQuote; Ok(()) } @@ -1375,7 +1392,7 @@ impl Scene for GameScene { self.hud_player2.draw(state, ctx, &self.frame)?; self.boss_life_bar.draw(state, ctx, &self.frame)?; - if !self.player2.cond.hidden() { + if self.player2.cond.alive() && !self.player2.cond.hidden() { let y = interpolate_fix9_scale(self.player2.prev_y - self.frame.prev_y, self.player2.y - self.frame.y, state.frame_time); let y = clamp(y, 8.0, state.canvas_size.1 - 8.0 - state.font.line_height(&state.constants)); diff --git a/src/shared_game_state.rs b/src/shared_game_state.rs index 4d0e6de..c44501b 100644 --- a/src/shared_game_state.rs +++ b/src/shared_game_state.rs @@ -204,6 +204,7 @@ impl SharedGameState { pub fn start_new_game(&mut self, ctx: &mut Context) -> GameResult { let mut next_scene = GameScene::new(self, ctx, 13)?; + next_scene.player1.cond.set_alive(true); next_scene.player1.x = 10 * 16 * 0x200; next_scene.player1.y = 8 * 16 * 0x200; self.fade_state = FadeState::Hidden;