Skip to content
Snippets Groups Projects
handlers.rs 1.50 KiB
use bevy::math::uvec2;
use bevy::prelude::*;

use crate::assets::AssetHandles;
use crate::entities::lifecycle::GameEntity;
use crate::entities::spawner::EntitySpawner;
use crate::system::graphics::LAYER_TILE;
use crate::world::adjacency::get_floor_sprite_offset;
use crate::world::level_map::{GridPosition, Indexer, LevelMap, Tile, WORLD_TILE_SIZE};

pub fn spawn_new_world(
	mut commands: Commands,
	assets: Res<AssetHandles>,
	mut spawner: EntitySpawner,
	query: Query<(Entity, &LevelMap), Added<LevelMap>>,
) {
	for (entity, map) in &query {
		let mut cmds = commands.entity(entity);
		for (idx, layer) in map.layers.iter().enumerate() {
			cmds.with_children(|layer_cmds| {
				let indexer = Indexer::new(layer.width, layer.height);
				for (idx, tile) in layer.tiles.iter().enumerate() {
					if let Some(data) = tile {
						let (x, y) = indexer.reverse(idx);
						layer_cmds
							.spawn_bundle(SpriteSheetBundle {
								texture_atlas: assets.atlas("environs"),
								sprite: TextureAtlasSprite::new(
									layer.layer_type.transform_adjacency(
										data.tile_group,
										layer.get_tile_adjacency(x, y),
									),
								),
								transform: Transform::from_xyz(
									x as f32 * WORLD_TILE_SIZE,
									y as f32 * WORLD_TILE_SIZE,
									LAYER_TILE + (idx as f32 / 100.0),
								),
								..Default::default()
							})
							.insert(GameEntity)
							.insert(Tile)
							.insert(GridPosition(uvec2(x as u32, y as u32)));
					}
				}
			});
		}

		spawner.spawn_player(map.spawn);
	}
}