WIP choice spawning

This commit is contained in:
yuni 2024-04-13 12:24:56 +02:00
parent 1fd0481ec4
commit 9cd1cf19e2
3 changed files with 60 additions and 6 deletions

View file

@ -9,11 +9,30 @@ pub const CHATS: &[&str] = &[
];
pub const TOKEN_CHAT: &str = "chat";
pub const TOKEN_SYSTEM: &str = "system";
pub const TOKEN_WARN: &str = "warn";
pub const TOKEN_SET: &str = "set";
pub const TOKEN_IF: &str = "if";
pub const TOKEN_GOTO: &str = "goto";
pub const TOKEN_LABEL: &str = "label";
pub const TOKEN_SCRIPT: &str = "script";
//pub const TOKEN_TIMEOUT: &str = "TIMEOUT";
pub const LETTERS_PER_SECOND: f32 = 17.0;
pub const TALKER_SPEED_FACTOR: f32 = settings::DEFAULT_CHAT_SPEED / LETTERS_PER_SECOND;
pub const CHAT_SPEED_MIN_LEN: f32 = 40.0;
pub const NAME_FALLBACK: &str = "Unknown";
pub const NON_CHOICE_TOKENS: &[&str] = &[
TOKEN_CHAT,
TOKEN_SYSTEM,
TOKEN_WARN,
TOKEN_SET,
TOKEN_IF,
TOKEN_GOTO,
TOKEN_LABEL,
TOKEN_SCRIPT,
];
pub struct ChatPlugin;
impl Plugin for ChatPlugin {
fn build(&self, app: &mut App) {
@ -70,6 +89,21 @@ impl ChatDB {
return Err(format!("No chat with the conversation ID `{id}` was found."));
}
fn search_choice(&self, yaml: &Yaml) -> Option<String> {
let non_choice_tokens = NON_CHOICE_TOKENS.to_vec();
if let Some(hash) = yaml.as_hash() {
for key in hash.keys() {
if let Yaml::String(key) = key {
if non_choice_tokens.contains(&key.as_str()) {
continue;
}
return Some(key.into());
}
}
}
return None;
}
pub fn advance_chat(&self, chat: &mut Chat, event: &mut EventWriter<ChatEvent>) {
event.send(ChatEvent::DespawnAllChoices);
let conv = &self.0[chat.id].as_vec();
@ -77,15 +111,36 @@ impl ChatDB {
return;
}
let conv = conv.unwrap();
// Handle next entry in the chat list
let mut is_skipping_through = false;
chat.position += 1;
if chat.position >= conv.len() {
event.send(ChatEvent::DisplayMessage("Disconnected.".to_string()));
event.send(ChatEvent::DespawnAllChats);
return;
}
if let Some(message) = conv[chat.position].as_str() {
else if let Some(_) = self.search_choice(&conv[chat.position]) {
is_skipping_through = true;
}
else if let Some(message) = conv[chat.position].as_str() {
event.send(ChatEvent::DisplayMessage(message.to_string()));
}
// Check if the immediately following entries are choices
let mut pos = chat.position + 1;
loop {
if is_skipping_through || pos >= conv.len() {
break;
}
if let Some(choice) = self.search_choice(&conv[pos]) {
event.send(ChatEvent::DisplayMessage(choice));
}
else {
break;
}
pos += 1;
}
}
}

View file

@ -41,11 +41,10 @@
- Whatever... I didn't ask for this.:
- goto: didntask
- TIMEOUT:
- How are you feeling?
- TIMEOUT:
- How are you feeling?
- How are you feeling?
- label: howru
- I feel quite cozy, this space suit feels like a second skin.:
- Hah, it does, doesn't it?

View file

@ -9,7 +9,7 @@
- chat: ClippyTransSerenity
- Welcome at StarTrans Cargo Services! You have reached Serenity Station.
- "Ready for a trip? Available bus stops: Oscillation Station, Metis Prime Station"
- set busstop: serenity
- set: busstop serenity
- label: startransbusstop
- goto: EXIT
- label: interesting
@ -23,7 +23,7 @@
- chat: ClippyTransMetis
- Welcome at StarTrans Cargo Services! You have reached Metis Prime Station.
- "Ready for a trip? Available bus stops: Oscillation Station, Serenity Station"
- set busstop: metis
- set: busstop metis
- label: startransbusstop
- goto: EXIT
- label: interesting
@ -38,7 +38,7 @@
- chat: ClippyTransOscillation
- Welcome at StarTrans Cargo Services! You have reached Oscillation Station.
- "Ready for a trip? Available bus stops: Serenity Station, Metis Prime Station"
- set busstop: oscillation
- set: busstop oscillation
- label: startransbusstop
- goto: EXIT
- label: interesting