mindustry logic execution, map- and schematic- parsing and rendering
20 files changed, 65 insertions, 54 deletions
diff --git a/mindus/Cargo.toml b/mindus/Cargo.toml index 5aa7da2..e6976bc 100644 --- a/mindus/Cargo.toml +++ b/mindus/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "mindus" -version = "5.0.41" +version = "5.0.42" edition = "2024" description = "A library for working with mindustry data formats (eg schematics and maps) (fork of plandustry)" authors = [ "KosmosPrime <[email protected]>", "bend-n <[email protected]>", ] -repository = "https://github.com/bend-n/mindus.git" +repository = "https://git.bendn.org/mindus.git" license = "GPL-3.0" exclude = [".github/", "items.py"] readme = "README.md" @@ -25,7 +25,7 @@ thiserror = "1.0" bobbin-bits = "0.1" enum_dispatch = "0.3" phf = { version = "0.11", features = ["macros"] } -fimg = { version = "0.4.33", features = [ +fimg = { version = "0.4.52", features = [ "scale", "blur", "save", @@ -42,7 +42,7 @@ square = [] default = ["bin"] [build-dependencies] -fimg = { version = "0.4.33", features = [ +fimg = { version = "0.4.52", features = [ "scale", "blur", "save", diff --git a/mindus/assets/blocks/environment/ore-wall-beryllium1.png b/mindus/assets/blocks/environment/ore-wall-beryllium1.png Binary files differindex a1dcfcf..e9a3cc3 100644 --- a/mindus/assets/blocks/environment/ore-wall-beryllium1.png +++ b/mindus/assets/blocks/environment/ore-wall-beryllium1.png diff --git a/mindus/assets/blocks/environment/ore-wall-beryllium2.png b/mindus/assets/blocks/environment/ore-wall-beryllium2.png Binary files differindex 851a6b5..0904e0d 100644 --- a/mindus/assets/blocks/environment/ore-wall-beryllium2.png +++ b/mindus/assets/blocks/environment/ore-wall-beryllium2.png diff --git a/mindus/assets/blocks/environment/ore-wall-beryllium3.png b/mindus/assets/blocks/environment/ore-wall-beryllium3.png Binary files differindex b87cd5a..5c9b8c7 100644 --- a/mindus/assets/blocks/environment/ore-wall-beryllium3.png +++ b/mindus/assets/blocks/environment/ore-wall-beryllium3.png diff --git a/mindus/assets/blocks/environment/ore-wall-graphite1.png b/mindus/assets/blocks/environment/ore-wall-graphite1.png Binary files differnew file mode 100644 index 0000000..12b7df9 --- /dev/null +++ b/mindus/assets/blocks/environment/ore-wall-graphite1.png diff --git a/mindus/assets/blocks/environment/ore-wall-graphite2.png b/mindus/assets/blocks/environment/ore-wall-graphite2.png Binary files differnew file mode 100644 index 0000000..5132f76 --- /dev/null +++ b/mindus/assets/blocks/environment/ore-wall-graphite2.png diff --git a/mindus/assets/blocks/environment/ore-wall-graphite3.png b/mindus/assets/blocks/environment/ore-wall-graphite3.png Binary files differnew file mode 100644 index 0000000..5369276 --- /dev/null +++ b/mindus/assets/blocks/environment/ore-wall-graphite3.png diff --git a/mindus/assets/blocks/environment/ore-wall-thorium1.png b/mindus/assets/blocks/environment/ore-wall-thorium1.png Binary files differindex a01a034..05342af 100644 --- a/mindus/assets/blocks/environment/ore-wall-thorium1.png +++ b/mindus/assets/blocks/environment/ore-wall-thorium1.png diff --git a/mindus/assets/blocks/environment/ore-wall-thorium2.png b/mindus/assets/blocks/environment/ore-wall-thorium2.png Binary files differindex 4ea1ec3..ed21d0d 100644 --- a/mindus/assets/blocks/environment/ore-wall-thorium2.png +++ b/mindus/assets/blocks/environment/ore-wall-thorium2.png diff --git a/mindus/assets/blocks/environment/ore-wall-thorium3.png b/mindus/assets/blocks/environment/ore-wall-thorium3.png Binary files differindex 266b53f..5a58f15 100644 --- a/mindus/assets/blocks/environment/ore-wall-thorium3.png +++ b/mindus/assets/blocks/environment/ore-wall-thorium3.png diff --git a/mindus/assets/blocks/environment/ore-wall-tungsten1.png b/mindus/assets/blocks/environment/ore-wall-tungsten1.png Binary files differindex faa96fc..81e61e1 100644 --- a/mindus/assets/blocks/environment/ore-wall-tungsten1.png +++ b/mindus/assets/blocks/environment/ore-wall-tungsten1.png diff --git a/mindus/assets/blocks/environment/ore-wall-tungsten2.png b/mindus/assets/blocks/environment/ore-wall-tungsten2.png Binary files differindex e8d939d..6ed7eba 100644 --- a/mindus/assets/blocks/environment/ore-wall-tungsten2.png +++ b/mindus/assets/blocks/environment/ore-wall-tungsten2.png diff --git a/mindus/assets/blocks/environment/ore-wall-tungsten3.png b/mindus/assets/blocks/environment/ore-wall-tungsten3.png Binary files differindex da8b232..d1e7993 100644 --- a/mindus/assets/blocks/environment/ore-wall-tungsten3.png +++ b/mindus/assets/blocks/environment/ore-wall-tungsten3.png diff --git a/mindus/assets/blocks/environment/snow1.png b/mindus/assets/blocks/environment/snow1.png Binary files differindex 1d320be..3387f23 100644 --- a/mindus/assets/blocks/environment/snow1.png +++ b/mindus/assets/blocks/environment/snow1.png diff --git a/mindus/assets/blocks/environment/snow3.png b/mindus/assets/blocks/environment/snow3.png Binary files differindex 8413bde..baa63ec 100644 --- a/mindus/assets/blocks/environment/snow3.png +++ b/mindus/assets/blocks/environment/snow3.png diff --git a/mindus/src/block/content.rs b/mindus/src/block/content.rs index 74047c4..25f5176 100644 --- a/mindus/src/block/content.rs +++ b/mindus/src/block/content.rs @@ -182,6 +182,7 @@ content_enum! { "ore-crystal-thorium", "ore-wall-thorium", "ore-wall-beryllium", + "ore-wall-graphite", "graphitic-wall", "ore-wall-tungsten", "graphite-press", diff --git a/mindus/src/block/logic.rs b/mindus/src/block/logic.rs index 67d5bb4..b4c374e 100644 --- a/mindus/src/block/logic.rs +++ b/mindus/src/block/logic.rs @@ -68,7 +68,7 @@ fn deser_canvas_image(b: &[u8], size: usize) -> Image<Box<[u8]>, 1> { let word = (i + offset) >> 3; n |= (((b[word] & (1 << ((i + offset) & 7))) != 0) as u8) << i; } - unsafe { p.set_pixel(i as u32 % size as u32, i as u32 / size as u32, [n]) }; + unsafe { p.set_pixel(i as u32 % size as u32, i as u32 / size as u32, &[n]) }; } p } diff --git a/mindus/src/block/mod.rs b/mindus/src/block/mod.rs index 94c809d..a1b6df2 100644 --- a/mindus/src/block/mod.rs +++ b/mindus/src/block/mod.rs @@ -727,6 +727,7 @@ make_register! { "ore-wall-beryllium" @ 1; "ore-wall-thorium" @ 1; "ore-wall-tungsten" @ 1; + "ore-wall-graphite" @ 1; "graphitic-wall" @ 1; "boulder" @ 1; "arkyic-wall" @ 1; diff --git a/mindus/src/data/map.rs b/mindus/src/data/map.rs index 7dbafa8..7d90133 100644 --- a/mindus/src/data/map.rs +++ b/mindus/src/data/map.rs @@ -147,7 +147,7 @@ static FLOOR_TABLE: [[[DynImage<&'static [u8]>; 3]; 8]; BlockEnum::ALL.len()] = | "spawn" ]; image! { - | "ore-copper" | "ore-beryllium" | "ore-lead" | "ore-scrap" | "ore-coal" | "ore-thorium" | "ore-titanium" | "ore-tungsten" | "pebbles" | "tendrils" | "ore-wall-tungsten" | "ore-wall-beryllium" | "ore-wall-thorium" | "ore-crystal-thorium" + | "ore-copper" | "ore-beryllium" | "ore-lead" | "ore-scrap" | "ore-coal" | "ore-thorium" | "ore-titanium" | "ore-tungsten" | "pebbles" | "tendrils" | "ore-wall-graphite" | "ore-wall-tungsten" | "ore-wall-beryllium" | "ore-wall-thorium" | "ore-crystal-thorium" | "yellow-stone-vent" | "arkyic-vent" | "crystalline-vent" | "red-stone-vent" | "carbon-vent" | "darksand" | "sand-floor" diff --git a/mindus/src/data/renderer.rs b/mindus/src/data/renderer.rs index 281264a..095a69d 100644 --- a/mindus/src/data/renderer.rs +++ b/mindus/src/data/renderer.rs @@ -393,52 +393,6 @@ impl Renderable for Map { ); } } - macro_rules! f { - ($($x: literal)+) => { paste::paste!{ - ([$(load!([<rune _ overlay $x>] ),)+], [$(load!([<rune _ overlay _ crux $x>] ),)+]) - }}; - } - const RUNES: ([[Image<&[u8], 4>; 3]; 109], [[Image<&[u8], 4>; 3]; 109]) = f![0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108]; - - if tile.has_ore() { - match tile.ore { - Type::RuneOverlay => unsafe { - img.overlay_at( - &RUNES.0[tile.nd[2] as usize][scale as usize], - scale * x as u32, - scale * y as u32, - ); - }, - Type::RuneOverlayCrux => unsafe { - img.overlay_at( - &RUNES.1[tile.nd[2] as usize][scale as usize], - scale * x as u32, - scale * y as u32, - ); - }, - Type::CharacterOverlay | Type::CharacterOverlayWhite => { - macro_rules! f { - ($($x: literal)+) => { paste::paste!{ - [$(load!([<character _ overlay $x>] ),)+] - }}; - } - - const LETTERS: [[Image<&[u8], 4>; 3]; 64] = f![0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63]; - unsafe { - img.overlay_at( - LETTERS[(tile.nd[2] & 0x3f) as usize][scale as usize] - .mapped(image::Cow::Ref) - .rotate(4 - (tile.nd[2] >> 6)), - scale * x as u32, - scale * y as u32, - ) - }; - } - ore => unsafe { - img.overlay_at(&table(ore, scale), scale * x as u32, scale * y as u32); - }, - } - } } } let mut img = unsafe { img.assume_init() }; @@ -523,7 +477,62 @@ impl Renderable for Map { } } } - // loop3 draws the units + /// loop 3 for the ores + for y in 0..self.height { + for x in 0..self.width { + let j = x + self.width * y; + let tile = unsafe { self.tiles.get_unchecked(j) }; + let y = self.height - y - 1; + + macro_rules! f { + ($($x: literal)+) => { paste::paste!{ + ([$(load!([<rune _ overlay $x>] ),)+], [$(load!([<rune _ overlay _ crux $x>] ),)+]) + }}; + } + const RUNES: ([[Image<&[u8], 4>; 3]; 109], [[Image<&[u8], 4>; 3]; 109]) = f![0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108]; + + if tile.has_ore() { + match tile.ore { + Type::RuneOverlay => unsafe { + img.overlay_at( + &RUNES.0[tile.nd[2] as usize][scale as usize], + scale * x as u32, + scale * y as u32, + ); + }, + Type::RuneOverlayCrux => unsafe { + img.overlay_at( + &RUNES.1[tile.nd[2] as usize][scale as usize], + scale * x as u32, + scale * y as u32, + ); + }, + Type::CharacterOverlay | Type::CharacterOverlayWhite => { + macro_rules! f { + ($($x: literal)+) => { paste::paste!{ + [$(load!([<character _ overlay $x>] ),)+] + }}; + } + + const LETTERS: [[Image<&[u8], 4>; 3]; 64] = f![0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63]; + unsafe { + img.overlay_at( + LETTERS[(tile.nd[2] & 0x3f) as usize][scale as usize] + .mapped(image::Cow::Ref) + .rotate(4 - (tile.nd[2] >> 6)), + scale * x as u32, + scale * y as u32, + ) + }; + } + ore => unsafe { + img.overlay_at(&table(ore, scale), scale * x as u32, scale * y as u32); + }, + } + } + } + } + // loop4 draws the units for entity in &self.entities { // bounds checks let (x, y) = ( @@ -812,7 +821,7 @@ pub fn draw_map_simple( for x in x..(x as usize + s as usize).min(w as usize) { for y in y..(y as usize + s as usize).min(h as usize) { unsafe { - img.set_pixel(x as u32, y as u32, <[u8; 3]>::from(team.color())); + img.set_pixel(x as u32, y as u32, &<[u8; 3]>::from(team.color())); } } } |