|
1 |
| -use bevy::prelude::*; |
| 1 | +use super::FLOOR_AMOUNT; |
| 2 | +use crate::resources::MapAssets; |
| 3 | +use avian3d::prelude::*; |
| 4 | +use bevy::{prelude::*, utils::HashMap}; |
2 | 5 | use bevy_rand::prelude::*;
|
3 |
| -use rand::Rng; |
| 6 | +use rand::prelude::*; |
| 7 | + |
| 8 | +#[derive(Resource, Default)] |
| 9 | +pub struct ObjectPool { |
| 10 | + available_rooms: HashMap<RoomType, Vec<Entity>>, |
| 11 | + pub active_rooms: HashMap<usize, Entity>, |
| 12 | +} |
| 13 | + |
| 14 | +impl ObjectPool { |
| 15 | + pub fn get_or_spawn( |
| 16 | + &mut self, |
| 17 | + room_index: usize, |
| 18 | + room: &Room, |
| 19 | + commands: &mut Commands, |
| 20 | + map_assets: &Res<MapAssets>, |
| 21 | + transform: Transform, |
| 22 | + ) -> Entity { |
| 23 | + // Check if the room is already active |
| 24 | + if let Some(&entity) = self.active_rooms.get(&room_index) { |
| 25 | + // Update the transform if the room is already active |
| 26 | + commands.entity(entity).insert(transform); |
| 27 | + return entity; |
| 28 | + } |
| 29 | + |
| 30 | + // Get the available rooms list, or create an empty list if none exists |
| 31 | + let available_rooms = self.available_rooms.entry(room.kind).or_default(); |
| 32 | + |
| 33 | + let entity = if let Some(entity) = available_rooms.pop() { |
| 34 | + commands.entity(entity).insert(transform); |
| 35 | + entity |
| 36 | + } else { |
| 37 | + // Spawn a new entity if none are available |
| 38 | + let scene = match room.kind { |
| 39 | + RoomType::Map => map_assets.map.clone(), |
| 40 | + RoomType::Map0 => map_assets.map0.clone(), |
| 41 | + RoomType::Map1 => map_assets.map1.clone(), |
| 42 | + RoomType::Map2 => map_assets.map2.clone(), |
| 43 | + RoomType::Map3 => map_assets.map3.clone(), |
| 44 | + RoomType::Map4 => map_assets.map4.clone(), |
| 45 | + RoomType::Map5 => map_assets.map5.clone(), |
| 46 | + RoomType::Map6 => map_assets.map6.clone(), |
| 47 | + RoomType::Maze => map_assets.map7.clone(), |
| 48 | + }; |
| 49 | + |
| 50 | + let new_entity = commands |
| 51 | + .spawn(( |
| 52 | + SceneBundle { |
| 53 | + scene, |
| 54 | + transform, |
| 55 | + ..default() |
| 56 | + }, |
| 57 | + ColliderConstructorHierarchy::new(Some(ColliderConstructor::TrimeshFromMesh)), |
| 58 | + RigidBody::Static, |
| 59 | + )) |
| 60 | + .id(); |
| 61 | + new_entity |
| 62 | + }; |
| 63 | + |
| 64 | + // Mark this room as active |
| 65 | + self.active_rooms.insert(room_index, entity); |
| 66 | + entity |
| 67 | + } |
| 68 | + |
| 69 | + pub fn release(&mut self, room_index: usize, room_type: RoomType) { |
| 70 | + if let Some(entity) = self.active_rooms.remove(&room_index) { |
| 71 | + self.available_rooms |
| 72 | + .entry(room_type) |
| 73 | + .or_default() |
| 74 | + .push(entity); |
| 75 | + } |
| 76 | + } |
| 77 | +} |
4 | 78 |
|
5 | 79 | #[derive(PartialEq, Eq, Default, Clone, Copy, Debug)]
|
6 | 80 | pub enum FloorAction {
|
@@ -57,15 +131,17 @@ pub struct Map {
|
57 | 131 | pub rooms: Vec<Room>,
|
58 | 132 | }
|
59 | 133 |
|
60 |
| -impl Map { |
61 |
| - pub fn new(floor_amount: usize) -> Self { |
| 134 | +impl Default for Map { |
| 135 | + fn default() -> Self { |
62 | 136 | Self {
|
63 |
| - floor_amount, |
64 |
| - floors: vec![Floor::default(); floor_amount], |
| 137 | + floor_amount: FLOOR_AMOUNT, |
| 138 | + floors: vec![Floor::default(); FLOOR_AMOUNT], |
65 | 139 | rooms: Default::default(),
|
66 | 140 | }
|
67 | 141 | }
|
| 142 | +} |
68 | 143 |
|
| 144 | +impl Map { |
69 | 145 | pub fn generate(&mut self, rng: &mut ResMut<GlobalEntropy<WyRand>>) {
|
70 | 146 | self.assign_floor_action(1, FloorAction::Proceed, 1.0);
|
71 | 147 |
|
@@ -245,34 +321,3 @@ impl Map {
|
245 | 321 | [above_room, current_room, bottom_room]
|
246 | 322 | }
|
247 | 323 | }
|
248 |
| - |
249 |
| -pub fn floor_transform(i: usize) -> Transform { |
250 |
| - let mut transform = Transform::default(); |
251 |
| - |
252 |
| - if (i as f32 / 2.0).floor() == (i as f32 / 2.0).ceil() { |
253 |
| - // parillinen |
254 |
| - transform.translation = Vec3::new(0.0, -(i as f32) * 2.0, 0.0); |
255 |
| - } else { |
256 |
| - // pariton |
257 |
| - transform.rotate_y(f32::to_radians(180.0)); |
258 |
| - transform.translation = Vec3::new(8.0, -(i as f32) * 2.0, 7.0); |
259 |
| - } |
260 |
| - |
261 |
| - transform |
262 |
| -} |
263 |
| - |
264 |
| -pub fn room_label_transform(i: usize) -> Transform { |
265 |
| - let mut transform = Transform { |
266 |
| - rotation: Quat::from_rotation_x(f32::to_radians(-90.0)), |
267 |
| - ..default() |
268 |
| - }; |
269 |
| - |
270 |
| - if (i as f32 / 2.0).floor() == (i as f32 / 2.0).ceil() { |
271 |
| - transform.translation = Vec3::new(-0.24, -(i as f32) * 2.0 - 0.6, 0.5); |
272 |
| - transform.rotate_y(f32::to_radians(180.0)); |
273 |
| - } else { |
274 |
| - transform.translation = Vec3::new(7.4 + 0.6 + 0.24, -(i as f32) * 2.0 - 0.6, 6.0 + 0.5); |
275 |
| - } |
276 |
| - |
277 |
| - transform |
278 |
| -} |
|
0 commit comments