Expands cheat menu

This commit is contained in:
Llywelwyn 2023-08-13 16:22:30 +01:00
parent 0344f87da8
commit 71f5c2ac9f
10 changed files with 66 additions and 10 deletions

View file

@ -75,7 +75,7 @@
"id": "equip_dagger",
"name": { "name": "dagger", "plural": "daggers" },
"renderable": { "glyph": ")", "fg": "#808080", "bg": "#000000", "order": 2 },
"weight": 130,
"weight": 1,
"value": 2,
"flags": ["EQUIP_MELEE", "FINESSE"],
"effects": { "base_damage": "1d4" }

View file

@ -3,6 +3,8 @@ use rltk::prelude::*;
use specs::prelude::*;
use std::collections::HashMap;
pub const CARRY_CAPACITY_PER_STRENGTH: i32 = 8;
pub struct EncumbranceSystem {}
impl<'a> System<'a> for EncumbranceSystem {
@ -49,7 +51,8 @@ impl<'a> System<'a> for EncumbranceSystem {
if let Some(pool) = pools.get_mut(*entity) {
pool.weight = *weight;
if let Some(attr) = attributes.get(*entity) {
let carry_capacity_lbs = (attr.strength.base + attr.strength.modifiers) * 10;
let carry_capacity_lbs =
(attr.strength.base + attr.strength.modifiers) * CARRY_CAPACITY_PER_STRENGTH;
if pool.weight as i32 > 3 * carry_capacity_lbs {
// Overloaded
burdened

View file

@ -7,4 +7,4 @@ pub use quip_system::QuipSystem;
mod regen_system;
pub use regen_system::RegenSystem;
mod encumbrance_system;
pub use encumbrance_system::EncumbranceSystem;
pub use encumbrance_system::{EncumbranceSystem, CARRY_CAPACITY_PER_STRENGTH};

View file

@ -144,6 +144,7 @@ pub struct Pools {
pub bac: i32,
pub level: i32,
pub weight: f32,
pub god: bool,
}
#[derive(Debug, Serialize, Deserialize, Clone)]

View file

@ -42,7 +42,9 @@ impl<'a> System<'a> for DamageSystem {
for (entity, mut stats, damage) in (&entities, &mut stats, &damage).join() {
for dmg in damage.amount.iter() {
if !stats.god {
stats.hit_points.current -= dmg.0;
}
let pos = positions.get(entity);
if let Some(pos) = pos {
let idx = map.xy_idx(pos.x, pos.y);

View file

@ -7,6 +7,9 @@ pub enum CheatMenuResult {
Cancel,
Ascend,
Descend,
Heal,
MagicMap,
GodMode,
}
pub fn show_cheat_menu(_gs: &mut State, ctx: &mut Rltk) -> CheatMenuResult {
@ -20,8 +23,8 @@ pub fn show_cheat_menu(_gs: &mut State, ctx: &mut Rltk) -> CheatMenuResult {
);
let x = 1 + x_offset;
let mut y = 3 + y_offset;
let count = 2;
let width = 18;
let count = 5;
let width = 19;
ctx.draw_box(x, y, width, (count + 1) as i32, RGB::named(rltk::RED), RGB::named(rltk::BLACK));
y += 1;
@ -32,12 +35,28 @@ pub fn show_cheat_menu(_gs: &mut State, ctx: &mut Rltk) -> CheatMenuResult {
// Desc
ctx.set(x_offset + 2, y, RGB::named(rltk::YELLOW), RGB::named(rltk::BLACK), rltk::to_cp437('d'));
ctx.print(x_offset + 4, y, "DESCEND A FLOOR");
y += 1;
// Heal
ctx.set(x_offset + 2, y, RGB::named(rltk::YELLOW), RGB::named(rltk::BLACK), rltk::to_cp437('h'));
ctx.print(x_offset + 4, y, "HEAL TO FULL");
y += 1;
// Reveal map
ctx.set(x_offset + 2, y, RGB::named(rltk::YELLOW), RGB::named(rltk::BLACK), rltk::to_cp437('m'));
ctx.print(x_offset + 4, y, "MAGIC MAP REVEAL");
y += 1;
// Godmode
ctx.set(x_offset + 2, y, RGB::named(rltk::YELLOW), RGB::named(rltk::BLACK), rltk::to_cp437('g'));
ctx.print(x_offset + 4, y, "GOD MODE");
y += 1;
// Match keys
match ctx.key {
None => CheatMenuResult::NoResponse,
Some(key) => match key {
VirtualKeyCode::A => CheatMenuResult::Ascend,
VirtualKeyCode::D => CheatMenuResult::Descend,
VirtualKeyCode::H => CheatMenuResult::Heal,
VirtualKeyCode::M => CheatMenuResult::MagicMap,
VirtualKeyCode::G => CheatMenuResult::GodMode,
VirtualKeyCode::Escape => CheatMenuResult::Cancel,
_ => CheatMenuResult::NoResponse,
},

View file

@ -1,7 +1,7 @@
use super::{
camera, gamelog, gamesystem, rex_assets::RexAssets, ArmourClassBonus, Attributes, Burden, Equipped, Hidden,
HungerClock, HungerState, InBackpack, Map, Name, Player, Point, Pools, Position, Prop, Renderable, RunState, Skill,
Skills, State, Viewshed,
ai::CARRY_CAPACITY_PER_STRENGTH, camera, gamelog, gamesystem, rex_assets::RexAssets, ArmourClassBonus, Attributes,
Burden, Equipped, Hidden, HungerClock, HungerState, InBackpack, Map, Name, Player, Point, Pools, Position, Prop,
Renderable, RunState, Skill, Skills, State, Viewshed,
};
use rltk::{Rltk, VirtualKeyCode, RGB};
use specs::prelude::*;
@ -139,6 +139,9 @@ pub fn draw_ui(ecs: &World, ctx: &mut Rltk) {
}
}
}
if stats.god {
ctx.print_color(20, 20, RGB::named(rltk::YELLOW), RGB::named(rltk::BLACK), "--- GODMODE: ON ---");
}
// Draw equipment
let names = ecs.read_storage::<Name>();
let mut equipment: Vec<String> = Vec::new();
@ -163,7 +166,11 @@ pub fn draw_ui(ecs: &World, ctx: &mut Rltk) {
y,
RGB::named(rltk::WHITE),
RGB::named(rltk::BLACK),
&format!("[{:.1}/{} lbs]", stats.weight, (attributes.strength.base + attributes.strength.modifiers) * 10),
&format!(
"[{:.1}/{} lbs]",
stats.weight,
(attributes.strength.base + attributes.strength.modifiers) * CARRY_CAPACITY_PER_STRENGTH
),
);
y += 1;
let (player_inventory, _inventory_ids) = get_player_inventory(&ecs);

View file

@ -260,6 +260,28 @@ impl GameState for State {
self.mapgen_next_state = Some(RunState::PreRun);
new_runstate = RunState::MapGeneration;
}
gui::CheatMenuResult::Heal => {
let player = self.ecs.fetch::<Entity>();
let mut pools = self.ecs.write_storage::<Pools>();
let mut player_pools = pools.get_mut(*player).unwrap();
player_pools.hit_points.current = player_pools.hit_points.max;
new_runstate = RunState::AwaitingInput;
}
gui::CheatMenuResult::MagicMap => {
let mut map = self.ecs.fetch_mut::<Map>();
for v in map.revealed_tiles.iter_mut() {
*v = true;
}
new_runstate = RunState::AwaitingInput;
}
gui::CheatMenuResult::GodMode => {
let player = self.ecs.fetch::<Entity>();
let mut pools = self.ecs.write_storage::<Pools>();
let mut player_pools = pools.get_mut(*player).unwrap();
gamelog::Logger::new().item_name("TOGGLED GOD MODE!").log();
player_pools.god = !player_pools.god;
new_runstate = RunState::AwaitingInput;
}
}
}
RunState::ShowInventory => {

View file

@ -313,6 +313,7 @@ pub fn spawn_named_mob(
hit_points: Pool { current: mob_hp, max: mob_hp },
mana: Pool { current: mob_mana, max: mob_mana },
weight: 0.0,
god: false,
};
eb = eb.with(pools);
eb = eb.with(EquipmentChanged {});

View file

@ -54,6 +54,7 @@ pub fn player(ecs: &mut World, player_x: i32, player_y: i32) -> Entity {
level: 1,
bac: 10,
weight: 0.0,
god: false,
})
.with(EquipmentChanged {})
.with(skills)