Browse Source

Add inventory selection

master
Garrit Franke 3 years ago
parent
commit
649e0045e7
  1. 54
      src/inventory.rs
  2. 90
      src/main.rs

54
src/inventory.rs

@ -6,22 +6,62 @@ use rltk::Rltk;
pub type Inventory = Vec<Item>;
#[derive(Clone)]
pub struct InventoryView {
pub inv: Inventory,
pub selected_item: usize,
}
impl InventoryView {
pub fn new(inv: Inventory) -> Self {
Self {
inv,
selected_item: 0,
}
}
pub fn selection_up(&mut self) {
match self.selected_item {
0 => {}
_ => self.selected_item -= 1,
}
}
pub fn selection_down(&mut self) {
match self.selected_item {
n if n == self.inv.len() => {}
_ => self.selected_item += 1,
}
}
}
#[derive(Clone)]
pub struct Item {
name: String,
pub name: String,
}
impl Render for Inventory {
impl Render for InventoryView {
fn render(&mut self, gs: &mut State, ctx: &mut Rltk) {
let mut draw_batch = DrawBatch::new();
ctx.cls();
draw_batch.print_color(
Point::new(1, 1),
"Hello Inventory",
ColorPair::new(rltk::WHITE, rltk::BLACK),
);
for (i, item) in self.inv.iter().enumerate() {
// Set color, based on if the item is selected
let color = match self.selected_item {
j if j == i => ColorPair::new(rltk::BLACK, rltk::WHITE),
_ => ColorPair::new(rltk::WHITE, rltk::BLACK),
};
draw_batch.print_color(Point::new(4, i * 2 + 1), &item.name, color);
if self.selected_item == i {
draw_batch.print_color(
Point::new(1, i * 2 + 1),
"->",
ColorPair::new(rltk::WHITE, rltk::BLACK),
);
}
}
draw_batch.submit(0).expect("Batch error");
render_draw_buffer(ctx).expect("Render error");

90
src/main.rs

@ -4,6 +4,7 @@ mod inventory;
mod map;
mod traits;
use crate::inventory::Inventory;
use crate::inventory::InventoryView;
use crate::map::Chunk;
use crate::traits::Render;
use map::TileType;
@ -24,7 +25,7 @@ pub struct State {
world_pos: (i32, i32),
seed: u64,
// @cleanup: Move to player struct
player_inventory: Inventory,
player_inventory: InventoryView,
player_position: usize,
selected_object: Option<TileType>,
visible: Vec<bool>,
@ -56,13 +57,26 @@ impl State {
chunks.insert(key, chunk);
}
let mut player_inventory = Inventory::new();
player_inventory.push(inventory::Item {
name: "Axe".to_string(),
});
player_inventory.push(inventory::Item {
name: "Water".to_string(),
});
player_inventory.push(inventory::Item {
name: "Wood".to_string(),
});
let state = State {
mode: DisplayMode::Game,
world_pos: (0, 0),
view: chunks.get(&(0, 0)).unwrap().to_vec(),
loaded_chunks: Box::new(chunks),
seed,
player_inventory: Inventory::new(),
player_inventory: InventoryView::new(player_inventory),
player_position: (25 * 80) + 40, // Equivalent to point2d_to_index(40, 25) but we haven't initialized it yet
visible: vec![false; 80 * 50],
selected_object: None,
@ -139,36 +153,48 @@ impl GameState for State {
None => {} // Nothing happened
Some(key) => {
// A key is pressed or held
match key {
// Numpad
VirtualKeyCode::Numpad8 => self.move_player(Point::new(0, -1)),
VirtualKeyCode::Numpad4 => self.move_player(Point::new(-1, 0)),
VirtualKeyCode::Numpad6 => self.move_player(Point::new(1, 0)),
VirtualKeyCode::Numpad2 => self.move_player(Point::new(0, 1)),
// Numpad diagonals
VirtualKeyCode::Numpad7 => self.move_player(Point::new(-1, -1)),
VirtualKeyCode::Numpad9 => self.move_player(Point::new(1, -1)),
VirtualKeyCode::Numpad1 => self.move_player(Point::new(-1, 1)),
VirtualKeyCode::Numpad3 => self.move_player(Point::new(1, 1)),
// Cursors
VirtualKeyCode::Up => self.move_player(Point::new(0, -1)),
VirtualKeyCode::Down => self.move_player(Point::new(0, 1)),
VirtualKeyCode::Left => self.move_player(Point::new(-1, 0)),
VirtualKeyCode::Right => self.move_player(Point::new(1, 0)),
// L33t keys
VirtualKeyCode::W => self.move_player(Point::new(0, -1)),
VirtualKeyCode::S => self.move_player(Point::new(0, 1)),
VirtualKeyCode::A => self.move_player(Point::new(-1, 0)),
VirtualKeyCode::D => self.move_player(Point::new(1, 0)),
VirtualKeyCode::I => self.mode = DisplayMode::Inventory,
VirtualKeyCode::Escape => self.mode = DisplayMode::Game,
_ => {} // Ignore all the other possibilities
// @cleanup: A LOT of redundant code
match self.mode {
DisplayMode::Game => {
match key {
// Numpad
VirtualKeyCode::Numpad8 => self.move_player(Point::new(0, -1)),
VirtualKeyCode::Numpad4 => self.move_player(Point::new(-1, 0)),
VirtualKeyCode::Numpad6 => self.move_player(Point::new(1, 0)),
VirtualKeyCode::Numpad2 => self.move_player(Point::new(0, 1)),
// Numpad diagonals
VirtualKeyCode::Numpad7 => self.move_player(Point::new(-1, -1)),
VirtualKeyCode::Numpad9 => self.move_player(Point::new(1, -1)),
VirtualKeyCode::Numpad1 => self.move_player(Point::new(-1, 1)),
VirtualKeyCode::Numpad3 => self.move_player(Point::new(1, 1)),
// Cursors
VirtualKeyCode::Up => self.move_player(Point::new(0, -1)),
VirtualKeyCode::Down => self.move_player(Point::new(0, 1)),
VirtualKeyCode::Left => self.move_player(Point::new(-1, 0)),
VirtualKeyCode::Right => self.move_player(Point::new(1, 0)),
// L33t keys
VirtualKeyCode::W => self.move_player(Point::new(0, -1)),
VirtualKeyCode::S => self.move_player(Point::new(0, 1)),
VirtualKeyCode::A => self.move_player(Point::new(-1, 0)),
VirtualKeyCode::D => self.move_player(Point::new(1, 0)),
// Views
VirtualKeyCode::I => self.mode = DisplayMode::Inventory,
_ => {} // Ignore all the other possibilities
}
}
DisplayMode::Inventory => {
match key {
// Numpad
VirtualKeyCode::Numpad8 => self.player_inventory.selection_up(),
VirtualKeyCode::Numpad2 => self.player_inventory.selection_down(),
// Cursors
VirtualKeyCode::Up => self.player_inventory.selection_up(),
VirtualKeyCode::Down => self.player_inventory.selection_down(),
// Views
VirtualKeyCode::Escape => self.mode = DisplayMode::Game,
_ => {} // Ignore all the other possibilities
}
}
}
}
}

Loading…
Cancel
Save