add chat definitions in YAML format (integration still needed)
This commit is contained in:
parent
b53545ce2c
commit
5ca31fda65
12
src/actor.rs
12
src/actor.rs
|
@ -2,7 +2,7 @@ use bevy::prelude::*;
|
||||||
use bevy_xpbd_3d::prelude::*;
|
use bevy_xpbd_3d::prelude::*;
|
||||||
use bevy::scene::SceneInstance;
|
use bevy::scene::SceneInstance;
|
||||||
use bevy::math::DVec3;
|
use bevy::math::DVec3;
|
||||||
use crate::{actor, audio, camera, chat, commands, effects, hud, nature, settings, world};
|
use crate::{actor, audio, camera, chat2, commands, effects, hud, nature, settings, world};
|
||||||
|
|
||||||
pub const ENGINE_SPEED_FACTOR: f32 = 30.0;
|
pub const ENGINE_SPEED_FACTOR: f32 = 30.0;
|
||||||
const MAX_TRANSMISSION_DISTANCE: f32 = 60.0;
|
const MAX_TRANSMISSION_DISTANCE: f32 = 60.0;
|
||||||
|
@ -235,11 +235,11 @@ pub fn handle_input(
|
||||||
mut commands: Commands,
|
mut commands: Commands,
|
||||||
keyboard_input: Res<ButtonInput<KeyCode>>,
|
keyboard_input: Res<ButtonInput<KeyCode>>,
|
||||||
mut settings: ResMut<settings::Settings>,
|
mut settings: ResMut<settings::Settings>,
|
||||||
q_talker: Query<(&chat::Talker, &Transform), (Without<actor::Player>, Without<Camera>)>,
|
q_talker: Query<(&chat2::Talker, &Transform), (Without<actor::Player>, Without<Camera>)>,
|
||||||
player: Query<Entity, With<actor::Player>>,
|
player: Query<Entity, With<actor::Player>>,
|
||||||
q_camera: Query<&Transform, With<Camera>>,
|
q_camera: Query<&Transform, With<Camera>>,
|
||||||
q_vehicles: Query<(Entity, &Transform), (With<actor::Vehicle>, Without<actor::Player>, Without<Camera>)>,
|
q_vehicles: Query<(Entity, &Transform), (With<actor::Vehicle>, Without<actor::Player>, Without<Camera>)>,
|
||||||
mut ew_conv: EventWriter<chat::StartConversationEvent>,
|
mut ew_conv: EventWriter<chat2::StartConversationEvent>,
|
||||||
mut ew_vehicle: EventWriter<VehicleEnterExitEvent>,
|
mut ew_vehicle: EventWriter<VehicleEnterExitEvent>,
|
||||||
mut ew_playerdies: EventWriter<PlayerDiesEvent>,
|
mut ew_playerdies: EventWriter<PlayerDiesEvent>,
|
||||||
q_player_drives: Query<Entity, With<PlayerDrivesThis>>,
|
q_player_drives: Query<Entity, With<PlayerDrivesThis>>,
|
||||||
|
@ -252,14 +252,14 @@ pub fn handle_input(
|
||||||
|
|
||||||
if keyboard_input.just_pressed(settings.key_interact) {
|
if keyboard_input.just_pressed(settings.key_interact) {
|
||||||
// Talking to people
|
// Talking to people
|
||||||
let objects: Vec<(chat::Talker, &Transform)> = q_talker
|
let objects: Vec<(chat2::Talker, &Transform)> = q_talker
|
||||||
.iter()
|
.iter()
|
||||||
.map(|(talker, transform)| (talker.clone(), transform))
|
.map(|(talker, transform)| (talker.clone(), transform))
|
||||||
.collect();
|
.collect();
|
||||||
// TODO: replace Transform.translation with Position
|
// TODO: replace Transform.translation with Position
|
||||||
if let (Some(talker), dist) = camera::find_closest_target::<chat::Talker>(objects, camtrans) {
|
if let (Some(talker), dist) = camera::find_closest_target::<chat2::Talker>(objects, camtrans) {
|
||||||
if dist <= MAX_TRANSMISSION_DISTANCE {
|
if dist <= MAX_TRANSMISSION_DISTANCE {
|
||||||
ew_conv.send(chat::StartConversationEvent{talker: talker.clone()});
|
ew_conv.send(chat2::StartConversationEvent{talker: talker.clone()});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Entering Vehicles
|
// Entering Vehicles
|
||||||
|
|
254
src/chats/serenity.yaml
Normal file
254
src/chats/serenity.yaml
Normal file
|
@ -0,0 +1,254 @@
|
||||||
|
- chat: Drifter
|
||||||
|
- system: "Error: No response"
|
||||||
|
- system: No life signs detected
|
||||||
|
- Damn, it's gotta be moldy in that suit. How long has it been drifting?:
|
||||||
|
- Harvest some oxygen:
|
||||||
|
- script: refilloxygen 1 Drifter
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
- chat: ClippyPizza
|
||||||
|
- At your service!
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
- 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
|
||||||
|
- label: startransbusstop
|
||||||
|
- goto: EXIT
|
||||||
|
- label: interesting
|
||||||
|
- Serenity Station is famous for the best pizza across the Jovian Rings.
|
||||||
|
- Look for the neon sign of the pizzeria nearby.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
- 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
|
||||||
|
- label: startransbusstop
|
||||||
|
- goto: EXIT
|
||||||
|
- label: interesting
|
||||||
|
- This area is an industrial paradise for asteroid miners.
|
||||||
|
- Though it has been recently abandoned due to the excessive particle radiation.
|
||||||
|
- I advise you to minimize the duration of your stay here.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
- 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
|
||||||
|
- label: startransbusstop
|
||||||
|
- goto: EXIT
|
||||||
|
- label: interesting
|
||||||
|
- The main attraction around here is the gorgeous view onto Jupiter from far up ahead.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
- addon: startransbusstop
|
||||||
|
- Bus stop?! How does this work?:
|
||||||
|
- StarTrans Cargo Services is the most convenient way to travel the vast distances of space.
|
||||||
|
- Just activate your suit's built-in cryostasis. A StarTrans carrier will pick you up and you will wake up at your destination in the blink of an eye.
|
||||||
|
- Of course we will supply you with free oxygen and ensure your safety.
|
||||||
|
- goto: startransbusstop
|
||||||
|
- Can I take a spacecraft with me?:
|
||||||
|
- Absolutely.
|
||||||
|
- goto startransbusstop
|
||||||
|
- if: busstop != oscillation
|
||||||
|
Take me to Oscillation Station, please.:
|
||||||
|
- StarTrans wishes you a pleasant journey.
|
||||||
|
- script: cryofadeout
|
||||||
|
- sleep: 5
|
||||||
|
- script: cryotrip oscillation
|
||||||
|
- goto: EXIT
|
||||||
|
- if: busstop != metis
|
||||||
|
Take me to Metis Prime Station, please.:
|
||||||
|
- StarTrans wishes you a pleasant journey.
|
||||||
|
- script: cryofadeout
|
||||||
|
- sleep: 5
|
||||||
|
- script: cryotrip metisprime
|
||||||
|
- goto: EXIT
|
||||||
|
- if: busstop != serenity
|
||||||
|
Take me to Serenity Station, please.:
|
||||||
|
- StarTrans wishes you a pleasant journey.
|
||||||
|
- script: cryofadeout
|
||||||
|
- sleep: 5
|
||||||
|
- script: cryotrip serenity
|
||||||
|
- goto: EXIT
|
||||||
|
- Can you please fill up my oxygen tank without taking me anywhere?:
|
||||||
|
- Of course, you can count on StarTrans!
|
||||||
|
- script: refilloxygen 1000
|
||||||
|
- Is there anything interesting to do around here?:
|
||||||
|
- goto: interesting
|
||||||
|
- No, thank you.:
|
||||||
|
- TIMEOUT:
|
||||||
|
- Feel free to come back any time.
|
||||||
|
- system: Connection terminated.
|
||||||
|
|
||||||
|
---
|
||||||
|
- chat: Icarus
|
||||||
|
- if talkcount > 0:
|
||||||
|
- "Oh, hi again! How are you?"
|
||||||
|
- goto: howru
|
||||||
|
- Oh hey, you're awake!
|
||||||
|
- I found you drifting out cold, and thought, I better watch over you.
|
||||||
|
- Took us here behind that moonlet, to shield you from the micros.
|
||||||
|
- Thank you!:
|
||||||
|
- label: thx
|
||||||
|
- No worries. Folks are stretched thin around this corner, we gotta watch out for each other.
|
||||||
|
- How talkcount are you feeling?
|
||||||
|
- goto: howru
|
||||||
|
- I didn't ask for this.:
|
||||||
|
- "Sure, 'cause you were unconscious. I just did what felt right. Is there a problem?"
|
||||||
|
- Nevermind. Thank you.:
|
||||||
|
- goto: thx
|
||||||
|
- Leave me alone!:
|
||||||
|
- goto: END
|
||||||
|
- Micros? What's that?:
|
||||||
|
- Micrometeorites. Those tiny 混蛋 that fly right through you, leaving holes in your suit. And your body.
|
||||||
|
- Ouch! Thank you so much.:
|
||||||
|
- goto: thx
|
||||||
|
- Whatever... I didn't ask for this.:
|
||||||
|
- goto: didntask
|
||||||
|
- TIMEOUT:
|
||||||
|
- How are you feeling?
|
||||||
|
- TIMEOUT:
|
||||||
|
- How are you feeling?
|
||||||
|
|
||||||
|
|
||||||
|
- label: howru
|
||||||
|
- I feel quite cozy, this space suit feels like a second skin.:
|
||||||
|
- Hah, it does, doesn't it?
|
||||||
|
- But take care, your suit seems to be leaking. I'd patch it up if I were you.
|
||||||
|
- I'm all out of SuitPatch™ SuperGlue™ right now, otherwise i'd share.
|
||||||
|
- Can I help you with anything else, maybe?
|
||||||
|
- set: friends
|
||||||
|
- I got this apocalyptic headache...:
|
||||||
|
- Heh, probably related to why you were passed out.
|
||||||
|
- Go easy on yourself, I'm sure things will turn for the better.
|
||||||
|
- Meanwhile, can I help you with anything?
|
||||||
|
- set: friends
|
||||||
|
- I... don't know, I'm pretty disoriented.:
|
||||||
|
- Oh no. Do you need a lowdown on reality?
|
||||||
|
- set: friends
|
||||||
|
|
||||||
|
|
||||||
|
- label: help
|
||||||
|
- Where are we?:
|
||||||
|
- This is space, my friend.
|
||||||
|
- That massive crescent over there, that's Juptiter.
|
||||||
|
- We're about 150,000km away from its surface, on the very outside of it's rings.
|
||||||
|
- This area is called the Thebe gossamer ring.
|
||||||
|
- The moon Thebe is actually pretty close right now, flinging all those micros at us.
|
||||||
|
- Micros? What's that?:
|
||||||
|
- Micrometeorites. Those tiny 混蛋 that fly right through you, leaving holes in your suit. And your body.
|
||||||
|
- goto: help
|
||||||
|
- What year is this?:
|
||||||
|
- Oh, is your Augmented Reality deactivated?
|
||||||
|
- Push the TAB button, your space suit's AR will show you the date and time.
|
||||||
|
- Why am I here?:
|
||||||
|
- That's a very philosophical question.
|
||||||
|
- I don't know.
|
||||||
|
- It's probably related to the choices you made in your life so far.
|
||||||
|
- What should I do?:
|
||||||
|
- Ah, that's the beauty of life.
|
||||||
|
- You can just do whatever you want.
|
||||||
|
- So long as you have the means, and respect people's boundaries.
|
||||||
|
- I'm here mostly for the view and the peace.
|
||||||
|
- Just look at Jupiter, it's mesmerizing, isn't it?
|
||||||
|
- So far away from everything, nobody expects anything from you.
|
||||||
|
- If you want, you can take my sports racing capsule MeteorAceGT™ for a ride. It's right over there.
|
||||||
|
- It rides like a punch in the face, don't hurt yourself, ok?
|
||||||
|
- You're too kind!:
|
||||||
|
- Ah, don't mention it!
|
||||||
|
- There's also a half-decent pizza restaurant over there, look for the neon sign.
|
||||||
|
- Do you have some money for me?:
|
||||||
|
- Huh? What is money?
|
||||||
|
- Currency? Flat round things that you can exchange for goods and services?:
|
||||||
|
- Uhm... are you talking about pizza?
|
||||||
|
- I don't have any pizza with me right now.
|
||||||
|
- But there's a pizza place right over there, look for the neon sign.
|
||||||
|
- goto: help
|
||||||
|
- Well, anyway, need anything else?
|
||||||
|
- I just want to be alone right now:
|
||||||
|
- Oh, sure. Ping me if you need anything. I'll go back to playing my VR game.
|
||||||
|
- goto: EXIT
|
||||||
|
- TIMEOUT:
|
||||||
|
- Well, I hope you're ok.
|
||||||
|
|
||||||
|
|
||||||
|
- label: chocolate
|
||||||
|
- I got some left-over instant hot chocolate, would you like some?
|
||||||
|
- Oh yes! Please!:
|
||||||
|
- Here you go, my friend!
|
||||||
|
- system: Received 1x ChuggaChug™ Instant Hot Chocolate
|
||||||
|
- TIMEOUT:
|
||||||
|
- I guess not. Well. I think I'll go back to playing my VR game. Ping me if you need anything.
|
||||||
|
- Oh and make sure to check out the pizza place!
|
||||||
|
- Will do, bye!:
|
||||||
|
- system: Disconnected.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
- chat: SpacePizza
|
||||||
|
- Welcome to Space Pizza™, best pizza around the rings!
|
||||||
|
- Great to see a customer, we don't get many lately
|
||||||
|
- Would you like to order today's special?
|
||||||
|
- label: offer
|
||||||
|
- What's the special?:
|
||||||
|
- Suspicious Spacefunghi
|
||||||
|
- With free pineapple imitation
|
||||||
|
- Our pizza smoothies are freshly blended every day
|
||||||
|
- Wait... pizza smoothie?:
|
||||||
|
- Huh? Of course, smoothie! How else do you want to get that pizza down your spacesuit feeding tube?
|
||||||
|
- An emulsion of deliciousness!
|
||||||
|
- TIMEOUT:
|
||||||
|
- Deliciousness for your spacesuit feeding tube!
|
||||||
|
- I think I'll pass...:
|
||||||
|
- Your loss, mate
|
||||||
|
- TIMEOUT:
|
||||||
|
- Hey? Are you still there?
|
||||||
|
- Wh... what's a pizzeria doing here?:
|
||||||
|
- Hah, beautiful, right? I carved it out this asteroid myself!
|
||||||
|
- You know how much work it was to neutralize the rotation of the asteroid, so my valued customers don't bang against the walls while drinking my pizza?
|
||||||
|
- Now would you like today's special or not?
|
||||||
|
- My head hurts, my suit leaks, I think I'm dying...:
|
||||||
|
- Seriously? Let me have a look. Just press the 'Grant Access' button please.
|
||||||
|
- "[GRANT ACCESS TO SPACESUIT WIFI]":
|
||||||
|
- label: hack
|
||||||
|
- warn: MALWARE DETECTED
|
||||||
|
- warn: BITCOIN MINER DETECTED
|
||||||
|
- Hey, what are you doing with me?:
|
||||||
|
- Just checking your systems, hang on tight
|
||||||
|
- Yeah, suit's fucked, I'd look out for a repair shop
|
||||||
|
- Anyway, wanna order today's special?
|
||||||
|
- goto: offer
|
||||||
|
- "[DENY ACCESS TO SPACESUIT WIFI]":
|
||||||
|
- Oh come on, do you want my help or not?
|
||||||
|
- "[GRANT ACCESS TO SPACESUIT WIFI]":
|
||||||
|
- goto hack
|
||||||
|
- "[DENY ACCESS TO SPACESUIT WIFI]":
|
||||||
|
- Fuck off!:
|
||||||
|
- TIMEOUT:
|
||||||
|
- goto: noreply
|
||||||
|
- Great, the first customer in ages, and they're brain damaged...
|
||||||
|
- goto: EXIT
|
||||||
|
- TIMEOUT:
|
||||||
|
- TIMEOUT:
|
||||||
|
- label: noreply
|
||||||
|
- Hey, are you still there? Is this a prank?
|
250
src/commands.rs
250
src/commands.rs
|
@ -3,7 +3,7 @@ extern crate regex;
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
use bevy_xpbd_3d::prelude::*;
|
use bevy_xpbd_3d::prelude::*;
|
||||||
use bevy::math::DVec3;
|
use bevy::math::DVec3;
|
||||||
use crate::{actor, chat, hud, nature, world};
|
use crate::{actor, chat2, hud, nature, world};
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use std::f32::consts::PI;
|
use std::f32::consts::PI;
|
||||||
use std::f64::consts::PI as PI64;
|
use std::f64::consts::PI as PI64;
|
||||||
|
@ -153,22 +153,22 @@ impl ParserState {
|
||||||
self.script_parameter2 = default.script_parameter2;
|
self.script_parameter2 = default.script_parameter2;
|
||||||
self.sound = default.sound;
|
self.sound = default.sound;
|
||||||
}
|
}
|
||||||
fn as_chatbranch(&self) -> chat::ChatBranch {
|
// fn as_chatbranch(&self) -> chat::ChatBranch {
|
||||||
return chat::ChatBranch {
|
// return chat::ChatBranch {
|
||||||
id: self.chat.clone(),
|
// id: self.chat.clone(),
|
||||||
name: self.name.clone().unwrap_or("".to_string()),
|
// name: self.name.clone().unwrap_or("".to_string()),
|
||||||
label: self.label.clone(),
|
// label: self.label.clone(),
|
||||||
delay: self.delay.clone(),
|
// delay: self.delay.clone(),
|
||||||
sound: if self.is_choice || self.sound.is_none() { "".to_string() } else { "chat".to_string() },
|
// sound: if self.is_choice || self.sound.is_none() { "".to_string() } else { "chat".to_string() },
|
||||||
level: self.level.clone(),
|
// level: self.level.clone(),
|
||||||
reply: if self.is_choice { "".to_string() } else { self.text.clone() },
|
// reply: if self.is_choice { "".to_string() } else { self.text.clone() },
|
||||||
choice: if self.is_choice { self.text.clone() } else { "".to_string() },
|
// choice: if self.is_choice { self.text.clone() } else { "".to_string() },
|
||||||
goto: self.goto.clone(),
|
// goto: self.goto.clone(),
|
||||||
script: self.script.clone(),
|
// script: self.script.clone(),
|
||||||
script_parameter: self.script_parameter.clone(),
|
// script_parameter: self.script_parameter.clone(),
|
||||||
script_parameter2: self.script_parameter2.clone(),
|
// script_parameter2: self.script_parameter2.clone(),
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn load_defs(
|
pub fn load_defs(
|
||||||
|
@ -468,109 +468,109 @@ pub fn load_defs(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parsing chats
|
// Parsing chats
|
||||||
["chat", chat_name] => {
|
// ["chat", chat_name] => {
|
||||||
debug!("Registering chat: {}", chat_name);
|
// debug!("Registering chat: {}", chat_name);
|
||||||
ew_spawn.send(SpawnEvent(state));
|
// ew_spawn.send(SpawnEvent(state));
|
||||||
state = ParserState::default();
|
// state = ParserState::default();
|
||||||
state.class = DefClass::Chat;
|
// state.class = DefClass::Chat;
|
||||||
state.chat = chat_name.to_string();
|
// state.chat = chat_name.to_string();
|
||||||
}
|
// }
|
||||||
["name", name] => {
|
// ["name", name] => {
|
||||||
debug!("Registering name: {}", name);
|
// debug!("Registering name: {}", name);
|
||||||
state.name = Some(name.to_string());
|
// state.name = Some(name.to_string());
|
||||||
}
|
// }
|
||||||
["msg", sleep, text] => {
|
// ["msg", sleep, text] => {
|
||||||
debug!("Registering message (sleep={}): {}", sleep, text);
|
// debug!("Registering message (sleep={}): {}", sleep, text);
|
||||||
ew_spawn.send(SpawnEvent(state.clone()));
|
// ew_spawn.send(SpawnEvent(state.clone()));
|
||||||
if let Ok(sleep_float) = sleep.parse::<f64>() {
|
// if let Ok(sleep_float) = sleep.parse::<f64>() {
|
||||||
state.delay = sleep_float;
|
// state.delay = sleep_float;
|
||||||
state.text = text.to_string();
|
// state.text = text.to_string();
|
||||||
state.stores_item = true;
|
// state.stores_item = true;
|
||||||
state.is_choice = false;
|
// state.is_choice = false;
|
||||||
} else {
|
// } else {
|
||||||
error!("The 'sleep' value for this message is not a float: {}", line);
|
// error!("The 'sleep' value for this message is not a float: {}", line);
|
||||||
continue;
|
// continue;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
["msg", sleep, label, goto, text] => {
|
// ["msg", sleep, label, goto, text] => {
|
||||||
debug!("Registering message (sleep={}): {}", sleep, text);
|
// debug!("Registering message (sleep={}): {}", sleep, text);
|
||||||
ew_spawn.send(SpawnEvent(state.clone()));
|
// ew_spawn.send(SpawnEvent(state.clone()));
|
||||||
state.reset_message();
|
// state.reset_message();
|
||||||
if let Ok(sleep_float) = sleep.parse::<f64>() {
|
// if let Ok(sleep_float) = sleep.parse::<f64>() {
|
||||||
state.delay = sleep_float;
|
// state.delay = sleep_float;
|
||||||
state.text = text.to_string();
|
// state.text = text.to_string();
|
||||||
state.stores_item = true;
|
// state.stores_item = true;
|
||||||
state.is_choice = false;
|
// state.is_choice = false;
|
||||||
state.goto = goto.to_string();
|
// state.goto = goto.to_string();
|
||||||
state.label = label.to_string();
|
// state.label = label.to_string();
|
||||||
} else {
|
// } else {
|
||||||
error!("The 'sleep' value for this message is not a float: {}", line);
|
// error!("The 'sleep' value for this message is not a float: {}", line);
|
||||||
continue;
|
// continue;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
["choice", sleep, text] => {
|
// ["choice", sleep, text] => {
|
||||||
debug!("Registering choice (sleep={}): {}", sleep, text);
|
// debug!("Registering choice (sleep={}): {}", sleep, text);
|
||||||
ew_spawn.send(SpawnEvent(state.clone()));
|
// ew_spawn.send(SpawnEvent(state.clone()));
|
||||||
state.reset_message();
|
// state.reset_message();
|
||||||
if let Ok(sleep_float) = sleep.parse::<f64>() {
|
// if let Ok(sleep_float) = sleep.parse::<f64>() {
|
||||||
state.delay = sleep_float;
|
// state.delay = sleep_float;
|
||||||
state.text = text.to_string();
|
// state.text = text.to_string();
|
||||||
state.stores_item = true;
|
// state.stores_item = true;
|
||||||
state.is_choice = true;
|
// state.is_choice = true;
|
||||||
} else {
|
// } else {
|
||||||
error!("The 'sleep' value for this message is not a float: {}", line);
|
// error!("The 'sleep' value for this message is not a float: {}", line);
|
||||||
continue;
|
// continue;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
["choice", sleep, label, goto, text] => {
|
// ["choice", sleep, label, goto, text] => {
|
||||||
debug!("Registering choice (sleep={}): {}", sleep, text);
|
// debug!("Registering choice (sleep={}): {}", sleep, text);
|
||||||
ew_spawn.send(SpawnEvent(state.clone()));
|
// ew_spawn.send(SpawnEvent(state.clone()));
|
||||||
state.reset_message();
|
// state.reset_message();
|
||||||
if let Ok(sleep_float) = sleep.parse::<f64>() {
|
// if let Ok(sleep_float) = sleep.parse::<f64>() {
|
||||||
state.delay = sleep_float;
|
// state.delay = sleep_float;
|
||||||
state.text = text.to_string();
|
// state.text = text.to_string();
|
||||||
state.stores_item = true;
|
// state.stores_item = true;
|
||||||
state.is_choice = true;
|
// state.is_choice = true;
|
||||||
state.goto = goto.to_string();
|
// state.goto = goto.to_string();
|
||||||
state.label = label.to_string();
|
// state.label = label.to_string();
|
||||||
} else {
|
// } else {
|
||||||
error!("The 'sleep' value for this message is not a float: {}", line);
|
// error!("The 'sleep' value for this message is not a float: {}", line);
|
||||||
continue;
|
// continue;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
["goto", label] => {
|
// ["goto", label] => {
|
||||||
debug!("Registering goto: {}", label);
|
// debug!("Registering goto: {}", label);
|
||||||
state.goto = label.to_string();
|
// state.goto = label.to_string();
|
||||||
}
|
// }
|
||||||
["label", label] => {
|
// ["label", label] => {
|
||||||
debug!("Registering label: {}", label);
|
// debug!("Registering label: {}", label);
|
||||||
state.label = label.to_string();
|
// state.label = label.to_string();
|
||||||
}
|
// }
|
||||||
["lvl", level] => {
|
// ["lvl", level] => {
|
||||||
debug!("Registering level: {}", level);
|
// debug!("Registering level: {}", level);
|
||||||
state.level = level.to_string();
|
// state.level = level.to_string();
|
||||||
}
|
// }
|
||||||
["script", scriptname] => {
|
// ["script", scriptname] => {
|
||||||
state.script = scriptname.to_string();
|
// state.script = scriptname.to_string();
|
||||||
state.script_parameter = "".to_string();
|
// state.script_parameter = "".to_string();
|
||||||
state.script_parameter2 = "".to_string();
|
// state.script_parameter2 = "".to_string();
|
||||||
}
|
// }
|
||||||
["script", scriptname, parameter] => {
|
// ["script", scriptname, parameter] => {
|
||||||
state.script = scriptname.to_string();
|
// state.script = scriptname.to_string();
|
||||||
state.script_parameter = parameter.to_string();
|
// state.script_parameter = parameter.to_string();
|
||||||
state.script_parameter2 = "".to_string();
|
// state.script_parameter2 = "".to_string();
|
||||||
}
|
// }
|
||||||
["script", scriptname, parameter, parameter2] => {
|
// ["script", scriptname, parameter, parameter2] => {
|
||||||
state.script = scriptname.to_string();
|
// state.script = scriptname.to_string();
|
||||||
state.script_parameter = parameter.to_string();
|
// state.script_parameter = parameter.to_string();
|
||||||
state.script_parameter2 = parameter2.to_string();
|
// state.script_parameter2 = parameter2.to_string();
|
||||||
}
|
// }
|
||||||
["sound", "none"] => {
|
// ["sound", "none"] => {
|
||||||
state.sound = None;
|
// state.sound = None;
|
||||||
}
|
// }
|
||||||
_ => {
|
// _ => {
|
||||||
error!("No match for [{}]", parts.join(","));
|
// error!("No match for [{}]", parts.join(","));
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ew_spawn.send(SpawnEvent(state));
|
ew_spawn.send(SpawnEvent(state));
|
||||||
|
@ -585,13 +585,7 @@ fn spawn_entities(
|
||||||
) {
|
) {
|
||||||
for state_wrapper in er_spawn.read() {
|
for state_wrapper in er_spawn.read() {
|
||||||
let state = &state_wrapper.0;
|
let state = &state_wrapper.0;
|
||||||
if state.class == DefClass::Chat {
|
if state.class == DefClass::Actor {
|
||||||
if state.stores_item {
|
|
||||||
let mut chat = commands.spawn(state.as_chatbranch());
|
|
||||||
chat.insert(world::DespawnOnPlayerDeath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if state.class == DefClass::Actor {
|
|
||||||
let actor_entity;
|
let actor_entity;
|
||||||
{
|
{
|
||||||
let mut actor = commands.spawn_empty();
|
let mut actor = commands.spawn_empty();
|
||||||
|
@ -697,7 +691,7 @@ fn spawn_entities(
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if !state.chat.is_empty() {
|
if !state.chat.is_empty() {
|
||||||
actor.insert(chat::Talker {
|
actor.insert(chat2::Talker {
|
||||||
conv_id: state.chat.clone(),
|
conv_id: state.chat.clone(),
|
||||||
..default()
|
..default()
|
||||||
});
|
});
|
||||||
|
|
88
src/hud.rs
88
src/hud.rs
|
@ -1,4 +1,4 @@
|
||||||
use crate::{actor, audio, camera, chat, nature, settings, world};
|
use crate::{actor, audio, camera, nature, settings, world};
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
use bevy::diagnostic::{DiagnosticsStore, FrameTimeDiagnosticsPlugin};
|
use bevy::diagnostic::{DiagnosticsStore, FrameTimeDiagnosticsPlugin};
|
||||||
use bevy::transform::TransformSystem;
|
use bevy::transform::TransformSystem;
|
||||||
|
@ -412,7 +412,7 @@ fn update_hud(
|
||||||
q_camera: Query<(&Position, &LinearVelocity), With<actor::PlayerCamera>>,
|
q_camera: Query<(&Position, &LinearVelocity), With<actor::PlayerCamera>>,
|
||||||
mut timer: ResMut<FPSUpdateTimer>,
|
mut timer: ResMut<FPSUpdateTimer>,
|
||||||
mut query: Query<&mut Text, With<GaugesText>>,
|
mut query: Query<&mut Text, With<GaugesText>>,
|
||||||
q_choices: Query<&chat::ChoiceAvailable>,
|
//q_choices: Query<&chat::ChoiceAvailable>,
|
||||||
mut query_chat: Query<&mut Text, (With<ChatText>, Without<GaugesText>)>,
|
mut query_chat: Query<&mut Text, (With<ChatText>, Without<GaugesText>)>,
|
||||||
query_all_actors: Query<&actor::Actor>,
|
query_all_actors: Query<&actor::Actor>,
|
||||||
settings: Res<settings::Settings>,
|
settings: Res<settings::Settings>,
|
||||||
|
@ -514,48 +514,48 @@ fn update_hud(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Ok(mut chat) = query_chat.get_single_mut() {
|
// if let Ok(mut chat) = query_chat.get_single_mut() {
|
||||||
// Choices
|
// // Choices
|
||||||
let mut choices: Vec<String> = Vec::new();
|
// let mut choices: Vec<String> = Vec::new();
|
||||||
let mut count = 0;
|
// let mut count = 0;
|
||||||
for choice in &q_choices {
|
// for choice in &q_choices {
|
||||||
if count > 9 {
|
// if count > 9 {
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
let press_this = REPLY_NUMBERS[count];
|
// let press_this = REPLY_NUMBERS[count];
|
||||||
let reply = &choice.text;
|
// let reply = &choice.text;
|
||||||
//let recipient = &choice.recipient;
|
// //let recipient = &choice.recipient;
|
||||||
// TODO: indicate recipients if there's more than one
|
// // TODO: indicate recipients if there's more than one
|
||||||
choices.push(format!("{press_this} {reply}"));
|
// choices.push(format!("{press_this} {reply}"));
|
||||||
count += 1;
|
// count += 1;
|
||||||
}
|
// }
|
||||||
if count < 4 {
|
// if count < 4 {
|
||||||
for _padding in 0..(4-count) {
|
// for _padding in 0..(4-count) {
|
||||||
choices.push(" ".to_string());
|
// choices.push(" ".to_string());
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
chat.sections[2].value = choices.join("\n");
|
// chat.sections[2].value = choices.join("\n");
|
||||||
|
//
|
||||||
// Chat Log and System Log
|
// // Chat Log and System Log
|
||||||
let logfilter = if settings.hud_active {
|
// let logfilter = if settings.hud_active {
|
||||||
|_msg: &&Message| { true }
|
// |_msg: &&Message| { true }
|
||||||
} else {
|
// } else {
|
||||||
|msg: &&Message| { match msg.level {
|
// |msg: &&Message| { match msg.level {
|
||||||
LogLevel::Chat => true,
|
// LogLevel::Chat => true,
|
||||||
LogLevel::Warning => true,
|
// LogLevel::Warning => true,
|
||||||
LogLevel::Info => true,
|
// LogLevel::Info => true,
|
||||||
_ => false
|
// _ => false
|
||||||
}}
|
// }}
|
||||||
};
|
// };
|
||||||
let logs_vec: Vec<String> = log.logs.iter()
|
// let logs_vec: Vec<String> = log.logs.iter()
|
||||||
.filter(logfilter)
|
// .filter(logfilter)
|
||||||
.map(|s| if s.sender.is_empty() {
|
// .map(|s| if s.sender.is_empty() {
|
||||||
format!("{}", s.text)
|
// format!("{}", s.text)
|
||||||
} else {
|
// } else {
|
||||||
format!("{}: {}", s.sender, s.text)
|
// format!("{}: {}", s.sender, s.text)
|
||||||
}).collect();
|
// }).collect();
|
||||||
chat.sections[0].value = logs_vec.join("\n");
|
// chat.sections[0].value = logs_vec.join("\n");
|
||||||
}
|
// }
|
||||||
log.needs_rerendering = false;
|
log.needs_rerendering = false;
|
||||||
log.remove_old();
|
log.remove_old();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
mod actor;
|
mod actor;
|
||||||
mod audio;
|
mod audio;
|
||||||
mod camera;
|
mod camera;
|
||||||
mod chat;
|
mod chat2;
|
||||||
mod commands;
|
mod commands;
|
||||||
mod effects;
|
mod effects;
|
||||||
mod hud;
|
mod hud;
|
||||||
|
@ -55,7 +55,7 @@ impl Plugin for OutFlyPlugin {
|
||||||
actor::ActorPlugin,
|
actor::ActorPlugin,
|
||||||
audio::AudioPlugin,
|
audio::AudioPlugin,
|
||||||
camera::CameraPlugin,
|
camera::CameraPlugin,
|
||||||
chat::ChatPlugin,
|
chat2::ChatPlugin,
|
||||||
commands::CommandsPlugin,
|
commands::CommandsPlugin,
|
||||||
effects::EffectsPlugin,
|
effects::EffectsPlugin,
|
||||||
hud::HudPlugin,
|
hud::HudPlugin,
|
||||||
|
|
Loading…
Reference in a new issue