diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 00000000..0d28290e --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,6 @@ +imports_indent = "Block" +imports_layout = "Horizontal" +imports_granularity = "Item" +group_imports = "One" +reorder_imports = true +reorder_modules = true diff --git a/src/audio.rs b/src/audio.rs index df1c8f96..0658ca1e 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -1,8 +1,7 @@ use crate::config::GameConfig; -use bevy::{ - audio::{PlaybackMode, Volume}, - prelude::*, -}; +use bevy::audio::PlaybackMode; +use bevy::audio::Volume; +use bevy::prelude::*; const SPATIAL_AUDIO_MAX_DISTANCE: f32 = 400.0; diff --git a/src/camera.rs b/src/camera.rs index 2258e2a4..534af11e 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -1,6 +1,7 @@ use crate::constant::CAMERA_SPEED; +use crate::controller::player::Player; use crate::entity::actor::Actor; -use crate::{controller::player::Player, states::GameState}; +use crate::states::GameState; use bevy::core::FrameCount; use bevy::prelude::*; use bevy_light_2d::light::AmbientLight2d; diff --git a/src/cast.rs b/src/cast.rs index 6241d9a2..42248118 100644 --- a/src/cast.rs +++ b/src/cast.rs @@ -1,20 +1,26 @@ -use crate::{ - asset::GameAssets, - constant::{ - ENEMY_BULLET_GROUP, ENEMY_GROUP, ENTITY_GROUP, MAX_SPELLS_IN_WAND, RABBIT_GROUP, - WALL_GROUP, WITCH_BULLET_GROUP, WITCH_GROUP, - }, - controller::remote::{send_remote_message, RemoteMessage}, - entity::{ - actor::{Actor, ActorGroup}, - bullet::{spawn_bullet, SpawnBullet, BULLET_SPAWNING_MARGIN}, - life::Life, - servant_seed::SpawnServantSeed, - witch::WITCH_COLLIDER_RADIUS, - }, - se::{SEEvent, SE}, - spell::{SpellCast, SpellType}, -}; +use crate::asset::GameAssets; +use crate::constant::ENEMY_BULLET_GROUP; +use crate::constant::ENEMY_GROUP; +use crate::constant::ENTITY_GROUP; +use crate::constant::MAX_SPELLS_IN_WAND; +use crate::constant::RABBIT_GROUP; +use crate::constant::WALL_GROUP; +use crate::constant::WITCH_BULLET_GROUP; +use crate::constant::WITCH_GROUP; +use crate::controller::remote::send_remote_message; +use crate::controller::remote::RemoteMessage; +use crate::entity::actor::Actor; +use crate::entity::actor::ActorGroup; +use crate::entity::bullet::spawn_bullet; +use crate::entity::bullet::SpawnBullet; +use crate::entity::bullet::BULLET_SPAWNING_MARGIN; +use crate::entity::life::Life; +use crate::entity::servant_seed::SpawnServantSeed; +use crate::entity::witch::WITCH_COLLIDER_RADIUS; +use crate::se::SEEvent; +use crate::se::SE; +use crate::spell::SpellCast; +use crate::spell::SpellType; use bevy::prelude::*; use bevy_rapier2d::prelude::ExternalImpulse; use bevy_simple_websocket::ClientMessage; @@ -143,13 +149,6 @@ pub fn cast_spell( online, &RemoteMessage::Fire(remove_bullet_props.clone()), ); - - info!("online {:?}", online); - - info!( - "fire message: {:?}", - RemoteMessage::Fire(remove_bullet_props) - ); } } SpellCast::BulletSpeedUpDown { delta } => { diff --git a/src/config.rs b/src/config.rs index 3e3fbb9b..bd3f41fb 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,7 +1,9 @@ -use crate::{constant::*, language::*}; +use crate::constant::*; +use crate::language::*; use bevy::prelude::*; use bevy_pkv::PkvStore; -use serde::{Deserialize, Serialize}; +use serde::Deserialize; +use serde::Serialize; #[derive(Resource, Clone, Debug, Serialize, Deserialize)] pub struct GameConfig { diff --git a/src/controller/despawn_with_gold.rs b/src/controller/despawn_with_gold.rs index edcef65f..15a1da99 100644 --- a/src/controller/despawn_with_gold.rs +++ b/src/controller/despawn_with_gold.rs @@ -1,7 +1,10 @@ +use crate::asset::GameAssets; use crate::entity::gold::spawn_gold; use crate::entity::life::Life; -use crate::se::{SEEvent, SE}; -use crate::{asset::GameAssets, set::GameSet, states::GameState}; +use crate::se::SEEvent; +use crate::se::SE; +use crate::set::GameSet; +use crate::states::GameState; use bevy::prelude::*; use bevy_rapier2d::prelude::*; diff --git a/src/controller/player.rs b/src/controller/player.rs index 71caffc6..f31aa57f 100644 --- a/src/controller/player.rs +++ b/src/controller/player.rs @@ -1,23 +1,31 @@ use crate::asset::GameAssets; -use crate::constant::{ENTITY_LAYER_Z, MAX_WANDS}; +use crate::constant::ENTITY_LAYER_Z; +use crate::constant::MAX_WANDS; use crate::controller::remote::send_remote_message; use crate::controller::remote::RemoteMessage; -use crate::entity::actor::{Actor, ActorFireState}; +use crate::entity::actor::Actor; +use crate::entity::actor::ActorFireState; use crate::entity::gold::Gold; use crate::entity::life::Life; use crate::equipment::EquipmentType; -use crate::input::{get_direction, get_fire_trigger}; -use crate::level::{CurrentLevel, GameLevel}; +use crate::input::get_direction; +use crate::input::get_fire_trigger; +use crate::page::in_game::CurrentLevel; +use crate::page::in_game::GameLevel; use crate::player_state::PlayerState; -use crate::se::{SEEvent, SE}; -use crate::states::{GameMenuState, GameState}; +use crate::se::SEEvent; +use crate::se::SE; +use crate::states::GameMenuState; +use crate::states::GameState; use bevy::core::FrameCount; use bevy::input::mouse::MouseWheel; use bevy::prelude::*; use bevy_aseprite_ultra::prelude::AseSpriteAnimation; use bevy_light_2d::light::PointLight2d; use bevy_rapier2d::prelude::*; -use bevy_simple_websocket::{ClientMessage, ReadyState, WebSocketState}; +use bevy_simple_websocket::ClientMessage; +use bevy_simple_websocket::ReadyState; +use bevy_simple_websocket::WebSocketState; #[derive(Debug, Clone, Copy, Reflect)] pub struct Equipment { diff --git a/src/controller/remote.rs b/src/controller/remote.rs index 8c2baa17..5f69500d 100644 --- a/src/controller/remote.rs +++ b/src/controller/remote.rs @@ -1,23 +1,34 @@ +use crate::asset::GameAssets; use crate::constant::*; use crate::controller::player::Player; +use crate::entity::actor::Actor; use crate::entity::actor::ActorGroup; +use crate::entity::bullet::spawn_bullet; use crate::entity::bullet::SpawnBullet; +use crate::entity::gold::spawn_gold; use crate::entity::life::Life; -use crate::entity::servant_seed::{ServantType, SpawnServantSeed}; +use crate::entity::servant_seed::ServantType; +use crate::entity::servant_seed::SpawnServantSeed; +use crate::entity::witch::spawn_witch; +use crate::hud::life_bar::LifeBarResource; use crate::inventory::Inventory; -use crate::level::{setup_level, CurrentLevel, GameLevel}; +use crate::page::in_game::setup_level; +use crate::page::in_game::CurrentLevel; +use crate::page::in_game::GameLevel; +use crate::se::SEEvent; use crate::se::SE; -use crate::{ - asset::GameAssets, - entity::{actor::Actor, bullet::spawn_bullet, gold::spawn_gold, witch::spawn_witch}, - hud::life_bar::LifeBarResource, - se::SEEvent, - states::GameState, -}; -use bevy::{core::FrameCount, prelude::*, utils::HashMap}; -use bevy_rapier2d::{plugin::PhysicsSet, prelude::Velocity}; -use bevy_simple_websocket::{ClientMessage, ReadyState, ServerMessage, WebSocketState}; -use serde::{Deserialize, Serialize}; +use crate::states::GameState; +use bevy::core::FrameCount; +use bevy::prelude::*; +use bevy::utils::HashMap; +use bevy_rapier2d::plugin::PhysicsSet; +use bevy_rapier2d::prelude::Velocity; +use bevy_simple_websocket::ClientMessage; +use bevy_simple_websocket::ReadyState; +use bevy_simple_websocket::ServerMessage; +use bevy_simple_websocket::WebSocketState; +use serde::Deserialize; +use serde::Serialize; use std::collections::HashSet; use uuid::Uuid; diff --git a/src/controller/shop_rabbit.rs b/src/controller/shop_rabbit.rs index d21e564b..ef988782 100644 --- a/src/controller/shop_rabbit.rs +++ b/src/controller/shop_rabbit.rs @@ -1,8 +1,11 @@ use crate::camera::GameCamera; use crate::controller::player::Player; use crate::entity::actor::Actor; -use crate::message::{shop_rabbit, too_few_golds, SHOP_RABBIT}; -use crate::se::{SEEvent, SE}; +use crate::message::shop_rabbit; +use crate::message::too_few_golds; +use crate::message::SHOP_RABBIT; +use crate::se::SEEvent; +use crate::se::SE; use crate::speech_bubble::SpeechEvent; use crate::states::GameState; use bevy::prelude::*; diff --git a/src/controller/training_dummy.rs b/src/controller/training_dummy.rs index ea311281..b8456792 100644 --- a/src/controller/training_dummy.rs +++ b/src/controller/training_dummy.rs @@ -1,5 +1,6 @@ use crate::controller::player::Player; -use crate::entity::actor::{Actor, ActorFireState}; +use crate::entity::actor::Actor; +use crate::entity::actor::ActorFireState; use crate::states::GameState; use bevy::prelude::*; use bevy_rapier2d::prelude::*; diff --git a/src/debug.rs b/src/debug.rs index 9a7ba5f1..b2faf489 100644 --- a/src/debug.rs +++ b/src/debug.rs @@ -1,25 +1,24 @@ -use crate::{ - config::GameConfig, - constant::LAST_BOSS_LEVEL, - controller::player::Player, - entity::{actor::Actor, life::Life}, - equipment::EquipmentType, - hud::overlay::OverlayEvent, - inventory_item::InventoryItemType, - level::{CurrentLevel, GameLevel}, - physics::GamePhysics, - player_state::PlayerState, - spell::SpellType, - states::GameState, - wand::{Wand, WandSpell, WandType}, -}; -use bevy::{ - input::{ - keyboard::{Key, KeyboardInput}, - ButtonState, - }, - prelude::*, -}; +use crate::config::GameConfig; +use crate::constant::LAST_BOSS_LEVEL; +use crate::controller::player::Player; +use crate::entity::actor::Actor; +use crate::entity::life::Life; +use crate::equipment::EquipmentType; +use crate::hud::overlay::OverlayEvent; +use crate::inventory_item::InventoryItemType; +use crate::page::in_game::CurrentLevel; +use crate::page::in_game::GameLevel; +use crate::physics::GamePhysics; +use crate::player_state::PlayerState; +use crate::spell::SpellType; +use crate::states::GameState; +use crate::wand::Wand; +use crate::wand::WandSpell; +use crate::wand::WandType; +use bevy::input::keyboard::Key; +use bevy::input::keyboard::KeyboardInput; +use bevy::input::ButtonState; +use bevy::prelude::*; use bevy_rapier2d::plugin::PhysicsSet; fn process_debug_command( diff --git a/src/enemy/basic.rs b/src/enemy/basic.rs index 7ae1b72a..459c8aaa 100644 --- a/src/enemy/basic.rs +++ b/src/enemy/basic.rs @@ -1,15 +1,22 @@ use crate::constant::*; use crate::controller::despawn_with_gold::DespawnWithGold; use crate::controller::servant::Servant; -use crate::entity::actor::{Actor, ActorFireState, ActorGroup, ActorState}; +use crate::entity::actor::Actor; +use crate::entity::actor::ActorFireState; +use crate::entity::actor::ActorGroup; +use crate::entity::actor::ActorState; use crate::entity::bullet::HomingTarget; -use crate::entity::life::{Life, LifeBeingSprite}; +use crate::entity::life::Life; +use crate::entity::life::LifeBeingSprite; use crate::entity::EntityDepth; -use crate::hud::life_bar::{spawn_life_bar, LifeBarResource}; +use crate::hud::life_bar::spawn_life_bar; +use crate::hud::life_bar::LifeBarResource; use crate::inventory::Inventory; use crate::spell::SpellType; use crate::states::GameState; -use crate::wand::{Wand, WandSpell, WandType}; +use crate::wand::Wand; +use crate::wand::WandSpell; +use crate::wand::WandType; use bevy::prelude::*; use bevy_aseprite_ultra::prelude::*; use bevy_rapier2d::prelude::*; diff --git a/src/enemy/eyeball.rs b/src/enemy/eyeball.rs index 56097ff7..920b006b 100644 --- a/src/enemy/eyeball.rs +++ b/src/enemy/eyeball.rs @@ -1,7 +1,9 @@ use crate::asset::GameAssets; use crate::constant::*; use crate::enemy::basic::spawn_basic_enemy; -use crate::entity::actor::{Actor, ActorFireState, ActorGroup}; +use crate::entity::actor::Actor; +use crate::entity::actor::ActorFireState; +use crate::entity::actor::ActorGroup; use crate::hud::life_bar::LifeBarResource; use crate::physics::compare_distance; use crate::set::GameSet; diff --git a/src/enemy/huge_slime.rs b/src/enemy/huge_slime.rs index 04bdbdad..b347dc47 100644 --- a/src/enemy/huge_slime.rs +++ b/src/enemy/huge_slime.rs @@ -2,17 +2,24 @@ use crate::asset::GameAssets; use crate::audio::NextBGM; use crate::constant::*; use crate::controller::player::Player; -use crate::entity::actor::{Actor, ActorFireState, ActorGroup, ActorState}; +use crate::entity::actor::Actor; +use crate::entity::actor::ActorFireState; +use crate::entity::actor::ActorGroup; +use crate::entity::actor::ActorState; use crate::entity::bullet::HomingTarget; use crate::entity::impact::SpawnImpact; use crate::entity::life::Life; -use crate::entity::servant_seed::{ServantType, SpawnServantSeed}; +use crate::entity::servant_seed::ServantType; +use crate::entity::servant_seed::SpawnServantSeed; use crate::entity::EntityDepth; use crate::inventory::Inventory; -use crate::se::{SEEvent, SE}; +use crate::se::SEEvent; +use crate::se::SE; use crate::spell::SpellType; use crate::states::GameState; -use crate::wand::{Wand, WandSpell, WandType}; +use crate::wand::Wand; +use crate::wand::WandSpell; +use crate::wand::WandType; use bevy::prelude::*; use bevy_aseprite_ultra::prelude::*; use bevy_rapier2d::prelude::*; diff --git a/src/enemy/sandbug.rs b/src/enemy/sandbug.rs index 38fe38f2..c443b58c 100644 --- a/src/enemy/sandbug.rs +++ b/src/enemy/sandbug.rs @@ -1,12 +1,15 @@ use crate::asset::GameAssets; use crate::enemy::basic::spawn_basic_enemy; -use crate::entity::actor::{Actor, ActorEvent, ActorGroup}; +use crate::entity::actor::Actor; +use crate::entity::actor::ActorEvent; +use crate::entity::actor::ActorGroup; use crate::entity::life::LifeBeingSprite; use crate::hud::life_bar::LifeBarResource; use crate::spell::SpellType; use crate::states::GameState; use bevy::prelude::*; -use bevy_aseprite_ultra::prelude::{AnimationState, AseSpriteAnimation}; +use bevy_aseprite_ultra::prelude::AnimationState; +use bevy_aseprite_ultra::prelude::AseSpriteAnimation; use bevy_rapier2d::plugin::PhysicsSet; const ENEMY_MOVE_FORCE: f32 = 100000.0; diff --git a/src/enemy/slime.rs b/src/enemy/slime.rs index 362bed24..7aeadc33 100644 --- a/src/enemy/slime.rs +++ b/src/enemy/slime.rs @@ -1,7 +1,9 @@ use crate::asset::GameAssets; use crate::constant::*; use crate::enemy::basic::spawn_basic_enemy; -use crate::entity::actor::{Actor, ActorFireState, ActorGroup}; +use crate::entity::actor::Actor; +use crate::entity::actor::ActorFireState; +use crate::entity::actor::ActorGroup; use crate::hud::life_bar::LifeBarResource; use crate::physics::compare_distance; use crate::set::GameSet; diff --git a/src/entity.rs b/src/entity.rs index b39d6ff3..c197d01b 100644 --- a/src/entity.rs +++ b/src/entity.rs @@ -17,14 +17,13 @@ pub mod shop; pub mod stone_lantern; pub mod witch; -use crate::{ - constant::{ENTITY_LAYER_Z, Z_ORDER_SCALE}, - states::GameState, -}; -use bevy::{ - ecs::query::{QueryData, QueryFilter, ROQueryItem}, - prelude::*, -}; +use crate::constant::ENTITY_LAYER_Z; +use crate::constant::Z_ORDER_SCALE; +use crate::states::GameState; +use bevy::ecs::query::QueryData; +use bevy::ecs::query::QueryFilter; +use bevy::ecs::query::ROQueryItem; +use bevy::prelude::*; #[derive(PartialEq, Eq, Clone, Copy, Debug)] pub enum GameEntity { diff --git a/src/entity/actor.rs b/src/entity/actor.rs index 5d505544..a3ab936e 100644 --- a/src/entity/actor.rs +++ b/src/entity/actor.rs @@ -1,20 +1,29 @@ +use crate::asset::GameAssets; use crate::cast::cast_spell; -use crate::constant::{MAX_ITEMS_IN_EQUIPMENT, MAX_WANDS}; -use crate::controller::player::{Equipment, Player}; +use crate::constant::MAX_ITEMS_IN_EQUIPMENT; +use crate::constant::MAX_WANDS; +use crate::controller::player::Equipment; +use crate::controller::player::Player; use crate::entity::life::Life; use crate::entity::life::LifeBeingSprite; use crate::entity::servant_seed::SpawnServantSeed; use crate::equipment::EquipmentType; use crate::inventory::Inventory; +use crate::se::SEEvent; +use crate::states::GameState; use crate::ui::floating::FloatingContent; -use crate::wand::{Wand, WandSpell}; -use crate::{asset::GameAssets, se::SEEvent, states::GameState}; +use crate::wand::Wand; +use crate::wand::WandSpell; use bevy::prelude::*; use bevy_light_2d::light::PointLight2d; use bevy_rapier2d::plugin::PhysicsSet; -use bevy_rapier2d::prelude::{ExternalForce, ExternalImpulse}; -use bevy_simple_websocket::{ClientMessage, ReadyState, WebSocketState}; -use serde::{Deserialize, Serialize}; +use bevy_rapier2d::prelude::ExternalForce; +use bevy_rapier2d::prelude::ExternalImpulse; +use bevy_simple_websocket::ClientMessage; +use bevy_simple_websocket::ReadyState; +use bevy_simple_websocket::WebSocketState; +use serde::Deserialize; +use serde::Serialize; use std::f32::consts::PI; use uuid::Uuid; diff --git a/src/entity/bgm.rs b/src/entity/bgm.rs index d9435d3a..cfa50653 100644 --- a/src/entity/bgm.rs +++ b/src/entity/bgm.rs @@ -1,10 +1,10 @@ -use crate::{ - asset::GameAssets, - audio::NextBGM, - constant::{SENSOR_GROUP, TILE_SIZE, WITCH_GROUP}, - controller::player::Player, - states::GameState, -}; +use crate::asset::GameAssets; +use crate::audio::NextBGM; +use crate::constant::SENSOR_GROUP; +use crate::constant::TILE_SIZE; +use crate::constant::WITCH_GROUP; +use crate::controller::player::Player; +use crate::states::GameState; use bevy::prelude::*; use bevy_rapier2d::prelude::*; diff --git a/src/entity/book_shelf.rs b/src/entity/book_shelf.rs index 39797339..a5133de9 100644 --- a/src/entity/book_shelf.rs +++ b/src/entity/book_shelf.rs @@ -1,7 +1,10 @@ -use crate::entity::life::{Life, LifeBeingSprite}; +use crate::constant::*; +use crate::entity::life::Life; +use crate::entity::life::LifeBeingSprite; use crate::entity::EntityDepth; -use crate::se::{SEEvent, SE}; -use crate::{constant::*, states::GameState}; +use crate::se::SEEvent; +use crate::se::SE; +use crate::states::GameState; use bevy::prelude::*; use bevy_aseprite_ultra::prelude::*; use bevy_rapier2d::prelude::*; diff --git a/src/entity/broken_magic_circle.rs b/src/entity/broken_magic_circle.rs index 586f2bc0..992d1c43 100644 --- a/src/entity/broken_magic_circle.rs +++ b/src/entity/broken_magic_circle.rs @@ -1,4 +1,5 @@ -use crate::{constant::*, states::GameState}; +use crate::constant::*; +use crate::states::GameState; use bevy::prelude::*; use bevy_aseprite_ultra::prelude::*; diff --git a/src/entity/bullet.rs b/src/entity/bullet.rs index 4a9227f5..bd0dbe46 100644 --- a/src/entity/bullet.rs +++ b/src/entity/bullet.rs @@ -1,18 +1,22 @@ -use super::actor::{ActorEvent, ActorGroup}; use crate::controller::remote::RemotePlayer; use crate::entity::actor::Actor; +use crate::entity::actor::ActorEvent; +use crate::entity::actor::ActorGroup; +use crate::entity::bullet_particle::spawn_particle_system; use crate::entity::bullet_particle::BulletParticleResource; use crate::entity::life::Life; use crate::entity::EntityDepth; use crate::level::wall::WallCollider; +use crate::se::SEEvent; use crate::se::SE; use crate::states::GameState; -use crate::{entity::bullet_particle::spawn_particle_system, se::SEEvent}; use bevy::prelude::*; -use bevy_aseprite_ultra::prelude::{AseSpriteSlice, Aseprite}; +use bevy_aseprite_ultra::prelude::AseSpriteSlice; +use bevy_aseprite_ultra::prelude::Aseprite; use bevy_light_2d::light::PointLight2d; use bevy_rapier2d::prelude::*; -use serde::{Deserialize, Serialize}; +use serde::Deserialize; +use serde::Serialize; use std::collections::HashSet; use uuid::Uuid; diff --git a/src/entity/bullet_particle.rs b/src/entity/bullet_particle.rs index ba9c0ec4..db74ef3e 100644 --- a/src/entity/bullet_particle.rs +++ b/src/entity/bullet_particle.rs @@ -1,8 +1,7 @@ +use crate::states::GameState; use bevy::prelude::*; use std::f32::consts::PI; -use crate::states::GameState; - #[derive(Resource)] pub struct BulletParticleResource { shape: Handle, diff --git a/src/entity/chest.rs b/src/entity/chest.rs index e95ca933..a15720ae 100644 --- a/src/entity/chest.rs +++ b/src/entity/chest.rs @@ -1,12 +1,12 @@ -use crate::{asset::GameAssets, constant::*, se::SEEvent, states::GameState}; -use crate::{ - entity::{ - gold::spawn_gold, - life::{Life, LifeBeingSprite}, - EntityDepth, - }, - se::SE, -}; +use crate::asset::GameAssets; +use crate::constant::*; +use crate::entity::gold::spawn_gold; +use crate::entity::life::Life; +use crate::entity::life::LifeBeingSprite; +use crate::entity::EntityDepth; +use crate::se::SEEvent; +use crate::se::SE; +use crate::states::GameState; use bevy::prelude::*; use bevy_aseprite_ultra::prelude::*; use bevy_rapier2d::prelude::*; diff --git a/src/entity/damege.rs b/src/entity/damege.rs index 538d389e..1fe7a1ce 100644 --- a/src/entity/damege.rs +++ b/src/entity/damege.rs @@ -1,7 +1,9 @@ -use crate::{asset::GameAssets, constant::DAMAGE_NUMBER_LAYER_Z, states::GameState}; -use bevy::{prelude::*, text::FontSmoothing}; - -use super::actor::ActorEvent; +use crate::asset::GameAssets; +use crate::constant::DAMAGE_NUMBER_LAYER_Z; +use crate::entity::actor::ActorEvent; +use crate::states::GameState; +use bevy::prelude::*; +use bevy::text::FontSmoothing; #[derive(Component)] struct DamageParticle { diff --git a/src/entity/dropped_item.rs b/src/entity/dropped_item.rs index 4e1f092a..69d55152 100644 --- a/src/entity/dropped_item.rs +++ b/src/entity/dropped_item.rs @@ -1,18 +1,20 @@ +use crate::asset::GameAssets; +use crate::constant::*; use crate::controller::player::Player; +use crate::entity::actor::Actor; +use crate::entity::life::Life; use crate::entity::EntityDepth; use crate::inventory::InventoryItem; use crate::inventory_item::InventoryItemType; -use crate::se::{SEEvent, SE}; -use crate::{asset::GameAssets, constant::*, states::GameState}; +use crate::se::SEEvent; +use crate::se::SE; +use crate::states::GameState; use bevy::core::FrameCount; use bevy::prelude::*; use bevy::text::FontSmoothing; use bevy_aseprite_ultra::prelude::*; use bevy_rapier2d::prelude::*; -use super::actor::Actor; -use super::life::Life; - #[derive(Component)] pub struct DroppedItemEntity { item: InventoryItem, diff --git a/src/entity/gold.rs b/src/entity/gold.rs index 7ce972c2..982b1189 100644 --- a/src/entity/gold.rs +++ b/src/entity/gold.rs @@ -1,5 +1,7 @@ +use crate::asset::GameAssets; +use crate::constant::*; use crate::entity::EntityDepth; -use crate::{asset::GameAssets, constant::*, states::GameState}; +use crate::states::GameState; use bevy::prelude::*; use bevy_aseprite_ultra::prelude::*; use bevy_rapier2d::prelude::*; diff --git a/src/entity/impact.rs b/src/entity/impact.rs index bd2ca560..8a67c2e9 100644 --- a/src/entity/impact.rs +++ b/src/entity/impact.rs @@ -1,18 +1,18 @@ +use crate::asset::GameAssets; +use crate::camera::GameCamera; +use crate::constant::ENEMY_GROUP; +use crate::constant::ENTITY_GROUP; +use crate::constant::PAINT_LAYER_Z; +use crate::constant::WITCH_GROUP; +use crate::entity::actor::ActorEvent; use crate::entity::life::Life; +use crate::se::SEEvent; use crate::se::SE; -use crate::{ - asset::GameAssets, - camera::GameCamera, - constant::{ENEMY_GROUP, ENTITY_GROUP, PAINT_LAYER_Z, WITCH_GROUP}, - se::SEEvent, - states::GameState, -}; +use crate::states::GameState; use bevy::prelude::*; use bevy_aseprite_ultra::prelude::AseSpriteAnimation; use bevy_rapier2d::prelude::*; -use super::actor::ActorEvent; - #[derive(Component)] struct Impact { lifetime: u32, diff --git a/src/entity/life.rs b/src/entity/life.rs index 4785f99e..72e75790 100644 --- a/src/entity/life.rs +++ b/src/entity/life.rs @@ -1,6 +1,5 @@ -use bevy::prelude::*; - use crate::states::GameState; +use bevy::prelude::*; /// 木箱やトーチなどの破壊可能なオブジェクトを表すコンポーネントです /// 弾丸は Breakable コンポーネントを持つエンティティに対してダメージを与えます diff --git a/src/entity/magic_circle.rs b/src/entity/magic_circle.rs index b6489d88..c9f2b6a4 100644 --- a/src/entity/magic_circle.rs +++ b/src/entity/magic_circle.rs @@ -1,22 +1,24 @@ -use crate::{ - asset::GameAssets, - constant::*, - controller::player::Player, - hud::overlay::OverlayEvent, - level::{CurrentLevel, GameLevel}, - player_state::PlayerState, - se::{SEEvent, SE}, - states::GameState, -}; +use crate::asset::GameAssets; +use crate::constant::*; +use crate::controller::player::Player; +use crate::entity::actor::Actor; +use crate::entity::life::Life; +use crate::hud::overlay::OverlayEvent; +use crate::page::in_game::CurrentLevel; +use crate::page::in_game::GameLevel; +use crate::player_state::PlayerState; +use crate::se::SEEvent; +use crate::se::SE; +use crate::states::GameState; use bevy::prelude::*; use bevy_aseprite_ultra::prelude::*; use bevy_light_2d::light::PointLight2d; -use bevy_rapier2d::{ - plugin::PhysicsSet, - prelude::{ActiveEvents, Collider, CollisionEvent, CollisionGroups, Sensor}, -}; - -use super::{actor::Actor, life::Life}; +use bevy_rapier2d::plugin::PhysicsSet; +use bevy_rapier2d::prelude::ActiveEvents; +use bevy_rapier2d::prelude::Collider; +use bevy_rapier2d::prelude::CollisionEvent; +use bevy_rapier2d::prelude::CollisionGroups; +use bevy_rapier2d::prelude::Sensor; const MAX_POWER: i32 = 360; const MIN_RADIUS_ON: f32 = 100.0; diff --git a/src/entity/rabbit.rs b/src/entity/rabbit.rs index 562adbf1..245d95ef 100644 --- a/src/entity/rabbit.rs +++ b/src/entity/rabbit.rs @@ -1,13 +1,17 @@ use crate::asset::GameAssets; use crate::constant::*; -use crate::entity::actor::{Actor, ActorFireState}; -use crate::entity::actor::{ActorGroup, ActorState}; +use crate::entity::actor::Actor; +use crate::entity::actor::ActorFireState; +use crate::entity::actor::ActorGroup; +use crate::entity::actor::ActorState; use crate::entity::life::Life; use crate::entity::EntityChildrenAutoDepth; use crate::inventory::Inventory; use crate::states::GameState; use bevy::prelude::*; -use bevy_aseprite_ultra::prelude::{AseSpriteAnimation, AseSpriteSlice, Aseprite}; +use bevy_aseprite_ultra::prelude::AseSpriteAnimation; +use bevy_aseprite_ultra::prelude::AseSpriteSlice; +use bevy_aseprite_ultra::prelude::Aseprite; use bevy_rapier2d::prelude::*; pub fn spawn_rabbit( diff --git a/src/entity/servant_seed.rs b/src/entity/servant_seed.rs index b491c42e..fec567b5 100644 --- a/src/entity/servant_seed.rs +++ b/src/entity/servant_seed.rs @@ -7,14 +7,18 @@ use crate::enemy::slime::spawn_slime; use crate::entity::actor::ActorGroup; use crate::hud::life_bar::LifeBarResource; use crate::level::tile::Tile; -use crate::level::CurrentLevel; -use crate::se::{SEEvent, SE}; +use crate::page::in_game::CurrentLevel; +use crate::se::SEEvent; +use crate::se::SE; use crate::states::GameState; use bevy::prelude::*; use bevy_aseprite_ultra::prelude::*; use bevy_rapier2d::prelude::*; -use bevy_simple_websocket::{ClientMessage, ReadyState, WebSocketState}; -use serde::{Deserialize, Serialize}; +use bevy_simple_websocket::ClientMessage; +use bevy_simple_websocket::ReadyState; +use bevy_simple_websocket::WebSocketState; +use serde::Deserialize; +use serde::Serialize; #[derive(Component)] pub struct ServantSeed { diff --git a/src/entity/shop.rs b/src/entity/shop.rs index 59dd1846..4fab7347 100644 --- a/src/entity/shop.rs +++ b/src/entity/shop.rs @@ -1,21 +1,27 @@ -use crate::{ - asset::GameAssets, - constant::{ - DOOR_GROUP, ENEMY_BULLET_GROUP, ENEMY_GROUP, ENTITY_GROUP, RABBIT_GROUP, SENSOR_GROUP, - TILE_HALF, TILE_SIZE, WITCH_BULLET_GROUP, WITCH_GROUP, - }, - controller::{player::Player, shop_rabbit::ShopRabbit}, - language::Dict, - se::{SEEvent, SE}, - speech_bubble::SpeechEvent, - states::GameState, -}; +use crate::asset::GameAssets; +use crate::constant::DOOR_GROUP; +use crate::constant::ENEMY_BULLET_GROUP; +use crate::constant::ENEMY_GROUP; +use crate::constant::ENTITY_GROUP; +use crate::constant::RABBIT_GROUP; +use crate::constant::SENSOR_GROUP; +use crate::constant::TILE_HALF; +use crate::constant::TILE_SIZE; +use crate::constant::WITCH_BULLET_GROUP; +use crate::constant::WITCH_GROUP; +use crate::controller::player::Player; +use crate::controller::shop_rabbit::ShopRabbit; +use crate::entity::actor::Actor; +use crate::entity::EntityDepth; +use crate::language::Dict; +use crate::se::SEEvent; +use crate::se::SE; +use crate::speech_bubble::SpeechEvent; +use crate::states::GameState; use bevy::prelude::*; use bevy_aseprite_ultra::prelude::AseSpriteSlice; use bevy_rapier2d::prelude::*; -use super::{actor::Actor, EntityDepth}; - #[derive(Component)] struct ShopDoorSensor { open: bool, diff --git a/src/entity/stone_lantern.rs b/src/entity/stone_lantern.rs index 6b099400..c2859d25 100644 --- a/src/entity/stone_lantern.rs +++ b/src/entity/stone_lantern.rs @@ -1,12 +1,14 @@ -use crate::{asset::GameAssets, constant::*, se::SEEvent, states::GameState}; -use crate::{ - entity::{ - life::{Life, LifeBeingSprite}, - EntityDepth, - }, - se::SE, -}; -use bevy::{core::FrameCount, prelude::*, sprite::Anchor}; +use crate::asset::GameAssets; +use crate::constant::*; +use crate::entity::life::Life; +use crate::entity::life::LifeBeingSprite; +use crate::entity::EntityDepth; +use crate::se::SEEvent; +use crate::se::SE; +use crate::states::GameState; +use bevy::core::FrameCount; +use bevy::prelude::*; +use bevy::sprite::Anchor; use bevy_aseprite_ultra::prelude::*; use bevy_light_2d::light::PointLight2d; use bevy_rapier2d::prelude::*; diff --git a/src/entity/witch.rs b/src/entity/witch.rs index 47f71461..b74aefe8 100644 --- a/src/entity/witch.rs +++ b/src/entity/witch.rs @@ -1,14 +1,18 @@ -use super::actor::{ActorGroup, ActorState}; -use super::bullet::HomingTarget; -use super::EntityChildrenAutoDepth; use crate::asset::GameAssets; use crate::config::GameConfig; use crate::constant::*; use crate::controller::player::Equipment; use crate::controller::training_dummy::TraningDummyController; -use crate::entity::actor::{Actor, ActorFireState}; -use crate::entity::life::{Life, LifeBeingSprite}; -use crate::hud::life_bar::{spawn_life_bar, LifeBarResource}; +use crate::entity::actor::Actor; +use crate::entity::actor::ActorFireState; +use crate::entity::actor::ActorGroup; +use crate::entity::actor::ActorState; +use crate::entity::bullet::HomingTarget; +use crate::entity::life::Life; +use crate::entity::life::LifeBeingSprite; +use crate::entity::EntityChildrenAutoDepth; +use crate::hud::life_bar::spawn_life_bar; +use crate::hud::life_bar::LifeBarResource; use crate::inventory::Inventory; use crate::player_state::PlayerState; use crate::states::GameState; diff --git a/src/equipment.rs b/src/equipment.rs index 7c798b94..1b685d95 100644 --- a/src/equipment.rs +++ b/src/equipment.rs @@ -1,6 +1,5 @@ -use bevy::reflect::Reflect; - use crate::language::Dict; +use bevy::reflect::Reflect; #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Reflect, strum::EnumIter)] pub enum EquipmentType { diff --git a/src/game.rs b/src/game.rs index ab9d0ba6..fe0caabf 100644 --- a/src/game.rs +++ b/src/game.rs @@ -41,6 +41,7 @@ use crate::hud::*; use crate::input::GameInputPlugin; use crate::level::*; use crate::page::ending::EndingPlugin; +use crate::page::in_game::WorldPlugin; use crate::page::main_menu::MainMenuPlugin; use crate::page::name_input::NameInputPagePlugin; use crate::page::setup::SetupPlugin; @@ -69,32 +70,31 @@ use crate::ui::wand_editor::WandEditorPlugin; use crate::ui::wand_list::WandListPlugin; use crate::ui::wand_sprite::WandSpritePlugin; use bevy::asset::AssetMetaCheck; +#[cfg(feature = "debug")] +use bevy::diagnostic::EntityCountDiagnosticsPlugin; +#[cfg(feature = "debug")] +use bevy::diagnostic::FrameTimeDiagnosticsPlugin; use bevy::log::*; use bevy::prelude::*; +use bevy::window::CursorOptions; +use bevy::window::EnabledButtons; use bevy::window::WindowMode; -use bevy::window::{CursorOptions, EnabledButtons}; use bevy_aseprite_ultra::AsepriteUltraPlugin; use bevy_asset_loader::prelude::*; -use bevy_light_2d::plugin::Light2dPlugin; -use bevy_rapier2d::prelude::*; -use bevy_simple_text_input::TextInputPlugin; -use bevy_simple_websocket::WebSocketPlugin; -use gameover::GameoverPlugin; -use wall::WallPlugin; - #[cfg(all(not(debug_assertions), not(target_arch = "wasm32")))] use bevy_embedded_assets::EmbeddedAssetPlugin; #[cfg(all(not(debug_assertions), not(target_arch = "wasm32")))] use bevy_embedded_assets::PluginMode; +use bevy_light_2d::plugin::Light2dPlugin; #[cfg(any(not(debug_assertions), target_arch = "wasm32", feature = "save"))] use bevy_pkv::PkvStore; - -#[cfg(feature = "debug")] -use bevy::diagnostic::EntityCountDiagnosticsPlugin; -#[cfg(feature = "debug")] -use bevy::diagnostic::FrameTimeDiagnosticsPlugin; +use bevy_rapier2d::prelude::*; #[cfg(all(feature = "debug", not(target_arch = "wasm32")))] use bevy_remote_inspector::RemoteInspectorPlugins; +use bevy_simple_text_input::TextInputPlugin; +use bevy_simple_websocket::WebSocketPlugin; +use gameover::GameoverPlugin; +use wall::WallPlugin; pub fn run_game() { let mut app = App::new(); diff --git a/src/hud.rs b/src/hud.rs index cbee44d5..50ebe687 100644 --- a/src/hud.rs +++ b/src/hud.rs @@ -9,13 +9,17 @@ use crate::constant::HUD_Z_INDEX; use crate::controller::player::Player; use crate::entity::actor::Actor; use crate::entity::life::Life; -use crate::level::{level_to_name, CurrentLevel, GameLevel}; +use crate::page::in_game::level_to_name; +use crate::page::in_game::CurrentLevel; +use crate::page::in_game::GameLevel; use crate::speech_bubble::spawn_speech_bubble; use crate::states::GameState; -use crate::ui::bar::{spawn_status_bar, StatusBar}; +use crate::ui::bar::spawn_status_bar; +use crate::ui::bar::StatusBar; use crate::ui::boss_hitpoint_bar::spawn_boss_hitpoint_bar; use crate::ui::equipment_list::spawn_equipment_list; -use crate::ui::floating::{spawn_inventory_floating, Floating}; +use crate::ui::floating::spawn_inventory_floating; +use crate::ui::floating::Floating; use crate::ui::wand_editor::spawn_wand_editor; use crate::ui::wand_list::spawn_wand_list; use bevy::prelude::*; diff --git a/src/hud/gameover.rs b/src/hud/gameover.rs index 0ab5afcb..d1bb0ee7 100644 --- a/src/hud/gameover.rs +++ b/src/hud/gameover.rs @@ -1,9 +1,8 @@ +use crate::controller::player::Player; +use crate::hud::overlay::OverlayEvent; +use crate::states::GameState; use bevy::prelude::*; -use crate::{controller::player::Player, states::GameState}; - -use super::overlay::OverlayEvent; - #[derive(Resource, Default)] struct GameOver { animation: u32, diff --git a/src/hud/life_bar.rs b/src/hud/life_bar.rs index c535717d..cc1d7eb2 100644 --- a/src/hud/life_bar.rs +++ b/src/hud/life_bar.rs @@ -1,5 +1,6 @@ use crate::entity::life::Life; -use crate::{set::GameSet, states::GameState}; +use crate::set::GameSet; +use crate::states::GameState; use bevy::prelude::*; const LIFE_BAR_WIDTH: f32 = 16.0; diff --git a/src/hud/overlay.rs b/src/hud/overlay.rs index 3f349e79..f58d4fe7 100644 --- a/src/hud/overlay.rs +++ b/src/hud/overlay.rs @@ -1,4 +1,5 @@ -use crate::{constant::OVERLAY_Z_INDEX, states::GameState}; +use crate::constant::OVERLAY_Z_INDEX; +use crate::states::GameState; use bevy::prelude::*; const SPEED: f32 = 0.02; diff --git a/src/hud/pointer.rs b/src/hud/pointer.rs index 64a1799d..9cb45508 100644 --- a/src/hud/pointer.rs +++ b/src/hud/pointer.rs @@ -1,8 +1,11 @@ +use crate::asset::GameAssets; use crate::constant::POINTER_Z_INDEX; +use crate::controller::player::Player; +use crate::entity::actor::Actor; use crate::states::GameMenuState; -use crate::{asset::GameAssets, states::GameState}; -use crate::{controller::player::Player, entity::actor::Actor}; -use bevy::{prelude::*, window::PrimaryWindow}; +use crate::states::GameState; +use bevy::prelude::*; +use bevy::window::PrimaryWindow; use bevy_aseprite_ultra::prelude::AseUiSlice; #[derive(Component)] diff --git a/src/inventory.rs b/src/inventory.rs index 0d907344..d0e9959b 100644 --- a/src/inventory.rs +++ b/src/inventory.rs @@ -1,4 +1,5 @@ -use crate::{constant::MAX_ITEMS_IN_INVENTORY, inventory_item::InventoryItemType}; +use crate::constant::MAX_ITEMS_IN_INVENTORY; +use crate::inventory_item::InventoryItemType; use bevy::reflect::Reflect; #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Reflect)] diff --git a/src/inventory_item.rs b/src/inventory_item.rs index 5d66855b..1bdc5ac6 100644 --- a/src/inventory_item.rs +++ b/src/inventory_item.rs @@ -1,4 +1,7 @@ -use crate::{equipment::EquipmentType, language::Dict, spell::SpellType, wand::WandType}; +use crate::equipment::EquipmentType; +use crate::language::Dict; +use crate::spell::SpellType; +use crate::wand::WandType; use bevy::reflect::Reflect; #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Reflect)] diff --git a/src/level.rs b/src/level.rs index 36e1c3f9..5e1b74a0 100644 --- a/src/level.rs +++ b/src/level.rs @@ -2,651 +2,3 @@ pub mod ceil; pub mod map; pub mod tile; pub mod wall; - -use crate::asset::GameAssets; -use crate::audio::NextBGM; -use crate::camera::setup_camera; -use crate::config::GameConfig; -use crate::constant::*; -use crate::controller::message_rabbit::MessageRabbit; -use crate::controller::message_rabbit::MessageRabbitInnerSensor; -use crate::controller::message_rabbit::MessageRabbitOuterSensor; -use crate::controller::player::Player; -use crate::controller::shop_rabbit::ShopRabbit; -use crate::controller::shop_rabbit::ShopRabbitOuterSensor; -use crate::controller::shop_rabbit::ShopRabbitSensor; -use crate::enemy::eyeball::spawn_eyeball; -use crate::enemy::huge_slime::spawn_huge_slime; -use crate::enemy::sandbug::spawn_sandbag; -use crate::enemy::slime::spawn_slime; -use crate::entity::actor::ActorGroup; -use crate::entity::bgm::spawn_bgm_switch; -use crate::entity::book_shelf::spawn_book_shelf; -use crate::entity::broken_magic_circle::spawn_broken_magic_circle; -use crate::entity::chest::spawn_chest; -use crate::entity::chest::ChestType; -use crate::entity::chest::CHEST_OR_BARREL; -use crate::entity::dropped_item::spawn_dropped_item; -use crate::entity::magic_circle::spawn_magic_circle; -use crate::entity::magic_circle::MagicCircleDestination; -use crate::entity::rabbit::spawn_rabbit; -use crate::entity::shop::spawn_shop_door; -use crate::entity::stone_lantern::spawn_stone_lantern; -use crate::entity::witch::spawn_witch; -use crate::entity::GameEntity; -use crate::equipment::EquipmentType; -use crate::hud::life_bar::LifeBarResource; -use crate::inventory::InventoryItem; -use crate::inventory_item::InventoryItemType; -use crate::language::Dict; -use crate::level::ceil::spawn_roof_tiles; -use crate::level::map::image_to_tilemap; -use crate::level::map::LevelChunk; -use crate::level::tile::*; -use crate::message::HELLO; -use crate::message::LEVEL0; -use crate::message::LEVEL1; -use crate::message::LEVEL2; -use crate::message::LEVEL3; -use crate::message::MULTIPLAY; -use crate::message::MULTIPLAY_ARENA; -use crate::message::SINGLEPLAY; -use crate::message::TRAINING_RABBIT; -use crate::message::UNKNOWN_LEVEL; -use crate::message::WITCHES_ARE; -use crate::player_state::PlayerState; -use crate::random::random_select_mut; -use crate::spell::SpellType; -use crate::states::GameState; -use bevy::asset::*; -use bevy::core::FrameCount; -use bevy::prelude::*; -use bevy_aseprite_ultra::prelude::*; -use map::image_to_spawn_tiles; -use rand::seq::IteratorRandom; -use rand::seq::SliceRandom; -use strum::IntoEnumIterator; -use uuid::Uuid; -use wall::spawn_wall_collisions; -use wall::WallCollider; - -#[derive(Clone, Copy, PartialEq, Eq, Debug)] -pub enum GameLevel { - Level(i32), - MultiPlayArena, -} - -#[derive(Resource, Debug, Clone)] -pub struct CurrentLevel { - pub level: Option, - pub chunk: Option, - pub next_level: GameLevel, - pub next_state: PlayerState, -} - -impl Default for CurrentLevel { - fn default() -> Self { - CurrentLevel { - level: None, - chunk: None, - next_level: GameLevel::Level(INITIAL_LEVEL), - next_state: PlayerState::from_config(&GameConfig::default()), - } - } -} - -/// レベルとプレイヤーキャラクターを生成します -pub fn setup_level( - mut commands: Commands, - level_aseprites: Res>, - images: Res>, - assets: Res, - life_bar_res: Res, - mut current: ResMut, - config: Res, -) { - let level = match current.next_level { - GameLevel::Level(level) => GameLevel::Level(level % LEVELS), - GameLevel::MultiPlayArena => GameLevel::MultiPlayArena, - }; - - let mut player = current.next_state.clone(); - player.name = config.player_name.clone(); - - let mut chunk = spawn_level( - &mut commands, - &level_aseprites, - &images, - &assets, - &life_bar_res, - level, - ); - - let entry_point = random_select_mut(&mut chunk.entry_points); - - let player_x = TILE_SIZE * entry_point.x as f32 + TILE_HALF; - let player_y = -TILE_SIZE * entry_point.y as f32 - TILE_HALF; - - setup_camera(&mut commands, Vec2::new(player_x, player_y)); - - // プレイヤーキャラクターの魔法使いを生成 - spawn_witch( - &mut commands, - &assets, - Vec2::new(player_x, player_y), - 0.0, - Uuid::new_v4(), - None, - player.life, - player.max_life, - &life_bar_res, - false, - 3.0, - player.golds, - player.wands, - player.inventory, - player.equipments, - Player { - name: player.name, - last_idle_frame_count: FrameCount(0), - last_ilde_x: player_x, - last_ilde_y: player_y, - last_idle_vx: 0.0, - last_idle_vy: 0.0, - last_idle_life: player.life, - last_idle_max_life: player.max_life, - }, - ActorGroup::Player, - ); - - current.level = Some(level); - current.chunk = Some(chunk); -} - -fn select_level_bgm( - next_level: Res, - mut next_bgm: ResMut, - assets: Res, -) { - if next_level.is_changed() { - info!("select_level_bgm {:?}", next_level.next_level); - *next_bgm = NextBGM(Some(match next_level.next_level { - GameLevel::Level(0) => assets.dokutsu.clone(), - GameLevel::Level(LAST_BOSS_LEVEL) => { - let mut rng = rand::thread_rng(); - let mut bgms = vec![ - assets.deamon.clone(), - assets.action.clone(), - assets.decisive.clone(), - assets.enjin.clone(), - // assets.sacred.clone(), // ボスのプロモート後用BGM - assets.battle_cinematic.clone(), - assets.battle_fight.clone(), - assets.final_battle.clone(), - assets.human_vs_machine.clone(), - ]; - bgms.shuffle(&mut rng); - bgms.pop().unwrap() - } - _ => { - let mut rng = rand::thread_rng(); - let mut bgms = vec![ - assets.arechi.clone(), - assets.touha.clone(), - assets.mori.clone(), - assets.meikyu.clone(), - assets.shiden.clone(), - assets.midnight_forest.clone(), - ]; - bgms.shuffle(&mut rng); - bgms.pop().unwrap() - } - })); - } -} - -/// 現状は StateScopedですべてのエンティティが削除されるので以下のコードは不要ですが、 -/// 今後レベルのシームレスなスポーンを実装する場合は、以下のようなコードが必要になるかも -#[allow(dead_code)] -fn despawn_level( - commands: &mut Commands, - collider_query: &Query>, - world_tile: &Query>, -) { - for entity in world_tile { - commands.entity(entity).despawn_recursive(); - } - for entity in collider_query { - commands.entity(entity).despawn_recursive(); - } -} - -fn spawn_level( - mut commands: &mut Commands, - level_aseprites: &Res>, - images: &Res>, - assets: &Res, - life_bar_res: &Res, - level: GameLevel, -) -> LevelChunk { - let level_slice = match level { - GameLevel::Level(level) => &format!("level{}", level % LEVELS), - GameLevel::MultiPlayArena => "multiplay_arena", - }; - - let level_aseprite = level_aseprites.get(assets.level.id()).unwrap(); - let level_image = images.get(level_aseprite.atlas_image.id()).unwrap(); - let slice = level_aseprite.slices.get(level_slice).unwrap(); - - info!( - "bounds min_x:{} max_x:{} min_y:{} max_y:{}", - slice.rect.min.x, slice.rect.max.x, slice.rect.min.y, slice.rect.max.y - ); - - let chunk = image_to_tilemap( - &level_image, - slice.rect.min.x as i32, - slice.rect.max.x as i32, - slice.rect.min.y as i32, - slice.rect.max.y as i32, - ); - - let mut empties = image_to_spawn_tiles(&chunk); - - spawn_world_tilemap(&mut commands, &assets, &chunk); - - spawn_wall_collisions(&mut commands, &chunk); - - spawn_entities(&mut commands, &assets, &life_bar_res, &chunk); - - if 30 < empties.len() { - for _ in 0..10 { - let (x, y) = random_select_mut(&mut empties); - spawn_slime( - &mut commands, - &assets, - Vec2::new( - TILE_SIZE * x as f32 + TILE_HALF, - TILE_SIZE * -y as f32 - TILE_HALF, - ), - &life_bar_res, - 0, - 2, - ActorGroup::Enemy, - None, - ); - } - - for _ in 0..10 { - let (x, y) = random_select_mut(&mut empties); - spawn_eyeball( - &mut commands, - &assets, - Vec2::new( - TILE_SIZE * x as f32 + TILE_HALF, - TILE_SIZE * -y as f32 - TILE_HALF, - ), - &life_bar_res, - ActorGroup::Enemy, - ); - } - - let mut rng = rand::thread_rng(); - for _ in 0..3 { - let (x, y) = random_select_mut(&mut empties); - let spell = SpellType::iter().choose(&mut rng).unwrap(); - spawn_dropped_item( - &mut commands, - &assets, - Vec2::new( - TILE_SIZE * x as f32 + TILE_HALF, - TILE_SIZE * -y as f32 - TILE_HALF, - ), - InventoryItem { - item_type: InventoryItemType::Spell(spell), - price: 0, - }, - ); - } - } - - return chunk; -} - -fn spawn_world_tilemap(commands: &mut Commands, assets: &Res, chunk: &LevelChunk) { - // 床と壁の生成 - for y in chunk.min_y..chunk.max_y as i32 { - for x in chunk.min_x..chunk.max_x as i32 { - let r = rand::random::() % 3; - let slice = format!("stone_tile{}", r); - - match chunk.get_tile(x, y) { - Tile::StoneTile => { - commands.spawn(( - WorldTile, - Name::new("stone_tile"), - StateScoped(GameState::InGame), - Transform::from_translation(Vec3::new( - x as f32 * TILE_SIZE, - y as f32 * -TILE_SIZE, - FLOOR_LAYER_Z, - )), - AseSpriteSlice { - aseprite: assets.atlas.clone(), - name: slice.into(), - }, - )); - } - Tile::Wall => { - let tx = x as f32 * TILE_SIZE; - let ty = y as f32 * -TILE_SIZE; - let tz = ENTITY_LAYER_Z + (-ty * Z_ORDER_SCALE); - - // 壁 - if !chunk.equals(x as i32, y as i32 + 1, Tile::Wall) { - commands.spawn(( - WorldTile, - Name::new("wall"), - StateScoped(GameState::InGame), - Transform::from_translation(Vec3::new(tx, ty - TILE_HALF, tz)), - AseSpriteSlice { - aseprite: assets.atlas.clone(), - name: "stone wall".into(), - }, - )); - } - - // // 天井 - if false - || chunk.is_empty(x - 1, y - 1) - || chunk.is_empty(x + 0, y - 1) - || chunk.is_empty(x + 1, y - 1) - || chunk.is_empty(x - 1, y + 0) - || chunk.is_empty(x + 0, y + 0) - || chunk.is_empty(x + 1, y + 0) - || chunk.is_empty(x - 1, y + 1) - || chunk.is_empty(x + 0, y + 1) - || chunk.is_empty(x + 1, y + 1) - { - spawn_roof_tiles(commands, assets, &chunk, x, y) - } - } - _ => {} - } - } - } -} - -fn spawn_entities( - mut commands: &mut Commands, - assets: &Res, - life_bar_resource: &Res, - chunk: &LevelChunk, -) { - // エンティティの生成 - for (entity, x, y) in &chunk.entities { - let tx = TILE_SIZE * *x as f32; - let ty = TILE_SIZE * -*y as f32; - match entity { - GameEntity::BookShelf => { - spawn_book_shelf( - &mut commands, - assets.atlas.clone(), - tx + TILE_SIZE, - ty - TILE_HALF, - ); - } - GameEntity::Chest => { - spawn_chest( - &mut commands, - assets.atlas.clone(), - tx + TILE_HALF, - ty - TILE_HALF, - ChestType::Chest, - ); - } - GameEntity::Crate => { - spawn_chest( - &mut commands, - assets.atlas.clone(), - tx + TILE_HALF, - ty - TILE_HALF, - ChestType::Crate, - ); - } - GameEntity::CrateOrBarrel => { - spawn_chest( - &mut commands, - assets.atlas.clone(), - tx + TILE_HALF, - ty - TILE_HALF, - *CHEST_OR_BARREL - .iter() - .choose(&mut rand::thread_rng()) - .unwrap(), - ); - } - GameEntity::MagicCircle => { - spawn_magic_circle( - &mut commands, - &assets, - tx + TILE_HALF, - ty - TILE_HALF, - MagicCircleDestination::NextLevel, - ); - } - GameEntity::MagicCircleHome => { - spawn_magic_circle( - &mut commands, - &assets, - tx + TILE_HALF, - ty - TILE_HALF, - MagicCircleDestination::Home, - ); - } - GameEntity::MultiPlayArenaMagicCircle => { - spawn_magic_circle( - &mut commands, - &assets, - tx + TILE_HALF, - ty - TILE_HALF, - MagicCircleDestination::MultiplayArena, - ); - } - GameEntity::BrokenMagicCircle => { - spawn_broken_magic_circle( - &mut commands, - assets.atlas.clone(), - tx + TILE_HALF, - ty - TILE_HALF, - ); - } - GameEntity::StoneLantern => { - spawn_stone_lantern(&mut commands, &assets, tx + TILE_HALF, ty - TILE_HALF); - } - GameEntity::Usage => { - commands.spawn(( - Name::new("usage"), - Transform::from_translation(Vec3::new(tx, ty, PAINT_LAYER_Z)), - Sprite { - color: Color::hsla(0.0, 0.0, 1.0, 0.7), - ..default() - }, - AseSpriteSlice { - aseprite: assets.atlas.clone(), - name: "usage".into(), - }, - )); - } - GameEntity::Routes => { - commands.spawn(( - Name::new("routes"), - Transform::from_translation(Vec3::new(tx, ty, PAINT_LAYER_Z)), - Sprite { - color: Color::hsla(0.0, 0.0, 1.0, 0.7), - ..default() - }, - AseSpriteSlice { - aseprite: assets.atlas.clone(), - name: "routes".into(), - }, - )); - } - GameEntity::Spell => { - let mut rng = rand::thread_rng(); - if 0.5 < rand::random::() { - let spell = SpellType::iter().choose(&mut rng).unwrap(); - let props = spell.to_props(); - spawn_dropped_item( - &mut commands, - &assets, - Vec2::new(tx + TILE_HALF, ty - TILE_HALF), - InventoryItem { - item_type: InventoryItemType::Spell(spell), - price: props.price, - }, - ); - } else { - let mut rng = rand::thread_rng(); - let equipment = EquipmentType::iter().choose(&mut rng).unwrap(); - let props = equipment.to_props(); - spawn_dropped_item( - &mut commands, - &assets, - Vec2::new(tx + TILE_HALF, ty - TILE_HALF), - InventoryItem { - item_type: InventoryItemType::Equipment(equipment), - price: props.price, - }, - ); - } - } - GameEntity::HugeSlime => { - spawn_huge_slime( - &mut commands, - &assets, - Vec2::new(tx + TILE_HALF, ty - TILE_HALF), - ); - } - GameEntity::ShopRabbit => { - spawn_rabbit( - &mut commands, - &assets, - &assets.rabbit_yellow, - Vec2::new(tx + TILE_HALF, ty - TILE_HALF), - ShopRabbit, - ShopRabbitSensor, - ShopRabbitOuterSensor, - ); - } - GameEntity::TrainingRabbit => { - spawn_rabbit( - &mut commands, - &assets, - &assets.rabbit_red, - Vec2::new(tx + TILE_HALF, ty - TILE_HALF), - MessageRabbit { - message: TRAINING_RABBIT.to_string(), - }, - MessageRabbitInnerSensor, - MessageRabbitOuterSensor, - ); - } - GameEntity::SinglePlayRabbit => { - spawn_rabbit( - &mut commands, - &assets, - &assets.rabbit_white, - Vec2::new(tx + TILE_HALF, ty - TILE_HALF), - MessageRabbit { - message: SINGLEPLAY.to_string(), - }, - MessageRabbitInnerSensor, - MessageRabbitOuterSensor, - ); - } - GameEntity::GuideRabbit => { - spawn_rabbit( - &mut commands, - &assets, - &assets.rabbit_blue, - Vec2::new(tx + TILE_HALF, ty - TILE_HALF), - MessageRabbit { - message: HELLO.to_string(), - }, - MessageRabbitInnerSensor, - MessageRabbitOuterSensor, - ); - } - GameEntity::MultiplayerRabbit => { - spawn_rabbit( - &mut commands, - &assets, - &assets.rabbit_black, - Vec2::new(tx + TILE_HALF, ty - TILE_HALF), - MessageRabbit { - message: MULTIPLAY.to_string(), - }, - MessageRabbitInnerSensor, - MessageRabbitOuterSensor, - ); - } - GameEntity::ReadingRabbit => { - spawn_rabbit( - &mut commands, - &assets, - &assets.rabbit_green, - Vec2::new(tx + TILE_HALF, ty - TILE_HALF), - MessageRabbit { - message: WITCHES_ARE.to_string(), - }, - MessageRabbitInnerSensor, - MessageRabbitOuterSensor, - ); - } - GameEntity::Sandbug => { - spawn_sandbag( - &mut commands, - &assets, - Vec2::new(tx + TILE_HALF, ty - TILE_HALF), - life_bar_resource, - ); - } - GameEntity::ShopDoor => { - spawn_shop_door( - &mut commands, - &assets, - Vec2::new(tx + TILE_HALF, ty - TILE_HALF), - ); - } - GameEntity::BGM => { - spawn_bgm_switch( - &mut commands, - &assets, - Vec2::new(tx + TILE_HALF, ty - TILE_HALF), - ); - } - } - } -} - -pub fn level_to_name(level: GameLevel) -> Dict<&'static str> { - match level { - GameLevel::Level(0) => LEVEL0, - GameLevel::Level(1) => LEVEL1, - GameLevel::Level(2) => LEVEL2, - GameLevel::Level(3) => LEVEL3, - GameLevel::MultiPlayArena => MULTIPLAY_ARENA, - _ => UNKNOWN_LEVEL, - } -} - -pub struct WorldPlugin; - -impl Plugin for WorldPlugin { - fn build(&self, app: &mut App) { - app.add_systems(OnEnter(GameState::InGame), setup_level); - app.add_systems(OnEnter(GameState::InGame), select_level_bgm); - app.init_resource::(); - } -} diff --git a/src/level/ceil.rs b/src/level/ceil.rs index 2f6ebc35..756bad16 100644 --- a/src/level/ceil.rs +++ b/src/level/ceil.rs @@ -1,5 +1,12 @@ -use crate::level::{map::LevelChunk, Tile, WorldTile, TILE_HALF, TILE_SIZE, WALL_HEIGHT}; -use crate::{asset::GameAssets, entity::get_entity_z, states::GameState}; +use crate::asset::GameAssets; +use crate::constant::TILE_HALF; +use crate::constant::TILE_SIZE; +use crate::constant::WALL_HEIGHT; +use crate::entity::get_entity_z; +use crate::level::map::LevelChunk; +use crate::level::tile::Tile; +use crate::level::tile::WorldTile; +use crate::states::GameState; use bevy::prelude::*; use bevy_aseprite_ultra::prelude::AseSpriteSlice; diff --git a/src/level/map.rs b/src/level/map.rs index 6373aa86..89731746 100644 --- a/src/level/map.rs +++ b/src/level/map.rs @@ -1,8 +1,8 @@ -use crate::{entity::GameEntity, level::tile::Tile}; +use crate::constant::TILE_SIZE; +use crate::entity::GameEntity; +use crate::level::tile::Tile; use bevy::prelude::*; -use super::TILE_SIZE; - #[derive(Clone, Copy, Debug)] pub enum Biome { /// モンスターがスポーンしないエリア diff --git a/src/level/wall.rs b/src/level/wall.rs index 72a1be77..e85d7fbb 100644 --- a/src/level/wall.rs +++ b/src/level/wall.rs @@ -1,16 +1,16 @@ -use crate::level::{ - map::LevelChunk, ENEMY_BULLET_GROUP, ENEMY_GROUP, ENTITY_GROUP, TILE_HALF, TILE_SIZE, - WALL_GROUP, WITCH_BULLET_GROUP, WITCH_GROUP, -}; -use crate::{level::Tile, states::GameState}; +use crate::constant::WALL_GROUP; +use crate::constant::*; +use crate::level::map::LevelChunk; +use crate::level::tile::Tile; +use crate::states::GameState; use bevy::prelude::*; -use bevy_rapier2d::prelude::{ - CoefficientCombineRule, Collider, CollisionGroups, Friction, RigidBody, -}; +use bevy_rapier2d::prelude::CoefficientCombineRule; +use bevy_rapier2d::prelude::Collider; +use bevy_rapier2d::prelude::CollisionGroups; +use bevy_rapier2d::prelude::Friction; +use bevy_rapier2d::prelude::RigidBody; use std::collections::HashMap; -use super::RABBIT_GROUP; - /// 壁タイルから衝突矩形を計算します /// チェストや本棚なども侵入不可能ですが、それらは個別に衝突形状を持つため、ここでは壁のみを扱います /// TODO: 本棚などのエンティティもここで一括で生成したほうが効率はいい? diff --git a/src/page.rs b/src/page.rs index ac311be2..7e5c14b6 100644 --- a/src/page.rs +++ b/src/page.rs @@ -1,4 +1,5 @@ pub mod ending; +pub mod in_game; pub mod main_menu; pub mod name_input; pub mod setup; diff --git a/src/page/ending.rs b/src/page/ending.rs index f19d40a6..28dfcfbb 100644 --- a/src/page/ending.rs +++ b/src/page/ending.rs @@ -1,12 +1,11 @@ -use crate::{ - asset::GameAssets, - audio::NextBGM, - constant::LAST_BOSS_LEVEL, - enemy::huge_slime::HugeSlime, - hud::overlay::OverlayEvent, - level::{CurrentLevel, GameLevel}, - states::GameState, -}; +use crate::asset::GameAssets; +use crate::audio::NextBGM; +use crate::constant::LAST_BOSS_LEVEL; +use crate::enemy::huge_slime::HugeSlime; +use crate::hud::overlay::OverlayEvent; +use crate::page::in_game::CurrentLevel; +use crate::page::in_game::GameLevel; +use crate::states::GameState; use bevy::prelude::*; use bevy_aseprite_ultra::prelude::AseUiAnimation; diff --git a/src/page/in_game.rs b/src/page/in_game.rs new file mode 100644 index 00000000..560ba898 --- /dev/null +++ b/src/page/in_game.rs @@ -0,0 +1,647 @@ +use crate::asset::GameAssets; +use crate::audio::NextBGM; +use crate::camera::setup_camera; +use crate::config::GameConfig; +use crate::constant::*; +use crate::controller::message_rabbit::MessageRabbit; +use crate::controller::message_rabbit::MessageRabbitInnerSensor; +use crate::controller::message_rabbit::MessageRabbitOuterSensor; +use crate::controller::player::Player; +use crate::controller::shop_rabbit::ShopRabbit; +use crate::controller::shop_rabbit::ShopRabbitOuterSensor; +use crate::controller::shop_rabbit::ShopRabbitSensor; +use crate::enemy::eyeball::spawn_eyeball; +use crate::enemy::huge_slime::spawn_huge_slime; +use crate::enemy::sandbug::spawn_sandbag; +use crate::enemy::slime::spawn_slime; +use crate::entity::actor::ActorGroup; +use crate::entity::bgm::spawn_bgm_switch; +use crate::entity::book_shelf::spawn_book_shelf; +use crate::entity::broken_magic_circle::spawn_broken_magic_circle; +use crate::entity::chest::spawn_chest; +use crate::entity::chest::ChestType; +use crate::entity::chest::CHEST_OR_BARREL; +use crate::entity::dropped_item::spawn_dropped_item; +use crate::entity::magic_circle::spawn_magic_circle; +use crate::entity::magic_circle::MagicCircleDestination; +use crate::entity::rabbit::spawn_rabbit; +use crate::entity::shop::spawn_shop_door; +use crate::entity::stone_lantern::spawn_stone_lantern; +use crate::entity::witch::spawn_witch; +use crate::entity::GameEntity; +use crate::equipment::EquipmentType; +use crate::hud::life_bar::LifeBarResource; +use crate::inventory::InventoryItem; +use crate::inventory_item::InventoryItemType; +use crate::language::Dict; +use crate::level::ceil::spawn_roof_tiles; +use crate::level::map::image_to_spawn_tiles; +use crate::level::map::image_to_tilemap; +use crate::level::map::LevelChunk; +use crate::level::tile::*; +use crate::level::wall::spawn_wall_collisions; +use crate::level::wall::WallCollider; +use crate::message::HELLO; +use crate::message::LEVEL0; +use crate::message::LEVEL1; +use crate::message::LEVEL2; +use crate::message::LEVEL3; +use crate::message::MULTIPLAY; +use crate::message::MULTIPLAY_ARENA; +use crate::message::SINGLEPLAY; +use crate::message::TRAINING_RABBIT; +use crate::message::UNKNOWN_LEVEL; +use crate::message::WITCHES_ARE; +use crate::player_state::PlayerState; +use crate::random::random_select_mut; +use crate::spell::SpellType; +use crate::states::GameState; +use bevy::asset::*; +use bevy::core::FrameCount; +use bevy::prelude::*; +use bevy_aseprite_ultra::prelude::*; +use rand::seq::IteratorRandom; +use rand::seq::SliceRandom; +use strum::IntoEnumIterator; +use uuid::Uuid; + +#[derive(Clone, Copy, PartialEq, Eq, Debug)] +pub enum GameLevel { + Level(i32), + MultiPlayArena, +} + +#[derive(Resource, Debug, Clone)] +pub struct CurrentLevel { + pub level: Option, + pub chunk: Option, + pub next_level: GameLevel, + pub next_state: PlayerState, +} + +impl Default for CurrentLevel { + fn default() -> Self { + CurrentLevel { + level: None, + chunk: None, + next_level: GameLevel::Level(INITIAL_LEVEL), + next_state: PlayerState::from_config(&GameConfig::default()), + } + } +} + +/// レベルとプレイヤーキャラクターを生成します +pub fn setup_level( + mut commands: Commands, + level_aseprites: Res>, + images: Res>, + assets: Res, + life_bar_res: Res, + mut current: ResMut, + config: Res, +) { + let level = match current.next_level { + GameLevel::Level(level) => GameLevel::Level(level % LEVELS), + GameLevel::MultiPlayArena => GameLevel::MultiPlayArena, + }; + + let mut player = current.next_state.clone(); + player.name = config.player_name.clone(); + + let mut chunk = spawn_level( + &mut commands, + &level_aseprites, + &images, + &assets, + &life_bar_res, + level, + ); + + let entry_point = random_select_mut(&mut chunk.entry_points); + + let player_x = TILE_SIZE * entry_point.x as f32 + TILE_HALF; + let player_y = -TILE_SIZE * entry_point.y as f32 - TILE_HALF; + + setup_camera(&mut commands, Vec2::new(player_x, player_y)); + + // プレイヤーキャラクターの魔法使いを生成 + spawn_witch( + &mut commands, + &assets, + Vec2::new(player_x, player_y), + 0.0, + Uuid::new_v4(), + None, + player.life, + player.max_life, + &life_bar_res, + false, + 3.0, + player.golds, + player.wands, + player.inventory, + player.equipments, + Player { + name: player.name, + last_idle_frame_count: FrameCount(0), + last_ilde_x: player_x, + last_ilde_y: player_y, + last_idle_vx: 0.0, + last_idle_vy: 0.0, + last_idle_life: player.life, + last_idle_max_life: player.max_life, + }, + ActorGroup::Player, + ); + + current.level = Some(level); + current.chunk = Some(chunk); +} + +fn select_level_bgm( + next_level: Res, + mut next_bgm: ResMut, + assets: Res, +) { + if next_level.is_changed() { + info!("select_level_bgm {:?}", next_level.next_level); + *next_bgm = NextBGM(Some(match next_level.next_level { + GameLevel::Level(0) => assets.dokutsu.clone(), + GameLevel::Level(LAST_BOSS_LEVEL) => { + let mut rng = rand::thread_rng(); + let mut bgms = vec![ + assets.deamon.clone(), + assets.action.clone(), + assets.decisive.clone(), + assets.enjin.clone(), + // assets.sacred.clone(), // ボスのプロモート後用BGM + assets.battle_cinematic.clone(), + assets.battle_fight.clone(), + assets.final_battle.clone(), + assets.human_vs_machine.clone(), + ]; + bgms.shuffle(&mut rng); + bgms.pop().unwrap() + } + _ => { + let mut rng = rand::thread_rng(); + let mut bgms = vec![ + assets.arechi.clone(), + assets.touha.clone(), + assets.mori.clone(), + assets.meikyu.clone(), + assets.shiden.clone(), + assets.midnight_forest.clone(), + ]; + bgms.shuffle(&mut rng); + bgms.pop().unwrap() + } + })); + } +} + +/// 現状は StateScopedですべてのエンティティが削除されるので以下のコードは不要ですが、 +/// 今後レベルのシームレスなスポーンを実装する場合は、以下のようなコードが必要になるかも +#[allow(dead_code)] +fn despawn_level( + commands: &mut Commands, + collider_query: &Query>, + world_tile: &Query>, +) { + for entity in world_tile { + commands.entity(entity).despawn_recursive(); + } + for entity in collider_query { + commands.entity(entity).despawn_recursive(); + } +} + +fn spawn_level( + mut commands: &mut Commands, + level_aseprites: &Res>, + images: &Res>, + assets: &Res, + life_bar_res: &Res, + level: GameLevel, +) -> LevelChunk { + let level_slice = match level { + GameLevel::Level(level) => &format!("level{}", level % LEVELS), + GameLevel::MultiPlayArena => "multiplay_arena", + }; + + let level_aseprite = level_aseprites.get(assets.level.id()).unwrap(); + let level_image = images.get(level_aseprite.atlas_image.id()).unwrap(); + let slice = level_aseprite.slices.get(level_slice).unwrap(); + + info!( + "bounds min_x:{} max_x:{} min_y:{} max_y:{}", + slice.rect.min.x, slice.rect.max.x, slice.rect.min.y, slice.rect.max.y + ); + + let chunk = image_to_tilemap( + &level_image, + slice.rect.min.x as i32, + slice.rect.max.x as i32, + slice.rect.min.y as i32, + slice.rect.max.y as i32, + ); + + let mut empties = image_to_spawn_tiles(&chunk); + + spawn_world_tilemap(&mut commands, &assets, &chunk); + + spawn_wall_collisions(&mut commands, &chunk); + + spawn_entities(&mut commands, &assets, &life_bar_res, &chunk); + + if 30 < empties.len() { + for _ in 0..10 { + let (x, y) = random_select_mut(&mut empties); + spawn_slime( + &mut commands, + &assets, + Vec2::new( + TILE_SIZE * x as f32 + TILE_HALF, + TILE_SIZE * -y as f32 - TILE_HALF, + ), + &life_bar_res, + 0, + 2, + ActorGroup::Enemy, + None, + ); + } + + for _ in 0..10 { + let (x, y) = random_select_mut(&mut empties); + spawn_eyeball( + &mut commands, + &assets, + Vec2::new( + TILE_SIZE * x as f32 + TILE_HALF, + TILE_SIZE * -y as f32 - TILE_HALF, + ), + &life_bar_res, + ActorGroup::Enemy, + ); + } + + let mut rng = rand::thread_rng(); + for _ in 0..3 { + let (x, y) = random_select_mut(&mut empties); + let spell = SpellType::iter().choose(&mut rng).unwrap(); + spawn_dropped_item( + &mut commands, + &assets, + Vec2::new( + TILE_SIZE * x as f32 + TILE_HALF, + TILE_SIZE * -y as f32 - TILE_HALF, + ), + InventoryItem { + item_type: InventoryItemType::Spell(spell), + price: 0, + }, + ); + } + } + + return chunk; +} + +fn spawn_world_tilemap(commands: &mut Commands, assets: &Res, chunk: &LevelChunk) { + // 床と壁の生成 + for y in chunk.min_y..chunk.max_y as i32 { + for x in chunk.min_x..chunk.max_x as i32 { + let r = rand::random::() % 3; + let slice = format!("stone_tile{}", r); + + match chunk.get_tile(x, y) { + Tile::StoneTile => { + commands.spawn(( + WorldTile, + Name::new("stone_tile"), + StateScoped(GameState::InGame), + Transform::from_translation(Vec3::new( + x as f32 * TILE_SIZE, + y as f32 * -TILE_SIZE, + FLOOR_LAYER_Z, + )), + AseSpriteSlice { + aseprite: assets.atlas.clone(), + name: slice.into(), + }, + )); + } + Tile::Wall => { + let tx = x as f32 * TILE_SIZE; + let ty = y as f32 * -TILE_SIZE; + let tz = ENTITY_LAYER_Z + (-ty * Z_ORDER_SCALE); + + // 壁 + if !chunk.equals(x as i32, y as i32 + 1, Tile::Wall) { + commands.spawn(( + WorldTile, + Name::new("wall"), + StateScoped(GameState::InGame), + Transform::from_translation(Vec3::new(tx, ty - TILE_HALF, tz)), + AseSpriteSlice { + aseprite: assets.atlas.clone(), + name: "stone wall".into(), + }, + )); + } + + // // 天井 + if false + || chunk.is_empty(x - 1, y - 1) + || chunk.is_empty(x + 0, y - 1) + || chunk.is_empty(x + 1, y - 1) + || chunk.is_empty(x - 1, y + 0) + || chunk.is_empty(x + 0, y + 0) + || chunk.is_empty(x + 1, y + 0) + || chunk.is_empty(x - 1, y + 1) + || chunk.is_empty(x + 0, y + 1) + || chunk.is_empty(x + 1, y + 1) + { + spawn_roof_tiles(commands, assets, &chunk, x, y) + } + } + _ => {} + } + } + } +} + +fn spawn_entities( + mut commands: &mut Commands, + assets: &Res, + life_bar_resource: &Res, + chunk: &LevelChunk, +) { + // エンティティの生成 + for (entity, x, y) in &chunk.entities { + let tx = TILE_SIZE * *x as f32; + let ty = TILE_SIZE * -*y as f32; + match entity { + GameEntity::BookShelf => { + spawn_book_shelf( + &mut commands, + assets.atlas.clone(), + tx + TILE_SIZE, + ty - TILE_HALF, + ); + } + GameEntity::Chest => { + spawn_chest( + &mut commands, + assets.atlas.clone(), + tx + TILE_HALF, + ty - TILE_HALF, + ChestType::Chest, + ); + } + GameEntity::Crate => { + spawn_chest( + &mut commands, + assets.atlas.clone(), + tx + TILE_HALF, + ty - TILE_HALF, + ChestType::Crate, + ); + } + GameEntity::CrateOrBarrel => { + spawn_chest( + &mut commands, + assets.atlas.clone(), + tx + TILE_HALF, + ty - TILE_HALF, + *CHEST_OR_BARREL + .iter() + .choose(&mut rand::thread_rng()) + .unwrap(), + ); + } + GameEntity::MagicCircle => { + spawn_magic_circle( + &mut commands, + &assets, + tx + TILE_HALF, + ty - TILE_HALF, + MagicCircleDestination::NextLevel, + ); + } + GameEntity::MagicCircleHome => { + spawn_magic_circle( + &mut commands, + &assets, + tx + TILE_HALF, + ty - TILE_HALF, + MagicCircleDestination::Home, + ); + } + GameEntity::MultiPlayArenaMagicCircle => { + spawn_magic_circle( + &mut commands, + &assets, + tx + TILE_HALF, + ty - TILE_HALF, + MagicCircleDestination::MultiplayArena, + ); + } + GameEntity::BrokenMagicCircle => { + spawn_broken_magic_circle( + &mut commands, + assets.atlas.clone(), + tx + TILE_HALF, + ty - TILE_HALF, + ); + } + GameEntity::StoneLantern => { + spawn_stone_lantern(&mut commands, &assets, tx + TILE_HALF, ty - TILE_HALF); + } + GameEntity::Usage => { + commands.spawn(( + Name::new("usage"), + Transform::from_translation(Vec3::new(tx, ty, PAINT_LAYER_Z)), + Sprite { + color: Color::hsla(0.0, 0.0, 1.0, 0.7), + ..default() + }, + AseSpriteSlice { + aseprite: assets.atlas.clone(), + name: "usage".into(), + }, + )); + } + GameEntity::Routes => { + commands.spawn(( + Name::new("routes"), + Transform::from_translation(Vec3::new(tx, ty, PAINT_LAYER_Z)), + Sprite { + color: Color::hsla(0.0, 0.0, 1.0, 0.7), + ..default() + }, + AseSpriteSlice { + aseprite: assets.atlas.clone(), + name: "routes".into(), + }, + )); + } + GameEntity::Spell => { + let mut rng = rand::thread_rng(); + if 0.5 < rand::random::() { + let spell = SpellType::iter().choose(&mut rng).unwrap(); + let props = spell.to_props(); + spawn_dropped_item( + &mut commands, + &assets, + Vec2::new(tx + TILE_HALF, ty - TILE_HALF), + InventoryItem { + item_type: InventoryItemType::Spell(spell), + price: props.price, + }, + ); + } else { + let mut rng = rand::thread_rng(); + let equipment = EquipmentType::iter().choose(&mut rng).unwrap(); + let props = equipment.to_props(); + spawn_dropped_item( + &mut commands, + &assets, + Vec2::new(tx + TILE_HALF, ty - TILE_HALF), + InventoryItem { + item_type: InventoryItemType::Equipment(equipment), + price: props.price, + }, + ); + } + } + GameEntity::HugeSlime => { + spawn_huge_slime( + &mut commands, + &assets, + Vec2::new(tx + TILE_HALF, ty - TILE_HALF), + ); + } + GameEntity::ShopRabbit => { + spawn_rabbit( + &mut commands, + &assets, + &assets.rabbit_yellow, + Vec2::new(tx + TILE_HALF, ty - TILE_HALF), + ShopRabbit, + ShopRabbitSensor, + ShopRabbitOuterSensor, + ); + } + GameEntity::TrainingRabbit => { + spawn_rabbit( + &mut commands, + &assets, + &assets.rabbit_red, + Vec2::new(tx + TILE_HALF, ty - TILE_HALF), + MessageRabbit { + message: TRAINING_RABBIT.to_string(), + }, + MessageRabbitInnerSensor, + MessageRabbitOuterSensor, + ); + } + GameEntity::SinglePlayRabbit => { + spawn_rabbit( + &mut commands, + &assets, + &assets.rabbit_white, + Vec2::new(tx + TILE_HALF, ty - TILE_HALF), + MessageRabbit { + message: SINGLEPLAY.to_string(), + }, + MessageRabbitInnerSensor, + MessageRabbitOuterSensor, + ); + } + GameEntity::GuideRabbit => { + spawn_rabbit( + &mut commands, + &assets, + &assets.rabbit_blue, + Vec2::new(tx + TILE_HALF, ty - TILE_HALF), + MessageRabbit { + message: HELLO.to_string(), + }, + MessageRabbitInnerSensor, + MessageRabbitOuterSensor, + ); + } + GameEntity::MultiplayerRabbit => { + spawn_rabbit( + &mut commands, + &assets, + &assets.rabbit_black, + Vec2::new(tx + TILE_HALF, ty - TILE_HALF), + MessageRabbit { + message: MULTIPLAY.to_string(), + }, + MessageRabbitInnerSensor, + MessageRabbitOuterSensor, + ); + } + GameEntity::ReadingRabbit => { + spawn_rabbit( + &mut commands, + &assets, + &assets.rabbit_green, + Vec2::new(tx + TILE_HALF, ty - TILE_HALF), + MessageRabbit { + message: WITCHES_ARE.to_string(), + }, + MessageRabbitInnerSensor, + MessageRabbitOuterSensor, + ); + } + GameEntity::Sandbug => { + spawn_sandbag( + &mut commands, + &assets, + Vec2::new(tx + TILE_HALF, ty - TILE_HALF), + life_bar_resource, + ); + } + GameEntity::ShopDoor => { + spawn_shop_door( + &mut commands, + &assets, + Vec2::new(tx + TILE_HALF, ty - TILE_HALF), + ); + } + GameEntity::BGM => { + spawn_bgm_switch( + &mut commands, + &assets, + Vec2::new(tx + TILE_HALF, ty - TILE_HALF), + ); + } + } + } +} + +pub fn level_to_name(level: GameLevel) -> Dict<&'static str> { + match level { + GameLevel::Level(0) => LEVEL0, + GameLevel::Level(1) => LEVEL1, + GameLevel::Level(2) => LEVEL2, + GameLevel::Level(3) => LEVEL3, + GameLevel::MultiPlayArena => MULTIPLAY_ARENA, + _ => UNKNOWN_LEVEL, + } +} + +pub struct WorldPlugin; + +impl Plugin for WorldPlugin { + fn build(&self, app: &mut App) { + app.add_systems(OnEnter(GameState::InGame), setup_level); + app.add_systems(OnEnter(GameState::InGame), select_level_bgm); + app.init_resource::(); + } +} diff --git a/src/page/main_menu.rs b/src/page/main_menu.rs index 427830ca..5fb2d064 100644 --- a/src/page/main_menu.rs +++ b/src/page/main_menu.rs @@ -1,15 +1,15 @@ +use crate::asset::GameAssets; use crate::audio::NextBGM; use crate::config::GameConfig; use crate::constant::HUD_Z_INDEX; use crate::hud::overlay::OverlayEvent; use crate::language::Languages; -use crate::level::CurrentLevel; -use crate::se::{SEEvent, SE}; +use crate::page::in_game::CurrentLevel; +use crate::se::SEEvent; +use crate::se::SE; +use crate::states::GameState; +use crate::states::MainMenuPhase; use crate::ui::on_press::OnPress; -use crate::{ - asset::GameAssets, - states::{GameState, MainMenuPhase}, -}; use bevy::core::FrameCount; use bevy::prelude::*; use bevy_aseprite_ultra::prelude::*; diff --git a/src/page/name_input.rs b/src/page/name_input.rs index 7817948b..24cc68ce 100644 --- a/src/page/name_input.rs +++ b/src/page/name_input.rs @@ -1,18 +1,20 @@ +use crate::asset::GameAssets; use crate::audio::NextBGM; use crate::config::GameConfig; use crate::hud::overlay::OverlayEvent; use crate::language::Dict; -use crate::se::{SEEvent, SE}; +use crate::se::SEEvent; +use crate::se::SE; +use crate::states::GameState; +use crate::states::MainMenuPhase; use crate::ui::menu_button::menu_button; -use crate::{ - asset::GameAssets, - states::{GameState, MainMenuPhase}, -}; use bevy::ecs::system::SystemId; use bevy::prelude::*; -use bevy_simple_text_input::{ - TextInput, TextInputSettings, TextInputTextColor, TextInputTextFont, TextInputValue, -}; +use bevy_simple_text_input::TextInput; +use bevy_simple_text_input::TextInputSettings; +use bevy_simple_text_input::TextInputTextColor; +use bevy_simple_text_input::TextInputTextFont; +use bevy_simple_text_input::TextInputValue; const BORDER_COLOR_ACTIVE: Color = Color::srgb(0.75, 0.52, 0.99); const TEXT_COLOR: Color = Color::srgb(0.9, 0.9, 0.9); diff --git a/src/page/setup.rs b/src/page/setup.rs index 6898cfcb..98387d26 100644 --- a/src/page/setup.rs +++ b/src/page/setup.rs @@ -1,4 +1,5 @@ -use crate::{constant::LOADING_Z_INDEX, states::GameState}; +use crate::constant::LOADING_Z_INDEX; +use crate::states::GameState; use bevy::prelude::*; fn setup(mut commands: Commands, asset_server: Res) { diff --git a/src/page/warp.rs b/src/page/warp.rs index 1c5bd240..c596444e 100644 --- a/src/page/warp.rs +++ b/src/page/warp.rs @@ -1,8 +1,7 @@ -use crate::{ - hud::overlay::OverlayEvent, - level::{CurrentLevel, GameLevel}, - states::GameState, -}; +use crate::hud::overlay::OverlayEvent; +use crate::page::in_game::CurrentLevel; +use crate::page::in_game::GameLevel; +use crate::states::GameState; use bevy::prelude::*; fn setup( diff --git a/src/physics.rs b/src/physics.rs index f3a80127..3053745c 100644 --- a/src/physics.rs +++ b/src/physics.rs @@ -1,8 +1,9 @@ -use std::cmp::Ordering; - use crate::states::GameState; use bevy::prelude::*; -use bevy_rapier2d::plugin::{DefaultRapierContext, PhysicsSet, RapierConfiguration}; +use bevy_rapier2d::plugin::DefaultRapierContext; +use bevy_rapier2d::plugin::PhysicsSet; +use bevy_rapier2d::plugin::RapierConfiguration; +use std::cmp::Ordering; #[derive(Resource)] pub struct GamePhysics { diff --git a/src/player_state.rs b/src/player_state.rs index 2cd99577..310ced48 100644 --- a/src/player_state.rs +++ b/src/player_state.rs @@ -1,17 +1,18 @@ +use crate::config::GameConfig; +use crate::constant::MAX_ITEMS_IN_EQUIPMENT; +use crate::constant::MAX_WANDS; +use crate::controller::player::Equipment; +use crate::controller::player::Player; +use crate::entity::actor::Actor; +use crate::entity::life::Life; +use crate::equipment::EquipmentType; +use crate::inventory::Inventory; +use crate::spell::SpellType; +use crate::wand::Wand; +use crate::wand::WandSpell; +use crate::wand::WandType; use bevy::ecs::query::QuerySingleError; -use crate::{ - config::GameConfig, - constant::{MAX_ITEMS_IN_EQUIPMENT, MAX_WANDS}, - controller::player::{Equipment, Player}, - entity::{actor::Actor, life::Life}, - equipment::EquipmentType, - inventory::Inventory, - inventory_item::InventoryItemType, - spell::SpellType, - wand::{Wand, WandSpell, WandType}, -}; - #[derive(Debug, Clone)] pub struct PlayerState { pub name: String, diff --git a/src/se.rs b/src/se.rs index 8faa8f9f..e853bc90 100644 --- a/src/se.rs +++ b/src/se.rs @@ -1,5 +1,8 @@ -use crate::{asset::GameAssets, audio::play_se, config::GameConfig}; -use bevy::{prelude::*, utils::hashbrown::HashSet}; +use crate::asset::GameAssets; +use crate::audio::play_se; +use crate::config::GameConfig; +use bevy::prelude::*; +use bevy::utils::hashbrown::HashSet; use bevy_rapier2d::plugin::PhysicsSet; use std::cmp::Ordering; diff --git a/src/speech_bubble.rs b/src/speech_bubble.rs index b4a12dff..adc025ad 100644 --- a/src/speech_bubble.rs +++ b/src/speech_bubble.rs @@ -1,7 +1,8 @@ use crate::asset::GameAssets; use crate::config::GameConfig; use crate::language::Dict; -use crate::se::{SEEvent, SE}; +use crate::se::SEEvent; +use crate::se::SE; use crate::states::GameState; use bevy::prelude::*; use bevy::text::FontSmoothing; diff --git a/src/spell.rs b/src/spell.rs index ebe79930..185a885e 100644 --- a/src/spell.rs +++ b/src/spell.rs @@ -1,5 +1,7 @@ +use crate::entity::servant_seed::ServantType; +use crate::language::Dict; +use crate::language::Languages; use bevy::reflect::Reflect; -use crate::{entity::servant_seed::ServantType, language::{Dict, Languages}}; #[derive(Reflect, Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, strum::EnumIter)] pub enum SpellType { @@ -20,9 +22,6 @@ pub enum SpellType { Dash, } - - - /// 呪文を詠唱したときの動作を表します /// 弾丸系魔法は Bullet にまとめられており、 /// そのほかの魔法も動作の種別によって分類されています @@ -56,8 +55,11 @@ pub enum SpellCast { }, Homing, HeavyShot, - Summon { friend: bool, servant_type: ServantType } , - Dash + Summon { + friend: bool, + servant_type: ServantType, + }, + Dash, } /// 呪文の基礎情報 @@ -129,7 +131,7 @@ impl SpellType { ja: "スライムの塊", en: "Slime Limp", }, - description: Dict { + description: Dict { ja: "ぷにぷにとした塊で殴りつけます。痛くはありませんが、相手を大きく吹き飛ばします。", en: "Slap with a soft, squishy lump. It doesn't hurt much, but it knocks the opponent backward." }, @@ -295,8 +297,7 @@ impl SpellType { }, } } -} - +} const DAMAGE: Dict<&'static str> = Dict { ja: "ダメージ", @@ -332,8 +333,6 @@ const HEAL_TEXT: Dict<&'static str> = Dict { ja: "回復", en: "Heal", }; - - pub fn get_spell_appendix(cast: SpellCast, language: Languages) -> String { match cast { @@ -372,9 +371,7 @@ pub fn get_spell_appendix(cast: SpellCast, language: Languages) -> String { SpellCast::MultipleCast { amount: _ } => format!(""), SpellCast::Homing => format!(""), SpellCast::HeavyShot => format!("威力: +5"), - SpellCast::Summon {..} => format!(""), - SpellCast::Dash {..} => format!(""), + SpellCast::Summon { .. } => format!(""), + SpellCast::Dash { .. } => format!(""), } } - - diff --git a/src/ui.rs b/src/ui.rs index 31006af4..4ee192f3 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -5,7 +5,6 @@ pub mod equipment_list; pub mod floating; pub mod hover_color; pub mod inventory; -pub mod popup; pub mod item_panel; pub mod label; pub mod menu_button; @@ -13,6 +12,7 @@ pub mod menu_left; pub mod on_press; pub mod pause_menu; pub mod player_list; +pub mod popup; pub mod range; pub mod spell_in_wand; pub mod wand_editor; diff --git a/src/ui/bar.rs b/src/ui/bar.rs index af1cb3cc..2883fabe 100644 --- a/src/ui/bar.rs +++ b/src/ui/bar.rs @@ -1,4 +1,5 @@ -use crate::{asset::GameAssets, states::GameState}; +use crate::asset::GameAssets; +use crate::states::GameState; use bevy::prelude::*; const BAR_HEIGHT: f32 = 16.0; diff --git a/src/ui/boss_hitpoint_bar.rs b/src/ui/boss_hitpoint_bar.rs index 3080e1df..3ef4a8cd 100644 --- a/src/ui/boss_hitpoint_bar.rs +++ b/src/ui/boss_hitpoint_bar.rs @@ -1,4 +1,7 @@ -use crate::{asset::GameAssets, enemy::huge_slime::Boss, entity::life::Life, states::GameState}; +use crate::asset::GameAssets; +use crate::enemy::huge_slime::Boss; +use crate::entity::life::Life; +use crate::states::GameState; use bevy::prelude::*; const BAR_WIDTH: f32 = 800.0; diff --git a/src/ui/equipment_list.rs b/src/ui/equipment_list.rs index 4e5f2b8e..4e0db857 100644 --- a/src/ui/equipment_list.rs +++ b/src/ui/equipment_list.rs @@ -1,16 +1,18 @@ -use super::item_panel::{spawn_item_panel, ItemPanel}; -use super::popup::PopUp; +use crate::asset::GameAssets; +use crate::constant::MAX_SPELLS_IN_WAND; +use crate::controller::player::Player; use crate::entity::actor::Actor; use crate::inventory::InventoryItem; use crate::inventory_item::InventoryItemType; -use crate::{ - asset::GameAssets, constant::MAX_SPELLS_IN_WAND, controller::player::Player, states::GameState, -}; -use crate::{ - states::GameMenuState, - ui::floating::{Floating, FloatingContent}, -}; -use bevy::{prelude::*, ui::Display}; +use crate::states::GameMenuState; +use crate::states::GameState; +use crate::ui::floating::Floating; +use crate::ui::floating::FloatingContent; +use crate::ui::item_panel::spawn_item_panel; +use crate::ui::item_panel::ItemPanel; +use crate::ui::popup::PopUp; +use bevy::prelude::*; +use bevy::ui::Display; #[derive(Component)] pub struct EquipmentContainer; diff --git a/src/ui/floating.rs b/src/ui/floating.rs index 54784d48..391e26e6 100644 --- a/src/ui/floating.rs +++ b/src/ui/floating.rs @@ -1,18 +1,25 @@ -use super::item_panel::{spawn_item_panel, ItemPanel}; -use crate::{ - asset::GameAssets, - constant::{MAX_SPELLS_IN_WAND, WAND_EDITOR_FLOATING_Z_INDEX}, - controller::player::{Equipment, Player}, - entity::{actor::Actor, dropped_item::spawn_dropped_item}, - hud::DropArea, - inventory::InventoryItem, - inventory_item::InventoryItemType, - level::{tile::Tile, CurrentLevel}, - se::{SEEvent, SE}, - states::{GameMenuState, GameState}, - wand::{Wand, WandSpell}, -}; -use bevy::{prelude::*, window::PrimaryWindow}; +use crate::asset::GameAssets; +use crate::constant::MAX_SPELLS_IN_WAND; +use crate::constant::WAND_EDITOR_FLOATING_Z_INDEX; +use crate::controller::player::Equipment; +use crate::controller::player::Player; +use crate::entity::actor::Actor; +use crate::entity::dropped_item::spawn_dropped_item; +use crate::hud::DropArea; +use crate::inventory::InventoryItem; +use crate::inventory_item::InventoryItemType; +use crate::level::tile::Tile; +use crate::page::in_game::CurrentLevel; +use crate::se::SEEvent; +use crate::se::SE; +use crate::states::GameMenuState; +use crate::states::GameState; +use crate::ui::item_panel::spawn_item_panel; +use crate::ui::item_panel::ItemPanel; +use crate::wand::Wand; +use crate::wand::WandSpell; +use bevy::prelude::*; +use bevy::window::PrimaryWindow; #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)] pub enum FloatingContent { diff --git a/src/ui/inventory.rs b/src/ui/inventory.rs index a8b6b8f5..912bf15d 100644 --- a/src/ui/inventory.rs +++ b/src/ui/inventory.rs @@ -3,8 +3,10 @@ use crate::constant::MAX_ITEMS_IN_INVENTORY; use crate::controller::player::Player; use crate::entity::actor::Actor; use crate::states::GameState; -use crate::ui::floating::{Floating, FloatingContent}; -use crate::ui::item_panel::{spawn_item_panel, ItemPanel}; +use crate::ui::floating::Floating; +use crate::ui::floating::FloatingContent; +use crate::ui::item_panel::spawn_item_panel; +use crate::ui::item_panel::ItemPanel; use crate::ui::popup::PopUp; use bevy::prelude::*; use bevy_aseprite_ultra::prelude::*; diff --git a/src/ui/item_panel.rs b/src/ui/item_panel.rs index ae51bf69..4a05c162 100644 --- a/src/ui/item_panel.rs +++ b/src/ui/item_panel.rs @@ -1,7 +1,8 @@ +use crate::asset::GameAssets; use crate::inventory::InventoryItem; use crate::inventory_item::InventoryItemType; use crate::spell::SpellType; -use crate::{asset::GameAssets, states::GameState}; +use crate::states::GameState; use bevy::prelude::*; use bevy_aseprite_ultra::prelude::*; diff --git a/src/ui/menu_left.rs b/src/ui/menu_left.rs index 66051d0c..1f0f72c7 100644 --- a/src/ui/menu_left.rs +++ b/src/ui/menu_left.rs @@ -1,7 +1,7 @@ +use crate::states::GameMenuState; +use crate::states::GameState; use bevy::prelude::*; -use crate::states::{GameMenuState, GameState}; - #[derive(Component)] pub struct MenuLeft { left: f32, diff --git a/src/ui/pause_menu.rs b/src/ui/pause_menu.rs index 675d8006..d03ef658 100644 --- a/src/ui/pause_menu.rs +++ b/src/ui/pause_menu.rs @@ -1,15 +1,19 @@ -use super::label::spawn_label; +use crate::asset::GameAssets; use crate::config::GameConfig; use crate::constant::GAME_MENU_Z_INDEX; use crate::hud::overlay::OverlayEvent; -use crate::language::{Dict, Languages}; -use crate::level::{CurrentLevel, GameLevel}; +use crate::language::Dict; +use crate::language::Languages; +use crate::page::in_game::CurrentLevel; +use crate::page::in_game::GameLevel; use crate::physics::GamePhysics; -use crate::se::{SEEvent, SE}; +use crate::se::SEEvent; +use crate::se::SE; use crate::states::GameMenuState; +use crate::states::GameState; +use crate::ui::label::spawn_label; use crate::ui::menu_button::menu_button; use crate::ui::range::spawn_range; -use crate::{asset::GameAssets, states::GameState}; use bevy::ecs::system::SystemId; use bevy::prelude::*; use bevy::window::WindowMode; diff --git a/src/ui/player_list.rs b/src/ui/player_list.rs index ccb9588b..f82ae422 100644 --- a/src/ui/player_list.rs +++ b/src/ui/player_list.rs @@ -1,12 +1,13 @@ -use crate::{ - asset::GameAssets, - controller::{player::Player, remote::RemotePlayer}, - entity::actor::Actor, - level::{CurrentLevel, GameLevel}, - states::GameState, -}; +use crate::asset::GameAssets; +use crate::controller::player::Player; +use crate::controller::remote::RemotePlayer; +use crate::entity::actor::Actor; +use crate::page::in_game::CurrentLevel; +use crate::page::in_game::GameLevel; +use crate::states::GameState; use bevy::prelude::*; -use bevy_simple_websocket::{ReadyState, WebSocketState}; +use bevy_simple_websocket::ReadyState; +use bevy_simple_websocket::WebSocketState; #[derive(Component)] struct PlayerListRoot; diff --git a/src/ui/popup.rs b/src/ui/popup.rs index ef59ec9c..a0750ff7 100644 --- a/src/ui/popup.rs +++ b/src/ui/popup.rs @@ -1,12 +1,14 @@ +use crate::asset::GameAssets; +use crate::config::GameConfig; use crate::constant::WAND_EDITOR_Z_INDEX; use crate::controller::player::Player; use crate::entity::actor::Actor; use crate::inventory_item::InventoryItemType; use crate::spell::get_spell_appendix; +use crate::states::GameState; use crate::ui::floating::Floating; use crate::ui::floating::FloatingContent; use crate::ui::wand_editor::MENU_THEME_COLOR; -use crate::{asset::GameAssets, config::GameConfig, states::GameState}; use bevy::prelude::*; use bevy::utils::HashSet; use bevy::window::PrimaryWindow; diff --git a/src/ui/range.rs b/src/ui/range.rs index c7aab74d..f6199713 100644 --- a/src/ui/range.rs +++ b/src/ui/range.rs @@ -1,6 +1,6 @@ -use super::label::spawn_label; use crate::asset::GameAssets; use crate::language::Dict; +use crate::ui::label::spawn_label; use crate::ui::menu_button::menu_button; use bevy::ecs::system::SystemId; use bevy::prelude::*; diff --git a/src/ui/spell_in_wand.rs b/src/ui/spell_in_wand.rs index fd1e8a17..5852cad8 100644 --- a/src/ui/spell_in_wand.rs +++ b/src/ui/spell_in_wand.rs @@ -1,16 +1,15 @@ -use super::{ - floating::{Floating, FloatingContent}, - item_panel::{spawn_item_panel, ItemPanel}, - popup::PopUp, -}; -use crate::{ - asset::GameAssets, - controller::player::Player, - entity::actor::Actor, - inventory::InventoryItem, - inventory_item::InventoryItemType, - states::{GameMenuState, GameState}, -}; +use crate::asset::GameAssets; +use crate::controller::player::Player; +use crate::entity::actor::Actor; +use crate::inventory::InventoryItem; +use crate::inventory_item::InventoryItemType; +use crate::states::GameMenuState; +use crate::states::GameState; +use crate::ui::floating::Floating; +use crate::ui::floating::FloatingContent; +use crate::ui::item_panel::spawn_item_panel; +use crate::ui::item_panel::ItemPanel; +use crate::ui::popup::PopUp; use bevy::prelude::*; #[derive(Component, Debug, Clone)] diff --git a/src/ui/wand_editor.rs b/src/ui/wand_editor.rs index 2f098703..867e857f 100644 --- a/src/ui/wand_editor.rs +++ b/src/ui/wand_editor.rs @@ -1,18 +1,17 @@ -use super::{ - command_button::{command_button, CommandButton}, - floating::Floating, - inventory::{spawn_inventory, INVENTORY_IMAGE_HEIGHT}, - menu_left::MenuLeft, - popup::spawn_spell_information, -}; -use crate::{ - asset::GameAssets, - constant::WAND_EDITOR_Z_INDEX, - controller::player::Player, - entity::actor::Actor, - language::Dict, - states::{GameMenuState, GameState}, -}; +use crate::asset::GameAssets; +use crate::constant::WAND_EDITOR_Z_INDEX; +use crate::controller::player::Player; +use crate::entity::actor::Actor; +use crate::language::Dict; +use crate::states::GameMenuState; +use crate::states::GameState; +use crate::ui::command_button::command_button; +use crate::ui::command_button::CommandButton; +use crate::ui::floating::Floating; +use crate::ui::inventory::spawn_inventory; +use crate::ui::inventory::INVENTORY_IMAGE_HEIGHT; +use crate::ui::menu_left::MenuLeft; +use crate::ui::popup::spawn_spell_information; use bevy::prelude::*; #[derive(Component)] diff --git a/src/ui/wand_list.rs b/src/ui/wand_list.rs index f68a7326..2ab34bb4 100644 --- a/src/ui/wand_list.rs +++ b/src/ui/wand_list.rs @@ -1,14 +1,14 @@ use crate::asset::GameAssets; -use crate::constant::{MAX_SPELLS_IN_WAND, MAX_WANDS}; +use crate::constant::MAX_SPELLS_IN_WAND; +use crate::constant::MAX_WANDS; use crate::controller::player::Player; use crate::entity::actor::Actor; use crate::states::GameState; use crate::ui::spell_in_wand::spawn_wand_spell_slot; use crate::ui::wand_sprite::spawn_wand_sprite_in_list; -use bevy::{ - prelude::*, - ui::{Display, Node}, -}; +use bevy::prelude::*; +use bevy::ui::Display; +use bevy::ui::Node; use bevy_aseprite_ultra::prelude::AseUiSlice; #[derive(Component)] diff --git a/src/ui/wand_sprite.rs b/src/ui/wand_sprite.rs index 07ef9159..6819e18a 100644 --- a/src/ui/wand_sprite.rs +++ b/src/ui/wand_sprite.rs @@ -1,14 +1,13 @@ -use super::{ - floating::{Floating, FloatingContent}, - popup::PopUp, -}; -use crate::{ - asset::GameAssets, - controller::player::Player, - entity::actor::Actor, - states::{GameMenuState, GameState}, -}; -use bevy::{prelude::*, ui::Node}; +use crate::asset::GameAssets; +use crate::controller::player::Player; +use crate::entity::actor::Actor; +use crate::states::GameMenuState; +use crate::states::GameState; +use crate::ui::floating::Floating; +use crate::ui::floating::FloatingContent; +use crate::ui::popup::PopUp; +use bevy::prelude::*; +use bevy::ui::Node; use bevy_aseprite_ultra::prelude::*; #[derive(Component)] diff --git a/src/wand.rs b/src/wand.rs index 6e52588d..9264f4e3 100644 --- a/src/wand.rs +++ b/src/wand.rs @@ -1,4 +1,5 @@ -use crate::{constant::MAX_SPELLS_IN_WAND, spell::SpellType}; +use crate::constant::MAX_SPELLS_IN_WAND; +use crate::spell::SpellType; use bevy::reflect::Reflect; #[derive(Reflect, Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)] diff --git a/src/wand_props.rs b/src/wand_props.rs index 637ee717..3783a22d 100644 --- a/src/wand_props.rs +++ b/src/wand_props.rs @@ -1,4 +1,5 @@ -use crate::{language::Dict, wand::WandType}; +use crate::language::Dict; +use crate::wand::WandType; pub struct WandProps { pub name: Dict<&'static str>,