chat refactoring WIP
This commit is contained in:
parent
62565bd2d1
commit
0af3b17810
|
@ -5,11 +5,11 @@ mod time;
|
||||||
mod generators;
|
mod generators;
|
||||||
mod creature;
|
mod creature;
|
||||||
mod site;
|
mod site;
|
||||||
mod app;
|
mod ui;
|
||||||
mod entity;
|
mod entity;
|
||||||
mod game;
|
mod game;
|
||||||
|
|
||||||
use app::App;
|
use ui::App;
|
||||||
use noise::{Perlin, ScalePoint, Add, NoiseFn, ScaleBias};
|
use noise::{Perlin, ScalePoint, Add, NoiseFn, ScaleBias};
|
||||||
use noise::utils::{NoiseMapBuilder, PlaneMapBuilder};
|
use noise::utils::{NoiseMapBuilder, PlaneMapBuilder};
|
||||||
use image::{RgbImage, Rgb};
|
use image::{RgbImage, Rgb};
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
use tui::{text::{Span}, style::{Style, Color}};
|
||||||
|
|
||||||
|
use crate::entity::EntityId;
|
||||||
|
|
||||||
|
pub struct ChatLine {
|
||||||
|
pub speaker_id: EntityId,
|
||||||
|
pub speaker: String,
|
||||||
|
pub text: String,
|
||||||
|
pub action: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Chat {
|
||||||
|
pub lines: Vec<ChatLine>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ChatLine {
|
||||||
|
pub fn new(speaker_id: EntityId, speaker: String, text: String, action: bool) -> ChatLine {
|
||||||
|
ChatLine {
|
||||||
|
speaker_id: speaker_id,
|
||||||
|
speaker: speaker,
|
||||||
|
text: text,
|
||||||
|
action: action,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn to_spans(&self) -> tui::text::Spans {
|
||||||
|
let mut spans = Vec::new();
|
||||||
|
spans.push(Span::styled(format!("{}: ", self.speaker), Style::default().fg(Color::Red)));
|
||||||
|
spans.push(Span::styled(format!("{}", self.text), Style::default().fg(Color::White)));
|
||||||
|
tui::text::Spans::from(spans)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Chat {
|
||||||
|
pub fn new() -> Chat {
|
||||||
|
Chat {
|
||||||
|
lines: Vec::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_line(&mut self, line: ChatLine) {
|
||||||
|
self.lines.push(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn to_spans(&self) -> Vec<tui::text::Spans> {
|
||||||
|
let mut spans = Vec::new();
|
||||||
|
for line in &self.lines {
|
||||||
|
spans.push(line.to_spans());
|
||||||
|
spans.push(tui::text::Spans::from(vec![
|
||||||
|
Span::styled("\n", Style::default().fg(Color::White))
|
||||||
|
]));
|
||||||
|
}
|
||||||
|
spans
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,8 +1,12 @@
|
||||||
|
mod chat;
|
||||||
|
|
||||||
use crossterm::event::{read, Event, KeyCode};
|
use crossterm::event::{read, Event, KeyCode};
|
||||||
use tui::{backend::Backend, Frame, layout::Layout};
|
use tui::{backend::Backend, Frame, layout::Layout};
|
||||||
|
|
||||||
use crate::{game::Game, entity::EntityId};
|
use crate::{game::Game, entity::EntityId};
|
||||||
|
|
||||||
|
use self::chat::{Chat, ChatLine};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* |........................|
|
* |........................|
|
||||||
* | Conversations/Selection|
|
* | Conversations/Selection|
|
||||||
|
@ -23,7 +27,7 @@ pub struct App<'a> {
|
||||||
guest_list: Vec<tui::widgets::ListItem<'a>>,
|
guest_list: Vec<tui::widgets::ListItem<'a>>,
|
||||||
guest_list_state: tui::widgets::ListState,
|
guest_list_state: tui::widgets::ListState,
|
||||||
status: AppStatus,
|
status: AppStatus,
|
||||||
conversation: Vec<tui::text::Spans<'a>>,
|
conversation: Chat,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> App<'a> {
|
impl<'a> App<'a> {
|
||||||
|
@ -33,7 +37,7 @@ impl<'a> App<'a> {
|
||||||
guest_list: vec![],
|
guest_list: vec![],
|
||||||
guest_list_state: tui::widgets::ListState::default(),
|
guest_list_state: tui::widgets::ListState::default(),
|
||||||
status: AppStatus::Initial,
|
status: AppStatus::Initial,
|
||||||
conversation: Vec::new(),
|
conversation: Chat::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,7 +73,7 @@ impl<'a> App<'a> {
|
||||||
KeyCode::Enter => {
|
KeyCode::Enter => {
|
||||||
let selected = self.guest_list_state.selected().unwrap();
|
let selected = self.guest_list_state.selected().unwrap();
|
||||||
let guest_id = &self.game.state.guests()[selected];
|
let guest_id = &self.game.state.guests()[selected];
|
||||||
self.conversation = Vec::new();
|
self.conversation = Chat::new();
|
||||||
self.greet_guest(Some(*guest_id));
|
self.greet_guest(Some(*guest_id));
|
||||||
self.status = AppStatus::TalkToGuest(Some(*guest_id));
|
self.status = AppStatus::TalkToGuest(Some(*guest_id));
|
||||||
},
|
},
|
||||||
|
@ -174,7 +178,7 @@ impl<'a> App<'a> {
|
||||||
.fg(tui::style::Color::Green)
|
.fg(tui::style::Color::Green)
|
||||||
.bg(tui::style::Color::Black);
|
.bg(tui::style::Color::Black);
|
||||||
|
|
||||||
let mut full_text = self.conversation.clone();
|
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?"),
|
tui::text::Span::raw("What's your business?"),
|
||||||
|
@ -192,32 +196,33 @@ impl<'a> App<'a> {
|
||||||
*/
|
*/
|
||||||
fn greet_guest(&mut self, guest_id: Option<EntityId>) {
|
fn greet_guest(&mut self, guest_id: Option<EntityId>) {
|
||||||
let guest = self.game.state.get_creature(guest_id.unwrap()).unwrap();
|
let guest = self.game.state.get_creature(guest_id.unwrap()).unwrap();
|
||||||
self.conversation.push(
|
self.conversation.add_line(ChatLine::new(
|
||||||
tui::text::Spans::from(vec![
|
0,
|
||||||
tui::text::Span::styled("Greetings traveller?\n", tui::style::Style::default().fg(tui::style::Color::Yellow)),
|
"You".to_owned(),
|
||||||
])
|
"Greetings traveller!".to_owned(),
|
||||||
);
|
false
|
||||||
self.conversation.push(
|
));
|
||||||
tui::text::Spans::from(vec![
|
self.conversation.add_line(ChatLine::new(
|
||||||
tui::text::Span::raw("Hello, I'm "),
|
guest_id.unwrap(),
|
||||||
tui::text::Span::styled(guest.name.clone(), tui::style::Style::default().add_modifier(tui::style::Modifier::BOLD)),
|
guest.name.clone(),
|
||||||
tui::text::Span::raw(".\n"),
|
"Hello, I'm ".to_owned() + &guest.name + ".",
|
||||||
])
|
false
|
||||||
);
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn ask_business(&mut self, guest: Option<EntityId>) {
|
fn ask_business(&mut self, guest: Option<EntityId>) {
|
||||||
let guest = self.game.state.get_creature(guest.unwrap()).unwrap();
|
let guest = self.game.state.get_creature(guest.unwrap()).unwrap();
|
||||||
self.conversation.push(
|
self.conversation.add_line(ChatLine::new(
|
||||||
tui::text::Spans::from(vec![
|
0,
|
||||||
tui::text::Span::styled("What's your business?\n", tui::style::Style::default().fg(tui::style::Color::Yellow))
|
"You".to_owned(),
|
||||||
])
|
"What's your business?".to_owned(),
|
||||||
);
|
false
|
||||||
self.conversation.push(
|
));
|
||||||
tui::text::Spans::from(vec![
|
self.conversation.add_line(ChatLine::new(
|
||||||
tui::text::Span::raw(guest.say_agenda(& self.game.state)),
|
guest.entity.id,
|
||||||
tui::text::Span::raw("\n"),
|
guest.name.clone(),
|
||||||
])
|
guest.say_agenda(& self.game.state),
|
||||||
);
|
false
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue