WIP buy items
This commit is contained in:
parent
9f104aec17
commit
d2b02b91c5
|
@ -9,7 +9,7 @@ pub enum ItemType {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone, PartialEq, Eq)]
|
||||||
pub enum ItemOwner {
|
pub enum ItemOwner {
|
||||||
Held(EntityId),
|
Held(EntityId),
|
||||||
Dropped(Location),
|
Dropped(Location),
|
||||||
|
|
24
src/state.rs
24
src/state.rs
|
@ -96,6 +96,15 @@ impl GameState {
|
||||||
self.creatures.get(&id)
|
self.creatures.get(&id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_inventory(&self, id: EntityId) -> Vec<EntityId> {
|
||||||
|
self.items.iter().filter(|(_, item)| {
|
||||||
|
item.owner == ItemOwner::Held(id)
|
||||||
|
}).map(|(id, _)| *id).collect::<Vec<_>>()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_item(&self, id: EntityId) -> Option<&Item> {
|
||||||
|
self.items.get(&id)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function to populate the world at genesis
|
* Function to populate the world at genesis
|
||||||
|
@ -212,6 +221,8 @@ impl GameState {
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use crate::item::ItemGenerator;
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -234,4 +245,17 @@ mod tests {
|
||||||
assert_eq!(state.tavern.is_some(), true);
|
assert_eq!(state.tavern.is_some(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_claim_and_inventory() {
|
||||||
|
let mut state = GameState::new(World::new(2));
|
||||||
|
let creature = CreatureGenerator::create_human(state.time, Location { x: 0, y: 0 });
|
||||||
|
let creature_id = state.add_person(creature);
|
||||||
|
let item = ItemGenerator::generate_item();
|
||||||
|
let item_id = state.add_item(item);
|
||||||
|
state.claim_item(creature_id, item_id);
|
||||||
|
let inventory = state.get_inventory(creature_id);
|
||||||
|
assert_eq!(inventory.len(), 1);
|
||||||
|
assert_eq!(inventory[0], item_id);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -21,6 +21,7 @@ enum AppStatus {
|
||||||
Initial,
|
Initial,
|
||||||
GuestSelection,
|
GuestSelection,
|
||||||
TalkToGuest(Option<EntityId>),
|
TalkToGuest(Option<EntityId>),
|
||||||
|
BuyFromGuest(EntityId),
|
||||||
Debug,
|
Debug,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,7 +105,11 @@ impl<'a> App<'a> {
|
||||||
// determine guests
|
// determine guests
|
||||||
self.guest_list = self.game.state.guests().iter().map(|creature_id| {
|
self.guest_list = self.game.state.guests().iter().map(|creature_id| {
|
||||||
let creature = self.game.state.get_creature(*creature_id).unwrap();
|
let creature = self.game.state.get_creature(*creature_id).unwrap();
|
||||||
tui::widgets::ListItem::new(creature.name.clone())
|
tui::widgets::ListItem::new(format!(
|
||||||
|
"{} ({}, {} items)",
|
||||||
|
creature.name,
|
||||||
|
creature.profession, self.game.state.get_inventory(creature.entity.id).len()
|
||||||
|
))
|
||||||
}).collect();
|
}).collect();
|
||||||
self.guest_list_state = tui::widgets::ListState::default();
|
self.guest_list_state = tui::widgets::ListState::default();
|
||||||
self.guest_list_state.select(Some(0));
|
self.guest_list_state.select(Some(0));
|
||||||
|
@ -167,6 +172,9 @@ impl<'a> App<'a> {
|
||||||
KeyCode::Char('a') => {
|
KeyCode::Char('a') => {
|
||||||
self.ask_business(*guest);
|
self.ask_business(*guest);
|
||||||
},
|
},
|
||||||
|
KeyCode::Char('b') => {
|
||||||
|
self.status = AppStatus::BuyFromGuest(guest.unwrap());
|
||||||
|
},
|
||||||
KeyCode::Up => {
|
KeyCode::Up => {
|
||||||
self.conversation_scroll += 1;
|
self.conversation_scroll += 1;
|
||||||
},
|
},
|
||||||
|
@ -182,6 +190,20 @@ impl<'a> App<'a> {
|
||||||
}
|
}
|
||||||
true
|
true
|
||||||
},
|
},
|
||||||
|
AppStatus::BuyFromGuest(guest_id) => {
|
||||||
|
match read() {
|
||||||
|
Ok(Event::Key(event)) => {
|
||||||
|
match event.code {
|
||||||
|
KeyCode::Esc => {
|
||||||
|
self.status = AppStatus::TalkToGuest(Some(*guest_id));
|
||||||
|
},
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
true
|
||||||
|
},
|
||||||
AppStatus::Debug => {
|
AppStatus::Debug => {
|
||||||
match read() {
|
match read() {
|
||||||
Ok(Event::Key(event)) => {
|
Ok(Event::Key(event)) => {
|
||||||
|
@ -308,9 +330,12 @@ impl<'a> App<'a> {
|
||||||
AppStatus::TalkToGuest(guest_id) => {
|
AppStatus::TalkToGuest(guest_id) => {
|
||||||
self.draw_talk_to_guest(f, *guest_id);
|
self.draw_talk_to_guest(f, *guest_id);
|
||||||
},
|
},
|
||||||
|
AppStatus::BuyFromGuest(guest_id) => {
|
||||||
|
self.draw_buy_from_guest(f, *guest_id);
|
||||||
|
},
|
||||||
AppStatus::Debug => {
|
AppStatus::Debug => {
|
||||||
self.draw_debug(f);
|
self.draw_debug(f);
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -373,24 +398,22 @@ impl<'a> App<'a> {
|
||||||
let mut full_text = self.conversation.to_spans();
|
let mut full_text = self.conversation.to_spans();
|
||||||
full_text.push(tui::text::Spans::from(vec![
|
full_text.push(tui::text::Spans::from(vec![
|
||||||
tui::text::Span::styled("(a) ", key_style),
|
tui::text::Span::styled("(a) ", key_style),
|
||||||
tui::text::Span::raw("What's your business?\n\n"),
|
tui::text::Span::raw("What's your business?"),
|
||||||
]));
|
]));
|
||||||
full_text.push(tui::text::Spans::from(vec![
|
full_text.push(tui::text::Spans::from(vec![
|
||||||
tui::text::Span::styled("(b) ", key_style),
|
tui::text::Span::styled("(b) ", key_style),
|
||||||
tui::text::Span::raw("Let's trade?\n\n"),
|
tui::text::Span::raw("What do you have to sell?"),
|
||||||
]));
|
]));
|
||||||
full_text.push(tui::text::Spans::from(vec![
|
full_text.push(tui::text::Spans::from(vec![
|
||||||
tui::text::Span::styled("(c) ", key_style),
|
tui::text::Span::styled("(c) ", key_style),
|
||||||
tui::text::Span::raw("Heard of anything interesting?\n\n"),
|
tui::text::Span::raw("Heard of anything interesting?"),
|
||||||
]));
|
]));
|
||||||
let text = tui::text::Text::from(full_text);
|
let text = tui::text::Text::from(full_text);
|
||||||
let scroll: u16 = ((text.lines.len() as u16) )
|
let scroll: u16 = ((text.lines.len() as u16) )
|
||||||
.checked_sub(
|
.saturating_sub(
|
||||||
(chunks.main.height as u16).checked_sub(2).unwrap_or(0) // 2 lines for the border
|
(chunks.main.height as u16).saturating_sub(2) // 2 lines for the border
|
||||||
)
|
)
|
||||||
.unwrap_or(0)
|
.saturating_sub(self.conversation_scroll);
|
||||||
.checked_sub(self.conversation_scroll)
|
|
||||||
.unwrap_or(0);
|
|
||||||
|
|
||||||
let main_window = tui::widgets::Paragraph::new(text)
|
let main_window = tui::widgets::Paragraph::new(text)
|
||||||
.block(tui::widgets::Block::default().title(guest.name.clone()).borders(tui::widgets::Borders::ALL))
|
.block(tui::widgets::Block::default().title(guest.name.clone()).borders(tui::widgets::Borders::ALL))
|
||||||
|
@ -408,6 +431,34 @@ impl<'a> App<'a> {
|
||||||
f.render_widget(controls, chunks.controls);
|
f.render_widget(controls, chunks.controls);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn draw_buy_from_guest<B: Backend>(&self, f: &mut Frame<B>, guest_id: EntityId) {
|
||||||
|
let chunks = DefaultLayout::default(f.size());
|
||||||
|
|
||||||
|
let guest = self.game.state.get_creature(guest_id).unwrap();
|
||||||
|
|
||||||
|
let inventory = self.game.state.get_inventory(guest_id);
|
||||||
|
let mut list_items = vec![];
|
||||||
|
for item in inventory {
|
||||||
|
let item = self.game.state.get_item(item).unwrap();
|
||||||
|
list_items.push(tui::widgets::ListItem::new(format!("{} ({} gold)", item.name, item.value())));
|
||||||
|
}
|
||||||
|
|
||||||
|
let main_window = tui::widgets::List::new(list_items)
|
||||||
|
.block(tui::widgets::Block::default().title(guest.name.clone()).borders(tui::widgets::Borders::ALL))
|
||||||
|
.style(tui::style::Style::default().fg(tui::style::Color::White))
|
||||||
|
.highlight_style(tui::style::Style::default().add_modifier(tui::style::Modifier::ITALIC))
|
||||||
|
.highlight_symbol(">>");
|
||||||
|
|
||||||
|
let mut binding = Controls::new();
|
||||||
|
let controls = binding
|
||||||
|
.add("a-z".to_owned(), "Select".to_owned())
|
||||||
|
.add("Esc".to_owned(), "Back".to_owned())
|
||||||
|
.render();
|
||||||
|
|
||||||
|
self.draw_status(f, chunks.status);
|
||||||
|
f.render_widget(main_window, chunks.main);
|
||||||
|
f.render_widget(controls, chunks.controls); }
|
||||||
|
|
||||||
fn draw_debug<B: Backend>(&mut self, f: &mut Frame<B>) {
|
fn draw_debug<B: Backend>(&mut self, f: &mut Frame<B>) {
|
||||||
let chunks = DefaultLayout::default(f.size());
|
let chunks = DefaultLayout::default(f.size());
|
||||||
|
|
||||||
|
@ -472,6 +523,7 @@ impl<'a> App<'a> {
|
||||||
f.render_widget(controls, chunks.controls);
|
f.render_widget(controls, chunks.controls);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Conversation
|
* Conversation
|
||||||
*/
|
*/
|
||||||
|
@ -509,4 +561,5 @@ impl<'a> App<'a> {
|
||||||
));
|
));
|
||||||
self.conversation_scroll = 0;
|
self.conversation_scroll = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue