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_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 LETTERS_PER_SECOND: f32 = 17.0;
pub const TALKER_SPEED_FACTOR: f32 = settings::DEFAULT_CHAT_SPEED / LETTERS_PER_SECOND; pub const TALKER_SPEED_FACTOR: f32 = settings::DEFAULT_CHAT_SPEED / LETTERS_PER_SECOND;
pub const CHAT_SPEED_MIN_LEN: f32 = 40.0; pub const CHAT_SPEED_MIN_LEN: f32 = 40.0;
pub const NAME_FALLBACK: &str = "Unknown"; 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; pub struct ChatPlugin;
impl Plugin for ChatPlugin { impl Plugin for ChatPlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
@ -70,6 +89,21 @@ impl ChatDB {
return Err(format!("No chat with the conversation ID `{id}` was found.")); 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>) { pub fn advance_chat(&self, chat: &mut Chat, event: &mut EventWriter<ChatEvent>) {
event.send(ChatEvent::DespawnAllChoices); event.send(ChatEvent::DespawnAllChoices);
let conv = &self.0[chat.id].as_vec(); let conv = &self.0[chat.id].as_vec();
@ -77,15 +111,36 @@ impl ChatDB {
return; return;
} }
let conv = conv.unwrap(); let conv = conv.unwrap();
// Handle next entry in the chat list
let mut is_skipping_through = false;
chat.position += 1; chat.position += 1;
if chat.position >= conv.len() { if chat.position >= conv.len() {
event.send(ChatEvent::DisplayMessage("Disconnected.".to_string())); event.send(ChatEvent::DisplayMessage("Disconnected.".to_string()));
event.send(ChatEvent::DespawnAllChats); event.send(ChatEvent::DespawnAllChats);
return; 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())); 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.: - Whatever... I didn't ask for this.:
- goto: didntask - goto: didntask
- TIMEOUT: - TIMEOUT:
- How are you feeling?
- TIMEOUT: - TIMEOUT:
- How are you feeling?
- How are you feeling?
- label: howru - label: howru
- I feel quite cozy, this space suit feels like a second skin.: - I feel quite cozy, this space suit feels like a second skin.:
- Hah, it does, doesn't it? - Hah, it does, doesn't it?

View file

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