added gameover, added class/ancestry defaults
This commit is contained in:
parent
65ec5c1b15
commit
2c4b4ca143
8 changed files with 60 additions and 98 deletions
|
|
@ -85,6 +85,7 @@ pub fn get_attribute_rolls(
|
|||
ancestry: Ancestry
|
||||
) -> (i32, i32, i32, i32, i32, i32) {
|
||||
let (mut str, mut dex, mut con, mut int, mut wis, mut cha) = match class {
|
||||
Class::Unset => VILLAGER_MIN_ATTR,
|
||||
Class::Fighter => FIGHTER_MIN_ATTR,
|
||||
Class::Rogue => ROGUE_MIN_ATTR,
|
||||
Class::Wizard => WIZARD_MIN_ATTR,
|
||||
|
|
@ -92,6 +93,7 @@ pub fn get_attribute_rolls(
|
|||
};
|
||||
let mut remaining_points = TOTAL_ATTRIBUTE_POINTS_MAXIMUM - (str + dex + con + int + wis + cha);
|
||||
let improve_chance: [i32; 6] = match class {
|
||||
Class::Unset => VILLAGER_IMPR_CHANCE,
|
||||
Class::Fighter => FIGHTER_IMPR_CHANCE,
|
||||
Class::Rogue => ROGUE_IMPR_CHANCE,
|
||||
Class::Wizard => WIZARD_IMPR_CHANCE,
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ use crate::consts::prelude::*;
|
|||
|
||||
#[derive(Serialize, Deserialize, Copy, Clone, PartialEq)]
|
||||
pub enum Ancestry {
|
||||
NULL,
|
||||
Unset,
|
||||
Human,
|
||||
Dwarf,
|
||||
Gnome,
|
||||
|
|
@ -42,6 +42,7 @@ pub enum Ancestry {
|
|||
|
||||
#[derive(Serialize, Deserialize, Copy, Clone, PartialEq)]
|
||||
pub enum Class {
|
||||
Unset,
|
||||
Fighter,
|
||||
Rogue,
|
||||
Wizard,
|
||||
|
|
@ -212,7 +213,7 @@ pub fn character_creation(gs: &mut State, ctx: &mut BTerm) -> CharCreateResult {
|
|||
Some(key) =>
|
||||
match key {
|
||||
VirtualKeyCode::Escape => {
|
||||
return CharCreateResult::Selected { ancestry: Ancestry::NULL, class };
|
||||
return CharCreateResult::Selected { ancestry: Ancestry::Unset, class };
|
||||
}
|
||||
VirtualKeyCode::Return => {
|
||||
return CharCreateResult::Selected { ancestry, class };
|
||||
|
|
@ -413,6 +414,9 @@ fn get_starting_inventory(
|
|||
let mut carried: Vec<String> = Vec::new();
|
||||
let starting_food: &str;
|
||||
match class {
|
||||
Class::Unset => {
|
||||
starting_food = VILLAGER_STARTING_FOOD;
|
||||
}
|
||||
Class::Fighter => {
|
||||
starting_food = FIGHTER_STARTING_FOOD;
|
||||
equipped = vec![
|
||||
|
|
|
|||
|
|
@ -1641,94 +1641,19 @@ pub enum YesNoResult {
|
|||
No,
|
||||
}
|
||||
|
||||
pub fn game_over(ctx: &mut BTerm) -> YesNoResult {
|
||||
let mut x = 3;
|
||||
let mut y = 12;
|
||||
let width = 45;
|
||||
let height = 20;
|
||||
ctx.draw_box(x, y, width, height, RGB::named(WHITE), RGB::named(BLACK));
|
||||
ctx.print_color(x + 3, y, RGB::named(YELLOW), RGB::named(BLACK), "You died!");
|
||||
ctx.print_color(
|
||||
x + 3,
|
||||
y + height,
|
||||
RGB::named(YELLOW),
|
||||
RGB::named(BLACK),
|
||||
" Write a morgue file? [y/n] "
|
||||
);
|
||||
x += 2;
|
||||
y += 2;
|
||||
ctx.print_color(
|
||||
x,
|
||||
y,
|
||||
RGB::named(GREEN),
|
||||
RGB::named(BLACK),
|
||||
format!("You survived for {} turns.", crate::gamelog::get_event_count(EVENT::COUNT_TURN))
|
||||
);
|
||||
y += 2;
|
||||
ctx.print_color(x, y, RGB::named(GREEN), RGB::named(BLACK), format!("And in the process, you"));
|
||||
y += 1;
|
||||
if crate::gamelog::get_event_count(EVENT::COUNT_CHANGED_FLOOR) > 0 {
|
||||
ctx.print_color(
|
||||
x + 1,
|
||||
y,
|
||||
RGB::named(WHITE),
|
||||
RGB::named(BLACK),
|
||||
format!(
|
||||
"- changed floor {} times",
|
||||
crate::gamelog::get_event_count(EVENT::COUNT_CHANGED_FLOOR)
|
||||
)
|
||||
);
|
||||
y += 1;
|
||||
pub fn game_over(ctx: &mut App) -> YesNoResult {
|
||||
for keycode in &ctx.keyboard.pressed {
|
||||
match *keycode {
|
||||
KeyCode::N => {
|
||||
return YesNoResult::No;
|
||||
}
|
||||
if crate::gamelog::get_event_count(EVENT::COUNT_KICK) > 0 {
|
||||
ctx.print_color(
|
||||
x + 1,
|
||||
y,
|
||||
RGB::named(WHITE),
|
||||
RGB::named(BLACK),
|
||||
format!(
|
||||
"- kicked {} time(s), breaking {} object(s)",
|
||||
crate::gamelog::get_event_count(EVENT::COUNT_KICK),
|
||||
crate::gamelog::get_event_count(EVENT::COUNT_BROKE_DOOR)
|
||||
)
|
||||
);
|
||||
y += 1;
|
||||
KeyCode::Y => {
|
||||
return YesNoResult::Yes;
|
||||
}
|
||||
if crate::gamelog::get_event_count(EVENT::COUNT_KILLED) > 0 {
|
||||
ctx.print_color(
|
||||
x + 1,
|
||||
y,
|
||||
RGB::named(WHITE),
|
||||
RGB::named(BLACK),
|
||||
format!(
|
||||
"- slew {} other creature(s)",
|
||||
crate::gamelog::get_event_count(EVENT::COUNT_KILLED)
|
||||
)
|
||||
);
|
||||
y += 1;
|
||||
}
|
||||
if crate::gamelog::get_event_count(EVENT::COUNT_LOOKED_FOR_HELP) > 0 {
|
||||
ctx.print_color(
|
||||
x + 1,
|
||||
y,
|
||||
RGB::named(WHITE),
|
||||
RGB::named(BLACK),
|
||||
format!(
|
||||
"- forgot the controls {} time(s)",
|
||||
crate::gamelog::get_event_count(EVENT::COUNT_LOOKED_FOR_HELP)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
match ctx.key {
|
||||
None => YesNoResult::NoSelection,
|
||||
Some(key) =>
|
||||
match key {
|
||||
VirtualKeyCode::N => YesNoResult::No,
|
||||
VirtualKeyCode::Y => YesNoResult::Yes,
|
||||
_ => YesNoResult::NoSelection,
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
YesNoResult::NoSelection
|
||||
}
|
||||
|
||||
pub fn with_article(name: &String) -> String {
|
||||
|
|
|
|||
15
src/main.rs
15
src/main.rs
|
|
@ -473,10 +473,10 @@ fn draw(_app: &mut App, gfx: &mut Graphics, gs: &mut State) {
|
|||
gui::draw_cheat_menu(&mut draw, &gs.atlas, &gs.font);
|
||||
}
|
||||
RunState::ActionWithDirection { .. } => {
|
||||
let offset = crate::camera::get_offset();
|
||||
draw.text(&gs.font, "In what direction? [0-9]/[YUHJKLBN]")
|
||||
.position(((offset.x + 1) as f32) * TILESIZE, ((offset.y + 1) as f32) * TILESIZE)
|
||||
.size(TILESIZE);
|
||||
corner_text("In what direction? [0-9]/[YUHJKLBN]", &mut draw, &gs.font);
|
||||
}
|
||||
RunState::GameOver => {
|
||||
corner_text("Create morgue file? [Y/N]", &mut draw, &gs.font);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
|
@ -487,3 +487,10 @@ fn draw(_app: &mut App, gfx: &mut Graphics, gs: &mut State) {
|
|||
fn update(ctx: &mut App, state: &mut State) {
|
||||
state.update(ctx);
|
||||
}
|
||||
|
||||
fn corner_text(text: &str, draw: &mut Draw, font: ¬an::draw::Font) {
|
||||
let offset = crate::camera::get_offset();
|
||||
draw.text(&font, &text)
|
||||
.position(((offset.x + 1) as f32) * TILESIZE, ((offset.y + 1) as f32) * TILESIZE)
|
||||
.size(FONTSIZE);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ fn create_file_name(ecs: &World, morgue_dir: &str) -> String {
|
|||
let pools = ecs.read_storage::<Pools>();
|
||||
let pool = pools.get(*e).unwrap();
|
||||
let class = match ecs.read_storage::<HasClass>().get(*e).unwrap().name {
|
||||
Class::Unset => "classless",
|
||||
Class::Fighter => "fighter",
|
||||
Class::Wizard => "wizard",
|
||||
Class::Rogue => "rogue",
|
||||
|
|
@ -47,7 +48,7 @@ fn create_file_name(ecs: &World, morgue_dir: &str) -> String {
|
|||
Ancestry::Dwarf => "dwarf",
|
||||
Ancestry::Gnome => "gnome",
|
||||
Ancestry::Catfolk => "catfolk",
|
||||
Ancestry::NULL => "NULL",
|
||||
Ancestry::Unset => "NULL",
|
||||
};
|
||||
return format!(
|
||||
"{}/lv{}-{}-{}-{}.txt",
|
||||
|
|
@ -64,6 +65,7 @@ fn create_morgue_string(ecs: &World) -> String {
|
|||
let mut morgue_info: String = Default::default();
|
||||
let e = ecs.fetch::<Entity>();
|
||||
let class = match ecs.read_storage::<HasClass>().get(*e).unwrap().name {
|
||||
Class::Unset => "classless",
|
||||
Class::Fighter => "fighter",
|
||||
Class::Wizard => "wizard",
|
||||
Class::Rogue => "rogue",
|
||||
|
|
@ -75,7 +77,7 @@ fn create_morgue_string(ecs: &World) -> String {
|
|||
Ancestry::Dwarf => "dwarf",
|
||||
Ancestry::Gnome => "gnome",
|
||||
Ancestry::Catfolk => "catfolk",
|
||||
Ancestry::NULL => "NULL",
|
||||
Ancestry::Unset => "NULL",
|
||||
};
|
||||
let pools = ecs.read_storage::<Pools>();
|
||||
let pool = pools.get(*e).unwrap();
|
||||
|
|
|
|||
|
|
@ -1022,7 +1022,7 @@ fn get_ancestry_string(ancestry: Ancestry) -> &'static str {
|
|||
Ancestry::Gnome => {
|
||||
return "gnome";
|
||||
}
|
||||
Ancestry::NULL => {
|
||||
Ancestry::Unset => {
|
||||
return "NULL";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,7 +27,10 @@ use super::{
|
|||
Bleeds,
|
||||
HasDamageModifiers,
|
||||
Intrinsics,
|
||||
HasAncestry,
|
||||
HasClass,
|
||||
};
|
||||
use crate::gui::{ Ancestry, Class };
|
||||
use crate::consts::entity;
|
||||
use crate::consts::visuals::BLOODSTAIN_COLOUR;
|
||||
use crate::gamesystem::*;
|
||||
|
|
@ -63,6 +66,8 @@ pub fn player(ecs: &mut World, player_x: i32, player_y: i32) -> Entity {
|
|||
.with(Player {})
|
||||
.with(Mind {})
|
||||
.with(Faction { name: "player".to_string() })
|
||||
.with(HasAncestry { name: Ancestry::Unset })
|
||||
.with(HasClass { name: Class::Unset })
|
||||
.with(Viewshed {
|
||||
visible_tiles: Vec::new(),
|
||||
range: entity::DEFAULT_VIEWSHED_STANDARD,
|
||||
|
|
|
|||
|
|
@ -290,7 +290,24 @@ impl State {
|
|||
menu_selection: gui::MainMenuSelection::LoadGame,
|
||||
};
|
||||
}
|
||||
//RunState::GameOver
|
||||
RunState::GameOver => {
|
||||
let result = gui::game_over(ctx);
|
||||
let write_to_morgue: Option<bool> = match result {
|
||||
gui::YesNoResult::NoSelection => None,
|
||||
gui::YesNoResult::No => Some(false),
|
||||
gui::YesNoResult::Yes => Some(true),
|
||||
};
|
||||
if let Some(response) = write_to_morgue {
|
||||
if response {
|
||||
morgue::create_morgue_file(&self.ecs);
|
||||
}
|
||||
self.game_over_cleanup();
|
||||
new_runstate = RunState::MapGeneration;
|
||||
self.mapgen_next_state = Some(RunState::MainMenu {
|
||||
menu_selection: gui::MainMenuSelection::NewGame,
|
||||
});
|
||||
}
|
||||
}
|
||||
RunState::GoToLevel(id, dest_tile) => {
|
||||
self.goto_id(id, dest_tile);
|
||||
self.mapgen_next_state = Some(RunState::PreRun);
|
||||
|
|
@ -680,7 +697,7 @@ impl State {
|
|||
new_runstate = RunState::CharacterCreation { ancestry, class };
|
||||
}
|
||||
gui::CharCreateResult::Selected { ancestry, class } => {
|
||||
if ancestry == gui::Ancestry::NULL {
|
||||
if ancestry == gui::Ancestry::Unset {
|
||||
new_runstate = RunState::MainMenu {
|
||||
menu_selection: gui::MainMenuSelection::NewGame,
|
||||
};
|
||||
|
|
@ -699,7 +716,7 @@ impl State {
|
|||
};
|
||||
}
|
||||
RunState::GameOver => {
|
||||
let result = gui::game_over(ctx);
|
||||
let result = gui::YesNoResult::No; //gui::game_over(ctx);
|
||||
let write_to_morgue: Option<bool> = match result {
|
||||
gui::YesNoResult::NoSelection => None,
|
||||
gui::YesNoResult::No => Some(false),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue