use brdb::{AsBrdbValue, BrFsReader, Brick, Brz, IntoReader, World, WirePort, assets};
use std::path::PathBuf;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut prefab = World::new();
prefab.meta.bundle.name = "Spawned Brick".to_string();
prefab.bricks.push(Brick {
position: (0, 0, 6).into(),
color: (255, 0, 0).into(),
..Default::default()
});
prefab.make_prefab();
let prefab_bytes = prefab.to_brz_vec()?;
let mut world = World::new();
world.register_all_components();
world.meta.bundle.description = "Button-triggered prefab spawner".to_string();
let prefab_path = world.add_prefab(prefab_bytes);
let (button, button_id) = Brick {
position: (0, 0, 2).into(),
color: (0, 255, 0).into(),
asset: assets::bricks::B_1X1F_ROUND,
..Default::default()
}
.with_component(assets::LiteralComponent::new("Component_Button").with_data([(
"PromptCustomLabel",
Box::new("Spawn Brick".to_string()) as Box<dyn AsBrdbValue>,
)]))
.with_id_split();
let (spawner, spawner_id) = Brick {
position: (15, 0, 1).into(),
color: (0, 0, 255).into(),
asset: assets::bricks::B_1X1_GATE_EXEC_PREFAB_SPAWNER,
..Default::default()
}
.with_component(
assets::LiteralComponent::new("BrickComponentType_WireGraph_Exec_PrefabSpawner").with_data(
[(
"Prefab",
Box::new(prefab_path.clone()) as Box<dyn AsBrdbValue>,
)],
),
)
.with_id_split();
world.add_bricks([button, spawner]);
world.add_wire_connection(
WirePort::new(button_id, "Component_Button", "bHeld"),
WirePort::new(
spawner_id,
"BrickComponentType_WireGraph_Exec_PrefabSpawner",
"Exec",
),
);
let path = PathBuf::from("./example_prefab_spawner.brz");
world.write_brz(&path)?;
println!("wrote {}", path.display());
let reader = Brz::open(&path)?.into_reader();
println!("embedded prefab: {}", prefab_path);
println!("prefab paths in archive: {:?}", reader.prefab_paths()?);
println!("{}", reader.get_fs()?.render());
Ok(())
}