show achievements in the menu

This commit is contained in:
yuni 2024-05-14 05:17:32 +02:00
parent 8f796c92fa
commit cb90846b6f
2 changed files with 104 additions and 0 deletions

View file

@ -37,6 +37,7 @@ impl Plugin for MenuPlugin {
#[derive(Resource)] pub struct DeathScreenInputDelayTimer(pub Timer);
#[derive(Component)] pub struct MenuElement;
#[derive(Component)] pub struct MenuTopLevel;
#[derive(Component)] pub struct MenuAchievements;
#[derive(Component)] pub struct DeathScreenElement;
#[derive(Component)] pub struct DeathText;
#[derive(Event)] pub struct UpdateMenuEvent;
@ -181,6 +182,52 @@ pub fn setup(
},
));
});
let style_achievement_header = TextStyle {
font: font_handle.clone(),
font_size: settings.font_size_achievement_header,
color: settings.hud_color_achievement_header,
..default()
};
let style_achievement = TextStyle {
font: font_handle.clone(),
font_size: settings.font_size_achievement,
color: settings.hud_color_achievement,
..default()
};
commands.spawn((
MenuElement,
NodeBundle {
style: Style {
width: Val::Percent(100.0),
height: Val::Percent(100.0),
align_items: AlignItems::Start,
justify_content: JustifyContent::Start,
..default()
},
visibility: Visibility::Hidden,
..default()
},
)).with_children(|builder| {
let mut sections = vec![
TextSection::new("Achievements\n", style_achievement_header)
];
sections.extend(Vec::from_iter((0..var::ACHIEVEMENT_COUNT).map(|_|
TextSection::new("", style_achievement.clone())
)));
builder.spawn((
MenuAchievements,
TextBundle {
text: Text {
sections,
justify: JustifyText::Left,
..default()
},
..default()
},
));
});
}
pub fn show_deathscreen(
@ -250,7 +297,9 @@ pub struct MenuState {
pub fn update_menu(
mut q_text: Query<&mut Text, With<MenuTopLevel>>,
mut q_achievement_text: Query<&mut Text, (With<MenuAchievements>, Without<MenuTopLevel>)>,
mut q_vis: Query<&mut Visibility, With<menu::MenuElement>>,
achievement_tracker: Res<var::AchievementTracker>,
menustate: Res<MenuState>,
settings: Res<Settings>,
) {
@ -260,6 +309,19 @@ pub fn update_menu(
fn bool2string(boolean: bool) -> String {
if boolean { "On" } else { "Off" }.to_string()
}
let bools = achievement_tracker.to_bool_vec();
let rendered = achievement_tracker.to_textsections();
if let Ok(mut text) = q_achievement_text.get_single_mut() {
for i in 0..text.sections.len() - 1 {
text.sections[i + 1].style.color = if bools[i] {
settings.hud_color_achievement_accomplished
} else {
settings.hud_color_achievement
};
text.sections[i + 1].value = rendered[i].clone();
}
}
if let Ok(mut text) = q_text.get_single_mut() {
for i in 0..text.sections.len() {
if menustate.cursor == i {

View file

@ -20,6 +20,7 @@ use toml_edit::DocumentMut;
use std::env;
use std::fs;
pub const ACHIEVEMENT_COUNT: usize = 5;
pub const SCOPE_SEPARATOR: &str = "$";
pub const TOKEN_EQUALS: &str = "==";
@ -56,6 +57,8 @@ pub struct Settings {
pub font_size_deathtext: f32,
pub font_size_deathsubtext: f32,
pub font_size_deathpoem: f32,
pub font_size_achievement: f32,
pub font_size_achievement_header: f32,
pub hud_color: Color,
pub hud_color_fps: Color,
pub hud_color_console: Color,
@ -66,6 +69,9 @@ pub struct Settings {
pub hud_color_choices: Color,
pub hud_color_speedometer: Color,
pub hud_color_deathpoem: Color,
pub hud_color_achievement: Color,
pub hud_color_achievement_header: Color,
pub hud_color_achievement_accomplished: Color,
pub chat_speed: f32,
pub flashlight_active: bool,
pub hud_active: bool,
@ -169,6 +175,8 @@ impl Default for Settings {
font_size_deathtext: 64.0,
font_size_deathsubtext: 32.0,
font_size_deathpoem: 18.0,
font_size_achievement: 24.0,
font_size_achievement_header: 32.0,
hud_color: Color::hex("#BE1251").unwrap(),
hud_color_fps: Color::hex("#181818").unwrap(),
hud_color_console: Color::hex("#BE1251").unwrap(),
@ -179,6 +187,9 @@ impl Default for Settings {
hud_color_choices: Color::hex("#727272").unwrap(),
hud_color_speedometer: Color::hex("#BE1251").unwrap(),
hud_color_deathpoem: Color::hex("#CC2200").unwrap(),
hud_color_achievement: Color::hex("#666666").unwrap(),
hud_color_achievement_accomplished: Color::hex("#F0D50C").unwrap(),
hud_color_achievement_header: Color::hex("#BE1251").unwrap(),
chat_speed: DEFAULT_CHAT_SPEED * if dev_mode { 2.5 } else { 1.0 },
flashlight_active: false,
hud_active: true,
@ -302,6 +313,37 @@ pub struct AchievementTracker {
pub all_people: HashSet<String>,
}
impl AchievementTracker {
pub fn to_bool_vec(&self) -> Vec<bool> {
vec![
self.repair_suit,
self.drink_a_pizza,
self.ride_every_vehicle,
self.talk_to_everyone,
self.in_jupiters_shadow,
]
}
pub fn to_textsections(&self) -> Vec<String> {
fn bool2string(boolean: bool) -> String {
if boolean { "achieved" } else { "not achieved" }.to_string()
}
vec![
format!("Repair Your Suit ({})\n",
bool2string(self.repair_suit)),
format!("Consume A Pizza ({})\n",
bool2string(self.drink_a_pizza)),
format!("Ride Every Vehicle ({}/{})\n",
self.vehicles_ridden.len(),
self.all_vehicles.len()),
format!("Talk To Everyone ({}/{})\n",
self.people_talked_to.len(),
self.all_people.len()),
format!("Let Jupiter Eclipse The Sun ({})\n",
bool2string(self.in_jupiters_shadow)),
]
}
}
#[derive(Resource, Deserialize, Debug, Default)]
#[serde(default)]
pub struct Preferences {