Began adding support for variables
This commit is contained in:
+89
-21
@@ -1,14 +1,24 @@
|
||||
use macroquad::prelude::*;
|
||||
use reqwest::*;
|
||||
use reqwest::blocking;
|
||||
use std::collections::HashMap;
|
||||
use phf::phf_map;
|
||||
use std::{thread, time::Duration};
|
||||
use std::
|
||||
{
|
||||
thread,
|
||||
time::Duration,
|
||||
collections::
|
||||
{
|
||||
HashMap,
|
||||
HashSet,
|
||||
},
|
||||
process::exit,
|
||||
};
|
||||
use serde::
|
||||
{
|
||||
Serialize,
|
||||
Deserialize,
|
||||
};
|
||||
use home::home_dir;
|
||||
|
||||
#[derive(Debug, Deserialize, Serialize, Clone, Default)]
|
||||
pub struct Data {
|
||||
@@ -69,45 +79,92 @@ static POSITIONS: phf::Map<&'static str, [f32;2]> = phf_map! [
|
||||
async fn main()
|
||||
{
|
||||
let mut characters: HashMap<String, (Character, Texture2D)> = HashMap::new();
|
||||
let mut textures: Vec<(Texture2D, f32, f32, Color)> = Vec::new();
|
||||
characters.insert("narrator".to_string(), (Character { name: "Narrator".to_string(), ..Default::default() }, Texture2D::empty()));
|
||||
let mut textures: HashMap<String,(Texture2D, f32, f32, Color)> = HashMap::new();
|
||||
let mut text: String = String::new();
|
||||
let mut checking_for_choice: bool = false;
|
||||
let mut data: Data = next_happening(); // First one should be begin
|
||||
loop
|
||||
{
|
||||
clear_background(RED);
|
||||
// Get the next character
|
||||
let data = next_happening();
|
||||
let character_name: &str = data.character.as_str();
|
||||
// Add the character to the HashMap if it's not already
|
||||
if character_name != "" && !characters.contains_key(character_name)
|
||||
for (name, (texture, x, y, colour)) in &textures
|
||||
{
|
||||
let new_character = get_character(character_name).await;
|
||||
characters.insert(character_name.to_string(), new_character);
|
||||
draw_texture(&texture, *x, *y, *colour);
|
||||
}
|
||||
draw_multiline_text(&text, 50.0,30.0,40.0,None,WHITE);
|
||||
if !is_any_key_down()
|
||||
{
|
||||
next_frame().await;
|
||||
continue
|
||||
}
|
||||
let keys: HashSet<KeyCode> = get_keys_pressed();
|
||||
if checking_for_choice
|
||||
{
|
||||
for key in &keys
|
||||
{
|
||||
let keycode = *key as u16;
|
||||
let length: u16 = data.choices.len() as u16;
|
||||
println!("key: {key:?} {keycode}");
|
||||
if keycode > 48 && keycode <= length+48
|
||||
{
|
||||
checking_for_choice = false;
|
||||
println!("Sending POST: {}",keycode-49);
|
||||
let value = keycode - 49;
|
||||
send_choice(value);
|
||||
}
|
||||
else { continue }
|
||||
}
|
||||
}
|
||||
// Get the next character
|
||||
data = next_happening();
|
||||
let character_name: String = data.character.to_lowercase();
|
||||
// Add the character to the HashMap if it's not already
|
||||
if character_name != "" && !characters.contains_key(&character_name)
|
||||
{
|
||||
println!("Fetching {character_name}");
|
||||
let new_character = get_character(&character_name).await;
|
||||
characters.insert(character_name.clone(), new_character);
|
||||
}
|
||||
// Matchbox for all the commands
|
||||
match data.action_type.to_lowercase().as_str()
|
||||
{
|
||||
"choice" =>
|
||||
{
|
||||
for (index, choice) in data.choices.iter().enumerate()
|
||||
{
|
||||
text += format!("\n{}. {}",index+1, choice).as_str();
|
||||
}
|
||||
checking_for_choice = true;
|
||||
},
|
||||
"output" =>
|
||||
{
|
||||
println!("SAYING");
|
||||
draw_text(characters[character_name].0.name.clone(), 50.0,20.0,40.0,WHITE);
|
||||
draw_text(data.content.as_str(), 50.0,40.0,30.0,WHITE);
|
||||
text = format!("{}: {}", characters[&character_name].0.name.clone(),wrap_text(&data.content).as_str());
|
||||
},
|
||||
"to" =>
|
||||
{
|
||||
let position = POSITIONS.get(&data.content).cloned().unwrap();
|
||||
let texture = &characters[character_name].1;
|
||||
textures.push((texture.clone(), position[0], position[1], WHITE)); // Heavy
|
||||
let texture = &characters[&character_name].1;
|
||||
textures.insert(character_name.clone(),(texture.clone(), position[0], position[1], WHITE)); // Heavy
|
||||
}
|
||||
_ => println!("Unknown action"),
|
||||
"begin" => (),
|
||||
"end" => exit(0),
|
||||
_ => println!("Unknown action, {}", data.action_type),
|
||||
}
|
||||
for (texture, x, y, colour) in &textures
|
||||
{
|
||||
draw_texture(&texture, *x, *y, *colour);
|
||||
}
|
||||
thread::sleep(Duration::from_millis(1000));
|
||||
next_frame().await;
|
||||
}
|
||||
}
|
||||
|
||||
fn wrap_text(text: &str) -> String
|
||||
{
|
||||
text.chars()
|
||||
.collect::<Vec<_>>()
|
||||
.chunks(30)
|
||||
.map(|chunk| chunk.iter().collect::<String>())
|
||||
.collect::<Vec<_>>()
|
||||
.join("\n")
|
||||
}
|
||||
|
||||
fn next_happening()
|
||||
-> Data
|
||||
{
|
||||
@@ -116,6 +173,17 @@ fn next_happening()
|
||||
data
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn send_choice(index: u16)
|
||||
{
|
||||
|
||||
let client = reqwest::Client::new();
|
||||
let res = client.post("http://localhost:20264/choice")
|
||||
.json(&index)
|
||||
.send()
|
||||
.await;
|
||||
}
|
||||
|
||||
async fn get_character(name: &str)
|
||||
-> (Character, Texture2D)
|
||||
{
|
||||
@@ -125,7 +193,7 @@ async fn get_character(name: &str)
|
||||
let skin: Color = Color::from_rgba(skin_colour.red,skin_colour.green,skin_colour.blue,255);
|
||||
let hair_colour = character.hair_color.clone();
|
||||
let hair: Color = Color::from_rgba(hair_colour.red,hair_colour.green,hair_colour.blue,255);
|
||||
let head_path: String = format!("../images/head/{}.png",character.head_shape);
|
||||
let head_path: String = format!("/home/deadvey/.local/share/happening/images/head/{}.png",character.head_shape);
|
||||
let head: Texture2D = change_colour(&mut load_image(head_path.as_str()).await.unwrap(), &skin, &hair);
|
||||
(character, head)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user