#![allow(clippy::too_many_arguments)] pub use stored::*; use crate::game::*; use bevy::{prelude::*, reflect::TypeUuid}; use serde::{Deserialize, Serialize}; pub fn setup_level( level_startup_event: &mut EventWriter, camera_query: &mut Query<&mut Transform, With>, ) { camera_query.single_mut().translation = Default::default(); level_startup_event.send(LevelStartupEvent); } pub fn despawn_level(mut commands: Commands, level_query: Query>) { for entity in level_query.iter() { commands.entity(entity).despawn_recursive(); } } // This is a bad design, to be refactored some days pub fn post_setup_level( mut commands: Commands, character_meshes: Res, mut meshes: ResMut>, mut materials: ResMut>, current_level: Res, mut level_startup_event: EventReader, asset_server: Res, audio: Res>, stored_levels_assets: Res>, stored_levels_handle: Res>, ) { for _ in level_startup_event.iter() { if let Some(level_id) = current_level.0 { if let Some(stored_level) = stored_levels_assets .get(&stored_levels_handle) .unwrap() .levels .get(level_id.0 as usize) { spawn_stored_level( &mut commands, &character_meshes, &mut meshes, &mut materials, &asset_server, &audio, stored_level, ); } } } } pub fn spawn_stored_level( commands: &mut Commands, character_meshes: &Res, meshes: &mut ResMut>, materials: &mut ResMut>, asset_server: &Res, audio: &Res>, stored_level: &StoredLevel, ) { let font = asset_server.get_handle("UacariLegacy-Thin.ttf"); spawn_platforms( commands, meshes, materials, stored_level.platforms.iter().map(|platform| { ( Transform::from_xyz(platform.pos.x, platform.pos.y, 0.), platform.size, ) }), ); spawn_characters( commands, character_meshes, materials, audio, stored_level.characters.iter().map(|character| { ( Transform::from_xyz(character.pos.x, character.pos.y, 0.), character.color.into(), ) }), ); for absorbing_filter in stored_level.absorbing_filters.iter() { spawn_absorbing_filter( commands, meshes, materials, Transform::from_xyz(absorbing_filter.pos.x, absorbing_filter.pos.y, 2.), absorbing_filter.size, absorbing_filter.color.into(), ); } for rotating_filter in stored_level.rotating_filters.iter() { spawn_rotating_filter( commands, asset_server, Transform::from_xyz(rotating_filter.pos.x, rotating_filter.pos.y, 2.), rotating_filter.angle, ); } for text in stored_level.texts.iter() { commands .spawn_bundle(Text2dBundle { text: Text::from_section( &text.text, TextStyle { font: font.clone(), font_size: text.font_size, color: Color::WHITE, }, ) .with_alignment(TextAlignment::CENTER), transform: Transform::from_xyz(text.pos.x, text.pos.y, 0.), ..Default::default() }) .insert(Level); } } pub mod stored { use super::*; #[derive(Deserialize, Serialize, TypeUuid)] #[uuid = "1fbba930-644b-0d62-2514-4b302b945327"] pub struct StoredLevels { pub levels: Vec, } #[derive(Deserialize, Serialize, TypeUuid)] #[uuid = "a1464a30-1f57-a654-d56c-ded41032af0b"] pub struct StoredLevel { pub comment: String, pub characters: Vec, pub platforms: Vec, pub absorbing_filters: Vec, pub rotating_filters: Vec, pub texts: Vec, } #[derive(Deserialize, Serialize, TypeUuid)] #[uuid = "1c798f8c-ef15-c528-693e-76becdef6b10"] pub struct StoredCharacter { pub pos: Vec2, pub color: Vec4, } #[derive(Deserialize, Serialize, TypeUuid)] #[uuid = "31696095-59de-93be-b5e9-333c2afbc900"] pub struct StoredPlatform { pub pos: Vec2, pub size: Vec2, } #[derive(Deserialize, Serialize, TypeUuid)] #[uuid = "bcad7fff-0605-c4e3-3cd4-42d5bbaad926"] pub struct StoredAbsorbingFilter { pub pos: Vec2, pub size: Vec2, pub color: Vec4, } #[derive(Deserialize, Serialize, TypeUuid)] #[uuid = "fa2843f2-6e34-601b-6c46-4827b0370b3f"] pub struct StoredRotatingFilter { pub pos: Vec2, pub angle: f32, } #[derive(Deserialize, Serialize, TypeUuid)] #[uuid = "72f6321a-f01f-6eea-9b17-3159837a2fd3"] pub struct StoredText { pub pos: Vec2, pub font_size: f32, pub text: String, } }