diff --git a/README.md b/README.md index aa49e04..2a5d129 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,11 @@ Use opacity 1.0 for opaque visualization and a smaller, positive value for parti Small visual artifacts will appear in partially transparent visualizations. ```rust room_visual_ext.structure(42.0, 42.0, StructureType::Spawn, 1.0); +room_visual_ext.structure_roomxy( + unsafe { RoomXY::unchecked_new(42u8, 42u8) }, + StructureType::Rampart, + 1.0 +); ``` 3. You may also call any `RoomVisual` method directly from the `RoomVisualExt` object. 4. You may not use the object in the next game tick since it becomes invalid just like `RoomVisual`. @@ -38,9 +43,9 @@ For results like in the game, place roads before containers that are on them and Below is an example showcasing visualization of all supported structures at opacities 1.0 and 0.5. For comparison, we present how they look in the actual game. -[TODO image] +![Screenshot of showcase of RoomVisualExt in-game](room_visual_ext_example.png) -You may find the code used to produce these visualizations in the `example.rs` file. [TODO add the example] +You may find the code used to produce these visualizations in the `examples/showcase.rs` file. ## Project history diff --git a/examples/showcase.rs b/examples/showcase.rs new file mode 100644 index 0000000..8f7f018 --- /dev/null +++ b/examples/showcase.rs @@ -0,0 +1,147 @@ +use screeps::{game, RoomXY, StructureType}; +use wasm_bindgen::prelude::*; +use room_visual_ext::RoomVisualExt; + +#[wasm_bindgen(js_name = loop)] +pub fn game_loop() { + fn show_sample(room_visual_ext: &mut RoomVisualExt, x_offset: f32, opacity: f32) { + // All RoomVisual functions may also be used. + let label = format!("RoomVisualExt with opacity={}", opacity); + room_visual_ext.text(13f32 + x_offset, 6.5f32, label, None); + + // Roads first so that nothing renders below them. + room_visual_ext.structure(13f32 + x_offset, 10f32, StructureType::Road, opacity); + room_visual_ext.structure(12f32 + x_offset, 9f32, StructureType::Road, opacity); + room_visual_ext.structure(11f32 + x_offset, 9f32, StructureType::Road, opacity); + room_visual_ext.structure(10f32 + x_offset, 9f32, StructureType::Road, opacity); + room_visual_ext.structure(9f32 + x_offset, 9f32, StructureType::Road, opacity); + room_visual_ext.structure(8f32 + x_offset, 9f32, StructureType::Road, opacity); + room_visual_ext.structure(14f32 + x_offset, 9f32, StructureType::Road, opacity); + room_visual_ext.structure(15f32 + x_offset, 9f32, StructureType::Road, opacity); + room_visual_ext.structure(16f32 + x_offset, 9f32, StructureType::Road, opacity); + room_visual_ext.structure(17f32 + x_offset, 9f32, StructureType::Road, opacity); + room_visual_ext.structure(18f32 + x_offset, 9f32, StructureType::Road, opacity); + room_visual_ext.structure(12f32 + x_offset, 11f32, StructureType::Road, opacity); + room_visual_ext.structure(14f32 + x_offset, 11f32, StructureType::Road, opacity); + room_visual_ext.structure(12f32 + x_offset, 12f32, StructureType::Road, opacity); + room_visual_ext.structure(14f32 + x_offset, 12f32, StructureType::Road, opacity); + room_visual_ext.structure(12f32 + x_offset, 13f32, StructureType::Road, opacity); + room_visual_ext.structure(14f32 + x_offset, 13f32, StructureType::Road, opacity); + room_visual_ext.structure(12f32 + x_offset, 14f32, StructureType::Road, opacity); + room_visual_ext.structure(14f32 + x_offset, 14f32, StructureType::Road, opacity); + room_visual_ext.structure(13f32 + x_offset, 15f32, StructureType::Road, opacity); + room_visual_ext.structure(13f32 + x_offset, 16f32, StructureType::Road, opacity); + room_visual_ext.structure(12f32 + x_offset, 16f32, StructureType::Road, opacity); + room_visual_ext.structure(14f32 + x_offset, 16f32, StructureType::Road, opacity); + + // RoomXY is also supported. + room_visual_ext.structure_roomxy( + unsafe { RoomXY::unchecked_new(13 + x_offset as u8, 14) }, + StructureType::Spawn, + opacity, + ); + room_visual_ext.structure(13f32 + x_offset, 13f32, StructureType::Nuker, opacity); + room_visual_ext.structure(13f32 + x_offset, 12f32, StructureType::Link, opacity); + room_visual_ext.structure(13f32 + x_offset, 11f32, StructureType::PowerSpawn, opacity); + + // Ramparts over the buildings below them, though preferably after all other structures + // due to buildings that stick out, such as terminal. + room_visual_ext.structure(13f32 + x_offset, 14f32, StructureType::Rampart, opacity); + room_visual_ext.structure(13f32 + x_offset, 13f32, StructureType::Rampart, opacity); + room_visual_ext.structure(13f32 + x_offset, 12f32, StructureType::Rampart, opacity); + room_visual_ext.structure(13f32 + x_offset, 11f32, StructureType::Rampart, opacity); + + // In particular, containers after roads below them, so that they do not render below them. + room_visual_ext.structure(13f32 + x_offset, 16f32, StructureType::Container, opacity); + room_visual_ext.structure(13f32 + x_offset, 17f32, StructureType::Extractor, opacity); + + room_visual_ext.structure(13f32 + x_offset, 9f32, StructureType::Terminal, opacity); + room_visual_ext.structure(13f32 + x_offset, 8f32, StructureType::Extension, opacity); + room_visual_ext.structure(12f32 + x_offset, 8f32, StructureType::Extension, opacity); + room_visual_ext.structure(11f32 + x_offset, 8f32, StructureType::Extension, opacity); + room_visual_ext.structure(14f32 + x_offset, 8f32, StructureType::Extension, opacity); + room_visual_ext.structure(15f32 + x_offset, 8f32, StructureType::Extension, opacity); + + room_visual_ext.structure(12f32 + x_offset, 10f32, StructureType::Observer, opacity); + room_visual_ext.structure(11f32 + x_offset, 10f32, StructureType::Extension, opacity); + room_visual_ext.structure(11f32 + x_offset, 11f32, StructureType::Factory, opacity); + room_visual_ext.structure(11f32 + x_offset, 12f32, StructureType::Extension, opacity); + room_visual_ext.structure(11f32 + x_offset, 13f32, StructureType::Extension, opacity); + room_visual_ext.structure(11f32 + x_offset, 14f32, StructureType::Storage, opacity); + room_visual_ext.structure(11f32 + x_offset, 15f32, StructureType::Extension, opacity); + room_visual_ext.structure(12f32 + x_offset, 15f32, StructureType::Extension, opacity); + + room_visual_ext.structure(14f32 + x_offset, 10f32, StructureType::Extension, opacity); + room_visual_ext.structure(15f32 + x_offset, 10f32, StructureType::Extension, opacity); + room_visual_ext.structure(15f32 + x_offset, 11f32, StructureType::Tower, opacity); + room_visual_ext.structure(15f32 + x_offset, 12f32, StructureType::Lab, opacity); + room_visual_ext.structure(15f32 + x_offset, 13f32, StructureType::Lab, opacity); + room_visual_ext.structure(15f32 + x_offset, 14f32, StructureType::Lab, opacity); + room_visual_ext.structure(15f32 + x_offset, 15f32, StructureType::Extension, opacity); + room_visual_ext.structure(14f32 + x_offset, 15f32, StructureType::Extension, opacity); + + // No particular horizontal or vertical ordering is needed. + room_visual_ext.structure(13f32 + x_offset, 9f32, StructureType::Rampart, opacity); + room_visual_ext.structure(13f32 + x_offset, 8f32, StructureType::Rampart, opacity); + room_visual_ext.structure(12f32 + x_offset, 8f32, StructureType::Rampart, opacity); + room_visual_ext.structure(11f32 + x_offset, 8f32, StructureType::Rampart, opacity); + room_visual_ext.structure(10f32 + x_offset, 8f32, StructureType::Rampart, opacity); + room_visual_ext.structure(9f32 + x_offset, 8f32, StructureType::Rampart, opacity); + room_visual_ext.structure(9f32 + x_offset, 9f32, StructureType::Rampart, opacity); + room_visual_ext.structure(9f32 + x_offset, 10f32, StructureType::Rampart, opacity); + room_visual_ext.structure(9f32 + x_offset, 11f32, StructureType::Rampart, opacity); + room_visual_ext.structure(9f32 + x_offset, 12f32, StructureType::Rampart, opacity); + room_visual_ext.structure(9f32 + x_offset, 13f32, StructureType::Rampart, opacity); + room_visual_ext.structure(9f32 + x_offset, 14f32, StructureType::Rampart, opacity); + room_visual_ext.structure(9f32 + x_offset, 15f32, StructureType::Rampart, opacity); + room_visual_ext.structure(9f32 + x_offset, 16f32, StructureType::Rampart, opacity); + room_visual_ext.structure(9f32 + x_offset, 17f32, StructureType::Rampart, opacity); + room_visual_ext.structure(10f32 + x_offset, 14f32, StructureType::Rampart, opacity); + room_visual_ext.structure(10f32 + x_offset, 15f32, StructureType::Rampart, opacity); + room_visual_ext.structure(10f32 + x_offset, 16f32, StructureType::Rampart, opacity); + room_visual_ext.structure(10f32 + x_offset, 17f32, StructureType::Rampart, opacity); + room_visual_ext.structure(11f32 + x_offset, 17f32, StructureType::Rampart, opacity); + room_visual_ext.structure(11f32 + x_offset, 16f32, StructureType::Rampart, opacity); + room_visual_ext.structure(14f32 + x_offset, 8f32, StructureType::Rampart, opacity); + room_visual_ext.structure(15f32 + x_offset, 8f32, StructureType::Rampart, opacity); + room_visual_ext.structure(16f32 + x_offset, 8f32, StructureType::Rampart, opacity); + room_visual_ext.structure(17f32 + x_offset, 8f32, StructureType::Rampart, opacity); + room_visual_ext.structure(17f32 + x_offset, 9f32, StructureType::Rampart, opacity); + + room_visual_ext.structure(17f32 + x_offset, 10f32, StructureType::Wall, opacity); + room_visual_ext.structure(17f32 + x_offset, 11f32, StructureType::Wall, opacity); + room_visual_ext.structure(17f32 + x_offset, 12f32, StructureType::Wall, opacity); + room_visual_ext.structure(17f32 + x_offset, 13f32, StructureType::Wall, opacity); + room_visual_ext.structure(17f32 + x_offset, 14f32, StructureType::Wall, opacity); + room_visual_ext.structure(17f32 + x_offset, 15f32, StructureType::Wall, opacity); + room_visual_ext.structure(17f32 + x_offset, 16f32, StructureType::Wall, opacity); + room_visual_ext.structure(17f32 + x_offset, 17f32, StructureType::Wall, opacity); + room_visual_ext.structure(16f32 + x_offset, 14f32, StructureType::Wall, opacity); + room_visual_ext.structure(16f32 + x_offset, 15f32, StructureType::Wall, opacity); + room_visual_ext.structure(16f32 + x_offset, 16f32, StructureType::Wall, opacity); + room_visual_ext.structure(16f32 + x_offset, 17f32, StructureType::Wall, opacity); + room_visual_ext.structure(15f32 + x_offset, 16f32, StructureType::Wall, opacity); + room_visual_ext.structure(15f32 + x_offset, 17f32, StructureType::Wall, opacity); + } + + let spawn = game::spawns().values().next().unwrap_throw(); + spawn.pos(); + let room_name = spawn.room().map(|r| r.name()); + let mut room_visual_ext = RoomVisualExt::new(room_name.unwrap()); + + show_sample(&mut room_visual_ext, 1.0, 1.0); + + room_visual_ext.line((20f32, 7f32), (20f32, 19f32), None); + + // You may get the internal RoomVisual object and use it directly too. + room_visual_ext.room_visual.text(26f32, 6.5f32, "Real, in-game objects".into(), None); + + room_visual_ext.line((32f32, 7f32), (32f32, 19f32), None); + + show_sample(&mut room_visual_ext, 25.0, 0.5); + + room_visual_ext.text( + 26f32, 20f32, + "This image was generated using the examples/showcase.rs snippet".into(), + None); +} \ No newline at end of file diff --git a/room_visual_ext_example.png b/room_visual_ext_example.png new file mode 100644 index 0000000..76aed9c Binary files /dev/null and b/room_visual_ext_example.png differ diff --git a/src/lib.rs b/src/lib.rs index d289683..0837329 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -31,8 +31,8 @@ const POWER_COLOR: &str = "#F53547"; const ROAD_COLOR: &str = "#666666"; const WHITE_COLOR: &str = "#FFFFFF"; const BLACK_COLOR: &str = "#000000"; -const RAMPART_COLOR: &str = "#434C43"; -const RAMPART_OUTLINE_COLOR: &str = "#5D735F"; +const RAMPART_COLOR: &str = "#669966"; +const RAMPART_OUTLINE_COLOR: &str = "#66CC66"; const FACTORY_OUTER_CIRCLE_FILL_COLOR: &str = "#232323"; const FACTORY_PARTS_COLOR: &str = "#140a0a"; const FACTORY_LEVEL_CIRCLE_FILL_COLOR: &str = "#302a2a"; @@ -171,7 +171,7 @@ impl RoomVisualExt { .fill(RAMPART_COLOR) .stroke(RAMPART_OUTLINE_COLOR) .stroke_width(0.07) - .opacity(opacity * 0.5); + .opacity(opacity * 0.3); self.rect(x - 0.5, y - 0.5, 1.0, 1.0, Some(rampart_rect_style)); } StructureType::Link => { @@ -592,4 +592,8 @@ impl RoomVisualExt { _ => {} }; } + + pub fn structure_roomxy(&mut self, xy: RoomXY, structure_type: StructureType, opacity: f32) { + self.structure(xy.x.u8() as f32, xy.y.u8() as f32, structure_type, opacity) + } } \ No newline at end of file