# Bevy Procedural Tilemaps

This repository is a streamlined fork of [Guillaume Henaux’s `ghx_proc_gen`](https://github.com/Henauxg/ghx_proc_gen), trimmed to focus on lightweight **2D tilemap generation** with Wave Function Collapse / Model Synthesis for Bevy. The work powers the procedural-generation chapters of my upcoming Bevy game-development book—The Impatient Programmer's Guide to Bevy and Rust (Chapter 1 is already available [here](https://aibodh.com/posts/bevy-rust-game-development-chapter-1/)).

Highlights:
- Updated for Bevy **0.17**.
- Small API surface: cartesian grid helpers, rule/model builders, and a simple Bevy runner.
- Designed for layered 2D tile maps (Z layers handled by a 3D grid).
- MIT/Apache dual-licensed, preserving full credit to the original authors.

## Quickstart

```sh
cargo add bevy_procedural_tilemaps
```

```rust
use bevy::prelude::*;
use bevy_procedural_tilemaps::prelude::*;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_plugins(ProcGenSimplePlugin::<Cartesian3D, Handle<Image>>::default())
        // add your systems …
        .run();
}
```

The core building blocks come from `procedural_tilemaps_core::prelude` (re-exported through the Bevy prelude):

- `RulesBuilder`, `SocketCollection`, `ModelCollection` to describe adjacency rules.
- `GeneratorBuilder` / `Generator` to run Model Synthesis / WFC.
- `CartesianGrid`, `GridDelta`, `Direction` for cartesian grids.
- `NodesSpawner` and bundle inserters to spawn tiles in Bevy worlds.

## Example (tile layers)

The workspace ships with a single Bevy example demonstrating layered tile generation:

```
cargo run -p bevy_examples --example tile-layers
```

It stacks multiple Z layers to render a top-down map while using Bevy’s 2D camera. Assets come from the “16x16 Game Assets” pack by George Bailey ([OpenGameArt, CC-BY 4.0](https://opengameart.org/content/16x16-game-assets)).

## Feature flags

```
[dependencies]
bevy_procedural_tilemaps = "0.1.3"
```

- `simple-plugin` – registers the minimal generator runner used by the example. Enabled by default; opt out with `default-features = false` if you want to wire systems manually.
- `default-bundle-inserters` – provides default `BundleInserter` impls for common Bevy asset handles (`Handle<Image>` and `Sprite`). Enabled by default; disable alongside the default features if you supply your own inserters.
- Enabling the `bevy` feature on the core crate (automatically applied by this crate) derives `Component` for relevant types and is required when targeting Bevy.

## Credits

- Original project design & implementation: [Guillaume Henaux (`Henauxg`)](https://github.com/Henauxg) and contributors.
- Lean tiles edition & book integration maintained by [AIBodh](https://aibodh.com/).

## License

Code is dual-licensed under either:

- MIT License ([LICENSE-MIT](LICENSE-MIT) or <http://opensource.org/licenses/MIT>)
- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or <http://www.apache.org/licenses/LICENSE-2.0>)

at your option. Contributions are accepted under the same terms.

## Assets

- `bevy_examples/assets/tile_layers`: “16x16 Game Assets” by George Bailey, CC-BY 4.0.
