Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

count loaded external levels #2

Merged
merged 1 commit into from
Sep 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/assets/ldtk_project.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ pub struct LdtkProject {
level_map: HashMap<String, Handle<LdtkLevel>>,
/// Image used for rendering int grid colors.
int_grid_image_handle: Option<Handle<Image>>,
external_level_count: usize,
}

impl RawLevelAccessor for LdtkProject {
Expand All @@ -52,6 +53,10 @@ impl LdtkProject {
.find(|(i, l)| level_selection.is_match(i, l))
.map(|(_, l)| l)
}

pub fn get_level_count(&self) -> usize{
self.external_level_count
}
}

#[derive(Default)]
Expand All @@ -66,6 +71,7 @@ impl AssetLoader for LdtkProjectLoader {
Box::pin(async move {
let data: LdtkJson = serde_json::from_slice(bytes)?;

let mut external_level_count = 0;
let mut external_level_paths = Vec::new();
let mut level_map = HashMap::new();
let mut background_images = Vec::new();
Expand All @@ -76,6 +82,7 @@ impl AssetLoader for LdtkProjectLoader {
ldtk_path_to_asset_path(load_context.path(), external_rel_path);

external_level_paths.push(asset_path.clone());
external_level_count += 1;
level_map.insert(level.iid.clone(), load_context.get_handle(asset_path));
}
}
Expand Down Expand Up @@ -123,6 +130,7 @@ impl AssetLoader for LdtkProjectLoader {
tileset_map,
level_map,
int_grid_image_handle,
external_level_count,
};
load_context.set_default_asset(
LoadedAsset::new(ldtk_asset)
Expand Down Expand Up @@ -170,6 +178,7 @@ mod tests {
tileset_map: HashMap::default(),
level_map: HashMap::default(),
int_grid_image_handle: None,
external_level_count: 0,
};

assert_eq!(project.root_levels(), data.root_levels());
Expand Down
104 changes: 52 additions & 52 deletions src/systems.rs
Original file line number Diff line number Diff line change
Expand Up @@ -230,16 +230,13 @@ pub fn process_ldtk_levels(
ldtk_entity_map: NonSend<LdtkEntityMap>,
ldtk_int_cell_map: NonSend<LdtkIntCellMap>,
ldtk_query: Query<&Handle<LdtkProject>>,
level_query: Query<
(
Entity,
&Handle<LdtkLevel>,
&Parent,
Option<&Respawn>,
Option<&Children>,
),
Or<(Added<Handle<LdtkLevel>>, With<Respawn>)>,
>,
level_query: Query<(
Entity,
&Handle<LdtkLevel>,
&Parent,
Option<&Respawn>,
Option<&Children>,
)>,
worldly_query: Query<&Worldly>,
mut level_events: EventWriter<LevelEvent>,
ldtk_settings: Res<LdtkSettings>,
Expand All @@ -259,49 +256,52 @@ pub fn process_ldtk_levels(
if !already_processed {
if let Ok(ldtk_handle) = ldtk_query.get(parent.get()) {
if let Some(ldtk_asset) = ldtk_assets.get(ldtk_handle) {
// Commence the spawning
let tileset_definition_map: HashMap<i32, &TilesetDefinition> = ldtk_asset
.data()
.defs
.tilesets
.iter()
.map(|t| (t.uid, t))
.collect();

let entity_definition_map =
create_entity_definition_map(&ldtk_asset.data().defs.entities);

let layer_definition_map =
create_layer_definition_map(&ldtk_asset.data().defs.layers);

let int_grid_image_handle = &ldtk_asset.int_grid_image_handle();

let worldly_set = worldly_query.iter().cloned().collect();

if let Some(level) = level_assets.get(level_handle) {
spawn_level(
level,
&mut commands,
&asset_server,
&images,
&mut texture_atlases,
&ldtk_entity_map,
&ldtk_int_cell_map,
&entity_definition_map,
&layer_definition_map,
ldtk_asset.tileset_map(),
&tileset_definition_map,
int_grid_image_handle,
worldly_set,
ldtk_entity,
&ldtk_settings,
);
level_events
.send(LevelEvent::Spawned(LevelIid::new(level.data().iid.clone())));
}
let fully_loaded = level_assets.ids().count() >= ldtk_asset.get_level_count();
if fully_loaded {
// Commence the spawning
let tileset_definition_map: HashMap<i32, &TilesetDefinition> = ldtk_asset
.data()
.defs
.tilesets
.iter()
.map(|t| (t.uid, t))
.collect();

let entity_definition_map =
create_entity_definition_map(&ldtk_asset.data().defs.entities);

let layer_definition_map =
create_layer_definition_map(&ldtk_asset.data().defs.layers);

let int_grid_image_handle = &ldtk_asset.int_grid_image_handle();

let worldly_set = worldly_query.iter().cloned().collect();

if let Some(level) = level_assets.get(level_handle) {
spawn_level(
level,
&mut commands,
&asset_server,
&images,
&mut texture_atlases,
&ldtk_entity_map,
&ldtk_int_cell_map,
&entity_definition_map,
&layer_definition_map,
ldtk_asset.tileset_map(),
&tileset_definition_map,
int_grid_image_handle,
worldly_set,
ldtk_entity,
&ldtk_settings,
);
level_events
.send(LevelEvent::Spawned(LevelIid::new(level.data().iid.clone())));
}

if respawn.is_some() {
commands.entity(ldtk_entity).remove::<Respawn>();
if respawn.is_some() {
commands.entity(ldtk_entity).remove::<Respawn>();
}
}
}
}
Expand Down