WIP implementing spawning Actors through defs.txt
This commit is contained in:
parent
e3e8278d03
commit
d9c5398a17
|
@ -1,3 +1,11 @@
|
||||||
|
actor -30 0 0 "alien"
|
||||||
|
alive "yes"
|
||||||
|
suited "yes"
|
||||||
|
name "Icarus"
|
||||||
|
pronoun "it"
|
||||||
|
chatid "hialien"
|
||||||
|
scale 1
|
||||||
|
|
||||||
chat "hialien"
|
chat "hialien"
|
||||||
name "Icarus"
|
name "Icarus"
|
||||||
msg 2 "INIT" "hi" "Requesting permission to communicate..."
|
msg 2 "INIT" "hi" "Requesting permission to communicate..."
|
||||||
|
|
120
src/world.rs
120
src/world.rs
|
@ -310,10 +310,31 @@ pub fn setup(
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
enum DefClass {
|
||||||
|
Actor,
|
||||||
|
Chat,
|
||||||
|
None,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct ParserState {
|
struct ParserState {
|
||||||
chat: String,
|
class: DefClass,
|
||||||
|
|
||||||
|
// Generic fields
|
||||||
name: String,
|
name: String,
|
||||||
|
chat: String,
|
||||||
|
|
||||||
|
// Actor fields
|
||||||
|
pos: Vec3,
|
||||||
|
model: String,
|
||||||
|
model_scale: f32,
|
||||||
|
pronoun: String,
|
||||||
|
is_lifeform: bool,
|
||||||
|
is_alive: bool,
|
||||||
|
is_suited: bool,
|
||||||
|
|
||||||
|
// Chat fields
|
||||||
delay: f64,
|
delay: f64,
|
||||||
text: String,
|
text: String,
|
||||||
level: String,
|
level: String,
|
||||||
|
@ -325,8 +346,18 @@ struct ParserState {
|
||||||
impl Default for ParserState {
|
impl Default for ParserState {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
chat: "".to_string(),
|
class: DefClass::None,
|
||||||
name: "".to_string(),
|
name: "".to_string(),
|
||||||
|
chat: "".to_string(),
|
||||||
|
|
||||||
|
pos: Vec3::new(0.0, 0.0, 0.0),
|
||||||
|
model: "".to_string(),
|
||||||
|
model_scale: 1.0,
|
||||||
|
pronoun: "they/them".to_string(),
|
||||||
|
is_lifeform: false,
|
||||||
|
is_alive: false,
|
||||||
|
is_suited: false,
|
||||||
|
|
||||||
delay: 0.0,
|
delay: 0.0,
|
||||||
text: "".to_string(),
|
text: "".to_string(),
|
||||||
level: "chat".to_string(),
|
level: "chat".to_string(),
|
||||||
|
@ -337,21 +368,6 @@ impl Default for ParserState {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl std::fmt::Display for ParserState {
|
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
||||||
f.debug_struct("ParserState")
|
|
||||||
.field("chat", &self.chat)
|
|
||||||
.field("name", &self.name)
|
|
||||||
.field("delay", &self.delay)
|
|
||||||
.field("text", &self.text)
|
|
||||||
.field("level", &self.level)
|
|
||||||
.field("label", &self.label)
|
|
||||||
.field("goto", &self.goto)
|
|
||||||
.field("is_choice", &self.is_choice)
|
|
||||||
.field("stores_item", &self.stores_item)
|
|
||||||
.finish()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl ParserState {
|
impl ParserState {
|
||||||
fn reset_message(&mut self) {
|
fn reset_message(&mut self) {
|
||||||
let default = ParserState::default();
|
let default = ParserState::default();
|
||||||
|
@ -367,6 +383,9 @@ impl ParserState {
|
||||||
self.reset_message();
|
self.reset_message();
|
||||||
self.stores_item = default.stores_item;
|
self.stores_item = default.stores_item;
|
||||||
}
|
}
|
||||||
|
fn reset(&mut self) {
|
||||||
|
*self = Self::default();
|
||||||
|
}
|
||||||
fn as_chatbranch(&self) -> actor::ChatBranch {
|
fn as_chatbranch(&self) -> actor::ChatBranch {
|
||||||
return actor::ChatBranch {
|
return actor::ChatBranch {
|
||||||
id: self.chat.clone(),
|
id: self.chat.clone(),
|
||||||
|
@ -380,13 +399,27 @@ impl ParserState {
|
||||||
goto: self.goto.clone(),
|
goto: self.goto.clone(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn spawn_chatbranch(&mut self, commands: &mut Commands) {
|
fn spawn_chat(&mut self, commands: &mut Commands) {
|
||||||
if self.stores_item {
|
if self.stores_item {
|
||||||
debug!("{:#?}", self.as_chatbranch());
|
debug!("{:#?}", self.as_chatbranch());
|
||||||
commands.spawn(self.as_chatbranch());
|
commands.spawn(self.as_chatbranch());
|
||||||
}
|
}
|
||||||
self.reset_message();
|
self.reset_message();
|
||||||
}
|
}
|
||||||
|
fn spawn_actor(&mut self, commands: &mut Commands) {
|
||||||
|
let component_actor = actor::Actor::default();
|
||||||
|
let component_lifeform = actor::LifeForm::default();
|
||||||
|
let component_suit = actor::Suit::default();
|
||||||
|
commands.spawn((component_actor, component_lifeform, component_suit));
|
||||||
|
self.reset();
|
||||||
|
}
|
||||||
|
fn spawn_entities(&mut self, commands: &mut Commands) {
|
||||||
|
match self.class {
|
||||||
|
DefClass::Actor => { self.spawn_actor(commands); }
|
||||||
|
DefClass::Chat => { self.spawn_chat(commands); }
|
||||||
|
DefClass::None => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn load_defs(
|
pub fn load_defs(
|
||||||
|
@ -422,9 +455,48 @@ pub fn load_defs(
|
||||||
}
|
}
|
||||||
|
|
||||||
match parts.as_slice() {
|
match parts.as_slice() {
|
||||||
|
// Parsing actors
|
||||||
|
["actor", x, y, z, model] => {
|
||||||
|
state.class = DefClass::Actor;
|
||||||
|
state.model = model.to_string();
|
||||||
|
if let (Ok(x_float), Ok(y_float), Ok(z_float)) =
|
||||||
|
(x.parse::<f32>(), y.parse::<f32>(), z.parse::<f32>()) {
|
||||||
|
state.pos = Vec3::new(x_float, y_float, z_float);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
error!("Can't parse coordinates as floats in def: {line}");
|
||||||
|
state.reset();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
["alive", "yes"] => {
|
||||||
|
state.is_alive = true;
|
||||||
|
state.is_lifeform = true;
|
||||||
|
}
|
||||||
|
["suited", "yes"] => {
|
||||||
|
state.is_suited = true;
|
||||||
|
}
|
||||||
|
["pronoun", pronoun] => {
|
||||||
|
state.pronoun = pronoun.to_string();
|
||||||
|
}
|
||||||
|
["chatid", chat] => {
|
||||||
|
state.chat = chat.to_string();
|
||||||
|
}
|
||||||
|
["scale", scale] => {
|
||||||
|
if let Ok(scale_float) = scale.parse::<f32>() {
|
||||||
|
state.model_scale = scale_float;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
error!("Can't parse float: {line}");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parsing chats
|
||||||
["chat", chat_name] => {
|
["chat", chat_name] => {
|
||||||
debug!("Registering chat: {}", chat_name);
|
debug!("Registering chat: {}", chat_name);
|
||||||
state.spawn_chatbranch(&mut commands);
|
state.class = DefClass::Chat;
|
||||||
|
state.spawn_entities(&mut commands);
|
||||||
state.reset_chat();
|
state.reset_chat();
|
||||||
state.chat = chat_name.to_string();
|
state.chat = chat_name.to_string();
|
||||||
}
|
}
|
||||||
|
@ -434,7 +506,7 @@ pub fn load_defs(
|
||||||
}
|
}
|
||||||
["msg", sleep, text] => {
|
["msg", sleep, text] => {
|
||||||
debug!("Registering message (sleep={}): {}", sleep, text);
|
debug!("Registering message (sleep={}): {}", sleep, text);
|
||||||
state.spawn_chatbranch(&mut commands);
|
state.spawn_entities(&mut commands);
|
||||||
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();
|
||||||
|
@ -447,7 +519,7 @@ pub fn load_defs(
|
||||||
}
|
}
|
||||||
["msg", sleep, label, goto, text] => {
|
["msg", sleep, label, goto, text] => {
|
||||||
debug!("Registering message (sleep={}): {}", sleep, text);
|
debug!("Registering message (sleep={}): {}", sleep, text);
|
||||||
state.spawn_chatbranch(&mut commands);
|
state.spawn_entities(&mut commands);
|
||||||
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();
|
||||||
|
@ -462,7 +534,7 @@ pub fn load_defs(
|
||||||
}
|
}
|
||||||
["choice", sleep, text] => {
|
["choice", sleep, text] => {
|
||||||
debug!("Registering choice (sleep={}): {}", sleep, text);
|
debug!("Registering choice (sleep={}): {}", sleep, text);
|
||||||
state.spawn_chatbranch(&mut commands);
|
state.spawn_entities(&mut commands);
|
||||||
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();
|
||||||
|
@ -475,7 +547,7 @@ pub fn load_defs(
|
||||||
}
|
}
|
||||||
["choice", sleep, label, goto, text] => {
|
["choice", sleep, label, goto, text] => {
|
||||||
debug!("Registering choice (sleep={}): {}", sleep, text);
|
debug!("Registering choice (sleep={}): {}", sleep, text);
|
||||||
state.spawn_chatbranch(&mut commands);
|
state.spawn_entities(&mut commands);
|
||||||
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();
|
||||||
|
@ -505,7 +577,7 @@ pub fn load_defs(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
state.spawn_chatbranch(&mut commands);
|
state.spawn_entities(&mut commands);
|
||||||
}
|
}
|
||||||
|
|
||||||
//pub fn swap_world_on_ar_toggle(
|
//pub fn swap_world_on_ar_toggle(
|
||||||
|
|
Loading…
Reference in a new issue