From dec7660f10610e9f34bcf1c7e26fd4c6f276de50 Mon Sep 17 00:00:00 2001
From: Louis Capitanchik <contact@louiscap.co>
Date: Sat, 20 Jan 2024 17:32:41 +0000
Subject: [PATCH] Handle version difference in autorule tile ids

---
 Cargo.toml      | 32 +++++++++++++++--------------
 src/ldtk/mod.rs | 44 ++++++++++++++++++++++++----------------
 src/lib.rs      | 53 +++----------------------------------------------
 3 files changed, 47 insertions(+), 82 deletions(-)

diff --git a/Cargo.toml b/Cargo.toml
index da3cfa9..6b229b0 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -12,23 +12,25 @@ license = "Apache-2.0"
 
 [features]
 default = ["ldtk_1_5_3", "autotile"]
-ldtk_1_5_3 = ["_supports_intgridgroup"]
-ldtk_1_4_1 = ["_supports_intgridgroup"]
-ldtk_1_4_0 = ["_supports_intgridgroup"]
-ldtk_1_3_0 = []
-ldtk_1_2_5 = []
-ldtk_1_2_4 = []
-ldtk_1_2_3 = []
-ldtk_1_2_2 = []
-ldtk_1_2_1 = []
-ldtk_1_2_0 = []
-ldtk_1_1_3 = []
-ldtk_1_1_2 = []
-ldtk_1_1_1 = []
-ldtk_1_1_0 = []
-ldtk_1_0_0 = []
+ldtk_1_5_3 = ["_supports_ldtk", "_supports_intgridgroup", "_optional_tile_list"]
+ldtk_1_4_1 = ["_supports_ldtk", "_supports_intgridgroup"]
+ldtk_1_4_0 = ["_supports_ldtk", "_supports_intgridgroup"]
+ldtk_1_3_0 = ["_supports_ldtk"]
+ldtk_1_2_5 = ["_supports_ldtk"]
+ldtk_1_2_4 = ["_supports_ldtk"]
+ldtk_1_2_3 = ["_supports_ldtk"]
+ldtk_1_2_2 = ["_supports_ldtk"]
+ldtk_1_2_1 = ["_supports_ldtk"]
+ldtk_1_2_0 = ["_supports_ldtk"]
+ldtk_1_1_3 = ["_supports_ldtk"]
+ldtk_1_1_2 = ["_supports_ldtk"]
+ldtk_1_1_1 = ["_supports_ldtk"]
+ldtk_1_1_0 = ["_supports_ldtk"]
+ldtk_1_0_0 = ["_supports_ldtk"]
 autotile = ["micro_autotile"]
 _supports_intgridgroup = []
+_supports_ldtk = []
+_optional_tile_list = []
 no_panic = []
 
 [dependencies]
diff --git a/src/ldtk/mod.rs b/src/ldtk/mod.rs
index 2e3704d..3390ee0 100644
--- a/src/ldtk/mod.rs
+++ b/src/ldtk/mod.rs
@@ -45,6 +45,8 @@ pub use data_1_2_5::*;
 pub use data_1_3_0::*;
 #[cfg(any(feature = "ldtk_1_4_1", feature = "ldtk_1_4_0"))]
 pub use data_1_4_0::*;
+#[cfg(any(feature = "ldtk_1_5_3"))]
+pub use data_1_5_3::*;
 use serde::Deserialize;
 
 #[derive(thiserror::Error, Debug)]
