Skip to content
Snippets Groups Projects
Verified Commit 048ebe23 authored by Louis's avatar Louis :fire:
Browse files

Add format loading test, support converting LDTK into autotile rules

parent ef8e13d8
No related branches found
No related tags found
No related merge requests found
...@@ -2066,6 +2066,15 @@ dependencies = [ ...@@ -2066,6 +2066,15 @@ dependencies = [
"objc", "objc",
] ]
[[package]]
name = "micro_autotile"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78eda07db196df5c028f17242e7f5e9fd26efadf83d1e10d4927b56754155996"
dependencies = [
"fastrand",
]
[[package]] [[package]]
name = "micro_ldtk" name = "micro_ldtk"
version = "0.3.0-beta.1" version = "0.3.0-beta.1"
...@@ -2073,6 +2082,7 @@ dependencies = [ ...@@ -2073,6 +2082,7 @@ dependencies = [
"anyhow", "anyhow",
"bevy", "bevy",
"log", "log",
"micro_autotile",
"num-traits", "num-traits",
"quadtree_rs", "quadtree_rs",
"serde", "serde",
......
...@@ -10,9 +10,10 @@ repository = "https://lab.lcr.gr/microhacks/bevy-micro-ldtk.git" ...@@ -10,9 +10,10 @@ repository = "https://lab.lcr.gr/microhacks/bevy-micro-ldtk.git"
license = "Apache-2.0" license = "Apache-2.0"
[features] [features]
default = ["ldtk_1_2_5"] default = ["ldtk_1_2_5", "autotile"]
ldtk_1_2_5 = [] ldtk_1_2_5 = []
ldtk_1_2_4 = [] ldtk_1_2_4 = []
autotile = ["micro_autotile"]
no_panic = [] no_panic = []
[dependencies] [dependencies]
...@@ -24,4 +25,5 @@ serde = "1.0.147" ...@@ -24,4 +25,5 @@ serde = "1.0.147"
serde_json = "1.0.87" serde_json = "1.0.87"
num-traits = "0.2.15" num-traits = "0.2.15"
quadtree_rs = "0.1.2" quadtree_rs = "0.1.2"
micro_autotile = { version = "0.1.0", optional = true }
...@@ -68,6 +68,81 @@ impl AssetLoader for LdtkLoader { ...@@ -68,6 +68,81 @@ impl AssetLoader for LdtkLoader {
} }
} }
#[cfg(feature = "autotile")]
mod autotile_support {
use micro_autotile::{AutoRuleSet, AutoTileRule, TileMatcher, TileOutput, TileStatus};
use crate::ldtk::{AutoLayerRuleGroup, Project};
impl From<&AutoLayerRuleGroup> for AutoRuleSet {
fn from(value: &AutoLayerRuleGroup) -> Self {
let set = value
.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)
}
3 => {
if rule.pattern.len() == 9 {
let matcher = TileMatcher([
TileStatus::from_ldtk_value(rule.pattern[0]),
TileStatus::from_ldtk_value(rule.pattern[1]),
TileStatus::from_ldtk_value(rule.pattern[2]),
TileStatus::from_ldtk_value(rule.pattern[3]),
TileStatus::from_ldtk_value(rule.pattern[4]),
TileStatus::from_ldtk_value(rule.pattern[5]),
TileStatus::from_ldtk_value(rule.pattern[6]),
TileStatus::from_ldtk_value(rule.pattern[7]),
TileStatus::from_ldtk_value(rule.pattern[8]),
]);
let rule = AutoTileRule {
chance: rule.chance as f32,
matcher,
output: TileOutput::Random(
rule.tile_ids.iter().map(|val| val as usize).collect(),
),
};
Some(rule)
} else {
None
}
}
_ => None,
})
.collect();
AutoRuleSet(set)
}
}
impl From<&Project> for AutoRuleSet {
fn from(value: &Project) -> Self {
let mut base_set = AutoRuleSet::default();
for layers in value.defs.layers.iter() {
for rule_group in layers.auto_rule_groups.iter() {
base_set = base_set + rule_group.into();
}
}
base_set
}
}
}
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use crate::ldtk::Project; use crate::ldtk::Project;
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
"iid": "325092c0-c640-11ed-9e63-bd196e303d69", "iid": "325092c0-c640-11ed-9e63-bd196e303d69",
"jsonVersion": "1.2.5", "jsonVersion": "1.2.5",
"appBuildId": 464870, "appBuildId": 464870,
"nextUid": 9, "nextUid": 10,
"identifierStyle": "Capitalize", "identifierStyle": "Capitalize",
"toc": [], "toc": [],
"worldLayout": "Free", "worldLayout": "Free",
...@@ -61,6 +61,30 @@ ...@@ -61,6 +61,30 @@
"excludedTags": [], "excludedTags": [],
"intGridValues": [], "intGridValues": [],
"autoRuleGroups": [{ "uid": 6, "name": "flloor", "active": true, "isOptional": false, "rules": [ "autoRuleGroups": [{ "uid": 6, "name": "flloor", "active": true, "isOptional": false, "rules": [
{
"uid": 9,
"active": true,
"size": 3,
"tileIds": [3],
"chance": 1,
"breakOnMatch": true,
"pattern": [0,0,0,0,2,2,0,2,0],
"flipX": false,
"flipY": false,
"xModulo": 1,
"yModulo": 1,
"xOffset": 0,
"yOffset": 0,
"checker": "None",
"tileMode": "Single",
"pivotX": 0,
"pivotY": 0,
"outOfBoundsValue": null,
"perlinActive": false,
"perlinSeed": 2913161,
"perlinScale": 0.2,
"perlinOctaves": 2
},
{ {
"uid": 8, "uid": 8,
"active": true, "active": true,
...@@ -273,26 +297,26 @@ ...@@ -273,26 +297,26 @@
{ "px": [80,192], "src": [368,48], "f": 0, "t": 119, "d": [7,197] }, { "px": [80,192], "src": [368,48], "f": 0, "t": 119, "d": [7,197] },
{ "px": [96,192], "src": [368,48], "f": 0, "t": 119, "d": [7,198] }, { "px": [96,192], "src": [368,48], "f": 0, "t": 119, "d": [7,198] },
{ "px": [112,192], "src": [368,48], "f": 0, "t": 119, "d": [7,199] }, { "px": [112,192], "src": [368,48], "f": 0, "t": 119, "d": [7,199] },
{ "px": [144,80], "src": [16,0], "f": 0, "t": 1, "d": [8,89] },
{ "px": [160,80], "src": [16,0], "f": 0, "t": 1, "d": [8,90] },
{ "px": [176,80], "src": [16,0], "f": 0, "t": 1, "d": [8,91] },
{ "px": [192,80], "src": [16,0], "f": 0, "t": 1, "d": [8,92] }, { "px": [192,80], "src": [16,0], "f": 0, "t": 1, "d": [8,92] },
{ "px": [144,96], "src": [16,0], "f": 0, "t": 1, "d": [8,105] },
{ "px": [160,96], "src": [16,0], "f": 0, "t": 1, "d": [8,106] },
{ "px": [176,96], "src": [16,0], "f": 0, "t": 1, "d": [8,107] },
{ "px": [192,96], "src": [16,0], "f": 0, "t": 1, "d": [8,108] }, { "px": [192,96], "src": [16,0], "f": 0, "t": 1, "d": [8,108] },
{ "px": [144,112], "src": [16,0], "f": 0, "t": 1, "d": [8,121] },
{ "px": [160,112], "src": [16,0], "f": 0, "t": 1, "d": [8,122] },
{ "px": [176,112], "src": [16,0], "f": 0, "t": 1, "d": [8,123] },
{ "px": [192,112], "src": [16,0], "f": 0, "t": 1, "d": [8,124] }, { "px": [192,112], "src": [16,0], "f": 0, "t": 1, "d": [8,124] },
{ "px": [144,128], "src": [16,0], "f": 0, "t": 1, "d": [8,137] },
{ "px": [160,128], "src": [16,0], "f": 0, "t": 1, "d": [8,138] },
{ "px": [176,128], "src": [16,0], "f": 0, "t": 1, "d": [8,139] },
{ "px": [192,128], "src": [16,0], "f": 0, "t": 1, "d": [8,140] }, { "px": [192,128], "src": [16,0], "f": 0, "t": 1, "d": [8,140] },
{ "px": [144,144], "src": [16,0], "f": 0, "t": 1, "d": [8,153] }, { "px": [144,144], "src": [16,0], "f": 0, "t": 1, "d": [8,153] },
{ "px": [160,144], "src": [16,0], "f": 0, "t": 1, "d": [8,154] }, { "px": [160,144], "src": [16,0], "f": 0, "t": 1, "d": [8,154] },
{ "px": [176,144], "src": [16,0], "f": 0, "t": 1, "d": [8,155] }, { "px": [176,144], "src": [16,0], "f": 0, "t": 1, "d": [8,155] },
{ "px": [192,144], "src": [16,0], "f": 0, "t": 1, "d": [8,156] } { "px": [192,144], "src": [16,0], "f": 0, "t": 1, "d": [8,156] },
{ "px": [144,80], "src": [48,0], "f": 0, "t": 3, "d": [9,89] },
{ "px": [160,80], "src": [48,0], "f": 0, "t": 3, "d": [9,90] },
{ "px": [176,80], "src": [48,0], "f": 0, "t": 3, "d": [9,91] },
{ "px": [144,96], "src": [48,0], "f": 0, "t": 3, "d": [9,105] },
{ "px": [160,96], "src": [48,0], "f": 0, "t": 3, "d": [9,106] },
{ "px": [176,96], "src": [48,0], "f": 0, "t": 3, "d": [9,107] },
{ "px": [144,112], "src": [48,0], "f": 0, "t": 3, "d": [9,121] },
{ "px": [160,112], "src": [48,0], "f": 0, "t": 3, "d": [9,122] },
{ "px": [176,112], "src": [48,0], "f": 0, "t": 3, "d": [9,123] },
{ "px": [144,128], "src": [48,0], "f": 0, "t": 3, "d": [9,137] },
{ "px": [160,128], "src": [48,0], "f": 0, "t": 3, "d": [9,138] },
{ "px": [176,128], "src": [48,0], "f": 0, "t": 3, "d": [9,139] }
], ],
"seed": 5669822, "seed": 5669822,
"overrideTilesetUid": null, "overrideTilesetUid": null,
......
...@@ -80,5 +80,7 @@ pub use assets::{LevelIndex, TileMetadata, TilesetIndex}; ...@@ -80,5 +80,7 @@ pub use assets::{LevelIndex, TileMetadata, TilesetIndex};
pub use camera::CameraBounder; pub use camera::CameraBounder;
pub use ldtk::{LdtkLoader, LdtkProject}; pub use ldtk::{LdtkLoader, LdtkProject};
pub use map_query::{CameraBounds, MapQuery}; pub use map_query::{CameraBounds, MapQuery};
#[cfg(feature = "autotile")]
pub use micro_autotile as autotile;
pub use pregen::{write_layer_to_texture, write_map_to_texture, Rasterise}; pub use pregen::{write_layer_to_texture, write_map_to_texture, Rasterise};
pub use system::*; pub use system::*;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment