diff --git a/raws/items.json b/raws/items.json index f4d9860..5b477e0 100644 --- a/raws/items.json +++ b/raws/items.json @@ -137,6 +137,15 @@ "flags": ["EQUIP_MELEE", "STRENGTH"], "effects": { "base_damage": "1d6" } }, + { + "id": "equip_rapier", + "name": { "name": "rapier", "plural": "rapiers" }, + "renderable": { "glyph": ")", "fg": "#C0C0C0", "bg": "#000000", "order": 2 }, + "weight": 2, + "value": 10, + "flags": ["EQUIP_MELEE", "FINESSE"], + "effects": { "base_damage": "1d8" } + }, { "id": "equip_pitchfork", "name": { "name": "pitchfork", "plural": "pitchforks" }, diff --git a/src/gamesystem.rs b/src/gamesystem.rs index 5e7c7c0..f79432f 100644 --- a/src/gamesystem.rs +++ b/src/gamesystem.rs @@ -77,15 +77,17 @@ pub fn roll_4d6(rng: &mut rltk::RandomNumberGenerator) -> i32 { /// Handles stat distribution for a player character. pub fn get_attribute_rolls(rng: &mut RandomNumberGenerator, class: Classes) -> (i32, i32, i32, i32, i32, i32) { let (mut str, mut dex, mut con, mut int, mut wis, mut cha) = match class { - Classes::Fighter => (10, 10, 10, 10, 10, 10), - Classes::Wizard => (10, 10, 10, 10, 10, 10), - Classes::Villager => (10, 10, 10, 10, 10, 10), + Classes::Fighter => (10, 8, 10, 6, 6, 8), + Classes::Rogue => (8, 12, 8, 6, 8, 10), + Classes::Wizard => (6, 8, 6, 12, 10, 8), + Classes::Villager => (6, 6, 6, 6, 6, 6), }; let remaining_points = 75 - (str + dex + con + int + wis + cha); let improve_chance: [i32; 6] = match class { Classes::Fighter => [30, 20, 30, 6, 7, 7], + Classes::Rogue => [18, 30, 20, 9, 8, 15], Classes::Wizard => [10, 20, 20, 30, 10, 10], - Classes::Villager => [15, 15, 40, 10, 10, 10], + Classes::Villager => [15, 15, 25, 15, 15, 15], }; let improve_table = crate::random_table::RandomTable::new() .add("Strength", improve_chance[0]) diff --git a/src/gui/race_selection.rs b/src/gui/race_selection.rs index 321ca8e..126216f 100644 --- a/src/gui/race_selection.rs +++ b/src/gui/race_selection.rs @@ -1,5 +1,8 @@ use super::{gamesystem::attr_bonus, gamesystem::get_attribute_rolls, Attributes, Pools, Renderable, RunState, State}; -use crate::{ai::NORMAL_SPEED, raws, Attribute, Energy, Pool, Skill, Skills, Telepath}; +use crate::{ + ai::NORMAL_SPEED, raws, spawner::potion_table, spawner::scroll_table, Attribute, Energy, Pool, Skill, Skills, + Telepath, +}; use rltk::prelude::*; use specs::prelude::*; use std::collections::HashMap; @@ -15,6 +18,7 @@ pub enum Races { #[derive(PartialEq, Copy, Clone)] pub enum Classes { Fighter, + Rogue, Wizard, Villager, } @@ -69,18 +73,24 @@ pub fn character_creation(gs: &mut State, ctx: &mut Rltk) -> CharCreateResult { fg = unselected_fg; } ctx.print_color(x, y, fg, bg, "f. Fighter"); + if class == Classes::Rogue { + fg = selected_fg; + } else { + fg = unselected_fg; + } + ctx.print_color(x, y + 1, fg, bg, "r. Rogue"); if class == Classes::Wizard { fg = selected_fg; } else { fg = unselected_fg; } - ctx.print_color(x, y + 1, fg, bg, "w. Wizard"); + ctx.print_color(x, y + 2, fg, bg, "w. Wizard"); if class == Classes::Villager { fg = selected_fg; } else { fg = unselected_fg; } - ctx.print_color(x, y + 2, fg, bg, "v. Villager"); + ctx.print_color(x, y + 3, fg, bg, "v. Villager"); match ctx.key { None => return CharCreateResult::NoSelection { race, class }, @@ -91,6 +101,7 @@ pub fn character_creation(gs: &mut State, ctx: &mut Rltk) -> CharCreateResult { VirtualKeyCode::E => return CharCreateResult::NoSelection { race: Races::Elf, class }, VirtualKeyCode::D => return CharCreateResult::NoSelection { race: Races::Dwarf, class }, VirtualKeyCode::F => return CharCreateResult::NoSelection { race, class: Classes::Fighter }, + VirtualKeyCode::R => return CharCreateResult::NoSelection { race, class: Classes::Rogue }, VirtualKeyCode::W => return CharCreateResult::NoSelection { race, class: Classes::Wizard }, VirtualKeyCode::V => return CharCreateResult::NoSelection { race, class: Classes::Villager }, _ => return CharCreateResult::NoSelection { race, class }, @@ -216,8 +227,24 @@ fn get_starting_inventory(class: Classes, rng: &mut RandomNumberGenerator) -> (V ]; carried = vec!["food_rations".to_string()]; } + Classes::Rogue => { + equipped = vec!["equip_rapier".to_string(), "equip_body_leather".to_string()]; + carried = vec![ + "equip_dagger".to_string(), + "equip_dagger".to_string(), + "food_rations".to_string(), + "food_apple".to_string(), + ]; + } Classes::Wizard => { equipped = vec!["equip_dagger".to_string(), "equip_back_protection".to_string()]; + carried = vec!["food_rations".to_string()]; + for _i in 0..rng.roll_dice(1, 3) { + carried.push(scroll_table(3).roll(rng)); + } + for _i in 0..rng.roll_dice(1, 2) - 1 { + carried.push(potion_table(3).roll(rng)); + } } Classes::Villager => { let rolled_weapon = raws::table_by_name(&raws::RAWS.lock().unwrap(), "villager_equipment", 1).roll(rng); diff --git a/src/hunger_system.rs b/src/hunger_system.rs index 00d5b53..de07b8a 100644 --- a/src/hunger_system.rs +++ b/src/hunger_system.rs @@ -90,7 +90,7 @@ impl<'a> System<'a> for HungerSystem { HungerState::Satiated => gamelog::Logger::new() .append("You feel") .colour(get_hunger_colour(hunger_clock.state)) - .append("satiated") + .append_n("satiated") .colour(WHITE) .period() .log(), @@ -98,27 +98,27 @@ impl<'a> System<'a> for HungerSystem { HungerState::Hungry => gamelog::Logger::new() .append("You feel") .colour(get_hunger_colour(hunger_clock.state)) - .append("hungry") + .append_n("hungry") .colour(WHITE) .period() .log(), HungerState::Weak => gamelog::Logger::new() .append("You feel") .colour(get_hunger_colour(hunger_clock.state)) - .append("weak with hunger") + .append_n("weak with hunger") .colour(WHITE) .period() .log(), HungerState::Fainting => gamelog::Logger::new() .append("You feel") .colour(get_hunger_colour(hunger_clock.state)) - .append("hungry enough to faint") + .append_n("hungry enough to faint") .colour(WHITE) .period() .log(), _ => gamelog::Logger::new() .colour(get_hunger_colour(hunger_clock.state)) - .append("You can't go on without food!") + .append_n("You can't go on without food!") .log(), } }