mindustry logic execution, map- and schematic- parsing and rendering
merge turrets (revert when/if i decide to rotate (probably not))
45 files changed, 68 insertions, 126 deletions
@@ -1,6 +1,6 @@ [package] name = "mindus" -version = "3.0.8" +version = "4.0.0" edition = "2021" description = "A library for working with mindustry data formats (eg schematics and maps) (fork of plandustry)" authors = [ diff --git a/assets/blocks/turrets/afflict.png b/assets/blocks/turrets/afflict.png Binary files differindex 5f8f18b..7b37826 100644 --- a/assets/blocks/turrets/afflict.png +++ b/assets/blocks/turrets/afflict.png diff --git a/assets/blocks/turrets/arc.png b/assets/blocks/turrets/arc.png Binary files differindex aa4bf20..be61590 100644 --- a/assets/blocks/turrets/arc.png +++ b/assets/blocks/turrets/arc.png diff --git a/assets/blocks/turrets/bases/block-1.png b/assets/blocks/turrets/bases/block-1.png Binary files differdeleted file mode 100644 index f3844b5..0000000 --- a/assets/blocks/turrets/bases/block-1.png +++ /dev/null diff --git a/assets/blocks/turrets/bases/block-2.png b/assets/blocks/turrets/bases/block-2.png Binary files differdeleted file mode 100644 index e49886f..0000000 --- a/assets/blocks/turrets/bases/block-2.png +++ /dev/null diff --git a/assets/blocks/turrets/bases/block-3.png b/assets/blocks/turrets/bases/block-3.png Binary files differdeleted file mode 100644 index f365825..0000000 --- a/assets/blocks/turrets/bases/block-3.png +++ /dev/null diff --git a/assets/blocks/turrets/bases/block-4.png b/assets/blocks/turrets/bases/block-4.png Binary files differdeleted file mode 100644 index 1a36363..0000000 --- a/assets/blocks/turrets/bases/block-4.png +++ /dev/null diff --git a/assets/blocks/turrets/bases/reinforced-block-3.png b/assets/blocks/turrets/bases/reinforced-block-3.png Binary files differdeleted file mode 100644 index 840c001..0000000 --- a/assets/blocks/turrets/bases/reinforced-block-3.png +++ /dev/null diff --git a/assets/blocks/turrets/bases/reinforced-block-4.png b/assets/blocks/turrets/bases/reinforced-block-4.png Binary files differdeleted file mode 100644 index a09af8d..0000000 --- a/assets/blocks/turrets/bases/reinforced-block-4.png +++ /dev/null diff --git a/assets/blocks/turrets/bases/reinforced-block-5.png b/assets/blocks/turrets/bases/reinforced-block-5.png Binary files differdeleted file mode 100644 index efb72ac..0000000 --- a/assets/blocks/turrets/bases/reinforced-block-5.png +++ /dev/null diff --git a/assets/blocks/turrets/breach.png b/assets/blocks/turrets/breach.png Binary files differindex b1aca8b..e9a490c 100644 --- a/assets/blocks/turrets/breach.png +++ b/assets/blocks/turrets/breach.png diff --git a/assets/blocks/turrets/cyclone.png b/assets/blocks/turrets/cyclone.png Binary files differindex 7c35527..96cabd4 100644 --- a/assets/blocks/turrets/cyclone.png +++ b/assets/blocks/turrets/cyclone.png diff --git a/assets/blocks/turrets/diffuse.png b/assets/blocks/turrets/diffuse.png Binary files differindex cc84024..3475747 100644 --- a/assets/blocks/turrets/diffuse.png +++ b/assets/blocks/turrets/diffuse.png diff --git a/assets/blocks/turrets/disperse.png b/assets/blocks/turrets/disperse.png Binary files differindex 605510c..641ae4b 100644 --- a/assets/blocks/turrets/disperse.png +++ b/assets/blocks/turrets/disperse.png diff --git a/assets/blocks/turrets/duo.png b/assets/blocks/turrets/duo.png Binary files differindex 6da03bd..2f7e385 100644 --- a/assets/blocks/turrets/duo.png +++ b/assets/blocks/turrets/duo.png diff --git a/assets/blocks/turrets/foreshadow.png b/assets/blocks/turrets/foreshadow.png Binary files differindex 5e138ab..381a2fe 100644 --- a/assets/blocks/turrets/foreshadow.png +++ b/assets/blocks/turrets/foreshadow.png diff --git a/assets/blocks/turrets/fuse.png b/assets/blocks/turrets/fuse.png Binary files differindex 464e535..bb9a0b6 100644 --- a/assets/blocks/turrets/fuse.png +++ b/assets/blocks/turrets/fuse.png diff --git a/assets/blocks/turrets/hail.png b/assets/blocks/turrets/hail.png Binary files differindex 436c95f..8250d37 100644 --- a/assets/blocks/turrets/hail.png +++ b/assets/blocks/turrets/hail.png diff --git a/assets/blocks/turrets/lancer.png b/assets/blocks/turrets/lancer.png Binary files differindex cc87aff..9fff5ba 100644 --- a/assets/blocks/turrets/lancer.png +++ b/assets/blocks/turrets/lancer.png diff --git a/assets/blocks/turrets/lustre.png b/assets/blocks/turrets/lustre.png Binary files differindex acbafb8..e436f52 100644 --- a/assets/blocks/turrets/lustre.png +++ b/assets/blocks/turrets/lustre.png diff --git a/assets/blocks/turrets/malign.png b/assets/blocks/turrets/malign.png Binary files differindex a485724..03e692f 100644 --- a/assets/blocks/turrets/malign.png +++ b/assets/blocks/turrets/malign.png diff --git a/assets/blocks/turrets/meltdown.png b/assets/blocks/turrets/meltdown.png Binary files differindex c0f7b2e..d63c8fb 100644 --- a/assets/blocks/turrets/meltdown.png +++ b/assets/blocks/turrets/meltdown.png diff --git a/assets/blocks/turrets/parallax.png b/assets/blocks/turrets/parallax.png Binary files differindex 9e4aec4..4d581dd 100644 --- a/assets/blocks/turrets/parallax.png +++ b/assets/blocks/turrets/parallax.png diff --git a/assets/blocks/turrets/ripple.png b/assets/blocks/turrets/ripple.png Binary files differindex 628c9d8..507f0b6 100644 --- a/assets/blocks/turrets/ripple.png +++ b/assets/blocks/turrets/ripple.png diff --git a/assets/blocks/turrets/salvo.png b/assets/blocks/turrets/salvo.png Binary files differindex 420957f..09136e0 100644 --- a/assets/blocks/turrets/salvo.png +++ b/assets/blocks/turrets/salvo.png diff --git a/assets/blocks/turrets/scathe.png b/assets/blocks/turrets/scathe.png Binary files differindex 3ea6ee2..897532a 100644 --- a/assets/blocks/turrets/scathe.png +++ b/assets/blocks/turrets/scathe.png diff --git a/assets/blocks/turrets/scatter.png b/assets/blocks/turrets/scatter.png Binary files differindex 2db3fbc..1cc620a 100644 --- a/assets/blocks/turrets/scatter.png +++ b/assets/blocks/turrets/scatter.png diff --git a/assets/blocks/turrets/scorch.png b/assets/blocks/turrets/scorch.png Binary files differindex 7d145ad..473e8d3 100644 --- a/assets/blocks/turrets/scorch.png +++ b/assets/blocks/turrets/scorch.png diff --git a/assets/blocks/turrets/segment.png b/assets/blocks/turrets/segment.png Binary files differindex b6997d2..c34929c 100644 --- a/assets/blocks/turrets/segment.png +++ b/assets/blocks/turrets/segment.png diff --git a/assets/blocks/turrets/smite.png b/assets/blocks/turrets/smite.png Binary files differindex 4b5262f..3402149 100644 --- a/assets/blocks/turrets/smite.png +++ b/assets/blocks/turrets/smite.png diff --git a/assets/blocks/turrets/spectre.png b/assets/blocks/turrets/spectre.png Binary files differindex 5c96770..811ef6e 100644 --- a/assets/blocks/turrets/spectre.png +++ b/assets/blocks/turrets/spectre.png diff --git a/assets/blocks/turrets/sublimate.png b/assets/blocks/turrets/sublimate.png Binary files differindex d0e1a76..5155235 100644 --- a/assets/blocks/turrets/sublimate.png +++ b/assets/blocks/turrets/sublimate.png diff --git a/assets/blocks/turrets/swarmer.png b/assets/blocks/turrets/swarmer.png Binary files differindex ed12771..1680beb 100644 --- a/assets/blocks/turrets/swarmer.png +++ b/assets/blocks/turrets/swarmer.png diff --git a/assets/blocks/turrets/titan.png b/assets/blocks/turrets/titan.png Binary files differindex 68db74e..e781843 100644 --- a/assets/blocks/turrets/titan.png +++ b/assets/blocks/turrets/titan.png diff --git a/assets/blocks/turrets/tsunami.png b/assets/blocks/turrets/tsunami.png Binary files differindex 6c5324e..6f72793 100644 --- a/assets/blocks/turrets/tsunami.png +++ b/assets/blocks/turrets/tsunami.png diff --git a/assets/blocks/turrets/wave.png b/assets/blocks/turrets/wave.png Binary files differindex ca784fe..360994d 100644 --- a/assets/blocks/turrets/wave.png +++ b/assets/blocks/turrets/wave.png diff --git a/assets/blocks/units/repair-point-base.png b/assets/blocks/units/repair-point-base.png Binary files differdeleted file mode 100644 index d68eb37..0000000 --- a/assets/blocks/units/repair-point-base.png +++ /dev/null diff --git a/assets/blocks/units/repair-point.png b/assets/blocks/units/repair-point.png Binary files differindex 9bad782..1f81c2c 100644 --- a/assets/blocks/units/repair-point.png +++ b/assets/blocks/units/repair-point.png diff --git a/assets/blocks/units/repair-turret.png b/assets/blocks/units/repair-turret.png Binary files differindex f20f3d7..f410dbf 100644 --- a/assets/blocks/units/repair-turret.png +++ b/assets/blocks/units/repair-turret.png diff --git a/src/block/distribution.rs b/src/block/distribution.rs index 62b071f..e65cf98 100644 --- a/src/block/distribution.rs +++ b/src/block/distribution.rs @@ -57,14 +57,14 @@ fn draw_stack( let ctx = ctx.unwrap(); let mask = mask(ctx, rot, name); let edge = load!(concat edge => name which is ["surge-conveyor" | "plastanium-conveyor"], s); - let edgify = |skip, mut to: Image<&mut [u8], 4>| { + let edgify = |skip, to: &mut Image<&mut [u8], 4>| { for i in 0..4 { if i == skip { continue; } let mut edge = edge.clone(); edge.rotate(i); - to.overlay(edge.borrow()); + to.overlay(&edge.borrow()); } }; let gimme = |n: u8| match n { @@ -79,19 +79,19 @@ fn draw_stack( let mut base = gimme(2); edgify( rot.mirrored(true, true).rotated(false).count(), - base.borrow_mut(), + &mut base.borrow_mut(), ); base } else if mask == B0000 && empty { // single let mut base = gimme(0); base.rotate(rot.rotated(false).count()); - edgify(5, base.borrow_mut()); + edgify(5, &mut base.borrow_mut()); base } else if mask == B0000 { // input let mut base = gimme(1); - edgify(rot.rotated(false).count(), base.borrow_mut()); + edgify(rot.rotated(false).count(), &mut base.borrow_mut()); base } else { // directional diff --git a/src/block/logic.rs b/src/block/logic.rs index 5cdae40..da7c47b 100644 --- a/src/block/logic.rs +++ b/src/block/logic.rs @@ -159,7 +159,7 @@ impl BlockLogic for CanvasBlock { let mut borders = load!("canvas", s); borders .borrow_mut() - .overlay_at(img.as_ref(), offset, offset); + .overlay_at(&img.as_ref(), offset, offset); return borders; } diff --git a/src/block/turrets.rs b/src/block/turrets.rs index 522906a..3e65ebe 100644 --- a/src/block/turrets.rs +++ b/src/block/turrets.rs @@ -1,89 +1,45 @@ //! idk why its not in the [`crate::block::defense`] module use super::simple::make_simple; -use super::{BlockLogic, Rotation, State}; use crate::block::make_register; use crate::block::simple::cost; -use crate::data::{renderer::*, DataRead, ReadError}; +use crate::data::{DataRead, ReadError}; make_register! { - "duo" => ItemTurret::new(1, true, cost!(Copper: 35)); - "scatter" => ItemTurret::new(2, true, cost!(Copper: 85, Lead: 45)); - "scorch" => ItemTurret::new(1, true, cost!(Copper: 25, Graphite: 22)); - "hail" => ItemTurret::new(1, true, cost!(Copper: 40, Graphite: 17)); - "wave" => Turret::new(2, true, cost!(Copper: 25, Lead: 75, Metaglass: 45)); - "tsunami" => Turret::new(3, true, cost!(Lead: 400, Metaglass: 100, Titanium: 250, Thorium: 100)); - "lancer" => Turret::new(2, true, cost!(Copper: 60, Lead: 70, Titanium: 30, Silicon: 60)); - "arc" => Turret::new(1, true, cost!(Copper: 50, Lead: 50)); - "parallax" => TractorBeamTurret::new(2, true, cost!(Graphite: 30, Titanium: 90, Silicon: 120)); - "swarmer" => ItemTurret::new(2, true, cost!(Graphite: 35, Titanium: 35, Silicon: 30, Plastanium: 45)); - "salvo" => ItemTurret::new(2, true, cost!(Copper: 100, Graphite: 80, Titanium: 50)); - "segment" => PointDefenseTurret::new(2, true, cost!(Titanium: 40, Thorium: 80, Silicon: 130, PhaseFabric: 40)); - "fuse" => ItemTurret::new(3, true, cost!(Copper: 225, Graphite: 225, Thorium: 100)); - "ripple" => ItemTurret::new(3, true, cost!(Copper: 150, Graphite: 135, Titanium: 60)); - "cyclone" => ItemTurret::new(3, true, cost!(Copper: 200, Titanium: 125, Plastanium: 80)); - "foreshadow" => ItemTurret::new(4, true, cost!(Copper: 1000, Metaglass: 600, Silicon: 600, Plastanium: 200, SurgeAlloy: 300)); - "spectre" => ItemTurret::new(4, true, cost!(Copper: 900, Graphite: 300, Thorium: 250, Plastanium: 175, SurgeAlloy: 250)); - "meltdown" => Turret::new(4, true, cost!(Copper: 1200, Lead: 350, Graphite: 300, Silicon: 325, SurgeAlloy: 325)); - "breach" => ItemTurret::new(3, true, cost!(Beryllium: 150, Silicon: 150, Graphite: 250)); - "diffuse" => ItemTurret::new(3, true, cost!(Beryllium: 150, Silicon: 200, Graphite: 200, Tungsten: 50)); - "sublimate" => ContinousTurret::new(3, true, cost!(Tungsten: 150, Silicon: 200, Oxide: 40, Beryllium: 400)); - "titan" => ItemTurret::new(4, true, cost!(Tungsten: 250, Silicon: 300, Thorium: 400)); - "disperse" => ItemTurret::new(4, true, cost!(Thorium: 50, Oxide: 150, Silicon: 200, Beryllium: 350)); - "afflict" => Turret::new(4, true, cost!(SurgeAlloy: 100, Silicon: 200, Graphite: 250, Oxide: 40)); - "lustre" => ContinousTurret::new(4, true, cost!(Silicon: 250, Graphite: 200, Oxide: 50, Carbide: 90)); - "scathe" => ItemTurret::new(4, true, cost!(Oxide: 200, SurgeAlloy: 400, Silicon: 800, Carbide: 500, PhaseFabric: 300)); - "malign" => Turret::new(5, true, cost!(Carbide: 400, Beryllium: 2000, Silicon: 800, Graphite: 800, PhaseFabric: 300)); - "smite" => ItemTurret::new(5, true, cost!(Oxide: 200, SurgeAlloy: 400, Silicon: 800, Carbide: 500, PhaseFabric: 300)); + "duo" -> ItemTurret::new(1, true, cost!(Copper: 35)); + "scatter" -> ItemTurret::new(2, true, cost!(Copper: 85, Lead: 45)); + "scorch" -> ItemTurret::new(1, true, cost!(Copper: 25, Graphite: 22)); + "hail" -> ItemTurret::new(1, true, cost!(Copper: 40, Graphite: 17)); + "wave" -> Turret::new(2, true, cost!(Copper: 25, Lead: 75, Metaglass: 45)); + "tsunami" -> Turret::new(3, true, cost!(Lead: 400, Metaglass: 100, Titanium: 250, Thorium: 100)); + "lancer" -> Turret::new(2, true, cost!(Copper: 60, Lead: 70, Titanium: 30, Silicon: 60)); + "arc" -> Turret::new(1, true, cost!(Copper: 50, Lead: 50)); + "parallax" -> TractorBeamTurret::new(2, true, cost!(Graphite: 30, Titanium: 90, Silicon: 120)); + "swarmer" -> ItemTurret::new(2, true, cost!(Graphite: 35, Titanium: 35, Silicon: 30, Plastanium: 45)); + "salvo" -> ItemTurret::new(2, true, cost!(Copper: 100, Graphite: 80, Titanium: 50)); + "segment" -> PointDefenseTurret::new(2, true, cost!(Titanium: 40, Thorium: 80, Silicon: 130, PhaseFabric: 40)); + "fuse" -> ItemTurret::new(3, true, cost!(Copper: 225, Graphite: 225, Thorium: 100)); + "ripple" -> ItemTurret::new(3, true, cost!(Copper: 150, Graphite: 135, Titanium: 60)); + "cyclone" -> ItemTurret::new(3, true, cost!(Copper: 200, Titanium: 125, Plastanium: 80)); + "foreshadow" -> ItemTurret::new(4, true, cost!(Copper: 1000, Metaglass: 600, Silicon: 600, Plastanium: 200, SurgeAlloy: 300)); + "spectre" -> ItemTurret::new(4, true, cost!(Copper: 900, Graphite: 300, Thorium: 250, Plastanium: 175, SurgeAlloy: 250)); + "meltdown" -> Turret::new(4, true, cost!(Copper: 1200, Lead: 350, Graphite: 300, Silicon: 325, SurgeAlloy: 325)); + "breach" -> ItemTurret::new(3, true, cost!(Beryllium: 150, Silicon: 150, Graphite: 250)); + "diffuse" -> ItemTurret::new(3, true, cost!(Beryllium: 150, Silicon: 200, Graphite: 200, Tungsten: 50)); + "sublimate" -> ContinousTurret::new(3, true, cost!(Tungsten: 150, Silicon: 200, Oxide: 40, Beryllium: 400)); + "titan" -> ItemTurret::new(4, true, cost!(Tungsten: 250, Silicon: 300, Thorium: 400)); + "disperse" -> ItemTurret::new(4, true, cost!(Thorium: 50, Oxide: 150, Silicon: 200, Beryllium: 350)); + "afflict" -> Turret::new(4, true, cost!(SurgeAlloy: 100, Silicon: 200, Graphite: 250, Oxide: 40)); + "lustre" -> ContinousTurret::new(4, true, cost!(Silicon: 250, Graphite: 200, Oxide: 50, Carbide: 90)); + "scathe" -> ItemTurret::new(4, true, cost!(Oxide: 200, SurgeAlloy: 400, Silicon: 800, Carbide: 500, PhaseFabric: 300)); + "malign" -> Turret::new(5, true, cost!(Carbide: 400, Beryllium: 2000, Silicon: 800, Graphite: 800, PhaseFabric: 300)); + "smite" -> ItemTurret::new(5, true, cost!(Oxide: 200, SurgeAlloy: 400, Silicon: 800, Carbide: 500, PhaseFabric: 300)); } -fn draw_turret( - me: &impl BlockLogic, - name: &str, - _: Option<&State>, - _: Option<&RenderingContext>, - _: Rotation, - s: Scale, -) -> ImageHolder<4> { - let size = me.get_size(); - let mut base = match name { - "breach" | "diffuse" | "sublimate" | "titan" | "disperse" | "afflict" | "lustre" - | "scathe" | "malign" | "smite" => load!(s -> match size { - 3 => "reinforced-block-3", - 4 => "reinforced-block-4", - 5 => "reinforced-block-5", - }), - _ => load!(s -> match size { - 1 => "block-1", - 2 => "block-2", - 3 => "block-3", - 4 => "block-4", - }), - }; - base.overlay(&load!(from name which is ["duo" | "scatter" | "scorch" | "hail" | "wave" | "tsunami" | "lancer" | "arc" | "parallax" | "swarmer" | "salvo" | "segment" | "fuse" | "ripple" | "cyclone" | "foreshadow" | "spectre" | "meltdown" | "breach" | "diffuse" | "sublimate" | "titan" | "disperse" | "afflict" | "lustre" | "scathe" | "malign" | "smite"], s)); - base -} - -make_simple!(Turret, draw_turret, |_, _, _, buff: &mut DataRead| { - read_turret(buff) -}); -make_simple!( - PointDefenseTurret, - draw_turret, - |_, _, _, buff: &mut DataRead| read_point_defense_turret(buff) -); -make_simple!( - ContinousTurret, - draw_turret, - |_, _, _, buff: &mut DataRead| { read_continous_turret(buff) } -); -make_simple!( - TractorBeamTurret, - draw_turret, - |_, _, _, buff: &mut DataRead| { read_tractor_beam_turret(buff) } -); -make_simple!(ItemTurret, draw_turret, |_, _, _, buff: &mut DataRead| { - read_item_turret(buff) -}); +make_simple!(Turret => |_, _, _, buff: &mut DataRead| read_turret(buff)); +make_simple!(PointDefenseTurret => |_, _, _, buff: &mut DataRead| read_point_defense_turret(buff)); +make_simple!(ContinousTurret => |_, _, _, buff: &mut DataRead| read_continous_turret(buff)); +make_simple!(TractorBeamTurret => |_, _, _, buff: &mut DataRead| read_tractor_beam_turret(buff)); +make_simple!(ItemTurret => |_, _, _, buff: &mut DataRead| read_item_turret(buff)); /// format: /// - call [`read_turret`] diff --git a/src/block/units.rs b/src/block/units.rs index 3587c9f..175fe56 100644 --- a/src/block/units.rs +++ b/src/block/units.rs @@ -89,22 +89,7 @@ make_simple!( ); make_simple!( - RepairTurret, - |_, n, _, _, _, scl| { - match n { - "repair-turret" => { - let mut bot = load!("block-2", scl); - bot.overlay(&load!("repair-turret", scl)); - bot - } - _ => { - let mut bot = load!("repair-point-base", scl); - bot.overlay(&load!("repair-point", scl)); - bot - } - } - }, - |_, _, _, buff: &mut DataRead| { + RepairTurret => |_, _, _, buff: &mut DataRead| { buff.skip(4) // rotation: [`f32`] } ); @@ -123,8 +108,8 @@ make_register! { cost!(Lead: 2000, Titanium: 2000, Thorium: 750, Silicon: 1000, Plastanium: 450, PhaseFabric: 600)); "tetrative-reconstructor" => ConstructorBlock::new(9, false, cost!(Lead: 4000, Thorium: 1000, Silicon: 3000, Plastanium: 600, PhaseFabric: 600, SurgeAlloy: 800)); - "repair-point" => RepairTurret::new(1, true, cost!(Copper: 30, Lead: 30, Silicon: 20)); - "repair-turret" => RepairTurret::new(2, true, cost!(Thorium: 80, Silicon: 90, Plastanium: 60)); + "repair-point" -> RepairTurret::new(1, true, cost!(Copper: 30, Lead: 30, Silicon: 20)); + "repair-turret" -> RepairTurret::new(2, true, cost!(Thorium: 80, Silicon: 90, Plastanium: 60)); "tank-fabricator" => UnitFactory::new(3, true, cost!(Silicon: 200, Beryllium: 150), &[unit::Type::Stell]); "ship-fabricator" => UnitFactory::new(3, true, cost!(Silicon: 250, Beryllium: 200), &[unit::Type::Elude]); "mech-fabricator" => UnitFactory::new(3, true, cost!(Silicon: 200, Graphite: 300, Tungsten: 60), &[unit::Type::Merui]); diff --git a/src/data/renderer.rs b/src/data/renderer.rs index 93f1a7e..1731802 100644 --- a/src/data/renderer.rs +++ b/src/data/renderer.rs @@ -128,12 +128,13 @@ impl Renderable for Schematic<'_> { let x = x as u32 - ((tile.block.get_size() - 1) / 2) as u32; let y = self.height as u32 - y as u32 - ((tile.block.get_size() / 2) + 1) as u32; canvas.as_mut().overlay_at( - tile.image( - ctx.as_ref(), - tile.get_rotation().unwrap_or(Rotation::Up), - Scale::Full, - ) - .borrow(), + &tile + .image( + ctx.as_ref(), + tile.get_rotation().unwrap_or(Rotation::Up), + Scale::Full, + ) + .borrow(), (x + 1) * 32, (y + 1) * 32, ); @@ -176,13 +177,13 @@ impl Renderable for Map<'_> { // draw the floor first. // println!("draw {tile:?} ({x}, {y}) + {scale:?}"); floor.as_mut().overlay_at( - tile.floor(scale).borrow(), + &tile.floor(scale).borrow(), scale * x as u32, scale * y as u32, ); if tile.has_ore() { floor.as_mut().overlay_at( - tile.ore(scale).borrow(), + &tile.ore(scale).borrow(), scale * x as u32, scale * y as u32, ); @@ -207,13 +208,13 @@ impl Renderable for Map<'_> { None }; top.as_mut().overlay_at( - tile.build_image(ctx.as_ref(), scale).borrow(), + &tile.build_image(ctx.as_ref(), scale).borrow(), scale * x as u32, scale * y as u32, ); } } - floor.as_mut().overlay_at(top.as_ref(), 0, 0); + floor.as_mut().overlay_at(&top.as_ref(), 0, 0); floor } } diff --git a/src/utils/image.rs b/src/utils/image.rs index 70f6261..c89f8cb 100644 --- a/src/utils/image.rs +++ b/src/utils/image.rs @@ -3,13 +3,13 @@ use std::{num::NonZeroU32, slice::SliceIndex}; pub trait Overlay<W> { /// Overlay with => self at coordinates x, y, without blending - fn overlay_at(&mut self, with: W, x: u32, y: u32) -> &mut Self; + fn overlay_at(&mut self, with: &W, x: u32, y: u32) -> &mut Self; } pub trait RepeatNew { type Output; /// Repeat self till it fills x, y - fn repeated(self, x: u32, y: u32) -> Self::Output; + fn repeated(&self, x: u32, y: u32) -> Self::Output; } pub trait ImageUtils { @@ -39,7 +39,7 @@ macro_rules! unsafe_assert { } impl Overlay<Image<&[u8], 3>> for Image<&mut [u8], 3> { - fn overlay_at(&mut self, with: Image<&[u8], 3>, x: u32, y: u32) -> &mut Self { + fn overlay_at(&mut self, with: &Image<&[u8], 3>, x: u32, y: u32) -> &mut Self { for j in 0..with.height() { for i in 0..with.width() { unsafe { @@ -60,7 +60,7 @@ impl Overlay<Image<&[u8], 3>> for Image<&mut [u8], 3> { } impl Overlay<Image<&[u8], 4>> for Image<&mut [u8], 3> { - fn overlay_at(&mut self, with: Image<&[u8], 4>, x: u32, y: u32) -> &mut Self { + fn overlay_at(&mut self, with: &Image<&[u8], 4>, x: u32, y: u32) -> &mut Self { for j in 0..with.height() { for i in 0..with.width() { unsafe { @@ -89,7 +89,7 @@ impl Overlay<Image<&[u8], 4>> for Image<&mut [u8], 3> { } impl Overlay<Image<&[u8], 4>> for Image<&mut [u8], 4> { - fn overlay_at(&mut self, with: Image<&[u8], 4>, x: u32, y: u32) -> &mut Self { + fn overlay_at(&mut self, with: &Image<&[u8], 4>, x: u32, y: u32) -> &mut Self { for j in 0..with.height() { for i in 0..with.width() { unsafe { @@ -118,12 +118,12 @@ impl Overlay<Image<&[u8], 4>> for Image<&mut [u8], 4> { impl RepeatNew for Image<&[u8], 4> { type Output = Image<Vec<u8>, 4>; - fn repeated(self, x: u32, y: u32) -> Self::Output { + fn repeated(&self, x: u32, y: u32) -> Self::Output { let mut img = Image::alloc(x, y); // could probably optimize this a ton but eh for x in 0..(x / self.width()) { for y in 0..(y / self.height()) { let a: &mut Image<&mut [u8], 4> = &mut img.as_mut(); - a.overlay_at(self.copy(), x * self.width(), y * self.height()); + a.overlay_at(self, x * self.width(), y * self.height()); } } img @@ -235,8 +235,8 @@ impl ImageUtils for Image<&mut [u8], 4> { } self } - type With<'a> = Image<&'a [u8], 4>; - fn overlay(&mut self, with: Image<&[u8], 4>) -> &mut Self { + type With<'a> = &'a Image<&'a [u8], 4>; + fn overlay(&mut self, with: &Image<&[u8], 4>) -> &mut Self { debug_assert_eq!(self.width(), with.width()); debug_assert_eq!(self.height(), with.height()); unsafe_assert!(self.buffer.len() % 4 == 0); @@ -495,9 +495,9 @@ impl<const CHANNELS: usize> ImageHolder<CHANNELS> { } } -impl<'a> Overlay<&'a ImageHolder<4>> for ImageHolder<4> { - fn overlay_at(&mut self, with: &'a ImageHolder<4>, x: u32, y: u32) -> &mut Self { - self.borrow_mut().overlay_at(with.borrow(), x, y); +impl Overlay<ImageHolder<4>> for ImageHolder<4> { + fn overlay_at(&mut self, with: &ImageHolder<4>, x: u32, y: u32) -> &mut Self { + self.borrow_mut().overlay_at(&with.borrow(), x, y); self } } @@ -509,7 +509,7 @@ impl ImageUtils for ImageHolder<4> { } type With<'a> = &'a Self; fn overlay(&mut self, with: &Self) -> &mut Self { - self.borrow_mut().overlay(with.borrow()); + self.borrow_mut().overlay(&with.borrow()); self } |