@@ -272,7 +274,23 @@ impl AssetLoader for LdtkLevelLoader {
 mod autotile_support {
 	use micro_autotile::{AutoRuleSet, AutoTileRule, TileMatcher, TileOutput, TileStatus};
 
-	use crate::ldtk::{AutoLayerRuleGroup, Project};
+	use crate::ldtk::{AutoLayerRuleDefinition, AutoLayerRuleGroup, Project};
+
+	#[cfg(feature = "_optional_tile_list")]
+	fn create_output(rule: &AutoLayerRuleDefinition) -> TileOutput {
+		TileOutput::Random(
+			rule.tile_rects_ids
+				.iter()
+				.flatten()
+				.map(|val| *val as usize)
+				.collect(),
+		)
+	}
+
+	#[cfg(not(feature = "_optional_tile_list"))]
+	fn create_output(rule: &AutoLayerRuleDefinition) -> TileOutput {
+		TileOutput::Random(rule.tile_ids.iter().map(|val| *val as usize).collect())
+	}
 
 	impl From<&AutoLayerRuleGroup> for AutoRuleSet {
 		fn from(value: &AutoLayerRuleGroup) -> Self {
@@ -280,19 +298,13 @@ mod autotile_support {
 				.rules
 				.iter()
 				.filter_map(|rule| match rule.size {
-					1 => {
-						let rule = AutoTileRule {
-							chance: rule.chance as f32,
-							output: TileOutput::Random(
-								rule.tile_ids.iter().map(|val| *val as usize).collect(),
-							),
-							matcher: TileMatcher::single_match(TileStatus::from_ldtk_value(
-								rule.pattern[0],
-							)),
-						};
-
-						Some(rule)
-					}
+					1 => Some(AutoTileRule {
+						chance: rule.chance as f32,
+						output: create_output(rule),
+						matcher: TileMatcher::single_match(TileStatus::from_ldtk_value(
+							rule.pattern[0],
+						)),
+					}),
 					3 => {
 						if rule.pattern.len() == 9 {
 							let matcher = TileMatcher([
@@ -310,9 +322,7 @@ mod autotile_support {
 							let rule = AutoTileRule {
 								chance: rule.chance as f32,
 								matcher,
-								output: TileOutput::Random(
-									rule.tile_ids.iter().map(|val| *val as usize).collect(),
-								),
+								output: create_output(rule),
 							};
 
 							Some(rule)
diff --git a/src/lib.rs b/src/lib.rs
index e36957f..718642e 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,43 +1,11 @@
-#[cfg(any(
-	feature = "ldtk_1_5_3",
-	feature = "ldtk_1_4_1",
-	feature = "ldtk_1_4_0",
-	feature = "ldtk_1_3_0",
-	feature = "ldtk_1_2_5",
-	feature = "ldtk_1_2_4",
-	feature = "ldtk_1_2_3",
-	feature = "ldtk_1_2_2",
-	feature = "ldtk_1_2_1",
-	feature = "ldtk_1_2_0",
-	feature = "ldtk_1_1_3",
-	feature = "ldtk_1_1_2",
-	feature = "ldtk_1_1_1",
-	feature = "ldtk_1_1_0",
-	feature = "ldtk_1_0_0",
-))]
+#[cfg(feature = "_supports_ldtk")]
 mod assets;
 mod camera;
 mod map_query;
 mod pregen;
 mod system;
 
-#[cfg(any(
-	feature = "ldtk_1_5_3",
-	feature = "ldtk_1_4_1",
-	feature = "ldtk_1_4_0",
-	feature = "ldtk_1_3_0",
-	feature = "ldtk_1_2_5",
-	feature = "ldtk_1_2_4",
-	feature = "ldtk_1_2_3",
-	feature = "ldtk_1_2_2",
-	feature = "ldtk_1_2_1",
-	feature = "ldtk_1_2_0",
-	feature = "ldtk_1_1_3",
-	feature = "ldtk_1_1_2",
-	feature = "ldtk_1_1_1",
-	feature = "ldtk_1_1_0",
-	feature = "ldtk_1_0_0",
-))]
+#[cfg(feature = "_supports_ldtk")]
 pub mod ldtk;
 
 pub static mut LDTK_TILE_SCALE: AtomicU32 = AtomicU32::new(32);
@@ -64,22 +32,7 @@ mod __plugin {
 	pub struct MicroLDTKPlugin;
 	impl Plugin for MicroLDTKPlugin {
 		fn build(&self, app: &mut App) {
-			#[cfg(any(
-				feature = "ldtk_1_4_1",
-				feature = "ldtk_1_4_0",
-				feature = "ldtk_1_3_0",
-				feature = "ldtk_1_2_5",
-				feature = "ldtk_1_2_4",
-				feature = "ldtk_1_2_3",
-				feature = "ldtk_1_2_2",
-				feature = "ldtk_1_2_1",
-				feature = "ldtk_1_2_0",
-				feature = "ldtk_1_1_3",
-				feature = "ldtk_1_1_2",
-				feature = "ldtk_1_1_1",
-				feature = "ldtk_1_1_0",
-				feature = "ldtk_1_0_0",
-			))]
+			#[cfg(feature = "_supports_ldtk")]
 			{
 				app.add_event::<super::system::LevelDataUpdated>()
 					.init_asset::<super::ldtk::Project>()
-- 
GitLab