From 022a7921ce81a5f3b2bd2745fda98be9b1734a0c Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Fri, 14 Jan 2022 09:44:01 -0500 Subject: [PATCH] More cheating! (For developing purposes, of course ;) ) --- src/components.rs | 1 + src/damage_system.rs | 15 ++++---- src/gui.rs | 84 +++++++++++++++++++++++++++++++++++++++++-- src/main.rs | 25 +++++++++++++ src/raws/rawmaster.rs | 1 + src/spawner.rs | 1 + 6 files changed, 116 insertions(+), 11 deletions(-) diff --git a/src/components.rs b/src/components.rs index 076cbca..0eeb238 100644 --- a/src/components.rs +++ b/src/components.rs @@ -275,6 +275,7 @@ pub struct Pools { pub total_weight: f32, pub total_initiative_penalty: f32, pub gold: f32, + pub god_mode: bool, } #[derive(Serialize, Deserialize, Clone)] diff --git a/src/damage_system.rs b/src/damage_system.rs index 955134c..33821ec 100644 --- a/src/damage_system.rs +++ b/src/damage_system.rs @@ -45,21 +45,20 @@ impl<'a> System<'a> for DamageSystem { let mut gold_gain = 0.0_f32; for (entity, mut stats, damage) in (&entities, &mut stats, &damage).join() { - let pos = positions.get(entity); + gold_gain += stats.gold; for dmg in damage.amount.iter() { - stats.hit_points.current -= dmg.0; - if let Some(pos) = pos { + if !stats.god_mode { + stats.hit_points.current -= dmg.0; + } + + if let Some(pos) = positions.get(entity) { let idx = map.xy_idx(pos.x, pos.y); map.bloodstains.insert(idx); + spatial::remove_entity(entity, idx); } if stats.hit_points.current < 1 && dmg.1 { xp_gain += stats.level * 100; - gold_gain += stats.gold; - if let Some(pos) = pos { - let idx = map.xy_idx(pos.x, pos.y); - spatial::remove_entity(entity, idx); - } } } } diff --git a/src/gui.rs b/src/gui.rs index 0a6bc31..7b4dee1 100644 --- a/src/gui.rs +++ b/src/gui.rs @@ -926,11 +926,14 @@ pub enum CheatMenuResult { NoResponse, Cancel, TeleportToExit, + Heal, + Reveal, + GodMode, } pub fn show_cheat_mode(_gs: &mut State, ctx: &mut Rltk) -> CheatMenuResult { - let count = 2; - let y = (25 - (count / 2)) as i32; + let count = 4; + let mut y = (25 - (count / 2)) as i32; ctx.draw_box( 15, y - 2, @@ -976,12 +979,87 @@ pub fn show_cheat_mode(_gs: &mut State, ctx: &mut Rltk) -> CheatMenuResult { rltk::to_cp437(')'), ); - ctx.print(21, y, "Teleport to exit"); + ctx.print(21, y, "Teleport to next level"); + + y += 1; + ctx.set( + 17, + y, + RGB::named(rltk::WHITE), + RGB::named(rltk::BLACK), + rltk::to_cp437('('), + ); + ctx.set( + 18, + y, + RGB::named(rltk::YELLOW), + RGB::named(rltk::BLACK), + rltk::to_cp437('H'), + ); + ctx.set( + 19, + y, + RGB::named(rltk::WHITE), + RGB::named(rltk::BLACK), + rltk::to_cp437(')'), + ); + ctx.print(21, y, "Heal all wounds"); + + y += 1; + ctx.set( + 17, + y, + RGB::named(rltk::WHITE), + RGB::named(rltk::BLACK), + rltk::to_cp437('('), + ); + ctx.set( + 18, + y, + RGB::named(rltk::YELLOW), + RGB::named(rltk::BLACK), + rltk::to_cp437('R'), + ); + ctx.set( + 19, + y, + RGB::named(rltk::WHITE), + RGB::named(rltk::BLACK), + rltk::to_cp437(')'), + ); + ctx.print(21, y, "Reveal the map"); + + y += 1; + ctx.set( + 17, + y, + RGB::named(rltk::WHITE), + RGB::named(rltk::BLACK), + rltk::to_cp437('('), + ); + ctx.set( + 18, + y, + RGB::named(rltk::YELLOW), + RGB::named(rltk::BLACK), + rltk::to_cp437('G'), + ); + ctx.set( + 19, + y, + RGB::named(rltk::WHITE), + RGB::named(rltk::BLACK), + rltk::to_cp437(')'), + ); + ctx.print(21, y, "God Mode (No Death)"); match ctx.key { None => CheatMenuResult::NoResponse, Some(key) => match key { VirtualKeyCode::T => CheatMenuResult::TeleportToExit, + VirtualKeyCode::H => CheatMenuResult::Heal, + VirtualKeyCode::R => CheatMenuResult::Reveal, + VirtualKeyCode::G => CheatMenuResult::GodMode, VirtualKeyCode::Escape => CheatMenuResult::Cancel, _ => CheatMenuResult::NoResponse, }, diff --git a/src/main.rs b/src/main.rs index a71286c..9daf74a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -400,8 +400,33 @@ impl GameState for State { CheatMenuResult::TeleportToExit => { self.goto_level(1); self.mapgen_next_state = Some(RunState::PreRun); + newrunstate = RunState::MapGeneration } + CheatMenuResult::Heal => { + let player = self.ecs.fetch::(); + let mut pools = self.ecs.write_storage::(); + let mut player_pools = pools.get_mut(*player).unwrap(); + player_pools.hit_points.current = player_pools.hit_points.max; + + newrunstate = RunState::AwaitingInput; + } + CheatMenuResult::Reveal => { + let mut map = self.ecs.fetch_mut::(); + for v in map.revealed_tiles.iter_mut() { + *v = true; + } + + newrunstate = RunState::AwaitingInput; + } + CheatMenuResult::GodMode => { + let player = self.ecs.fetch::(); + let mut pools = self.ecs.write_storage::(); + let mut player_pools = pools.get_mut(*player).unwrap(); + player_pools.god_mode = true; + + newrunstate = RunState::AwaitingInput; + } }, RunState::ShowVendor { vendor, mode } => { let result = gui::show_vendor_menu(self, ctx, vendor, mode); diff --git a/src/raws/rawmaster.rs b/src/raws/rawmaster.rs index 9cccc04..24404d1 100644 --- a/src/raws/rawmaster.rs +++ b/src/raws/rawmaster.rs @@ -425,6 +425,7 @@ pub fn spawn_named_mob( } else { 0.0 }, + god_mode: false, }; eb = eb.with(pools); diff --git a/src/spawner.rs b/src/spawner.rs index 0efc5b6..16ea2c3 100644 --- a/src/spawner.rs +++ b/src/spawner.rs @@ -46,6 +46,7 @@ pub fn player(ecs: &mut World, player_x: i32, player_y: i32) -> Entity { total_weight: 0., total_initiative_penalty: 0., gold: 0., + god_mode: false, }) .with(LightSource { color: RGB::from_f32(1.0, 1.0, 0.5),