2022-08-23 10:02:58 +00:00
|
|
|
#![allow(clippy::too_many_arguments)]
|
|
|
|
|
2022-08-25 22:33:44 +00:00
|
|
|
pub use stored::*;
|
|
|
|
|
2022-08-23 10:02:58 +00:00
|
|
|
use crate::game::*;
|
|
|
|
|
2022-08-25 17:55:34 +00:00
|
|
|
use bevy::{prelude::*, reflect::TypeUuid};
|
|
|
|
use serde::{Deserialize, Serialize};
|
2022-08-23 10:02:58 +00:00
|
|
|
|
|
|
|
pub fn setup_level(
|
|
|
|
level_startup_event: &mut EventWriter<LevelStartupEvent>,
|
2022-08-23 22:45:57 +00:00
|
|
|
camera_query: &mut Query<&mut Transform, With<Camera>>,
|
2022-08-23 10:02:58 +00:00
|
|
|
) {
|
2022-08-23 22:45:57 +00:00
|
|
|
camera_query.single_mut().translation = Default::default();
|
|
|
|
|
2022-08-25 09:31:12 +00:00
|
|
|
level_startup_event.send(LevelStartupEvent);
|
2022-08-23 10:02:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn despawn_level(mut commands: Commands, level_query: Query<Entity, With<Level>>) {
|
|
|
|
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<CharacterMeshes>,
|
2022-08-24 10:21:08 +00:00
|
|
|
mut meshes: ResMut<Assets<Mesh>>,
|
2022-08-23 10:02:58 +00:00
|
|
|
mut materials: ResMut<Assets<ColorMaterial>>,
|
|
|
|
current_level: Res<CurrentLevel>,
|
|
|
|
mut level_startup_event: EventReader<LevelStartupEvent>,
|
|
|
|
asset_server: Res<AssetServer>,
|
2022-08-23 15:02:13 +00:00
|
|
|
audio: Res<crossbeam_channel::Sender<AudioMsg>>,
|
2022-08-25 17:55:34 +00:00
|
|
|
stored_levels_assets: Res<Assets<StoredLevels>>,
|
|
|
|
stored_levels_handle: Res<Handle<StoredLevels>>,
|
2022-08-23 10:02:58 +00:00
|
|
|
) {
|
2022-08-25 09:31:12 +00:00
|
|
|
for _ in level_startup_event.iter() {
|
2022-08-24 11:26:25 +00:00
|
|
|
if let Some(level_id) = current_level.0 {
|
2022-08-25 17:55:34 +00:00
|
|
|
if let Some(stored_level) = stored_levels_assets
|
|
|
|
.get(&stored_levels_handle)
|
|
|
|
.unwrap()
|
|
|
|
.levels
|
|
|
|
.get(level_id.0 as usize)
|
|
|
|
{
|
|
|
|
spawn_stored_level(
|
2022-08-24 11:26:25 +00:00
|
|
|
&mut commands,
|
|
|
|
&character_meshes,
|
2022-08-24 10:21:08 +00:00
|
|
|
&mut meshes,
|
2022-08-24 11:26:25 +00:00
|
|
|
&mut materials,
|
2022-08-25 07:30:47 +00:00
|
|
|
&asset_server,
|
2022-08-25 10:32:06 +00:00
|
|
|
&audio,
|
2022-08-25 17:55:34 +00:00
|
|
|
stored_level,
|
|
|
|
);
|
2022-08-23 10:02:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-08-25 17:55:34 +00:00
|
|
|
|
|
|
|
pub fn spawn_stored_level(
|
|
|
|
commands: &mut Commands,
|
|
|
|
character_meshes: &Res<CharacterMeshes>,
|
|
|
|
meshes: &mut ResMut<Assets<Mesh>>,
|
|
|
|
materials: &mut ResMut<Assets<ColorMaterial>>,
|
|
|
|
asset_server: &Res<AssetServer>,
|
|
|
|
audio: &Res<crossbeam_channel::Sender<AudioMsg>>,
|
|
|
|
|
|
|
|
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,
|
|
|
|
);
|
|
|
|
}
|
2022-08-26 21:54:49 +00:00
|
|
|
for melty_platform in stored_level.melty_platforms.iter() {
|
|
|
|
spawn_melty_platform(
|
|
|
|
commands,
|
|
|
|
meshes,
|
|
|
|
materials,
|
|
|
|
asset_server,
|
|
|
|
Transform::from_xyz(melty_platform.pos.x, melty_platform.pos.y, 2.),
|
|
|
|
melty_platform.color.into(),
|
|
|
|
);
|
|
|
|
}
|
2022-08-25 17:55:34 +00:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
2022-08-25 22:33:44 +00:00
|
|
|
|
|
|
|
pub mod stored {
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
#[derive(Deserialize, Serialize, TypeUuid)]
|
|
|
|
#[uuid = "1fbba930-644b-0d62-2514-4b302b945327"]
|
|
|
|
pub struct StoredLevels {
|
|
|
|
pub levels: Vec<StoredLevel>,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Deserialize, Serialize, TypeUuid)]
|
|
|
|
#[uuid = "a1464a30-1f57-a654-d56c-ded41032af0b"]
|
|
|
|
pub struct StoredLevel {
|
|
|
|
pub comment: String,
|
|
|
|
pub characters: Vec<StoredCharacter>,
|
|
|
|
pub platforms: Vec<StoredPlatform>,
|
|
|
|
pub absorbing_filters: Vec<StoredAbsorbingFilter>,
|
|
|
|
pub rotating_filters: Vec<StoredRotatingFilter>,
|
2022-08-26 21:54:49 +00:00
|
|
|
pub melty_platforms: Vec<StoredMeltyPlatform>,
|
2022-08-25 22:33:44 +00:00
|
|
|
pub texts: Vec<StoredText>,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[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,
|
|
|
|
}
|
|
|
|
|
2022-08-26 21:54:49 +00:00
|
|
|
#[derive(Deserialize, Serialize, TypeUuid)]
|
|
|
|
#[uuid = "cb0773ef-eca6-9b96-dcba-f4240ebdcf40"]
|
|
|
|
pub struct StoredMeltyPlatform {
|
|
|
|
pub pos: Vec2,
|
|
|
|
pub color: Vec4,
|
|
|
|
}
|
|
|
|
|
2022-08-25 22:33:44 +00:00
|
|
|
#[derive(Deserialize, Serialize, TypeUuid)]
|
|
|
|
#[uuid = "72f6321a-f01f-6eea-9b17-3159837a2fd3"]
|
|
|
|
pub struct StoredText {
|
|
|
|
pub pos: Vec2,
|
|
|
|
pub font_size: f32,
|
|
|
|
pub text: String,
|
|
|
|
}
|
|
|
|
}
|