use std::env;
use bevy::prelude::*;
use bevy_ecs_tiled::prelude::*;
mod helper;
fn main() {
let mut path = env::current_dir().unwrap();
path.push("exports");
path.push("properties_basic_types.json");
App::new()
.add_plugins(DefaultPlugins.build().set(ImagePlugin::default_nearest()))
.add_plugins(TiledPlugin(TiledPluginConfig {
tiled_types_export_file: Some(path),
tiled_types_filter: TiledFilter::from(
regex::RegexSet::new([
r"^properties_basic::.*",
r"^bevy_sprite::text2d::Text2d$",
r"^bevy_text::text::TextColor$",
r"^bevy_ecs::name::Name$",
])
.unwrap(),
),
}))
.add_plugins(helper::HelperPlugin)
.register_type::<Biome>()
.register_type::<SpawnPoint>()
.register_type::<Resource>()
.add_systems(Startup, startup)
.run();
}
fn startup(mut commands: Commands, asset_server: Res<AssetServer>) {
commands.spawn(Camera2d);
commands
.spawn(TiledMap(
asset_server.load("maps/hexagonal/finite_pointy_top_odd.tmx"),
))
.observe(on_add_spawn)
.observe(on_map_created);
}
#[derive(Component, Default, Debug, Reflect)]
#[reflect(Component, Default)]
struct Biome {
ty: BiomeType,
move_cost: usize,
block_line_of_sight: bool,
}
#[derive(Default, Reflect, Debug)]
#[reflect(Default)]
enum BiomeType {
#[default]
Unknown,
Plain,
Desert,
Forest,
Mountain,
Water,
}
#[derive(Component, Default, Debug, Reflect)]
#[reflect(Component, Default)]
enum SpawnPoint {
#[default]
Unknown,
Player {
color: Color,
id: u32,
other_obj: Option<Entity>,
},
Enemy(Color),
Friendly,
}
#[derive(Component, Default, Debug, Reflect)]
#[reflect(Component, Default)]
enum Resource {
#[default]
Unknown,
Wheat,
Strawberry,
Wood,
Copper,
Gold,
}
fn on_add_spawn(
add_spawn: On<Add, SpawnPoint>,
spawn_query: Query<(&SpawnPoint, &GlobalTransform)>,
mut _commands: Commands,
) {
let spawn_entity = add_spawn.event().entity;
let Ok((spawn_type, global_transform)) = spawn_query.get(spawn_entity) else {
return;
};
info!(
"New SpawnPoint [{:?} @ {:?}]",
spawn_type,
global_transform.translation()
);
match spawn_type {
SpawnPoint::Enemy(_) => {
}
SpawnPoint::Player { .. } => {
}
_ => {}
};
}
fn on_map_created(
map_created: On<TiledEvent<MapCreated>>,
map_query: Query<&TiledMapStorage, With<TiledMap>>,
tiles_query: Query<(&TilePos, Option<&Biome>, Option<&Resource>)>,
) {
let map_entity = map_created.event().origin;
let Ok(map_storage) = map_query.get(map_entity) else {
return;
};
for ((_tile_id, _tileset_id), entities_list) in map_storage.tiles() {
for tile_entity in entities_list {
let Ok((pos, biome, resource)) = tiles_query.get(*tile_entity) else {
continue;
};
if let Some(i) = biome {
info_once!("Found Biome [{:?} @ {:?}]", i, pos);
}
if let Some(i) = resource {
info_once!("Found Resource [{:?} @ {:?}]", i, pos);
}
}
}
}