Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--.github/example.pngbin33317 -> 6866 bytes
-rw-r--r--.gitignore5
-rw-r--r--Cargo.toml46
-rw-r--r--README.md20
-rw-r--r--assets/blocks/campaign/interplanetary-accelerator.pngbin2696 -> 0 bytes
-rw-r--r--assets/blocks/campaign/launchpod.pngbin735 -> 0 bytes
-rw-r--r--assets/blocks/defense/barrier-projector-team.pngbin482 -> 0 bytes
-rw-r--r--assets/blocks/defense/barrier-projector.pngbin831 -> 0 bytes
-rw-r--r--assets/blocks/defense/build-tower.pngbin1093 -> 0 bytes
-rw-r--r--assets/blocks/defense/force-projector.pngbin829 -> 0 bytes
-rw-r--r--assets/blocks/defense/large-shield-projector-team.pngbin839 -> 0 bytes
-rw-r--r--assets/blocks/defense/large-shield-projector.pngbin1172 -> 0 bytes
-rw-r--r--assets/blocks/defense/mend-projector.pngbin520 -> 0 bytes
-rw-r--r--assets/blocks/defense/mender.pngbin262 -> 0 bytes
-rw-r--r--assets/blocks/defense/overdrive-dome.pngbin1105 -> 0 bytes
-rw-r--r--assets/blocks/defense/overdrive-projector.pngbin520 -> 0 bytes
-rw-r--r--assets/blocks/defense/regen-projector.pngbin1072 -> 0 bytes
-rw-r--r--assets/blocks/defense/shield-projector.pngbin882 -> 0 bytes
-rw-r--r--assets/blocks/defense/shock-mine-team-top.pngbin140 -> 0 bytes
-rw-r--r--assets/blocks/defense/shockwave-tower.pngbin1144 -> 0 bytes
-rw-r--r--assets/blocks/distribution/bridge-arrow.pngbin130 -> 0 bytes
-rw-r--r--assets/blocks/distribution/bridge-conveyor-arrow.pngbin128 -> 0 bytes
-rw-r--r--assets/blocks/distribution/bridge-conveyor-bridge.pngbin116 -> 0 bytes
-rw-r--r--assets/blocks/distribution/bridge-conveyor-end.pngbin147 -> 0 bytes
-rw-r--r--assets/blocks/distribution/bridge-conveyor.pngbin219 -> 0 bytes
-rw-r--r--assets/blocks/distribution/center.pngbin114 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-0-0.pngbin272 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-0-1.pngbin361 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-0-2.pngbin342 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-0-3.pngbin362 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-1-0-h.pngbin422 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-1-0.pngbin430 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-1-1-h.pngbin418 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-1-1-v.pngbin423 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-1-1.pngbin417 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-1-2.pngbin418 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-1-3.pngbin423 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-2-0-h.pngbin366 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-2-0-v.pngbin376 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-2-0.pngbin290 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-2-1-h.pngbin375 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-2-1.pngbin371 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-2-2.pngbin371 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-2-3-h.pngbin369 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-2-3.pngbin372 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-3-0-h.pngbin318 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-3-0.pngbin187 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-3-1.pngbin324 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-3-3.pngbin324 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-4-0.pngbin258 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-4-1.pngbin359 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/armored-conveyor-4-3.pngbin361 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-0-0.pngbin145 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-0-1.pngbin272 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-0-2.pngbin276 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-0-3.pngbin271 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-1-0-h.pngbin366 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-1-0.pngbin263 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-1-1-h.pngbin362 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-1-1-v.pngbin365 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-1-1.pngbin361 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-1-2.pngbin362 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-2-0-h.pngbin313 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-2-0-v.pngbin315 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-2-0.pngbin182 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-2-1-h.pngbin307 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-2-1.pngbin307 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-2-2.pngbin315 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-2-3-h.pngbin303 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-2-3.pngbin309 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-3-0-h.pngbin318 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-3-0.pngbin188 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-3-1.pngbin327 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-3-3.pngbin326 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-4-1.pngbin307 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/conveyor-4-3.pngbin308 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/titanium-conveyor-0-0.pngbin152 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/titanium-conveyor-0-1.pngbin278 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/titanium-conveyor-0-2.pngbin285 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/titanium-conveyor-0-3.pngbin278 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/titanium-conveyor-1-0.pngbin275 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/titanium-conveyor-1-1-v.pngbin382 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/titanium-conveyor-1-2.pngbin380 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/titanium-conveyor-1-3.pngbin379 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/titanium-conveyor-2-0-h.pngbin321 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/titanium-conveyor-2-0-v.pngbin324 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/titanium-conveyor-2-0.pngbin188 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/titanium-conveyor-2-2.pngbin323 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/titanium-conveyor-2-3.pngbin315 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/titanium-conveyor-3-0-h.pngbin318 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/titanium-conveyor-3-0.pngbin188 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/titanium-conveyor-3-1.pngbin327 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/titanium-conveyor-3-3.pngbin326 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/titanium-conveyor-4-1.pngbin315 -> 0 bytes
-rw-r--r--assets/blocks/distribution/conveyors/titanium-conveyor-4-3.pngbin315 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-0-0.pngbin298 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-0-1.pngbin335 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-0-2.pngbin301 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-0-3.pngbin342 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-1-0-h.pngbin376 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-1-0.pngbin375 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-1-1-h.pngbin372 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-1-1-v.pngbin375 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-1-1.pngbin369 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-1-2.pngbin374 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-1-3.pngbin377 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-2-0-h.pngbin312 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-2-0-v.pngbin316 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-2-0.pngbin312 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-2-1-h.pngbin351 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-2-1.pngbin351 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-2-2.pngbin315 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-2-3-h.pngbin354 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-2-3.pngbin351 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-3-0-h.pngbin313 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-3-0.pngbin312 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-3-1.pngbin340 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-3-3.pngbin345 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-4-1.pngbin339 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/armored-duct-4-3.pngbin340 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-0-0.pngbin290 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-0-1.pngbin307 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-0-2.pngbin292 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-0-3.pngbin306 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-1-0-h.pngbin340 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-1-0.pngbin345 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-1-1-h.pngbin337 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-1-1-v.pngbin341 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-1-1.pngbin344 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-1-2.pngbin341 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-1-3.pngbin338 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-2-0-h.pngbin305 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-2-0-v.pngbin308 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-2-0.pngbin305 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-2-1-h.pngbin318 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-2-1.pngbin320 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-2-2.pngbin305 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-2-3-h.pngbin320 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-2-3.pngbin322 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-3-0-h.pngbin306 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-3-0.pngbin303 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-3-1.pngbin326 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-3-3.pngbin325 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-4-0.pngbin312 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-4-1.pngbin323 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-4-3.pngbin322 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-base.pngbin251 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-bridge-arrow.pngbin134 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-bridge-bridge-bottom.pngbin115 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-bridge-bridge.pngbin131 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-bridge-dir.pngbin141 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-bridge.pngbin203 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-router.pngbin203 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-unloader-top.pngbin393 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/duct-unloader.pngbin226 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/surge-router.pngbin260 -> 0 bytes
-rw-r--r--assets/blocks/distribution/ducts/top.pngbin155 -> 0 bytes
-rw-r--r--assets/blocks/distribution/inverted-sorter.pngbin370 -> 0 bytes
-rw-r--r--assets/blocks/distribution/item-source.pngbin324 -> 0 bytes
-rw-r--r--assets/blocks/distribution/item-void.pngbin223 -> 0 bytes
-rw-r--r--assets/blocks/distribution/mass-driver-base.pngbin840 -> 0 bytes
-rw-r--r--assets/blocks/distribution/mass-driver.pngbin1023 -> 0 bytes
-rw-r--r--assets/blocks/distribution/overflow-gate.pngbin179 -> 0 bytes
-rw-r--r--assets/blocks/distribution/phase-conveyor-arrow.pngbin128 -> 0 bytes
-rw-r--r--assets/blocks/distribution/phase-conveyor-bridge.pngbin116 -> 0 bytes
-rw-r--r--assets/blocks/distribution/phase-conveyor-end.pngbin101 -> 0 bytes
-rw-r--r--assets/blocks/distribution/phase-conveyor.pngbin253 -> 0 bytes
-rw-r--r--assets/blocks/distribution/sorter.pngbin316 -> 0 bytes
-rw-r--r--assets/blocks/distribution/stack-conveyors/plastanium-conveyor-0.pngbin165 -> 0 bytes
-rw-r--r--assets/blocks/distribution/stack-conveyors/plastanium-conveyor-1.pngbin1640 -> 0 bytes
-rw-r--r--assets/blocks/distribution/stack-conveyors/plastanium-conveyor-2.pngbin1678 -> 0 bytes
-rw-r--r--assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-0.pngbin567 -> 0 bytes
-rw-r--r--assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-1.pngbin1120 -> 0 bytes
-rw-r--r--assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-2.pngbin1127 -> 0 bytes
-rw-r--r--assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-3.pngbin1120 -> 0 bytes
-rw-r--r--assets/blocks/distribution/stack-conveyors/surge-conveyor-0.pngbin198 -> 0 bytes
-rw-r--r--assets/blocks/distribution/stack-conveyors/surge-conveyor-1.pngbin579 -> 0 bytes
-rw-r--r--assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-0.pngbin545 -> 0 bytes
-rw-r--r--assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-1.pngbin1100 -> 0 bytes
-rw-r--r--assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-2.pngbin1105 -> 0 bytes
-rw-r--r--assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-3.pngbin1110 -> 0 bytes
-rw-r--r--assets/blocks/distribution/stack-conveyors/surge-conveyor-stack.pngbin190 -> 0 bytes
-rw-r--r--assets/blocks/distribution/underflow-gate.pngbin253 -> 0 bytes
-rw-r--r--assets/blocks/distribution/unit-cargo-unload-point-top.pngbin143 -> 0 bytes
-rw-r--r--assets/blocks/distribution/unit-cargo-unload-point.pngbin586 -> 0 bytes
-rw-r--r--assets/blocks/drills/blast-drill.pngbin1285 -> 0 bytes
-rw-r--r--assets/blocks/drills/cliff-crusher-rotator.pngbin216 -> 0 bytes
-rw-r--r--assets/blocks/drills/cliff-crusher.pngbin688 -> 0 bytes
-rw-r--r--assets/blocks/drills/eruption-drill.pngbin2257 -> 0 bytes
-rw-r--r--assets/blocks/drills/impact-drill.pngbin1770 -> 0 bytes
-rw-r--r--assets/blocks/drills/large-plasma-bore-top.pngbin432 -> 0 bytes
-rw-r--r--assets/blocks/drills/large-plasma-bore.pngbin1060 -> 0 bytes
-rw-r--r--assets/blocks/drills/laser-drill.pngbin912 -> 0 bytes
-rw-r--r--assets/blocks/drills/mechanical-drill.pngbin706 -> 0 bytes
-rw-r--r--assets/blocks/drills/oil-extractor.pngbin1065 -> 0 bytes
-rw-r--r--assets/blocks/drills/plasma-bore-top.pngbin382 -> 0 bytes
-rw-r--r--assets/blocks/drills/plasma-bore.pngbin674 -> 0 bytes
-rw-r--r--assets/blocks/drills/pneumatic-drill.pngbin666 -> 0 bytes
-rw-r--r--assets/blocks/drills/vent-condenser.pngbin1408 -> 0 bytes
-rw-r--r--assets/blocks/drills/water-extractor.pngbin714 -> 0 bytes
-rw-r--r--assets/blocks/environment/arkycite-floor.pngbin175 -> 0 bytes
-rw-r--r--assets/blocks/environment/arkyic-boulder.pngbin443 -> 0 bytes
-rw-r--r--assets/blocks/environment/arkyic-stone.pngbin175 -> 0 bytes
-rw-r--r--assets/blocks/environment/arkyic-vent.pngbin946 -> 0 bytes
-rw-r--r--assets/blocks/environment/arkyic-wall-large.pngbin527 -> 0 bytes
-rw-r--r--assets/blocks/environment/arkyic-wall.pngbin194 -> 0 bytes
-rw-r--r--assets/blocks/environment/basalt-boulder.pngbin494 -> 0 bytes
-rw-r--r--assets/blocks/environment/basalt.pngbin155 -> 0 bytes
-rw-r--r--assets/blocks/environment/beryllic-boulder.pngbin472 -> 0 bytes
-rw-r--r--assets/blocks/environment/beryllic-stone-wall-large.pngbin538 -> 0 bytes
-rw-r--r--assets/blocks/environment/beryllic-stone-wall.pngbin210 -> 0 bytes
-rw-r--r--assets/blocks/environment/beryllic-stone.pngbin178 -> 0 bytes
-rw-r--r--assets/blocks/environment/bluemat.pngbin157 -> 0 bytes
-rw-r--r--assets/blocks/environment/boulder.pngbin382 -> 0 bytes
-rw-r--r--assets/blocks/environment/carbon-boulder.pngbin485 -> 0 bytes
-rw-r--r--assets/blocks/environment/carbon-stone.pngbin301 -> 0 bytes
-rw-r--r--assets/blocks/environment/carbon-vent.pngbin923 -> 0 bytes
-rw-r--r--assets/blocks/environment/carbon-wall-large.pngbin559 -> 0 bytes
-rw-r--r--assets/blocks/environment/carbon-wall.pngbin343 -> 0 bytes
-rw-r--r--assets/blocks/environment/char.pngbin221 -> 0 bytes
-rw-r--r--assets/blocks/environment/core-zone.pngbin172 -> 0 bytes
-rw-r--r--assets/blocks/environment/crater-stone.pngbin213 -> 0 bytes
-rw-r--r--assets/blocks/environment/crystal-blocks.pngbin1023 -> 0 bytes
-rw-r--r--assets/blocks/environment/crystal-cluster.pngbin2417 -> 0 bytes
-rw-r--r--assets/blocks/environment/crystal-orbs.pngbin929 -> 0 bytes
-rw-r--r--assets/blocks/environment/crystalline-boulder.pngbin458 -> 0 bytes
-rw-r--r--assets/blocks/environment/crystalline-stone-wall-large.pngbin555 -> 0 bytes
-rw-r--r--assets/blocks/environment/crystalline-stone-wall.pngbin190 -> 0 bytes
-rw-r--r--assets/blocks/environment/crystalline-stone.pngbin165 -> 0 bytes
-rw-r--r--assets/blocks/environment/crystalline-vent.pngbin942 -> 0 bytes
-rw-r--r--assets/blocks/environment/dacite-boulder.pngbin494 -> 0 bytes
-rw-r--r--assets/blocks/environment/dacite-wall-large.pngbin497 -> 0 bytes
-rw-r--r--assets/blocks/environment/dacite-wall.pngbin205 -> 0 bytes
-rw-r--r--assets/blocks/environment/dacite.pngbin172 -> 0 bytes
-rw-r--r--assets/blocks/environment/dark-metal-large.pngbin413 -> 0 bytes
-rw-r--r--assets/blocks/environment/dark-metal.pngbin262 -> 0 bytes
-rw-r--r--assets/blocks/environment/dark-panel-1.pngbin187 -> 0 bytes
-rw-r--r--assets/blocks/environment/dark-panel-2.pngbin227 -> 0 bytes
-rw-r--r--assets/blocks/environment/dark-panel-3.pngbin158 -> 0 bytes
-rw-r--r--assets/blocks/environment/dark-panel-4.pngbin210 -> 0 bytes
-rw-r--r--assets/blocks/environment/dark-panel-6.pngbin174 -> 0 bytes
-rw-r--r--assets/blocks/environment/darksand-tainted-water.pngbin313 -> 0 bytes
-rw-r--r--assets/blocks/environment/darksand-water.pngbin313 -> 0 bytes
-rw-r--r--assets/blocks/environment/darksand.pngbin157 -> 0 bytes
-rw-r--r--assets/blocks/environment/deep-tainted-water.pngbin172 -> 0 bytes
-rw-r--r--assets/blocks/environment/deep-water.pngbin172 -> 0 bytes
-rw-r--r--assets/blocks/environment/dense-red-stone.pngbin200 -> 0 bytes
-rw-r--r--assets/blocks/environment/dirt-wall-large.pngbin480 -> 0 bytes
-rw-r--r--assets/blocks/environment/dirt.pngbin143 -> 0 bytes
-rw-r--r--assets/blocks/environment/dune-wall-large.pngbin647 -> 0 bytes
-rw-r--r--assets/blocks/environment/dune-wall.pngbin230 -> 0 bytes
-rw-r--r--assets/blocks/environment/ferric-boulder.pngbin421 -> 0 bytes
-rw-r--r--assets/blocks/environment/ferric-craters.pngbin216 -> 0 bytes
-rw-r--r--assets/blocks/environment/ferric-stone-wall-large.pngbin500 -> 0 bytes
-rw-r--r--assets/blocks/environment/ferric-stone.pngbin154 -> 0 bytes
-rw-r--r--assets/blocks/environment/graphitic-wall-large.pngbin759 -> 0 bytes
-rw-r--r--assets/blocks/environment/graphitic-wall.pngbin384 -> 0 bytes
-rw-r--r--assets/blocks/environment/grass.pngbin152 -> 0 bytes
-rw-r--r--assets/blocks/environment/hotrock.pngbin225 -> 0 bytes
-rw-r--r--assets/blocks/environment/ice-snow.pngbin363 -> 0 bytes
-rw-r--r--assets/blocks/environment/ice-wall-large.pngbin418 -> 0 bytes
-rw-r--r--assets/blocks/environment/ice-wall.pngbin235 -> 0 bytes
-rw-r--r--assets/blocks/environment/ice.pngbin184 -> 0 bytes
-rw-r--r--assets/blocks/environment/magmarock.pngbin262 -> 0 bytes
-rw-r--r--assets/blocks/environment/metal-floor-2.pngbin131 -> 0 bytes
-rw-r--r--assets/blocks/environment/metal-floor-3.pngbin150 -> 0 bytes
-rw-r--r--assets/blocks/environment/metal-floor-5.pngbin162 -> 0 bytes
-rw-r--r--assets/blocks/environment/metal-floor-damaged.pngbin216 -> 0 bytes
-rw-r--r--assets/blocks/environment/metal-floor.pngbin175 -> 0 bytes
-rw-r--r--assets/blocks/environment/molten-slag.pngbin1279 -> 0 bytes
-rw-r--r--assets/blocks/environment/moss.pngbin167 -> 0 bytes
-rw-r--r--assets/blocks/environment/mud.pngbin1297 -> 0 bytes
-rw-r--r--assets/blocks/environment/ore-beryllium.pngbin203 -> 0 bytes
-rw-r--r--assets/blocks/environment/ore-coal.pngbin253 -> 0 bytes
-rw-r--r--assets/blocks/environment/ore-copper.pngbin293 -> 0 bytes
-rw-r--r--assets/blocks/environment/ore-crystal-thorium.pngbin208 -> 0 bytes
-rw-r--r--assets/blocks/environment/ore-lead.pngbin255 -> 0 bytes
-rw-r--r--assets/blocks/environment/ore-scrap.pngbin290 -> 0 bytes
-rw-r--r--assets/blocks/environment/ore-thorium.pngbin255 -> 0 bytes
-rw-r--r--assets/blocks/environment/ore-titanium.pngbin255 -> 0 bytes
-rw-r--r--assets/blocks/environment/ore-tungsten.pngbin202 -> 0 bytes
-rw-r--r--assets/blocks/environment/ore-wall-beryllium.pngbin196 -> 0 bytes
-rw-r--r--assets/blocks/environment/ore-wall-thorium.pngbin211 -> 0 bytes
-rw-r--r--assets/blocks/environment/ore-wall-tungsten.pngbin219 -> 0 bytes
-rw-r--r--assets/blocks/environment/pebbles.pngbin224 -> 0 bytes
-rw-r--r--assets/blocks/environment/pine.pngbin523 -> 0 bytes
-rw-r--r--assets/blocks/environment/pooled-cryofluid.pngbin1311 -> 0 bytes
-rw-r--r--assets/blocks/environment/pur-bush.pngbin287 -> 0 bytes
-rw-r--r--assets/blocks/environment/red-diamond-wall.pngbin508 -> 0 bytes
-rw-r--r--assets/blocks/environment/red-ice-boulder.pngbin501 -> 0 bytes
-rw-r--r--assets/blocks/environment/red-ice-wall-large.pngbin563 -> 0 bytes
-rw-r--r--assets/blocks/environment/red-ice-wall.pngbin246 -> 0 bytes
-rw-r--r--assets/blocks/environment/red-ice.pngbin200 -> 0 bytes
-rw-r--r--assets/blocks/environment/red-stone-boulder.pngbin419 -> 0 bytes
-rw-r--r--assets/blocks/environment/red-stone-vent.pngbin944 -> 0 bytes
-rw-r--r--assets/blocks/environment/red-stone-wall-large.pngbin598 -> 0 bytes
-rw-r--r--assets/blocks/environment/red-stone.pngbin181 -> 0 bytes
-rw-r--r--assets/blocks/environment/redmat.pngbin159 -> 0 bytes
-rw-r--r--assets/blocks/environment/redweed.pngbin248 -> 0 bytes
-rw-r--r--assets/blocks/environment/regolith-wall-large.pngbin609 -> 0 bytes
-rw-r--r--assets/blocks/environment/regolith-wall.pngbin228 -> 0 bytes
-rw-r--r--assets/blocks/environment/regolith.pngbin164 -> 0 bytes
-rw-r--r--assets/blocks/environment/rhyolite-boulder.pngbin460 -> 0 bytes
-rw-r--r--assets/blocks/environment/rhyolite-crater.pngbin607 -> 0 bytes
-rw-r--r--assets/blocks/environment/rhyolite-vent.pngbin890 -> 0 bytes
-rw-r--r--assets/blocks/environment/rhyolite-wall-large.pngbin609 -> 0 bytes
-rw-r--r--assets/blocks/environment/rhyolite-wall.pngbin236 -> 0 bytes
-rw-r--r--assets/blocks/environment/rhyolite.pngbin576 -> 0 bytes
-rw-r--r--assets/blocks/environment/rough-rhyolite.pngbin163 -> 0 bytes
-rw-r--r--assets/blocks/environment/salt-wall.pngbin203 -> 0 bytes
-rw-r--r--assets/blocks/environment/salt.pngbin186 -> 0 bytes
-rw-r--r--assets/blocks/environment/sand-boulder.pngbin264 -> 0 bytes
-rw-r--r--assets/blocks/environment/sand-floor.pngbin156 -> 0 bytes
-rw-r--r--assets/blocks/environment/sand-wall-large.pngbin503 -> 0 bytes
-rw-r--r--assets/blocks/environment/sand-wall.pngbin216 -> 0 bytes
-rw-r--r--assets/blocks/environment/sand-water.pngbin314 -> 0 bytes
-rw-r--r--assets/blocks/environment/shale-boulder.pngbin264 -> 0 bytes
-rw-r--r--assets/blocks/environment/shale-wall-large.pngbin362 -> 0 bytes
-rw-r--r--assets/blocks/environment/shale-wall.pngbin187 -> 0 bytes
-rw-r--r--assets/blocks/environment/shale.pngbin175 -> 0 bytes
-rw-r--r--assets/blocks/environment/shallow-water.pngbin172 -> 0 bytes
-rw-r--r--assets/blocks/environment/shrubs-large.pngbin366 -> 0 bytes
-rw-r--r--assets/blocks/environment/shrubs.pngbin217 -> 0 bytes
-rw-r--r--assets/blocks/environment/snow-boulder.pngbin398 -> 0 bytes
-rw-r--r--assets/blocks/environment/snow-pine.pngbin518 -> 0 bytes
-rw-r--r--assets/blocks/environment/snow-wall-large.pngbin366 -> 0 bytes
-rw-r--r--assets/blocks/environment/snow-wall.pngbin196 -> 0 bytes
-rw-r--r--assets/blocks/environment/snow.pngbin189 -> 0 bytes
-rw-r--r--assets/blocks/environment/spawn.pngbin236 -> 0 bytes
-rw-r--r--assets/blocks/environment/spore-cluster.pngbin261 -> 0 bytes
-rw-r--r--assets/blocks/environment/spore-moss.pngbin211 -> 0 bytes
-rw-r--r--assets/blocks/environment/spore-pine.pngbin523 -> 0 bytes
-rw-r--r--assets/blocks/environment/spore-wall-large.pngbin359 -> 0 bytes
-rw-r--r--assets/blocks/environment/spore-wall.pngbin168 -> 0 bytes
-rw-r--r--assets/blocks/environment/stone-wall-large.pngbin284 -> 0 bytes
-rw-r--r--assets/blocks/environment/stone-wall.pngbin174 -> 0 bytes
-rw-r--r--assets/blocks/environment/stone.pngbin154 -> 0 bytes
-rw-r--r--assets/blocks/environment/tainted-water.pngbin172 -> 0 bytes
-rw-r--r--assets/blocks/environment/tendrils.pngbin232 -> 0 bytes
-rw-r--r--assets/blocks/environment/vibrant-crystal-cluster.pngbin960 -> 0 bytes
-rw-r--r--assets/blocks/environment/white-tree-dead.pngbin4947 -> 0 bytes
-rw-r--r--assets/blocks/environment/yellow-stone-boulder.pngbin465 -> 0 bytes
-rw-r--r--assets/blocks/environment/yellow-stone-vent.pngbin942 -> 0 bytes
-rw-r--r--assets/blocks/environment/yellow-stone-wall-large.pngbin488 -> 0 bytes
-rw-r--r--assets/blocks/environment/yellow-stone.pngbin153 -> 0 bytes
-rw-r--r--assets/blocks/environment/yellowcoral.pngbin432 -> 0 bytes
-rw-r--r--assets/blocks/liquid/bridge-conduit-arrow.pngbin128 -> 0 bytes
-rw-r--r--assets/blocks/liquid/bridge-conduit-bridge.pngbin116 -> 0 bytes
-rw-r--r--assets/blocks/liquid/bridge-conduit-end.pngbin148 -> 0 bytes
-rw-r--r--assets/blocks/liquid/bridge-conduit.pngbin234 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/conduit-0-0.pngbin185 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/conduit-0-2.pngbin300 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/conduit-1-0-h.pngbin356 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/conduit-1-0.pngbin243 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/conduit-1-1-h.pngbin358 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/conduit-1-1-v.pngbin362 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/conduit-1-1.pngbin354 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/conduit-1-2.pngbin355 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/conduit-1-3.pngbin356 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/conduit-2-0-h.pngbin329 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/conduit-2-0-v.pngbin323 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/conduit-2-0.pngbin215 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/conduit-2-2.pngbin327 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/conduit-2-3-h.pngbin330 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/conduit-3-0-h.pngbin328 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/conduit-3-0.pngbin212 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/conduit-3-1.pngbin343 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/conduit-3-3.pngbin343 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/conduit-4-0.pngbin202 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/conduit-4-1.pngbin334 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/conduit-4-3.pngbin326 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/conduit-bottom-0.pngbin134 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/conduit-bottom-1.pngbin177 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/plated-conduit-0-0.pngbin210 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/plated-conduit-0-1.pngbin367 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/plated-conduit-0-2.pngbin333 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/plated-conduit-0-3.pngbin368 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/plated-conduit-1-0-h.pngbin409 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/plated-conduit-1-0.pngbin272 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/plated-conduit-1-1-h.pngbin402 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/plated-conduit-1-1-v.pngbin417 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/plated-conduit-1-1.pngbin394 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/plated-conduit-1-2.pngbin399 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/plated-conduit-1-3.pngbin409 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/plated-conduit-2-0-h.pngbin362 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/plated-conduit-2-0-v.pngbin364 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/plated-conduit-2-0.pngbin227 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/plated-conduit-2-1-h.pngbin373 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/plated-conduit-2-2.pngbin363 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/plated-conduit-2-3-h.pngbin373 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/plated-conduit-3-0-h.pngbin342 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/plated-conduit-3-0.pngbin215 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/plated-conduit-3-1.pngbin362 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/plated-conduit-3-3.pngbin360 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/plated-conduit-4-1.pngbin359 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/plated-conduit-4-3.pngbin361 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/pulse-conduit-0-0.pngbin223 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/pulse-conduit-0-2.pngbin333 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/pulse-conduit-0-3.pngbin363 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/pulse-conduit-1-0-h.pngbin409 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/pulse-conduit-1-0.pngbin297 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/pulse-conduit-1-1-h.pngbin402 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/pulse-conduit-1-1-v.pngbin417 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/pulse-conduit-1-1.pngbin394 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/pulse-conduit-1-2.pngbin399 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/pulse-conduit-1-3.pngbin409 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/pulse-conduit-2-0-h.pngbin362 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/pulse-conduit-2-0-v.pngbin364 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/pulse-conduit-2-0.pngbin253 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/pulse-conduit-2-1-h.pngbin373 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/pulse-conduit-2-2.pngbin363 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/pulse-conduit-2-3-h.pngbin373 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/pulse-conduit-3-0-h.pngbin342 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/pulse-conduit-3-0.pngbin263 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/pulse-conduit-3-1.pngbin362 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/pulse-conduit-3-3.pngbin360 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/pulse-conduit-4-0.pngbin235 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/pulse-conduit-4-1.pngbin359 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/pulse-conduit-4-3.pngbin357 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-0-0.pngbin218 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-0-1.pngbin364 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-0-2.pngbin340 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-0-3.pngbin363 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-1-0-h.pngbin395 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-1-0.pngbin257 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-1-1-h.pngbin400 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-1-1-v.pngbin404 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-1-1.pngbin385 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-1-2.pngbin396 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-1-3.pngbin394 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-2-0-h.pngbin346 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-2-0-v.pngbin340 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-2-0.pngbin219 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-2-1-h.pngbin354 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-2-1.pngbin348 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-2-2.pngbin339 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-2-3-h.pngbin350 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-2-3.pngbin348 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-3-0-h.pngbin306 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-3-0.pngbin195 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-3-1.pngbin318 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-3-3.pngbin316 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-4-0.pngbin244 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-4-1.pngbin348 -> 0 bytes
-rw-r--r--assets/blocks/liquid/conduits/reinforced-conduit-4-3.pngbin346 -> 0 bytes
-rw-r--r--assets/blocks/liquid/impulse-pump-liquid.pngbin253 -> 0 bytes
-rw-r--r--assets/blocks/liquid/impulse-pump.pngbin1007 -> 0 bytes
-rw-r--r--assets/blocks/liquid/liquid-container.pngbin540 -> 0 bytes
-rw-r--r--assets/blocks/liquid/liquid-junction.pngbin216 -> 0 bytes
-rw-r--r--assets/blocks/liquid/liquid-router.pngbin222 -> 0 bytes
-rw-r--r--assets/blocks/liquid/liquid-source.pngbin339 -> 0 bytes
-rw-r--r--assets/blocks/liquid/liquid-tank-bottom.pngbin233 -> 0 bytes
-rw-r--r--assets/blocks/liquid/liquid-tank.pngbin945 -> 0 bytes
-rw-r--r--assets/blocks/liquid/liquid-void.pngbin222 -> 0 bytes
-rw-r--r--assets/blocks/liquid/mechanical-pump-liquid.pngbin253 -> 0 bytes
-rw-r--r--assets/blocks/liquid/mechanical-pump.pngbin302 -> 0 bytes
-rw-r--r--assets/blocks/liquid/phase-conduit-arrow.pngbin128 -> 0 bytes
-rw-r--r--assets/blocks/liquid/phase-conduit-bridge.pngbin117 -> 0 bytes
-rw-r--r--assets/blocks/liquid/phase-conduit-end.pngbin105 -> 0 bytes
-rw-r--r--assets/blocks/liquid/phase-conduit.pngbin235 -> 0 bytes
-rw-r--r--assets/blocks/liquid/reinforced-bridge-conduit-arrow.pngbin129 -> 0 bytes
-rw-r--r--assets/blocks/liquid/reinforced-bridge-conduit-bridge-liquid.pngbin111 -> 0 bytes
-rw-r--r--assets/blocks/liquid/reinforced-bridge-conduit-bridge.pngbin136 -> 0 bytes
-rw-r--r--assets/blocks/liquid/reinforced-bridge-conduit-dir.pngbin141 -> 0 bytes
-rw-r--r--assets/blocks/liquid/reinforced-bridge-conduit-liquid.pngbin129 -> 0 bytes
-rw-r--r--assets/blocks/liquid/reinforced-bridge-conduit.pngbin257 -> 0 bytes
-rw-r--r--assets/blocks/liquid/reinforced-liquid-container.pngbin659 -> 0 bytes
-rw-r--r--assets/blocks/liquid/reinforced-liquid-junction.pngbin377 -> 0 bytes
-rw-r--r--assets/blocks/liquid/reinforced-liquid-tank-bottom.pngbin324 -> 0 bytes
-rw-r--r--assets/blocks/liquid/reinforced-pump-liquid.pngbin142 -> 0 bytes
-rw-r--r--assets/blocks/liquid/reinforced-pump.pngbin684 -> 0 bytes
-rw-r--r--assets/blocks/liquid/rotary-pump-liquid.pngbin253 -> 0 bytes
-rw-r--r--assets/blocks/liquid/rotary-pump.pngbin700 -> 0 bytes
-rw-r--r--assets/blocks/logic/canvas.pngbin429 -> 0 bytes
-rw-r--r--assets/blocks/logic/hyper-processor.pngbin1212 -> 0 bytes
-rw-r--r--assets/blocks/logic/large-logic-display.pngbin578 -> 0 bytes
-rw-r--r--assets/blocks/logic/logic-display.pngbin481 -> 0 bytes
-rw-r--r--assets/blocks/logic/logic-processor.pngbin800 -> 0 bytes
-rw-r--r--assets/blocks/logic/memory-bank.pngbin502 -> 0 bytes
-rw-r--r--assets/blocks/logic/memory-cell.pngbin220 -> 0 bytes
-rw-r--r--assets/blocks/logic/message.pngbin205 -> 0 bytes
-rw-r--r--assets/blocks/logic/micro-processor.pngbin454 -> 0 bytes
-rw-r--r--assets/blocks/logic/reinforced-message.pngbin205 -> 0 bytes
-rw-r--r--assets/blocks/logic/switch-on.pngbin527 -> 0 bytes
-rw-r--r--assets/blocks/logic/switch.pngbin615 -> 0 bytes
-rw-r--r--assets/blocks/logic/world-cell.pngbin221 -> 0 bytes
-rw-r--r--assets/blocks/logic/world-message.pngbin205 -> 0 bytes
-rw-r--r--assets/blocks/logic/world-processor.pngbin454 -> 0 bytes
-rw-r--r--assets/blocks/payload/constructor-top.pngbin1001 -> 0 bytes
-rw-r--r--assets/blocks/payload/constructor.pngbin876 -> 0 bytes
-rw-r--r--assets/blocks/payload/deconstructor-top.pngbin1389 -> 0 bytes
-rw-r--r--assets/blocks/payload/deconstructor.pngbin1871 -> 0 bytes
-rw-r--r--assets/blocks/payload/factory-in-3-dark.pngbin392 -> 0 bytes
-rw-r--r--assets/blocks/payload/factory-in-3.pngbin427 -> 0 bytes
-rw-r--r--assets/blocks/payload/factory-in-5-dark.pngbin625 -> 0 bytes
-rw-r--r--assets/blocks/payload/factory-in-5.pngbin645 -> 0 bytes
-rw-r--r--assets/blocks/payload/factory-out-3-dark.pngbin393 -> 0 bytes
-rw-r--r--assets/blocks/payload/factory-out-3.pngbin442 -> 0 bytes
-rw-r--r--assets/blocks/payload/factory-out-5-dark.pngbin614 -> 0 bytes
-rw-r--r--assets/blocks/payload/factory-out-5.pngbin749 -> 0 bytes
-rw-r--r--assets/blocks/payload/factory-out-7.pngbin901 -> 0 bytes
-rw-r--r--assets/blocks/payload/factory-out-9.pngbin1143 -> 0 bytes
-rw-r--r--assets/blocks/payload/factory-top-3.pngbin604 -> 0 bytes
-rw-r--r--assets/blocks/payload/large-constructor-top.pngbin1747 -> 0 bytes
-rw-r--r--assets/blocks/payload/large-constructor.pngbin1861 -> 0 bytes
-rw-r--r--assets/blocks/payload/large-payload-mass-driver.pngbin2509 -> 0 bytes
-rw-r--r--assets/blocks/payload/payload-conveyor.pngbin390 -> 0 bytes
-rw-r--r--assets/blocks/payload/payload-loader-top.pngbin626 -> 0 bytes
-rw-r--r--assets/blocks/payload/payload-loader.pngbin800 -> 0 bytes
-rw-r--r--assets/blocks/payload/payload-mass-driver.pngbin1219 -> 0 bytes
-rw-r--r--assets/blocks/payload/payload-router.pngbin307 -> 0 bytes
-rw-r--r--assets/blocks/payload/payload-source-top.pngbin675 -> 0 bytes
-rw-r--r--assets/blocks/payload/payload-unloader-top.pngbin626 -> 0 bytes
-rw-r--r--assets/blocks/payload/payload-unloader.pngbin800 -> 0 bytes
-rw-r--r--assets/blocks/payload/payload-void-top.pngbin685 -> 0 bytes
-rw-r--r--assets/blocks/payload/payload-void.pngbin1033 -> 0 bytes
-rw-r--r--assets/blocks/payload/reinforced-payload-conveyor.pngbin442 -> 0 bytes
-rw-r--r--assets/blocks/payload/reinforced-payload-router.pngbin300 -> 0 bytes
-rw-r--r--assets/blocks/payload/small-deconstructor-top.pngbin735 -> 0 bytes
-rw-r--r--assets/blocks/payload/small-deconstructor.pngbin897 -> 0 bytes
-rw-r--r--assets/blocks/power/battery-large.pngbin868 -> 0 bytes
-rw-r--r--assets/blocks/power/battery.pngbin2540 -> 0 bytes
-rw-r--r--assets/blocks/power/beam-link.pngbin1234 -> 0 bytes
-rw-r--r--assets/blocks/power/beam-node.pngbin450 -> 0 bytes
-rw-r--r--assets/blocks/power/beam-tower.pngbin1125 -> 0 bytes
-rw-r--r--assets/blocks/power/chemical-combustion-chamber.pngbin1136 -> 0 bytes
-rw-r--r--assets/blocks/power/combustion-generator.pngbin250 -> 0 bytes
-rw-r--r--assets/blocks/power/differential-generator-liquid.pngbin771 -> 0 bytes
-rw-r--r--assets/blocks/power/differential-generator.pngbin982 -> 0 bytes
-rw-r--r--assets/blocks/power/diode-arrow.pngbin151 -> 0 bytes
-rw-r--r--assets/blocks/power/diode.pngbin222 -> 0 bytes
-rw-r--r--assets/blocks/power/flux-reactor-bottom.pngbin241 -> 0 bytes
-rw-r--r--assets/blocks/power/flux-reactor-mid.pngbin334 -> 0 bytes
-rw-r--r--assets/blocks/power/flux-reactor.pngbin2141 -> 0 bytes
-rw-r--r--assets/blocks/power/illuminator.pngbin262 -> 0 bytes
-rw-r--r--assets/blocks/power/impact-reactor-bottom.pngbin240 -> 0 bytes
-rw-r--r--assets/blocks/power/impact-reactor.pngbin1380 -> 0 bytes
-rw-r--r--assets/blocks/power/neoplasia-reactor-bottom.pngbin398 -> 0 bytes
-rw-r--r--assets/blocks/power/neoplasia-reactor-center.pngbin335 -> 0 bytes
-rw-r--r--assets/blocks/power/neoplasia-reactor.pngbin2384 -> 0 bytes
-rw-r--r--assets/blocks/power/power-node-large.pngbin341 -> 0 bytes
-rw-r--r--assets/blocks/power/power-node.pngbin236 -> 0 bytes
-rw-r--r--assets/blocks/power/power-source.pngbin416 -> 0 bytes
-rw-r--r--assets/blocks/power/power-void.pngbin410 -> 0 bytes
-rw-r--r--assets/blocks/power/pyrolysis-generator.pngbin1294 -> 0 bytes
-rw-r--r--assets/blocks/power/rtg-generator.pngbin772 -> 0 bytes
-rw-r--r--assets/blocks/power/solar-panel-large.pngbin860 -> 0 bytes
-rw-r--r--assets/blocks/power/solar-panel.pngbin585 -> 0 bytes
-rw-r--r--assets/blocks/power/steam-generator-liquid.pngbin619 -> 0 bytes
-rw-r--r--assets/blocks/power/steam-generator.pngbin690 -> 0 bytes
-rw-r--r--assets/blocks/power/thermal-generator.pngbin638 -> 0 bytes
-rw-r--r--assets/blocks/power/thorium-reactor.pngbin878 -> 0 bytes
-rw-r--r--assets/blocks/power/turbine-condenser.pngbin1297 -> 0 bytes
-rw-r--r--assets/blocks/production/atmospheric-concentrator-bottom.pngbin334 -> 0 bytes
-rw-r--r--assets/blocks/production/atmospheric-concentrator.pngbin970 -> 0 bytes
-rw-r--r--assets/blocks/production/blast-mixer.pngbin678 -> 0 bytes
-rw-r--r--assets/blocks/production/carbide-crucible-bottom.pngbin233 -> 0 bytes
-rw-r--r--assets/blocks/production/carbide-crucible.pngbin1222 -> 0 bytes
-rw-r--r--assets/blocks/production/coal-centrifuge.pngbin519 -> 0 bytes
-rw-r--r--assets/blocks/production/cryofluid-mixer.pngbin696 -> 0 bytes
-rw-r--r--assets/blocks/production/cultivator.pngbin655 -> 0 bytes
-rw-r--r--assets/blocks/production/cyanogen-synthesizer-bottom.pngbin334 -> 0 bytes
-rw-r--r--assets/blocks/production/cyanogen-synthesizer.pngbin1100 -> 0 bytes
-rw-r--r--assets/blocks/production/disassembler-bottom.pngbin233 -> 0 bytes
-rw-r--r--assets/blocks/production/disassembler.pngbin1118 -> 0 bytes
-rw-r--r--assets/blocks/production/electric-heater-top1.pngbin370 -> 0 bytes
-rw-r--r--assets/blocks/production/electric-heater-top2.pngbin370 -> 0 bytes
-rw-r--r--assets/blocks/production/electric-heater.pngbin671 -> 0 bytes
-rw-r--r--assets/blocks/production/electrolyzer-bottom.pngbin334 -> 0 bytes
-rw-r--r--assets/blocks/production/electrolyzer.pngbin1050 -> 0 bytes
-rw-r--r--assets/blocks/production/heat-redirector-top2.pngbin474 -> 0 bytes
-rw-r--r--assets/blocks/production/heat-redirector.pngbin985 -> 0 bytes
-rw-r--r--assets/blocks/production/heat-router-top1.pngbin307 -> 0 bytes
-rw-r--r--assets/blocks/production/heat-router.pngbin959 -> 0 bytes
-rw-r--r--assets/blocks/production/heat-source.pngbin410 -> 0 bytes
-rw-r--r--assets/blocks/production/incinerator.pngbin213 -> 0 bytes
-rw-r--r--assets/blocks/production/kiln.pngbin652 -> 0 bytes
-rw-r--r--assets/blocks/production/melter.pngbin303 -> 0 bytes
-rw-r--r--assets/blocks/production/multi-press.pngbin843 -> 0 bytes
-rw-r--r--assets/blocks/production/oxidation-chamber-top1.pngbin455 -> 0 bytes
-rw-r--r--assets/blocks/production/oxidation-chamber-top2.pngbin455 -> 0 bytes
-rw-r--r--assets/blocks/production/oxidation-chamber.pngbin1214 -> 0 bytes
-rw-r--r--assets/blocks/production/phase-heater-top1.pngbin392 -> 0 bytes
-rw-r--r--assets/blocks/production/phase-heater-top2.pngbin392 -> 0 bytes
-rw-r--r--assets/blocks/production/phase-heater.pngbin673 -> 0 bytes
-rw-r--r--assets/blocks/production/phase-synthesizer.pngbin1200 -> 0 bytes
-rw-r--r--assets/blocks/production/phase-weaver.pngbin665 -> 0 bytes
-rw-r--r--assets/blocks/production/plastanium-compressor.pngbin576 -> 0 bytes
-rw-r--r--assets/blocks/production/pulverizer.pngbin234 -> 0 bytes
-rw-r--r--assets/blocks/production/pyratite-mixer.pngbin529 -> 0 bytes
-rw-r--r--assets/blocks/production/separator.pngbin586 -> 0 bytes
-rw-r--r--assets/blocks/production/silicon-arc-furnace.pngbin1221 -> 0 bytes
-rw-r--r--assets/blocks/production/silicon-crucible.pngbin1032 -> 0 bytes
-rw-r--r--assets/blocks/production/silicon-smelter.pngbin642 -> 0 bytes
-rw-r--r--assets/blocks/production/slag-heater-bottom.pngbin233 -> 0 bytes
-rw-r--r--assets/blocks/production/slag-heater.pngbin1067 -> 0 bytes
-rw-r--r--assets/blocks/production/slag-incinerator-liquid.pngbin132 -> 0 bytes
-rw-r--r--assets/blocks/production/slag-incinerator.pngbin370 -> 0 bytes
-rw-r--r--assets/blocks/production/spore-press.pngbin666 -> 0 bytes
-rw-r--r--assets/blocks/production/surge-crucible-bottom.pngbin334 -> 0 bytes
-rw-r--r--assets/blocks/production/surge-crucible-liquid.pngbin178 -> 0 bytes
-rw-r--r--assets/blocks/production/surge-crucible.pngbin1173 -> 0 bytes
-rw-r--r--assets/blocks/production/surge-smelter.pngbin1051 -> 0 bytes
-rw-r--r--assets/blocks/storage/core-acropolis-team.pngbin2012 -> 0 bytes
-rw-r--r--assets/blocks/storage/core-acropolis.pngbin3026 -> 0 bytes
-rw-r--r--assets/blocks/storage/core-bastion-team.pngbin1048 -> 0 bytes
-rw-r--r--assets/blocks/storage/core-bastion.pngbin1624 -> 0 bytes
-rw-r--r--assets/blocks/storage/core-citadel-team.pngbin1556 -> 0 bytes
-rw-r--r--assets/blocks/storage/core-citadel.pngbin2273 -> 0 bytes
-rw-r--r--assets/blocks/storage/core-foundation-team.pngbin996 -> 0 bytes
-rw-r--r--assets/blocks/storage/core-foundation.pngbin1170 -> 0 bytes
-rw-r--r--assets/blocks/storage/core-nucleus-team.pngbin1197 -> 0 bytes
-rw-r--r--assets/blocks/storage/core-shard-team.pngbin654 -> 0 bytes
-rw-r--r--assets/blocks/storage/core-shard.pngbin771 -> 0 bytes
-rw-r--r--assets/blocks/storage/reinforced-container-team.pngbin428 -> 0 bytes
-rw-r--r--assets/blocks/storage/reinforced-container.pngbin601 -> 0 bytes
-rw-r--r--assets/blocks/storage/reinforced-vault.pngbin902 -> 0 bytes
-rw-r--r--assets/blocks/storage/unloader-center.pngbin267 -> 0 bytes
-rw-r--r--assets/blocks/storage/unloader.pngbin253 -> 0 bytes
-rw-r--r--assets/blocks/storage/vault-team.pngbin526 -> 0 bytes
-rw-r--r--assets/blocks/turrets/afflict.pngbin1913 -> 0 bytes
-rw-r--r--assets/blocks/turrets/arc.pngbin415 -> 0 bytes
-rw-r--r--assets/blocks/turrets/breach.pngbin1248 -> 0 bytes
-rw-r--r--assets/blocks/turrets/cyclone.pngbin1020 -> 0 bytes
-rw-r--r--assets/blocks/turrets/diffuse.pngbin1390 -> 0 bytes
-rw-r--r--assets/blocks/turrets/disperse.pngbin1628 -> 0 bytes
-rw-r--r--assets/blocks/turrets/duo.pngbin419 -> 0 bytes
-rw-r--r--assets/blocks/turrets/foreshadow.pngbin1506 -> 0 bytes
-rw-r--r--assets/blocks/turrets/fuse.pngbin1302 -> 0 bytes
-rw-r--r--assets/blocks/turrets/hail.pngbin432 -> 0 bytes
-rw-r--r--assets/blocks/turrets/lancer.pngbin739 -> 0 bytes
-rw-r--r--assets/blocks/turrets/lustre.pngbin1737 -> 0 bytes
-rw-r--r--assets/blocks/turrets/malign.pngbin2473 -> 0 bytes
-rw-r--r--assets/blocks/turrets/meltdown.pngbin1567 -> 0 bytes
-rw-r--r--assets/blocks/turrets/parallax.pngbin717 -> 0 bytes
-rw-r--r--assets/blocks/turrets/ripple.pngbin1051 -> 0 bytes
-rw-r--r--assets/blocks/turrets/salvo.pngbin795 -> 0 bytes
-rw-r--r--assets/blocks/turrets/scathe.pngbin1636 -> 0 bytes
-rw-r--r--assets/blocks/turrets/scatter.pngbin697 -> 0 bytes
-rw-r--r--assets/blocks/turrets/scorch.pngbin411 -> 0 bytes
-rw-r--r--assets/blocks/turrets/segment.pngbin700 -> 0 bytes
-rw-r--r--assets/blocks/turrets/smite.pngbin2350 -> 0 bytes
-rw-r--r--assets/blocks/turrets/spectre.pngbin1511 -> 0 bytes
-rw-r--r--assets/blocks/turrets/sublimate.pngbin1325 -> 0 bytes
-rw-r--r--assets/blocks/turrets/swarmer.pngbin727 -> 0 bytes
-rw-r--r--assets/blocks/turrets/titan.pngbin1557 -> 0 bytes
-rw-r--r--assets/blocks/turrets/tsunami.pngbin1144 -> 0 bytes
-rw-r--r--assets/blocks/turrets/wave.pngbin793 -> 0 bytes
-rw-r--r--assets/blocks/units/additive-reconstructor-top.pngbin807 -> 0 bytes
-rw-r--r--assets/blocks/units/additive-reconstructor.pngbin749 -> 0 bytes
-rw-r--r--assets/blocks/units/air-factory.pngbin766 -> 0 bytes
-rw-r--r--assets/blocks/units/basic-assembler-module-side1.pngbin969 -> 0 bytes
-rw-r--r--assets/blocks/units/basic-assembler-module-side2.pngbin1091 -> 0 bytes
-rw-r--r--assets/blocks/units/basic-assembler-module.pngbin1515 -> 0 bytes
-rw-r--r--assets/blocks/units/exponential-reconstructor-top.pngbin1745 -> 0 bytes
-rw-r--r--assets/blocks/units/exponential-reconstructor.pngbin2353 -> 0 bytes
-rw-r--r--assets/blocks/units/ground-factory.pngbin766 -> 0 bytes
-rw-r--r--assets/blocks/units/mech-assembler-side1.pngbin764 -> 0 bytes
-rw-r--r--assets/blocks/units/mech-assembler-side2.pngbin767 -> 0 bytes
-rw-r--r--assets/blocks/units/mech-assembler-top.pngbin1607 -> 0 bytes
-rw-r--r--assets/blocks/units/mech-assembler.pngbin1443 -> 0 bytes
-rw-r--r--assets/blocks/units/mech-fabricator-top.pngbin848 -> 0 bytes
-rw-r--r--assets/blocks/units/mech-fabricator.pngbin872 -> 0 bytes
-rw-r--r--assets/blocks/units/mech-refabricator-top.pngbin968 -> 0 bytes
-rw-r--r--assets/blocks/units/mech-refabricator.pngbin729 -> 0 bytes
-rw-r--r--assets/blocks/units/multiplicative-reconstructor-top.pngbin1240 -> 0 bytes
-rw-r--r--assets/blocks/units/multiplicative-reconstructor.pngbin1432 -> 0 bytes
-rw-r--r--assets/blocks/units/naval-factory.pngbin762 -> 0 bytes
-rw-r--r--assets/blocks/units/prime-refabricator-top.pngbin1723 -> 0 bytes
-rw-r--r--assets/blocks/units/prime-refabricator.pngbin1464 -> 0 bytes
-rw-r--r--assets/blocks/units/repair-point.pngbin398 -> 0 bytes
-rw-r--r--assets/blocks/units/repair-turret.pngbin761 -> 0 bytes
-rw-r--r--assets/blocks/units/ship-assembler-side1.pngbin770 -> 0 bytes
-rw-r--r--assets/blocks/units/ship-assembler-side2.pngbin772 -> 0 bytes
-rw-r--r--assets/blocks/units/ship-assembler-top.pngbin1608 -> 0 bytes
-rw-r--r--assets/blocks/units/ship-assembler.pngbin1443 -> 0 bytes
-rw-r--r--assets/blocks/units/ship-fabricator-top.pngbin849 -> 0 bytes
-rw-r--r--assets/blocks/units/ship-fabricator.pngbin872 -> 0 bytes
-rw-r--r--assets/blocks/units/ship-refabricator-top.pngbin967 -> 0 bytes
-rw-r--r--assets/blocks/units/ship-refabricator.pngbin729 -> 0 bytes
-rw-r--r--assets/blocks/units/tank-assembler-side1.pngbin765 -> 0 bytes
-rw-r--r--assets/blocks/units/tank-assembler-side2.pngbin765 -> 0 bytes
-rw-r--r--assets/blocks/units/tank-assembler-top.pngbin1607 -> 0 bytes
-rw-r--r--assets/blocks/units/tank-assembler.pngbin1443 -> 0 bytes
-rw-r--r--assets/blocks/units/tank-fabricator-top.pngbin848 -> 0 bytes
-rw-r--r--assets/blocks/units/tank-fabricator.pngbin872 -> 0 bytes
-rw-r--r--assets/blocks/units/tank-refabricator-top.pngbin968 -> 0 bytes
-rw-r--r--assets/blocks/units/tank-refabricator.pngbin729 -> 0 bytes
-rw-r--r--assets/blocks/units/tetrative-reconstructor-top.pngbin2221 -> 0 bytes
-rw-r--r--assets/blocks/units/tetrative-reconstructor.pngbin4025 -> 0 bytes
-rw-r--r--assets/blocks/units/unit-cargo-loader.pngbin1055 -> 0 bytes
-rw-r--r--assets/blocks/units/unit-repair-tower.pngbin761 -> 0 bytes
-rw-r--r--assets/blocks/walls/beryllium-wall-large.pngbin516 -> 0 bytes
-rw-r--r--assets/blocks/walls/beryllium-wall.pngbin184 -> 0 bytes
-rw-r--r--assets/blocks/walls/blast-door-open.pngbin537 -> 0 bytes
-rw-r--r--assets/blocks/walls/blast-door.pngbin639 -> 0 bytes
-rw-r--r--assets/blocks/walls/carbide-wall-large.pngbin533 -> 0 bytes
-rw-r--r--assets/blocks/walls/carbide-wall.pngbin194 -> 0 bytes
-rw-r--r--assets/blocks/walls/copper-wall.pngbin163 -> 0 bytes
-rw-r--r--assets/blocks/walls/door-large-open.pngbin512 -> 0 bytes
-rw-r--r--assets/blocks/walls/door-large.pngbin453 -> 0 bytes
-rw-r--r--assets/blocks/walls/door-open.pngbin264 -> 0 bytes
-rw-r--r--assets/blocks/walls/door.pngbin224 -> 0 bytes
-rw-r--r--assets/blocks/walls/phase-wall-large.pngbin411 -> 0 bytes
-rw-r--r--assets/blocks/walls/phase-wall.pngbin176 -> 0 bytes
-rw-r--r--assets/blocks/walls/plastanium-wall-large.pngbin411 -> 0 bytes
-rw-r--r--assets/blocks/walls/plastanium-wall.pngbin176 -> 0 bytes
-rw-r--r--assets/blocks/walls/reinforced-surge-wall-large.pngbin533 -> 0 bytes
-rw-r--r--assets/blocks/walls/reinforced-surge-wall.pngbin194 -> 0 bytes
-rw-r--r--assets/blocks/walls/scrap-wall-huge.pngbin550 -> 0 bytes
-rw-r--r--assets/blocks/walls/scrap-wall-large.pngbin381 -> 0 bytes
-rw-r--r--assets/blocks/walls/scrap-wall.pngbin213 -> 0 bytes
-rw-r--r--assets/blocks/walls/surge-wall-large.pngbin554 -> 0 bytes
-rw-r--r--assets/blocks/walls/surge-wall.pngbin202 -> 0 bytes
-rw-r--r--assets/blocks/walls/thorium-wall.pngbin202 -> 0 bytes
-rw-r--r--assets/blocks/walls/thruster-top.pngbin525 -> 0 bytes
-rw-r--r--assets/blocks/walls/titanium-wall.pngbin163 -> 0 bytes
-rw-r--r--assets/blocks/walls/tungsten-wall-large.pngbin516 -> 0 bytes
-rw-r--r--assets/blocks/walls/tungsten-wall.pngbin184 -> 0 bytes
-rw-r--r--build.rs115
-rw-r--r--lemu/.gitignore1
-rw-r--r--lemu/Cargo.toml36
-rw-r--r--lemu/LICENSE21
-rw-r--r--lemu/README.md11
-rw-r--r--lemu/rust-toolchain.toml2
-rw-r--r--lemu/rustfmt.toml1
-rw-r--r--lemu/speed.mlog7
-rw-r--r--lemu/src/celliterate.mlog3
-rw-r--r--lemu/src/code.rs62
-rw-r--r--lemu/src/debug/info.rs58
-rw-r--r--lemu/src/debug/mod.rs24
-rw-r--r--lemu/src/debug/printable.rs7
-rw-r--r--lemu/src/executor/builder.rs159
-rw-r--r--lemu/src/executor/mod.rs320
-rw-r--r--lemu/src/fib.mlog15
-rw-r--r--lemu/src/hello.mlog2
-rw-r--r--lemu/src/instructions/cop.rs40
-rw-r--r--lemu/src/instructions/draw.rs601
-rw-r--r--lemu/src/instructions/io.rs90
-rw-r--r--lemu/src/instructions/mod.rs500
-rw-r--r--lemu/src/instructions/mop.rs79
-rw-r--r--lemu/src/instructions/mop2.rs140
-rw-r--r--lemu/src/lexer.rs213
-rw-r--r--lemu/src/lib.rs185
-rw-r--r--lemu/src/main.rs34
-rw-r--r--lemu/src/memory.rs185
-rw-r--r--lemu/src/numbers.mlog4
-rw-r--r--lemu/src/parser/error.rs442
-rw-r--r--lemu/src/parser/mod.rs856
-rw-r--r--lemu/src/primes.mlog21
-rw-r--r--lemu/yes.mlog4
-rw-r--r--mindus/Cargo.toml69
-rw-r--r--mindus/LICENSE.txt (renamed from LICENSE.txt)0
-rw-r--r--mindus/README.md18
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-0.pngbin0 -> 114 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-1.pngbin0 -> 90 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-10.pngbin0 -> 110 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-11.pngbin0 -> 108 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-12.pngbin0 -> 90 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-13.png (renamed from assets/blocks/liquid/conduits/conduit-bottom-2.png)bin71 -> 71 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-14.pngbin0 -> 89 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-15.pngbin0 -> 90 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-16.pngbin0 -> 125 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-17.pngbin0 -> 124 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-18.pngbin0 -> 96 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-19.pngbin0 -> 96 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-2.pngbin0 -> 114 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-20.pngbin0 -> 98 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-21.pngbin0 -> 100 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-22.pngbin0 -> 104 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-23.pngbin0 -> 108 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-24.pngbin0 -> 114 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-25.pngbin0 -> 90 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-26.pngbin0 -> 113 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-27.pngbin0 -> 123 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-28.pngbin0 -> 107 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-29.pngbin0 -> 104 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-3.pngbin0 -> 128 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-30.pngbin0 -> 99 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-31.pngbin0 -> 98 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-32.pngbin0 -> 103 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-33.pngbin0 -> 101 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-34.pngbin0 -> 99 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-35.pngbin0 -> 107 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-36.pngbin0 -> 122 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-37.pngbin0 -> 93 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-38.pngbin0 -> 122 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-39.pngbin0 -> 136 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-4.pngbin0 -> 124 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-40.pngbin0 -> 106 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-41.pngbin0 -> 105 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-42.pngbin0 -> 99 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-43.pngbin0 -> 101 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-44.pngbin0 -> 102 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-45.pngbin0 -> 101 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-46.pngbin0 -> 109 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-5.pngbin0 -> 124 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-6.pngbin0 -> 95 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-7.pngbin0 -> 95 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-8.pngbin0 -> 100 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-floor-9.pngbin0 -> 99 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-0.pngbin0 -> 168 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-1.pngbin0 -> 90 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-10.pngbin0 -> 166 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-11.pngbin0 -> 145 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-12.pngbin0 -> 90 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-13.pngbin0 -> 83 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-14.pngbin0 -> 89 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-15.pngbin0 -> 97 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-16.pngbin0 -> 135 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-17.pngbin0 -> 198 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-18.pngbin0 -> 97 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-19.pngbin0 -> 126 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-2.pngbin0 -> 121 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-20.pngbin0 -> 129 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-21.pngbin0 -> 105 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-22.pngbin0 -> 140 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-23.pngbin0 -> 159 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-24.pngbin0 -> 121 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-25.pngbin0 -> 90 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-26.pngbin0 -> 169 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-27.pngbin0 -> 180 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-28.pngbin0 -> 140 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-29.pngbin0 -> 143 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-3.pngbin0 -> 180 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-30.pngbin0 -> 129 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-31.pngbin0 -> 104 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-32.pngbin0 -> 135 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-33.pngbin0 -> 137 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-34.pngbin0 -> 115 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-35.pngbin0 -> 145 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-36.pngbin0 -> 182 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-37.pngbin0 -> 98 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-38.pngbin0 -> 181 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-39.pngbin0 -> 212 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-4.pngbin0 -> 198 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-40.pngbin0 -> 141 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-41.pngbin0 -> 142 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-42.pngbin0 -> 105 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-43.pngbin0 -> 131 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-44.pngbin0 -> 137 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-45.pngbin0 -> 137 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-46.pngbin0 -> 159 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-5.pngbin0 -> 134 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-6.pngbin0 -> 125 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-7.pngbin0 -> 96 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-8.pngbin0 -> 104 bytes
-rw-r--r--mindus/assets/blocks/autotiles/colored-wall-9.pngbin0 -> 132 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-0.pngbin0 -> 257 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-1.pngbin0 -> 147 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-10.pngbin0 -> 199 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-11.pngbin0 -> 185 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-12.pngbin0 -> 193 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-13.pngbin0 -> 162 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-14.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-15.pngbin0 -> 189 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-16.pngbin0 -> 197 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-17.pngbin0 -> 236 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-18.pngbin0 -> 164 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-19.pngbin0 -> 187 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-2.pngbin0 -> 242 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-20.pngbin0 -> 208 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-21.pngbin0 -> 153 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-22.pngbin0 -> 194 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-23.pngbin0 -> 200 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-24.pngbin0 -> 240 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-25.pngbin0 -> 154 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-26.pngbin0 -> 258 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-27.pngbin0 -> 219 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-28.pngbin0 -> 167 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-29.pngbin0 -> 205 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-3.pngbin0 -> 211 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-30.pngbin0 -> 166 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-31.pngbin0 -> 189 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-32.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-33.pngbin0 -> 191 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-34.pngbin0 -> 175 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-35.pngbin0 -> 191 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-36.pngbin0 -> 219 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-37.pngbin0 -> 132 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-38.pngbin0 -> 201 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-39.pngbin0 -> 233 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-4.pngbin0 -> 235 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-40.pngbin0 -> 202 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-41.pngbin0 -> 176 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-42.pngbin0 -> 187 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-43.pngbin0 -> 176 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-44.pngbin0 -> 183 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-45.pngbin0 -> 191 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-46.pngbin0 -> 197 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-5.pngbin0 -> 186 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-6.pngbin0 -> 180 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-7.pngbin0 -> 170 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-8.pngbin0 -> 152 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-1-9.pngbin0 -> 201 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-0.pngbin0 -> 193 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-1.pngbin0 -> 174 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-10.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-11.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-12.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-13.pngbin0 -> 213 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-14.pngbin0 -> 175 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-15.pngbin0 -> 147 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-16.pngbin0 -> 189 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-17.pngbin0 -> 192 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-18.pngbin0 -> 192 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-19.pngbin0 -> 193 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-2.pngbin0 -> 197 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-20.pngbin0 -> 168 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-21.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-22.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-23.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-24.pngbin0 -> 198 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-25.pngbin0 -> 174 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-26.pngbin0 -> 193 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-27.pngbin0 -> 190 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-28.pngbin0 -> 171 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-29.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-3.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-30.pngbin0 -> 171 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-31.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-32.pngbin0 -> 185 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-33.pngbin0 -> 178 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-34.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-35.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-36.pngbin0 -> 182 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-37.pngbin0 -> 140 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-38.pngbin0 -> 182 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-39.pngbin0 -> 186 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-4.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-40.pngbin0 -> 168 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-41.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-42.pngbin0 -> 168 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-43.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-44.pngbin0 -> 181 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-45.pngbin0 -> 185 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-46.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-5.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-6.pngbin0 -> 194 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-7.pngbin0 -> 191 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-8.pngbin0 -> 171 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-10-9.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-0.pngbin0 -> 237 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-1.pngbin0 -> 150 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-10.pngbin0 -> 266 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-11.pngbin0 -> 268 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-12.pngbin0 -> 122 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-13.pngbin0 -> 141 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-14.pngbin0 -> 170 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-15.pngbin0 -> 171 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-16.pngbin0 -> 251 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-17.pngbin0 -> 230 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-18.pngbin0 -> 231 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-19.pngbin0 -> 163 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-2.pngbin0 -> 219 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-20.pngbin0 -> 178 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-21.pngbin0 -> 231 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-22.pngbin0 -> 201 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-23.pngbin0 -> 200 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-24.pngbin0 -> 233 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-25.pngbin0 -> 160 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-26.pngbin0 -> 224 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-27.pngbin0 -> 212 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-28.pngbin0 -> 209 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-29.pngbin0 -> 212 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-3.pngbin0 -> 235 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-30.pngbin0 -> 206 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-31.pngbin0 -> 225 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-32.pngbin0 -> 201 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-33.pngbin0 -> 170 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-34.pngbin0 -> 254 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-35.pngbin0 -> 264 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-36.pngbin0 -> 198 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-37.pngbin0 -> 164 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-38.pngbin0 -> 214 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-39.pngbin0 -> 206 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-4.pngbin0 -> 229 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-40.pngbin0 -> 244 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-41.pngbin0 -> 234 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-42.pngbin0 -> 243 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-43.pngbin0 -> 185 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-44.pngbin0 -> 235 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-45.pngbin0 -> 226 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-46.pngbin0 -> 264 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-5.pngbin0 -> 199 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-6.pngbin0 -> 184 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-7.pngbin0 -> 200 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-8.pngbin0 -> 205 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-11-9.pngbin0 -> 214 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-0.pngbin0 -> 613 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-1.pngbin0 -> 221 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-10.pngbin0 -> 342 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-11.pngbin0 -> 352 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-12.pngbin0 -> 205 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-13.pngbin0 -> 141 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-14.pngbin0 -> 218 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-15.pngbin0 -> 210 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-16.pngbin0 -> 430 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-17.pngbin0 -> 452 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-18.pngbin0 -> 311 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-19.pngbin0 -> 314 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-2.pngbin0 -> 703 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-20.pngbin0 -> 322 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-21.pngbin0 -> 350 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-22.pngbin0 -> 372 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-23.pngbin0 -> 343 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-24.pngbin0 -> 696 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-25.pngbin0 -> 223 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-26.pngbin0 -> 721 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-27.pngbin0 -> 1177 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-28.pngbin0 -> 288 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-29.pngbin0 -> 344 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-3.pngbin0 -> 972 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-30.pngbin0 -> 347 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-31.pngbin0 -> 329 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-32.pngbin0 -> 309 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-33.pngbin0 -> 280 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-34.pngbin0 -> 346 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-35.pngbin0 -> 338 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-36.pngbin0 -> 1130 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-37.pngbin0 -> 220 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-38.pngbin0 -> 972 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-39.pngbin0 -> 537 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-4.pngbin0 -> 400 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-40.pngbin0 -> 290 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-41.pngbin0 -> 356 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-42.pngbin0 -> 328 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-43.pngbin0 -> 350 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-44.pngbin0 -> 303 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-45.pngbin0 -> 294 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-46.pngbin0 -> 376 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-5.pngbin0 -> 433 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-6.pngbin0 -> 320 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-7.pngbin0 -> 318 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-8.pngbin0 -> 330 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-12-9.pngbin0 -> 356 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-0.pngbin0 -> 205 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-1.pngbin0 -> 198 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-10.pngbin0 -> 177 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-11.pngbin0 -> 233 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-12.pngbin0 -> 194 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-13.pngbin0 -> 199 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-14.pngbin0 -> 195 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-15.pngbin0 -> 167 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-16.pngbin0 -> 189 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-17.pngbin0 -> 190 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-18.pngbin0 -> 206 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-19.pngbin0 -> 208 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-2.pngbin0 -> 207 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-20.pngbin0 -> 222 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-21.pngbin0 -> 220 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-22.pngbin0 -> 212 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-23.pngbin0 -> 220 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-24.pngbin0 -> 210 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-25.pngbin0 -> 196 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-26.pngbin0 -> 212 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-27.pngbin0 -> 181 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-28.pngbin0 -> 185 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-29.pngbin0 -> 181 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-3.pngbin0 -> 182 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-30.pngbin0 -> 218 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-31.pngbin0 -> 221 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-32.pngbin0 -> 206 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-33.pngbin0 -> 194 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-34.pngbin0 -> 212 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-35.pngbin0 -> 216 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-36.pngbin0 -> 175 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-37.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-38.pngbin0 -> 177 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-39.pngbin0 -> 209 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-4.pngbin0 -> 190 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-40.pngbin0 -> 180 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-41.pngbin0 -> 183 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-42.pngbin0 -> 216 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-43.pngbin0 -> 227 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-44.pngbin0 -> 197 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-45.pngbin0 -> 205 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-46.pngbin0 -> 221 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-5.pngbin0 -> 189 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-6.pngbin0 -> 207 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-7.pngbin0 -> 206 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-8.pngbin0 -> 224 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-13-9.pngbin0 -> 217 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-0.pngbin0 -> 197 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-1.pngbin0 -> 158 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-10.pngbin0 -> 222 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-11.pngbin0 -> 201 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-12.pngbin0 -> 164 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-13.pngbin0 -> 105 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-14.pngbin0 -> 171 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-15.pngbin0 -> 192 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-16.pngbin0 -> 216 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-17.pngbin0 -> 219 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-18.pngbin0 -> 159 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-19.pngbin0 -> 170 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-2.pngbin0 -> 199 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-20.pngbin0 -> 184 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-21.pngbin0 -> 189 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-22.pngbin0 -> 198 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-23.pngbin0 -> 216 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-24.pngbin0 -> 217 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-25.pngbin0 -> 159 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-26.pngbin0 -> 223 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-27.pngbin0 -> 218 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-28.pngbin0 -> 206 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-29.pngbin0 -> 221 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-3.pngbin0 -> 209 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-30.pngbin0 -> 190 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-31.pngbin0 -> 203 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-32.pngbin0 -> 184 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-33.pngbin0 -> 198 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-34.pngbin0 -> 196 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-35.pngbin0 -> 221 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-36.pngbin0 -> 209 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-37.pngbin0 -> 179 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-38.pngbin0 -> 197 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-39.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-4.pngbin0 -> 200 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-40.pngbin0 -> 208 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-41.pngbin0 -> 216 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-42.pngbin0 -> 207 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-43.pngbin0 -> 197 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-44.pngbin0 -> 177 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-45.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-46.pngbin0 -> 220 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-5.pngbin0 -> 224 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-6.pngbin0 -> 158 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-7.pngbin0 -> 164 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-8.pngbin0 -> 199 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-2-9.pngbin0 -> 206 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-0.pngbin0 -> 262 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-1.pngbin0 -> 195 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-10.pngbin0 -> 196 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-11.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-12.pngbin0 -> 244 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-13.pngbin0 -> 162 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-14.pngbin0 -> 232 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-15.pngbin0 -> 252 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-16.pngbin0 -> 257 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-17.pngbin0 -> 260 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-18.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-19.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-2.pngbin0 -> 252 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-20.pngbin0 -> 243 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-21.pngbin0 -> 203 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-22.pngbin0 -> 181 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-23.pngbin0 -> 191 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-24.pngbin0 -> 253 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-25.pngbin0 -> 195 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-26.pngbin0 -> 258 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-27.pngbin0 -> 284 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-28.pngbin0 -> 211 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-29.pngbin0 -> 256 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-3.pngbin0 -> 288 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-30.pngbin0 -> 203 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-31.pngbin0 -> 243 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-32.pngbin0 -> 183 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-33.pngbin0 -> 185 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-34.pngbin0 -> 179 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-35.pngbin0 -> 190 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-36.pngbin0 -> 264 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-37.pngbin0 -> 196 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-38.pngbin0 -> 256 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-39.pngbin0 -> 291 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-4.pngbin0 -> 262 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-40.pngbin0 -> 249 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-41.pngbin0 -> 211 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-42.pngbin0 -> 250 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-43.pngbin0 -> 202 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-44.pngbin0 -> 184 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-45.pngbin0 -> 184 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-46.pngbin0 -> 192 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-5.pngbin0 -> 255 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-6.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-7.pngbin0 -> 177 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-8.pngbin0 -> 204 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-3-9.pngbin0 -> 242 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-0.pngbin0 -> 265 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-1.pngbin0 -> 195 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-10.pngbin0 -> 196 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-11.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-12.pngbin0 -> 238 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-13.pngbin0 -> 162 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-14.pngbin0 -> 231 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-15.pngbin0 -> 252 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-16.pngbin0 -> 258 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-17.pngbin0 -> 259 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-18.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-19.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-2.pngbin0 -> 252 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-20.pngbin0 -> 243 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-21.pngbin0 -> 203 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-22.pngbin0 -> 181 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-23.pngbin0 -> 191 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-24.pngbin0 -> 253 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-25.pngbin0 -> 195 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-26.pngbin0 -> 258 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-27.pngbin0 -> 284 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-28.pngbin0 -> 211 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-29.pngbin0 -> 248 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-3.pngbin0 -> 292 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-30.pngbin0 -> 200 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-31.pngbin0 -> 243 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-32.pngbin0 -> 183 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-33.pngbin0 -> 185 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-34.pngbin0 -> 179 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-35.pngbin0 -> 190 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-36.pngbin0 -> 268 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-37.pngbin0 -> 196 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-38.pngbin0 -> 256 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-39.pngbin0 -> 295 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-4.pngbin0 -> 267 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-40.pngbin0 -> 249 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-41.pngbin0 -> 211 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-42.pngbin0 -> 254 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-43.pngbin0 -> 202 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-44.pngbin0 -> 184 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-45.pngbin0 -> 184 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-46.pngbin0 -> 192 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-5.pngbin0 -> 255 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-6.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-7.pngbin0 -> 177 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-8.pngbin0 -> 204 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-4-9.pngbin0 -> 242 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-0.pngbin0 -> 269 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-1.pngbin0 -> 210 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-10.pngbin0 -> 253 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-11.pngbin0 -> 239 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-12.pngbin0 -> 220 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-13.pngbin0 -> 253 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-14.pngbin0 -> 217 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-15.pngbin0 -> 218 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-16.pngbin0 -> 236 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-17.pngbin0 -> 257 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-18.pngbin0 -> 217 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-19.pngbin0 -> 257 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-2.pngbin0 -> 254 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-20.pngbin0 -> 229 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-21.pngbin0 -> 223 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-22.pngbin0 -> 245 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-23.pngbin0 -> 253 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-24.pngbin0 -> 238 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-25.pngbin0 -> 198 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-26.pngbin0 -> 276 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-27.pngbin0 -> 265 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-28.pngbin0 -> 224 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-29.pngbin0 -> 247 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-3.pngbin0 -> 277 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-30.pngbin0 -> 222 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-31.pngbin0 -> 240 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-32.pngbin0 -> 241 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-33.pngbin0 -> 247 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-34.pngbin0 -> 234 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-35.pngbin0 -> 250 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-36.pngbin0 -> 283 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-37.pngbin0 -> 201 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-38.pngbin0 -> 274 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-39.pngbin0 -> 257 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-4.pngbin0 -> 259 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-40.pngbin0 -> 243 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-41.pngbin0 -> 235 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-42.pngbin0 -> 243 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-43.pngbin0 -> 234 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-44.pngbin0 -> 244 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-45.pngbin0 -> 248 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-46.pngbin0 -> 253 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-5.pngbin0 -> 254 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-6.pngbin0 -> 259 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-7.pngbin0 -> 235 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-8.pngbin0 -> 222 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-5-9.pngbin0 -> 235 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-0.pngbin0 -> 1134 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-1.pngbin0 -> 1068 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-10.pngbin0 -> 865 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-11.pngbin0 -> 1016 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-12.pngbin0 -> 817 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-13.pngbin0 -> 749 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-14.pngbin0 -> 884 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-15.pngbin0 -> 846 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-16.pngbin0 -> 1007 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-17.pngbin0 -> 1024 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-18.pngbin0 -> 1066 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-19.pngbin0 -> 1060 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-2.pngbin0 -> 1194 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-20.pngbin0 -> 985 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-21.pngbin0 -> 1029 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-22.pngbin0 -> 960 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-23.pngbin0 -> 1040 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-24.pngbin0 -> 1175 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-25.pngbin0 -> 1083 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-26.pngbin0 -> 1208 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-27.pngbin0 -> 1078 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-28.pngbin0 -> 952 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-29.pngbin0 -> 973 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-3.pngbin0 -> 1062 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-30.pngbin0 -> 1011 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-31.pngbin0 -> 1026 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-32.pngbin0 -> 1117 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-33.pngbin0 -> 838 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-34.pngbin0 -> 886 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-35.pngbin0 -> 1002 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-36.pngbin0 -> 948 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-37.pngbin0 -> 706 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-38.pngbin0 -> 1007 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-39.pngbin0 -> 1071 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-4.pngbin0 -> 967 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-40.pngbin0 -> 955 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-41.pngbin0 -> 992 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-42.pngbin0 -> 982 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-43.pngbin0 -> 1011 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-44.pngbin0 -> 899 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-45.pngbin0 -> 1022 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-46.pngbin0 -> 1013 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-5.pngbin0 -> 1011 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-6.pngbin0 -> 1151 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-7.pngbin0 -> 1057 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-8.pngbin0 -> 990 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-6-9.pngbin0 -> 1009 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-0.pngbin0 -> 215 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-1.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-10.pngbin0 -> 202 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-11.pngbin0 -> 233 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-12.pngbin0 -> 191 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-13.pngbin0 -> 190 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-14.pngbin0 -> 194 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-15.pngbin0 -> 130 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-16.pngbin0 -> 203 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-17.pngbin0 -> 204 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-18.pngbin0 -> 227 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-19.pngbin0 -> 236 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-2.pngbin0 -> 219 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-20.pngbin0 -> 212 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-21.pngbin0 -> 203 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-22.pngbin0 -> 244 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-23.pngbin0 -> 248 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-24.pngbin0 -> 218 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-25.pngbin0 -> 192 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-26.pngbin0 -> 212 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-27.pngbin0 -> 200 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-28.pngbin0 -> 185 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-29.pngbin0 -> 191 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-3.pngbin0 -> 197 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-30.pngbin0 -> 210 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-31.pngbin0 -> 216 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-32.pngbin0 -> 234 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-33.pngbin0 -> 231 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-34.pngbin0 -> 245 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-35.pngbin0 -> 237 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-36.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-37.pngbin0 -> 130 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-38.pngbin0 -> 174 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-39.pngbin0 -> 192 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-4.pngbin0 -> 200 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-40.pngbin0 -> 186 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-41.pngbin0 -> 182 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-42.pngbin0 -> 209 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-43.pngbin0 -> 206 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-44.pngbin0 -> 224 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-45.pngbin0 -> 228 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-46.pngbin0 -> 229 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-5.pngbin0 -> 196 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-6.pngbin0 -> 235 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-7.pngbin0 -> 239 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-8.pngbin0 -> 204 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-7-9.pngbin0 -> 212 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-0.pngbin0 -> 219 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-1.pngbin0 -> 221 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-10.pngbin0 -> 263 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-11.pngbin0 -> 264 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-12.pngbin0 -> 227 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-13.pngbin0 -> 270 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-14.pngbin0 -> 214 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-15.pngbin0 -> 132 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-16.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-17.pngbin0 -> 250 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-18.pngbin0 -> 271 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-19.pngbin0 -> 298 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-2.pngbin0 -> 196 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-20.pngbin0 -> 240 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-21.pngbin0 -> 207 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-22.pngbin0 -> 314 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-23.pngbin0 -> 298 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-24.pngbin0 -> 209 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-25.pngbin0 -> 219 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-26.pngbin0 -> 225 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-27.pngbin0 -> 201 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-28.pngbin0 -> 226 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-29.pngbin0 -> 241 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-3.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-30.pngbin0 -> 252 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-31.pngbin0 -> 207 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-32.pngbin0 -> 277 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-33.pngbin0 -> 286 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-34.pngbin0 -> 259 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-35.pngbin0 -> 276 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-36.pngbin0 -> 198 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-37.pngbin0 -> 152 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-38.pngbin0 -> 214 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-39.pngbin0 -> 221 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-4.pngbin0 -> 227 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-40.pngbin0 -> 205 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-41.pngbin0 -> 224 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-42.pngbin0 -> 217 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-43.pngbin0 -> 251 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-44.pngbin0 -> 274 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-45.pngbin0 -> 276 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-46.pngbin0 -> 282 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-5.pngbin0 -> 185 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-6.pngbin0 -> 284 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-7.pngbin0 -> 254 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-8.pngbin0 -> 215 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-8-9.pngbin0 -> 248 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-0.pngbin0 -> 325 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-1.pngbin0 -> 169 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-10.pngbin0 -> 227 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-11.pngbin0 -> 214 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-12.pngbin0 -> 210 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-13.pngbin0 -> 136 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-14.pngbin0 -> 219 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-15.pngbin0 -> 225 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-16.pngbin0 -> 228 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-17.pngbin0 -> 239 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-18.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-19.pngbin0 -> 175 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-2.pngbin0 -> 317 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-20.pngbin0 -> 228 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-21.pngbin0 -> 192 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-22.pngbin0 -> 196 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-23.pngbin0 -> 222 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-24.pngbin0 -> 295 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-25.pngbin0 -> 169 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-26.pngbin0 -> 289 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-27.pngbin0 -> 253 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-28.pngbin0 -> 208 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-29.pngbin0 -> 245 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-3.pngbin0 -> 237 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-30.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-31.pngbin0 -> 225 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-32.pngbin0 -> 203 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-33.pngbin0 -> 201 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-34.pngbin0 -> 204 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-35.pngbin0 -> 227 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-36.pngbin0 -> 243 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-37.pngbin0 -> 184 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-38.pngbin0 -> 215 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-39.pngbin0 -> 195 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-4.pngbin0 -> 226 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-40.pngbin0 -> 238 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-41.pngbin0 -> 208 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-42.pngbin0 -> 239 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-43.pngbin0 -> 201 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-44.pngbin0 -> 200 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-45.pngbin0 -> 211 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-46.pngbin0 -> 215 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-5.pngbin0 -> 237 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-6.pngbin0 -> 185 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-7.pngbin0 -> 174 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-8.pngbin0 -> 204 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-tiles-9-9.pngbin0 -> 234 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-0.pngbin0 -> 286 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-1.pngbin0 -> 182 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-10.pngbin0 -> 224 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-11.pngbin0 -> 246 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-12.pngbin0 -> 183 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-13.pngbin0 -> 231 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-14.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-15.pngbin0 -> 175 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-16.pngbin0 -> 177 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-17.pngbin0 -> 233 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-18.pngbin0 -> 209 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-19.pngbin0 -> 279 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-2.pngbin0 -> 247 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-20.pngbin0 -> 218 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-21.pngbin0 -> 218 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-22.pngbin0 -> 272 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-23.pngbin0 -> 246 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-24.pngbin0 -> 252 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-25.pngbin0 -> 182 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-26.pngbin0 -> 293 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-27.pngbin0 -> 257 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-28.pngbin0 -> 209 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-29.pngbin0 -> 209 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-3.pngbin0 -> 263 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-30.pngbin0 -> 217 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-31.pngbin0 -> 224 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-32.pngbin0 -> 233 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-33.pngbin0 -> 236 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-34.pngbin0 -> 248 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-35.pngbin0 -> 244 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-36.pngbin0 -> 254 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-37.pngbin0 -> 181 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-38.pngbin0 -> 253 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-39.pngbin0 -> 270 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-4.pngbin0 -> 232 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-40.pngbin0 -> 206 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-41.pngbin0 -> 210 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-42.pngbin0 -> 220 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-43.pngbin0 -> 216 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-44.pngbin0 -> 237 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-45.pngbin0 -> 236 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-46.pngbin0 -> 244 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-5.pngbin0 -> 180 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-6.pngbin0 -> 280 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-7.pngbin0 -> 206 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-8.pngbin0 -> 215 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-1-9.pngbin0 -> 214 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-0.pngbin0 -> 257 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-1.pngbin0 -> 198 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-10.pngbin0 -> 251 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-11.pngbin0 -> 277 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-12.pngbin0 -> 194 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-13.pngbin0 -> 192 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-14.pngbin0 -> 193 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-15.pngbin0 -> 190 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-16.pngbin0 -> 210 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-17.pngbin0 -> 266 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-18.pngbin0 -> 206 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-19.pngbin0 -> 271 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-2.pngbin0 -> 207 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-20.pngbin0 -> 274 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-21.pngbin0 -> 258 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-22.pngbin0 -> 299 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-23.pngbin0 -> 303 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-24.pngbin0 -> 210 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-25.pngbin0 -> 196 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-26.pngbin0 -> 261 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-27.pngbin0 -> 227 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-28.pngbin0 -> 239 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-29.pngbin0 -> 234 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-3.pngbin0 -> 231 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-30.pngbin0 -> 259 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-31.pngbin0 -> 276 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-32.pngbin0 -> 265 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-33.pngbin0 -> 261 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-34.pngbin0 -> 261 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-35.pngbin0 -> 282 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-36.pngbin0 -> 224 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-37.pngbin0 -> 205 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-38.pngbin0 -> 224 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-39.pngbin0 -> 262 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-4.pngbin0 -> 265 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-40.pngbin0 -> 233 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-41.pngbin0 -> 241 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-42.pngbin0 -> 250 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-43.pngbin0 -> 281 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-44.pngbin0 -> 241 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-45.pngbin0 -> 246 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-46.pngbin0 -> 282 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-5.pngbin0 -> 210 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-6.pngbin0 -> 270 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-7.pngbin0 -> 206 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-8.pngbin0 -> 270 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-2-9.pngbin0 -> 253 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-0.pngbin0 -> 216 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-1.pngbin0 -> 154 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-10.pngbin0 -> 267 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-11.pngbin0 -> 232 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-12.pngbin0 -> 168 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-13.pngbin0 -> 105 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-14.pngbin0 -> 180 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-15.pngbin0 -> 217 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-16.pngbin0 -> 221 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-17.pngbin0 -> 264 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-18.pngbin0 -> 157 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-19.pngbin0 -> 182 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-2.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-20.pngbin0 -> 209 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-21.pngbin0 -> 194 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-22.pngbin0 -> 235 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-23.pngbin0 -> 249 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-24.pngbin0 -> 208 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-25.pngbin0 -> 155 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-26.pngbin0 -> 255 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-27.pngbin0 -> 243 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-28.pngbin0 -> 233 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-29.pngbin0 -> 255 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-3.pngbin0 -> 246 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-30.pngbin0 -> 210 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-31.pngbin0 -> 218 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-32.pngbin0 -> 207 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-33.pngbin0 -> 216 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-34.pngbin0 -> 201 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-35.pngbin0 -> 253 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-36.pngbin0 -> 240 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-37.pngbin0 -> 189 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-38.pngbin0 -> 216 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-39.pngbin0 -> 226 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-4.pngbin0 -> 247 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-40.pngbin0 -> 247 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-41.pngbin0 -> 243 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-42.pngbin0 -> 218 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-43.pngbin0 -> 211 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-44.pngbin0 -> 198 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-45.pngbin0 -> 218 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-46.pngbin0 -> 257 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-5.pngbin0 -> 219 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-6.pngbin0 -> 194 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-7.pngbin0 -> 154 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-8.pngbin0 -> 197 bytes
-rw-r--r--mindus/assets/blocks/autotiles/metal-wall-3-9.pngbin0 -> 229 bytes
-rw-r--r--mindus/assets/blocks/campaign/advanced-launch-pad.pngbin0 -> 6246 bytes
-rw-r--r--mindus/assets/blocks/campaign/interplanetary-accelerator.pngbin0 -> 2550 bytes
-rw-r--r--mindus/assets/blocks/campaign/landing-pad-bg.pngbin0 -> 182 bytes
-rw-r--r--mindus/assets/blocks/campaign/landing-pad.pngbin0 -> 1215 bytes
-rw-r--r--mindus/assets/blocks/campaign/launch-pad.png (renamed from assets/blocks/campaign/launch-pad.png)bin741 -> 741 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay0.pngbin0 -> 171 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay1.pngbin0 -> 210 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay10.pngbin0 -> 198 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay11.pngbin0 -> 109 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay12.pngbin0 -> 170 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay13.pngbin0 -> 205 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay14.pngbin0 -> 197 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay15.pngbin0 -> 168 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay16.pngbin0 -> 267 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay17.pngbin0 -> 194 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay18.pngbin0 -> 181 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay19.pngbin0 -> 110 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay2.pngbin0 -> 168 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay20.pngbin0 -> 165 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay21.pngbin0 -> 225 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay22.pngbin0 -> 164 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay23.pngbin0 -> 224 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay24.pngbin0 -> 233 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay25.pngbin0 -> 191 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay26.pngbin0 -> 112 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay27.pngbin0 -> 181 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay28.pngbin0 -> 243 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay29.pngbin0 -> 216 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay3.pngbin0 -> 163 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay30.pngbin0 -> 147 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay31.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay32.pngbin0 -> 160 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay33.pngbin0 -> 323 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay34.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay35.pngbin0 -> 204 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay36.pngbin0 -> 105 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay37.pngbin0 -> 107 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay38.pngbin0 -> 175 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay39.pngbin0 -> 98 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay4.pngbin0 -> 115 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay40.pngbin0 -> 106 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay41.pngbin0 -> 114 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay42.pngbin0 -> 107 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay43.pngbin0 -> 161 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay44.pngbin0 -> 167 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay45.pngbin0 -> 109 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay46.pngbin0 -> 110 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay47.pngbin0 -> 180 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay48.pngbin0 -> 181 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay49.pngbin0 -> 200 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay5.pngbin0 -> 112 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay50.pngbin0 -> 196 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay51.pngbin0 -> 101 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay52.pngbin0 -> 163 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay53.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay54.pngbin0 -> 165 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay55.pngbin0 -> 149 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay56.pngbin0 -> 99 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay57.pngbin0 -> 274 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay58.pngbin0 -> 110 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay59.pngbin0 -> 107 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay6.pngbin0 -> 177 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay60.pngbin0 -> 114 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay61.pngbin0 -> 100 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay62.pngbin0 -> 243 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay63.pngbin0 -> 186 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay7.pngbin0 -> 112 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay8.pngbin0 -> 112 bytes
-rw-r--r--mindus/assets/blocks/characters/character-overlay9.pngbin0 -> 163 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux0.pngbin0 -> 366 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux1.pngbin0 -> 322 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux10.pngbin0 -> 313 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux100.pngbin0 -> 263 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux101.pngbin0 -> 258 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux102.pngbin0 -> 250 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux103.pngbin0 -> 258 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux104.pngbin0 -> 321 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux105.pngbin0 -> 283 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux106.pngbin0 -> 325 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux107.pngbin0 -> 263 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux108.pngbin0 -> 238 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux11.pngbin0 -> 364 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux12.pngbin0 -> 360 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux13.pngbin0 -> 316 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux14.pngbin0 -> 339 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux15.pngbin0 -> 326 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux16.pngbin0 -> 331 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux17.pngbin0 -> 326 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux18.pngbin0 -> 323 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux19.pngbin0 -> 335 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux2.pngbin0 -> 329 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux20.pngbin0 -> 334 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux21.pngbin0 -> 313 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux22.pngbin0 -> 353 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux23.pngbin0 -> 321 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux24.pngbin0 -> 334 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux25.pngbin0 -> 313 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux26.pngbin0 -> 362 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux27.pngbin0 -> 314 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux28.pngbin0 -> 256 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux29.pngbin0 -> 307 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux3.pngbin0 -> 370 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux30.pngbin0 -> 305 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux31.pngbin0 -> 329 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux32.pngbin0 -> 342 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux33.pngbin0 -> 306 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux34.pngbin0 -> 338 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux35.pngbin0 -> 340 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux36.pngbin0 -> 333 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux37.pngbin0 -> 337 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux38.pngbin0 -> 329 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux39.pngbin0 -> 260 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux4.pngbin0 -> 227 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux40.pngbin0 -> 332 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux41.pngbin0 -> 343 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux42.pngbin0 -> 332 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux43.pngbin0 -> 326 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux44.pngbin0 -> 321 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux45.pngbin0 -> 309 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux46.pngbin0 -> 311 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux47.pngbin0 -> 338 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux48.pngbin0 -> 363 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux49.pngbin0 -> 310 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux5.pngbin0 -> 307 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux50.pngbin0 -> 333 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux51.pngbin0 -> 326 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux52.pngbin0 -> 335 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux53.pngbin0 -> 315 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux54.pngbin0 -> 331 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux55.pngbin0 -> 319 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux56.pngbin0 -> 322 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux57.pngbin0 -> 255 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux58.pngbin0 -> 332 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux59.pngbin0 -> 329 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux6.pngbin0 -> 335 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux60.pngbin0 -> 349 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux61.pngbin0 -> 329 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux62.pngbin0 -> 254 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux63.pngbin0 -> 260 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux64.pngbin0 -> 316 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux65.pngbin0 -> 326 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux66.pngbin0 -> 318 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux67.pngbin0 -> 313 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux68.pngbin0 -> 319 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux69.pngbin0 -> 260 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux7.pngbin0 -> 332 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux70.pngbin0 -> 308 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux71.pngbin0 -> 339 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux72.pngbin0 -> 260 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux73.pngbin0 -> 309 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux74.pngbin0 -> 255 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux75.pngbin0 -> 318 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux76.pngbin0 -> 226 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux77.pngbin0 -> 336 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux78.pngbin0 -> 221 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux79.pngbin0 -> 327 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux8.pngbin0 -> 307 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux80.pngbin0 -> 251 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux81.pngbin0 -> 330 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux82.pngbin0 -> 313 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux83.pngbin0 -> 327 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux84.pngbin0 -> 324 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux85.pngbin0 -> 318 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux86.pngbin0 -> 238 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux87.pngbin0 -> 264 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux88.pngbin0 -> 254 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux89.pngbin0 -> 313 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux9.pngbin0 -> 330 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux90.pngbin0 -> 240 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux91.pngbin0 -> 192 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux92.pngbin0 -> 227 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux93.pngbin0 -> 259 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux94.pngbin0 -> 264 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux95.pngbin0 -> 322 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux96.pngbin0 -> 318 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux97.pngbin0 -> 249 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux98.pngbin0 -> 260 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay-crux99.pngbin0 -> 257 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay0.pngbin0 -> 192 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay1.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay10.pngbin0 -> 179 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay100.pngbin0 -> 183 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay101.pngbin0 -> 185 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay102.pngbin0 -> 176 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay103.pngbin0 -> 185 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay104.pngbin0 -> 187 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay105.pngbin0 -> 193 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay106.pngbin0 -> 187 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay107.pngbin0 -> 183 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay108.pngbin0 -> 174 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay11.pngbin0 -> 192 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay12.pngbin0 -> 192 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay13.pngbin0 -> 187 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay14.pngbin0 -> 191 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay15.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay16.pngbin0 -> 181 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay17.pngbin0 -> 181 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay18.pngbin0 -> 187 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay19.pngbin0 -> 183 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay2.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay20.pngbin0 -> 187 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay21.pngbin0 -> 177 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay22.pngbin0 -> 192 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay23.pngbin0 -> 180 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay24.pngbin0 -> 183 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay25.pngbin0 -> 180 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay26.pngbin0 -> 199 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay27.pngbin0 -> 178 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay28.pngbin0 -> 177 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay29.pngbin0 -> 182 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay3.pngbin0 -> 192 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay30.pngbin0 -> 185 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay31.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay32.pngbin0 -> 184 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay33.pngbin0 -> 183 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay34.pngbin0 -> 194 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay35.pngbin0 -> 185 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay36.pngbin0 -> 187 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay37.pngbin0 -> 193 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay38.pngbin0 -> 186 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay39.pngbin0 -> 180 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay4.pngbin0 -> 169 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay40.pngbin0 -> 187 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay41.pngbin0 -> 189 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay42.pngbin0 -> 192 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay43.pngbin0 -> 190 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay44.pngbin0 -> 189 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay45.pngbin0 -> 178 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay46.pngbin0 -> 179 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay47.pngbin0 -> 193 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay48.pngbin0 -> 195 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay49.pngbin0 -> 177 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay5.pngbin0 -> 183 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay50.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay51.pngbin0 -> 181 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay52.pngbin0 -> 190 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay53.pngbin0 -> 186 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay54.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay55.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay56.pngbin0 -> 187 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay57.pngbin0 -> 186 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay58.pngbin0 -> 181 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay59.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay6.pngbin0 -> 191 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay60.pngbin0 -> 192 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay61.pngbin0 -> 187 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay62.pngbin0 -> 177 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay63.pngbin0 -> 179 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay64.pngbin0 -> 185 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay65.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay66.pngbin0 -> 185 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay67.pngbin0 -> 176 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay68.pngbin0 -> 190 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay69.pngbin0 -> 186 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay7.pngbin0 -> 187 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay70.pngbin0 -> 182 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay71.pngbin0 -> 192 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay72.pngbin0 -> 185 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay73.pngbin0 -> 180 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay74.pngbin0 -> 186 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay75.pngbin0 -> 185 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay76.pngbin0 -> 169 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay77.pngbin0 -> 191 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay78.pngbin0 -> 174 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay79.pngbin0 -> 186 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay8.pngbin0 -> 181 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay80.pngbin0 -> 180 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay81.pngbin0 -> 190 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay82.pngbin0 -> 186 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay83.pngbin0 -> 191 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay84.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay85.pngbin0 -> 187 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay86.pngbin0 -> 174 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay87.pngbin0 -> 181 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay88.pngbin0 -> 179 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay89.pngbin0 -> 176 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay9.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay90.pngbin0 -> 174 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay91.pngbin0 -> 172 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay92.pngbin0 -> 176 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay93.pngbin0 -> 184 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay94.pngbin0 -> 184 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay95.pngbin0 -> 186 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay96.pngbin0 -> 187 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay97.pngbin0 -> 177 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay98.pngbin0 -> 182 bytes
-rw-r--r--mindus/assets/blocks/characters/rune-overlay99.pngbin0 -> 187 bytes
-rw-r--r--mindus/assets/blocks/defense/build-tower.pngbin0 -> 1018 bytes
-rw-r--r--mindus/assets/blocks/defense/force-projector-team.png (renamed from assets/blocks/defense/force-projector-team.png)bin482 -> 482 bytes
-rw-r--r--mindus/assets/blocks/defense/force-projector.pngbin0 -> 809 bytes
-rw-r--r--mindus/assets/blocks/defense/large-shield-projector-team.pngbin0 -> 799 bytes
-rw-r--r--mindus/assets/blocks/defense/large-shield-projector.pngbin0 -> 1130 bytes
-rw-r--r--mindus/assets/blocks/defense/mend-projector.pngbin0 -> 490 bytes
-rw-r--r--mindus/assets/blocks/defense/mender.pngbin0 -> 246 bytes
-rw-r--r--mindus/assets/blocks/defense/overdrive-dome.pngbin0 -> 1020 bytes
-rw-r--r--mindus/assets/blocks/defense/overdrive-projector.pngbin0 -> 490 bytes
-rw-r--r--mindus/assets/blocks/defense/radar.png (renamed from assets/blocks/defense/radar.png)bin301 -> 301 bytes
-rw-r--r--mindus/assets/blocks/defense/regen-projector.pngbin0 -> 984 bytes
-rw-r--r--mindus/assets/blocks/defense/shield-projector-team.png (renamed from assets/blocks/defense/shield-projector-team.png)bin482 -> 482 bytes
-rw-r--r--mindus/assets/blocks/defense/shield-projector.pngbin0 -> 849 bytes
-rw-r--r--mindus/assets/blocks/defense/shock-mine-team-top.pngbin0 -> 121 bytes
-rw-r--r--mindus/assets/blocks/defense/shock-mine.png (renamed from assets/blocks/defense/shock-mine.png)bin217 -> 217 bytes
-rw-r--r--mindus/assets/blocks/defense/shockwave-tower.pngbin0 -> 1033 bytes
-rw-r--r--mindus/assets/blocks/defense/target-dummy.pngbin0 -> 832 bytes
-rw-r--r--mindus/assets/blocks/distribution/bridge-arrow.pngbin0 -> 125 bytes
-rw-r--r--mindus/assets/blocks/distribution/bridge-conveyor-arrow.pngbin0 -> 193 bytes
-rw-r--r--mindus/assets/blocks/distribution/bridge-conveyor-bridge.pngbin0 -> 144 bytes
-rw-r--r--mindus/assets/blocks/distribution/bridge-conveyor-end.pngbin0 -> 143 bytes
-rw-r--r--mindus/assets/blocks/distribution/bridge-conveyor.pngbin0 -> 205 bytes
-rw-r--r--mindus/assets/blocks/distribution/center.pngbin0 -> 104 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-0-0.pngbin0 -> 220 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-0-1.pngbin0 -> 343 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-0-2.pngbin0 -> 307 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-0-3.pngbin0 -> 336 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-0-h.pngbin0 -> 390 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-0.pngbin0 -> 398 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-1-h.pngbin0 -> 389 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-1-v.pngbin0 -> 387 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-1.pngbin0 -> 387 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-2-h.pngbin0 -> 387 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-2.pngbin0 -> 385 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-3.pngbin0 -> 381 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-0-h.pngbin0 -> 322 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-0-v.pngbin0 -> 328 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-0.pngbin0 -> 239 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-1-h.pngbin0 -> 347 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-1.pngbin0 -> 346 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-2.pngbin0 -> 328 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-3-h.pngbin0 -> 348 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-3.pngbin0 -> 344 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-3-0-h.pngbin0 -> 301 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-3-0.pngbin0 -> 184 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-3-1.pngbin0 -> 305 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-3-3.pngbin0 -> 296 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-4-0.pngbin0 -> 244 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-4-1.pngbin0 -> 326 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/armored-conveyor-4-3.pngbin0 -> 322 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-0-0.pngbin0 -> 138 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-0-1.pngbin0 -> 255 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-0-2.pngbin0 -> 253 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-0-3.pngbin0 -> 255 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-1-0-h.pngbin0 -> 341 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-1-0.pngbin0 -> 258 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-1-1-h.pngbin0 -> 343 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-1-1-v.pngbin0 -> 342 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-1-1.pngbin0 -> 342 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-1-2-h.pngbin0 -> 341 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-1-2.pngbin0 -> 341 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-1-3.png (renamed from assets/blocks/distribution/conveyors/conveyor-1-3.png)bin362 -> 362 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-2-0-h.pngbin0 -> 282 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-2-0-v.pngbin0 -> 283 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-2-0.pngbin0 -> 165 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-2-1-h.pngbin0 -> 291 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-2-1.pngbin0 -> 291 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-2-2.pngbin0 -> 283 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-2-3-h.pngbin0 -> 288 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-2-3.pngbin0 -> 293 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-3-0-h.pngbin0 -> 301 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-3-0.pngbin0 -> 185 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-3-1.pngbin0 -> 302 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-3-3.pngbin0 -> 296 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-4-0.png (renamed from assets/blocks/distribution/conveyors/conveyor-4-0.png)bin172 -> 172 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-4-1.pngbin0 -> 282 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/conveyor-4-3.pngbin0 -> 279 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-0-0.pngbin0 -> 144 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-0-1.pngbin0 -> 262 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-0-2.pngbin0 -> 260 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-0-3.pngbin0 -> 262 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-0-h.png (renamed from assets/blocks/distribution/conveyors/titanium-conveyor-1-0-h.png)bin375 -> 375 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-0.pngbin0 -> 268 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-1-h.png (renamed from assets/blocks/distribution/conveyors/titanium-conveyor-1-1-h.png)bin376 -> 376 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-1-v.pngbin0 -> 354 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-1.png (renamed from assets/blocks/distribution/conveyors/titanium-conveyor-1-1.png)bin375 -> 375 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-2-h.pngbin0 -> 352 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-2.pngbin0 -> 356 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-3.pngbin0 -> 357 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-0-h.pngbin0 -> 289 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-0-v.pngbin0 -> 291 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-0.pngbin0 -> 174 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-1-h.png (renamed from assets/blocks/distribution/conveyors/titanium-conveyor-2-1-h.png)bin312 -> 312 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-1.png (renamed from assets/blocks/distribution/conveyors/titanium-conveyor-2-1.png)bin311 -> 311 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-2.pngbin0 -> 292 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-3-h.png (renamed from assets/blocks/distribution/conveyors/titanium-conveyor-2-3-h.png)bin310 -> 310 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-3.pngbin0 -> 297 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-3-0-h.pngbin0 -> 301 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-3-0.pngbin0 -> 185 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-3-1.pngbin0 -> 302 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-3-3.pngbin0 -> 296 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-4-0.png (renamed from assets/blocks/distribution/conveyors/titanium-conveyor-4-0.png)bin177 -> 177 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-4-1.pngbin0 -> 290 bytes
-rw-r--r--mindus/assets/blocks/distribution/conveyors/titanium-conveyor-4-3.pngbin0 -> 282 bytes
-rw-r--r--mindus/assets/blocks/distribution/distributor.png (renamed from assets/blocks/distribution/distributor.png)bin318 -> 318 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-0-0.pngbin0 -> 264 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-0-1.pngbin0 -> 316 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-0-2.pngbin0 -> 264 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-0-3.pngbin0 -> 319 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-1-0-h.pngbin0 -> 342 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-1-0.pngbin0 -> 345 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-1-1-h.pngbin0 -> 337 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-1-1-v.pngbin0 -> 341 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-1-1.pngbin0 -> 339 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-1-2-h.pngbin0 -> 339 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-1-2.pngbin0 -> 339 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-1-3.pngbin0 -> 342 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-2-0-h.pngbin0 -> 276 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-2-0-v.pngbin0 -> 277 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-2-0.pngbin0 -> 275 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-2-1-h.pngbin0 -> 332 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-2-1.pngbin0 -> 334 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-2-2.pngbin0 -> 278 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-2-3-h.pngbin0 -> 329 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-2-3.pngbin0 -> 327 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-3-0-h.pngbin0 -> 283 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-3-0.pngbin0 -> 283 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-3-1.pngbin0 -> 314 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-3-3.pngbin0 -> 315 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-4-0.png (renamed from assets/blocks/distribution/ducts/armored-duct-4-0.png)bin331 -> 331 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-4-1.pngbin0 -> 302 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/armored-duct-4-3.pngbin0 -> 304 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-0-0.pngbin0 -> 238 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-0-1.pngbin0 -> 291 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-0-2.pngbin0 -> 237 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-0-3.pngbin0 -> 290 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-1-0-h.pngbin0 -> 309 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-1-0.pngbin0 -> 312 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-1-1-h.pngbin0 -> 309 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-1-1-v.pngbin0 -> 316 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-1-1.pngbin0 -> 308 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-1-2-h.pngbin0 -> 308 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-1-2.pngbin0 -> 308 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-1-3.pngbin0 -> 313 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-2-0-h.pngbin0 -> 260 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-2-0-v.pngbin0 -> 260 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-2-0.pngbin0 -> 262 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-2-1-h.pngbin0 -> 302 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-2-1.pngbin0 -> 303 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-2-2.pngbin0 -> 260 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-2-3-h.pngbin0 -> 303 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-2-3.pngbin0 -> 303 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-3-0-h.pngbin0 -> 270 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-3-0.pngbin0 -> 270 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-3-1.pngbin0 -> 293 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-3-3.pngbin0 -> 295 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-4-0.pngbin0 -> 297 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-4-1.pngbin0 -> 288 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-4-3.pngbin0 -> 291 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-base.pngbin0 -> 232 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-bridge-arrow.pngbin0 -> 105 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-bridge-bridge-bottom.pngbin0 -> 89 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-bridge-bridge.pngbin0 -> 103 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-bridge-dir.pngbin0 -> 131 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-bridge.pngbin0 -> 199 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-router.pngbin0 -> 199 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-unloader-arrows.pngbin0 -> 141 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-unloader-top.pngbin0 -> 272 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-unloader.pngbin0 -> 214 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/overflow-duct.png (renamed from assets/blocks/distribution/ducts/overflow-duct.png)bin134 -> 134 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/surge-router.pngbin0 -> 233 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/top.pngbin0 -> 104 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/underflow-duct.png (renamed from assets/blocks/distribution/ducts/underflow-duct.png)bin166 -> 166 bytes
-rw-r--r--mindus/assets/blocks/distribution/inverted-sorter.pngbin0 -> 336 bytes
-rw-r--r--mindus/assets/blocks/distribution/item-source.pngbin0 -> 302 bytes
-rw-r--r--mindus/assets/blocks/distribution/item-void.pngbin0 -> 196 bytes
-rw-r--r--mindus/assets/blocks/distribution/junction.png (renamed from assets/blocks/distribution/junction.png)bin196 -> 196 bytes
-rw-r--r--mindus/assets/blocks/distribution/mass-driver-base.pngbin0 -> 795 bytes
-rw-r--r--mindus/assets/blocks/distribution/mass-driver.pngbin0 -> 933 bytes
-rw-r--r--mindus/assets/blocks/distribution/overflow-gate.pngbin0 -> 170 bytes
-rw-r--r--mindus/assets/blocks/distribution/phase-conveyor-arrow.pngbin0 -> 193 bytes
-rw-r--r--mindus/assets/blocks/distribution/phase-conveyor-bridge.pngbin0 -> 141 bytes
-rw-r--r--mindus/assets/blocks/distribution/phase-conveyor-end.pngbin0 -> 98 bytes
-rw-r--r--mindus/assets/blocks/distribution/phase-conveyor.pngbin0 -> 240 bytes
-rw-r--r--mindus/assets/blocks/distribution/router.png (renamed from assets/blocks/distribution/router.png)bin153 -> 153 bytes
-rw-r--r--mindus/assets/blocks/distribution/sorter.pngbin0 -> 295 bytes
-rw-r--r--mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-0.pngbin0 -> 153 bytes
-rw-r--r--mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-1.pngbin0 -> 1618 bytes
-rw-r--r--mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-2.pngbin0 -> 1651 bytes
-rw-r--r--mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-0.pngbin0 -> 549 bytes
-rw-r--r--mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-1.pngbin0 -> 1092 bytes
-rw-r--r--mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-2.pngbin0 -> 1099 bytes
-rw-r--r--mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-3.pngbin0 -> 1092 bytes
-rw-r--r--mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-stack.png (renamed from assets/blocks/distribution/stack-conveyors/plastanium-conveyor-stack.png)bin1370 -> 1349 bytes
-rw-r--r--mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-0.pngbin0 -> 179 bytes
-rw-r--r--mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-1.pngbin0 -> 546 bytes
-rw-r--r--mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-0.pngbin0 -> 525 bytes
-rw-r--r--mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-1.pngbin0 -> 1072 bytes
-rw-r--r--mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-2.pngbin0 -> 1076 bytes
-rw-r--r--mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-3.pngbin0 -> 1069 bytes
-rw-r--r--mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-stack.pngbin0 -> 178 bytes
-rw-r--r--mindus/assets/blocks/distribution/underflow-gate.pngbin0 -> 205 bytes
-rw-r--r--mindus/assets/blocks/distribution/unit-cargo-unload-point-top.pngbin0 -> 134 bytes
-rw-r--r--mindus/assets/blocks/distribution/unit-cargo-unload-point.pngbin0 -> 543 bytes
-rw-r--r--mindus/assets/blocks/drills/blast-drill.pngbin0 -> 1226 bytes
-rw-r--r--mindus/assets/blocks/drills/cliff-crusher-rotator.pngbin0 -> 203 bytes
-rw-r--r--mindus/assets/blocks/drills/cliff-crusher-top.png (renamed from assets/blocks/drills/cliff-crusher-top.png)bin214 -> 214 bytes
-rw-r--r--mindus/assets/blocks/drills/cliff-crusher.pngbin0 -> 635 bytes
-rw-r--r--mindus/assets/blocks/drills/eruption-drill.pngbin0 -> 2034 bytes
-rw-r--r--mindus/assets/blocks/drills/impact-drill.pngbin0 -> 1635 bytes
-rw-r--r--mindus/assets/blocks/drills/large-cliff-crusher-top.pngbin0 -> 222 bytes
-rw-r--r--mindus/assets/blocks/drills/large-cliff-crusher.pngbin0 -> 925 bytes
-rw-r--r--mindus/assets/blocks/drills/large-plasma-bore-top.pngbin0 -> 417 bytes
-rw-r--r--mindus/assets/blocks/drills/large-plasma-bore.pngbin0 -> 968 bytes
-rw-r--r--mindus/assets/blocks/drills/laser-drill.pngbin0 -> 864 bytes
-rw-r--r--mindus/assets/blocks/drills/mechanical-drill.pngbin0 -> 660 bytes
-rw-r--r--mindus/assets/blocks/drills/oil-extractor.pngbin0 -> 987 bytes
-rw-r--r--mindus/assets/blocks/drills/plasma-bore-top.pngbin0 -> 353 bytes
-rw-r--r--mindus/assets/blocks/drills/plasma-bore.pngbin0 -> 606 bytes
-rw-r--r--mindus/assets/blocks/drills/pneumatic-drill.pngbin0 -> 618 bytes
-rw-r--r--mindus/assets/blocks/drills/vent-condenser.pngbin0 -> 1238 bytes
-rw-r--r--mindus/assets/blocks/drills/water-extractor.pngbin0 -> 657 bytes
-rw-r--r--mindus/assets/blocks/environment/arkycite-floor.pngbin0 -> 167 bytes
-rw-r--r--mindus/assets/blocks/environment/arkyic-boulder1.pngbin0 -> 405 bytes
-rw-r--r--mindus/assets/blocks/environment/arkyic-boulder2.pngbin0 -> 390 bytes
-rw-r--r--mindus/assets/blocks/environment/arkyic-boulder3.pngbin0 -> 357 bytes
-rw-r--r--mindus/assets/blocks/environment/arkyic-stone1.pngbin0 -> 163 bytes
-rw-r--r--mindus/assets/blocks/environment/arkyic-stone2.pngbin0 -> 160 bytes
-rw-r--r--mindus/assets/blocks/environment/arkyic-stone3.pngbin0 -> 177 bytes
-rw-r--r--mindus/assets/blocks/environment/arkyic-vent1.pngbin0 -> 856 bytes
-rw-r--r--mindus/assets/blocks/environment/arkyic-vent2.pngbin0 -> 822 bytes
-rw-r--r--mindus/assets/blocks/environment/arkyic-wall-large.pngbin0 -> 528 bytes
-rw-r--r--mindus/assets/blocks/environment/arkyic-wall1.pngbin0 -> 189 bytes
-rw-r--r--mindus/assets/blocks/environment/arkyic-wall2.pngbin0 -> 198 bytes
-rw-r--r--mindus/assets/blocks/environment/arkyic-wall3.pngbin0 -> 189 bytes
-rw-r--r--mindus/assets/blocks/environment/basalt-boulder1.pngbin0 -> 439 bytes
-rw-r--r--mindus/assets/blocks/environment/basalt-boulder2.pngbin0 -> 443 bytes
-rw-r--r--mindus/assets/blocks/environment/basalt-vent1.pngbin0 -> 709 bytes
-rw-r--r--mindus/assets/blocks/environment/basalt1.pngbin0 -> 150 bytes
-rw-r--r--mindus/assets/blocks/environment/basalt2.pngbin0 -> 144 bytes
-rw-r--r--mindus/assets/blocks/environment/basalt3.pngbin0 -> 154 bytes
-rw-r--r--mindus/assets/blocks/environment/beryllic-boulder1.pngbin0 -> 436 bytes
-rw-r--r--mindus/assets/blocks/environment/beryllic-boulder2.pngbin0 -> 436 bytes
-rw-r--r--mindus/assets/blocks/environment/beryllic-stone-wall-large.pngbin0 -> 522 bytes
-rw-r--r--mindus/assets/blocks/environment/beryllic-stone-wall1.pngbin0 -> 201 bytes
-rw-r--r--mindus/assets/blocks/environment/beryllic-stone-wall2.pngbin0 -> 206 bytes
-rw-r--r--mindus/assets/blocks/environment/beryllic-stone1.pngbin0 -> 167 bytes
-rw-r--r--mindus/assets/blocks/environment/beryllic-stone2.pngbin0 -> 134 bytes
-rw-r--r--mindus/assets/blocks/environment/beryllic-stone3.pngbin0 -> 119 bytes
-rw-r--r--mindus/assets/blocks/environment/beryllic-stone4.pngbin0 -> 145 bytes
-rw-r--r--mindus/assets/blocks/environment/bluemat1.pngbin0 -> 142 bytes
-rw-r--r--mindus/assets/blocks/environment/bluemat2.pngbin0 -> 161 bytes
-rw-r--r--mindus/assets/blocks/environment/bluemat3.pngbin0 -> 132 bytes
-rw-r--r--mindus/assets/blocks/environment/boulder1.pngbin0 -> 328 bytes
-rw-r--r--mindus/assets/blocks/environment/boulder2.pngbin0 -> 330 bytes
-rw-r--r--mindus/assets/blocks/environment/carbon-boulder1.pngbin0 -> 445 bytes
-rw-r--r--mindus/assets/blocks/environment/carbon-boulder2.pngbin0 -> 437 bytes
-rw-r--r--mindus/assets/blocks/environment/carbon-stone1.pngbin0 -> 275 bytes
-rw-r--r--mindus/assets/blocks/environment/carbon-stone2.pngbin0 -> 127 bytes
-rw-r--r--mindus/assets/blocks/environment/carbon-stone3.pngbin0 -> 121 bytes
-rw-r--r--mindus/assets/blocks/environment/carbon-stone4.pngbin0 -> 256 bytes
-rw-r--r--mindus/assets/blocks/environment/carbon-vent.pngbin0 -> 591 bytes
-rw-r--r--mindus/assets/blocks/environment/carbon-vent1.pngbin0 -> 826 bytes
-rw-r--r--mindus/assets/blocks/environment/carbon-vent2.pngbin0 -> 782 bytes
-rw-r--r--mindus/assets/blocks/environment/carbon-wall-large.pngbin0 -> 544 bytes
-rw-r--r--mindus/assets/blocks/environment/carbon-wall1.pngbin0 -> 324 bytes
-rw-r--r--mindus/assets/blocks/environment/carbon-wall2.pngbin0 -> 327 bytes
-rw-r--r--mindus/assets/blocks/environment/char1.pngbin0 -> 197 bytes
-rw-r--r--mindus/assets/blocks/environment/char2.pngbin0 -> 181 bytes
-rw-r--r--mindus/assets/blocks/environment/char3.pngbin0 -> 204 bytes
-rw-r--r--mindus/assets/blocks/environment/core-zone.pngbin0 -> 138 bytes
-rw-r--r--mindus/assets/blocks/environment/crater-stone1.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/environment/crater-stone2.pngbin0 -> 174 bytes
-rw-r--r--mindus/assets/blocks/environment/crater-stone3.pngbin0 -> 175 bytes
-rw-r--r--mindus/assets/blocks/environment/crater-stone4.pngbin0 -> 175 bytes
-rw-r--r--mindus/assets/blocks/environment/crater-stone5.pngbin0 -> 126 bytes
-rw-r--r--mindus/assets/blocks/environment/crater-stone6.pngbin0 -> 132 bytes
-rw-r--r--mindus/assets/blocks/environment/crystal-blocks1.pngbin0 -> 1502 bytes
-rw-r--r--mindus/assets/blocks/environment/crystal-blocks2.pngbin0 -> 1139 bytes
-rw-r--r--mindus/assets/blocks/environment/crystal-blocks3.pngbin0 -> 869 bytes
-rw-r--r--mindus/assets/blocks/environment/crystal-cluster1.pngbin0 -> 2165 bytes
-rw-r--r--mindus/assets/blocks/environment/crystal-cluster2.pngbin0 -> 1207 bytes
-rw-r--r--mindus/assets/blocks/environment/crystal-cluster3.pngbin0 -> 1075 bytes
-rw-r--r--mindus/assets/blocks/environment/crystal-floor1.png (renamed from assets/blocks/environment/crystal-floor.png)bin180 -> 180 bytes
-rw-r--r--mindus/assets/blocks/environment/crystal-floor2.pngbin0 -> 157 bytes
-rw-r--r--mindus/assets/blocks/environment/crystal-floor3.pngbin0 -> 178 bytes
-rw-r--r--mindus/assets/blocks/environment/crystal-floor4.pngbin0 -> 181 bytes
-rw-r--r--mindus/assets/blocks/environment/crystal-orbs1.pngbin0 -> 1025 bytes
-rw-r--r--mindus/assets/blocks/environment/crystal-orbs2.pngbin0 -> 854 bytes
-rw-r--r--mindus/assets/blocks/environment/crystal-orbs3.pngbin0 -> 845 bytes
-rw-r--r--mindus/assets/blocks/environment/crystalline-boulder1.pngbin0 -> 415 bytes
-rw-r--r--mindus/assets/blocks/environment/crystalline-boulder2.pngbin0 -> 425 bytes
-rw-r--r--mindus/assets/blocks/environment/crystalline-stone-wall-large.pngbin0 -> 540 bytes
-rw-r--r--mindus/assets/blocks/environment/crystalline-stone-wall1.pngbin0 -> 323 bytes
-rw-r--r--mindus/assets/blocks/environment/crystalline-stone-wall2.pngbin0 -> 209 bytes
-rw-r--r--mindus/assets/blocks/environment/crystalline-stone-wall3.pngbin0 -> 193 bytes
-rw-r--r--mindus/assets/blocks/environment/crystalline-stone-wall4.pngbin0 -> 184 bytes
-rw-r--r--mindus/assets/blocks/environment/crystalline-stone1.pngbin0 -> 149 bytes
-rw-r--r--mindus/assets/blocks/environment/crystalline-stone2.pngbin0 -> 141 bytes
-rw-r--r--mindus/assets/blocks/environment/crystalline-stone3.pngbin0 -> 139 bytes
-rw-r--r--mindus/assets/blocks/environment/crystalline-stone4.pngbin0 -> 133 bytes
-rw-r--r--mindus/assets/blocks/environment/crystalline-stone5.pngbin0 -> 147 bytes
-rw-r--r--mindus/assets/blocks/environment/crystalline-vent.pngbin0 -> 632 bytes
-rw-r--r--mindus/assets/blocks/environment/crystalline-vent1.pngbin0 -> 854 bytes
-rw-r--r--mindus/assets/blocks/environment/crystalline-vent2.pngbin0 -> 826 bytes
-rw-r--r--mindus/assets/blocks/environment/dacite-boulder1.pngbin0 -> 439 bytes
-rw-r--r--mindus/assets/blocks/environment/dacite-boulder2.pngbin0 -> 443 bytes
-rw-r--r--mindus/assets/blocks/environment/dacite-wall-large.pngbin0 -> 481 bytes
-rw-r--r--mindus/assets/blocks/environment/dacite-wall1.pngbin0 -> 199 bytes
-rw-r--r--mindus/assets/blocks/environment/dacite-wall2.pngbin0 -> 207 bytes
-rw-r--r--mindus/assets/blocks/environment/dacite1.pngbin0 -> 161 bytes
-rw-r--r--mindus/assets/blocks/environment/dacite2.pngbin0 -> 135 bytes
-rw-r--r--mindus/assets/blocks/environment/dacite3.pngbin0 -> 157 bytes
-rw-r--r--mindus/assets/blocks/environment/dark-metal-large.pngbin0 -> 412 bytes
-rw-r--r--mindus/assets/blocks/environment/dark-metal1.pngbin0 -> 159 bytes
-rw-r--r--mindus/assets/blocks/environment/dark-metal2.pngbin0 -> 263 bytes
-rw-r--r--mindus/assets/blocks/environment/dark-panel-1.pngbin0 -> 182 bytes
-rw-r--r--mindus/assets/blocks/environment/dark-panel-2.pngbin0 -> 221 bytes
-rw-r--r--mindus/assets/blocks/environment/dark-panel-3.pngbin0 -> 139 bytes
-rw-r--r--mindus/assets/blocks/environment/dark-panel-4.pngbin0 -> 211 bytes
-rw-r--r--mindus/assets/blocks/environment/dark-panel-5.png (renamed from assets/blocks/environment/dark-panel-5.png)bin196 -> 196 bytes
-rw-r--r--mindus/assets/blocks/environment/dark-panel-6.pngbin0 -> 172 bytes
-rw-r--r--mindus/assets/blocks/environment/darksand-tainted-water.pngbin0 -> 308 bytes
-rw-r--r--mindus/assets/blocks/environment/darksand-water.pngbin0 -> 308 bytes
-rw-r--r--mindus/assets/blocks/environment/darksand1.pngbin0 -> 129 bytes
-rw-r--r--mindus/assets/blocks/environment/darksand2.pngbin0 -> 149 bytes
-rw-r--r--mindus/assets/blocks/environment/darksand3.pngbin0 -> 133 bytes
-rw-r--r--mindus/assets/blocks/environment/deep-tainted-water.pngbin0 -> 160 bytes
-rw-r--r--mindus/assets/blocks/environment/deep-water.pngbin0 -> 160 bytes
-rw-r--r--mindus/assets/blocks/environment/dense-red-stone1.pngbin0 -> 201 bytes
-rw-r--r--mindus/assets/blocks/environment/dense-red-stone2.pngbin0 -> 198 bytes
-rw-r--r--mindus/assets/blocks/environment/dense-red-stone3.pngbin0 -> 198 bytes
-rw-r--r--mindus/assets/blocks/environment/dense-red-stone4.pngbin0 -> 157 bytes
-rw-r--r--mindus/assets/blocks/environment/dirt-wall-large.pngbin0 -> 464 bytes
-rw-r--r--mindus/assets/blocks/environment/dirt-wall1.pngbin0 -> 204 bytes
-rw-r--r--mindus/assets/blocks/environment/dirt-wall2.png (renamed from assets/blocks/environment/dirt-wall.png)bin197 -> 197 bytes
-rw-r--r--mindus/assets/blocks/environment/dirt1.pngbin0 -> 136 bytes
-rw-r--r--mindus/assets/blocks/environment/dirt2.pngbin0 -> 145 bytes
-rw-r--r--mindus/assets/blocks/environment/dirt3.pngbin0 -> 503 bytes
-rw-r--r--mindus/assets/blocks/environment/dune-wall-large.pngbin0 -> 584 bytes
-rw-r--r--mindus/assets/blocks/environment/dune-wall1.pngbin0 -> 216 bytes
-rw-r--r--mindus/assets/blocks/environment/dune-wall2.pngbin0 -> 211 bytes
-rw-r--r--mindus/assets/blocks/environment/edge-stencil.pngbin0 -> 1845 bytes
-rw-r--r--mindus/assets/blocks/environment/edge.pngbin0 -> 415 bytes
-rw-r--r--mindus/assets/blocks/environment/env-error.pngbin0 -> 168 bytes
-rw-r--r--mindus/assets/blocks/environment/ferric-boulder1.pngbin0 -> 385 bytes
-rw-r--r--mindus/assets/blocks/environment/ferric-boulder2.pngbin0 -> 387 bytes
-rw-r--r--mindus/assets/blocks/environment/ferric-craters1.pngbin0 -> 203 bytes
-rw-r--r--mindus/assets/blocks/environment/ferric-craters2.pngbin0 -> 179 bytes
-rw-r--r--mindus/assets/blocks/environment/ferric-craters3.pngbin0 -> 189 bytes
-rw-r--r--mindus/assets/blocks/environment/ferric-stone-wall-large.pngbin0 -> 484 bytes
-rw-r--r--mindus/assets/blocks/environment/ferric-stone-wall1.pngbin0 -> 205 bytes
-rw-r--r--mindus/assets/blocks/environment/ferric-stone-wall2.png (renamed from assets/blocks/environment/ferric-stone-wall.png)bin193 -> 193 bytes
-rw-r--r--mindus/assets/blocks/environment/ferric-stone1.pngbin0 -> 148 bytes
-rw-r--r--mindus/assets/blocks/environment/ferric-stone2.pngbin0 -> 140 bytes
-rw-r--r--mindus/assets/blocks/environment/ferric-stone3.pngbin0 -> 134 bytes
-rw-r--r--mindus/assets/blocks/environment/ferric-stone4.pngbin0 -> 147 bytes
-rw-r--r--mindus/assets/blocks/environment/graphitic-wall-large.pngbin0 -> 740 bytes
-rw-r--r--mindus/assets/blocks/environment/graphitic-wall1.pngbin0 -> 378 bytes
-rw-r--r--mindus/assets/blocks/environment/graphitic-wall2.pngbin0 -> 381 bytes
-rw-r--r--mindus/assets/blocks/environment/graphitic-wall3.pngbin0 -> 350 bytes
-rw-r--r--mindus/assets/blocks/environment/grass1.pngbin0 -> 135 bytes
-rw-r--r--mindus/assets/blocks/environment/grass2.pngbin0 -> 122 bytes
-rw-r--r--mindus/assets/blocks/environment/grass3.pngbin0 -> 134 bytes
-rw-r--r--mindus/assets/blocks/environment/hotrock1.pngbin0 -> 206 bytes
-rw-r--r--mindus/assets/blocks/environment/hotrock2.pngbin0 -> 219 bytes
-rw-r--r--mindus/assets/blocks/environment/hotrock3.pngbin0 -> 211 bytes
-rw-r--r--mindus/assets/blocks/environment/ice-snow1.pngbin0 -> 373 bytes
-rw-r--r--mindus/assets/blocks/environment/ice-snow2.pngbin0 -> 382 bytes
-rw-r--r--mindus/assets/blocks/environment/ice-snow3.pngbin0 -> 359 bytes
-rw-r--r--mindus/assets/blocks/environment/ice-wall-large.pngbin0 -> 373 bytes
-rw-r--r--mindus/assets/blocks/environment/ice-wall1.pngbin0 -> 196 bytes
-rw-r--r--mindus/assets/blocks/environment/ice-wall2.pngbin0 -> 207 bytes
-rw-r--r--mindus/assets/blocks/environment/ice1.pngbin0 -> 145 bytes
-rw-r--r--mindus/assets/blocks/environment/ice2.pngbin0 -> 149 bytes
-rw-r--r--mindus/assets/blocks/environment/ice3.pngbin0 -> 141 bytes
-rw-r--r--mindus/assets/blocks/environment/magmarock1.pngbin0 -> 238 bytes
-rw-r--r--mindus/assets/blocks/environment/magmarock2.pngbin0 -> 238 bytes
-rw-r--r--mindus/assets/blocks/environment/magmarock3.pngbin0 -> 228 bytes
-rw-r--r--mindus/assets/blocks/environment/metal-floor-2.pngbin0 -> 117 bytes
-rw-r--r--mindus/assets/blocks/environment/metal-floor-3.pngbin0 -> 147 bytes
-rw-r--r--mindus/assets/blocks/environment/metal-floor-4.png (renamed from assets/blocks/environment/metal-floor-4.png)bin184 -> 184 bytes
-rw-r--r--mindus/assets/blocks/environment/metal-floor-5.pngbin0 -> 128 bytes
-rw-r--r--mindus/assets/blocks/environment/metal-floor-damaged1.pngbin0 -> 219 bytes
-rw-r--r--mindus/assets/blocks/environment/metal-floor-damaged2.pngbin0 -> 212 bytes
-rw-r--r--mindus/assets/blocks/environment/metal-floor-damaged3.pngbin0 -> 201 bytes
-rw-r--r--mindus/assets/blocks/environment/metal-floor.pngbin0 -> 141 bytes
-rw-r--r--mindus/assets/blocks/environment/molten-slag1.pngbin0 -> 1259 bytes
-rw-r--r--mindus/assets/blocks/environment/moss1.pngbin0 -> 155 bytes
-rw-r--r--mindus/assets/blocks/environment/moss2.pngbin0 -> 154 bytes
-rw-r--r--mindus/assets/blocks/environment/moss3.pngbin0 -> 153 bytes
-rw-r--r--mindus/assets/blocks/environment/mud1.pngbin0 -> 1278 bytes
-rw-r--r--mindus/assets/blocks/environment/mud2.pngbin0 -> 1265 bytes
-rw-r--r--mindus/assets/blocks/environment/mud3.pngbin0 -> 1277 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-beryllium1.pngbin0 -> 189 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-beryllium2.pngbin0 -> 201 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-beryllium3.pngbin0 -> 182 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-coal1.pngbin0 -> 274 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-coal2.pngbin0 -> 258 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-coal3.pngbin0 -> 235 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-copper1.pngbin0 -> 261 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-copper2.pngbin0 -> 272 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-copper3.pngbin0 -> 258 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-crystal-thorium1.pngbin0 -> 163 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-crystal-thorium2.pngbin0 -> 207 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-crystal-thorium3.pngbin0 -> 191 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-lead1.pngbin0 -> 246 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-lead2.pngbin0 -> 241 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-lead3.pngbin0 -> 235 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-scrap1.pngbin0 -> 263 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-scrap2.pngbin0 -> 275 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-scrap3.pngbin0 -> 258 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-thorium1.pngbin0 -> 233 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-thorium2.pngbin0 -> 231 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-thorium3.pngbin0 -> 235 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-titanium1.pngbin0 -> 326 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-titanium2.pngbin0 -> 286 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-titanium3.pngbin0 -> 239 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-tungsten1.pngbin0 -> 194 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-tungsten2.pngbin0 -> 181 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-tungsten3.pngbin0 -> 191 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-wall-beryllium1.pngbin0 -> 212 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-wall-beryllium2.pngbin0 -> 176 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-wall-beryllium3.pngbin0 -> 179 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-wall-graphite1.pngbin0 -> 181 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-wall-graphite2.pngbin0 -> 186 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-wall-graphite3.pngbin0 -> 148 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-wall-thorium1.pngbin0 -> 184 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-wall-thorium2.pngbin0 -> 186 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-wall-thorium3.pngbin0 -> 197 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-wall-tungsten1.pngbin0 -> 223 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-wall-tungsten2.pngbin0 -> 200 bytes
-rw-r--r--mindus/assets/blocks/environment/ore-wall-tungsten3.pngbin0 -> 207 bytes
-rw-r--r--mindus/assets/blocks/environment/pebbles1.pngbin0 -> 201 bytes
-rw-r--r--mindus/assets/blocks/environment/pebbles2.pngbin0 -> 226 bytes
-rw-r--r--mindus/assets/blocks/environment/pebbles3.pngbin0 -> 221 bytes
-rw-r--r--mindus/assets/blocks/environment/pine.pngbin0 -> 465 bytes
-rw-r--r--mindus/assets/blocks/environment/pooled-cryofluid.pngbin0 -> 1276 bytes
-rw-r--r--mindus/assets/blocks/environment/pur-bush.pngbin0 -> 176 bytes
-rw-r--r--mindus/assets/blocks/environment/red-diamond-wall1.pngbin0 -> 449 bytes
-rw-r--r--mindus/assets/blocks/environment/red-diamond-wall2.pngbin0 -> 442 bytes
-rw-r--r--mindus/assets/blocks/environment/red-diamond-wall3.pngbin0 -> 456 bytes
-rw-r--r--mindus/assets/blocks/environment/red-ice-boulder1.pngbin0 -> 446 bytes
-rw-r--r--mindus/assets/blocks/environment/red-ice-boulder2.pngbin0 -> 428 bytes
-rw-r--r--mindus/assets/blocks/environment/red-ice-boulder3.pngbin0 -> 407 bytes
-rw-r--r--mindus/assets/blocks/environment/red-ice-wall-large.pngbin0 -> 500 bytes
-rw-r--r--mindus/assets/blocks/environment/red-ice-wall1.pngbin0 -> 214 bytes
-rw-r--r--mindus/assets/blocks/environment/red-ice-wall2.pngbin0 -> 223 bytes
-rw-r--r--mindus/assets/blocks/environment/red-ice1.pngbin0 -> 179 bytes
-rw-r--r--mindus/assets/blocks/environment/red-ice2.pngbin0 -> 167 bytes
-rw-r--r--mindus/assets/blocks/environment/red-ice3.pngbin0 -> 164 bytes
-rw-r--r--mindus/assets/blocks/environment/red-stone-boulder1.pngbin0 -> 380 bytes
-rw-r--r--mindus/assets/blocks/environment/red-stone-boulder2.pngbin0 -> 385 bytes
-rw-r--r--mindus/assets/blocks/environment/red-stone-boulder3.pngbin0 -> 385 bytes
-rw-r--r--mindus/assets/blocks/environment/red-stone-boulder4.pngbin0 -> 410 bytes
-rw-r--r--mindus/assets/blocks/environment/red-stone-vent1.pngbin0 -> 854 bytes
-rw-r--r--mindus/assets/blocks/environment/red-stone-vent2.pngbin0 -> 826 bytes
-rw-r--r--mindus/assets/blocks/environment/red-stone-wall-large.pngbin0 -> 583 bytes
-rw-r--r--mindus/assets/blocks/environment/red-stone-wall1.pngbin0 -> 211 bytes
-rw-r--r--mindus/assets/blocks/environment/red-stone-wall2.pngbin0 -> 200 bytes
-rw-r--r--mindus/assets/blocks/environment/red-stone-wall3.png (renamed from assets/blocks/environment/red-stone-wall.png)bin194 -> 194 bytes
-rw-r--r--mindus/assets/blocks/environment/red-stone1.pngbin0 -> 162 bytes
-rw-r--r--mindus/assets/blocks/environment/red-stone2.pngbin0 -> 156 bytes
-rw-r--r--mindus/assets/blocks/environment/red-stone3.pngbin0 -> 137 bytes
-rw-r--r--mindus/assets/blocks/environment/red-stone4.pngbin0 -> 146 bytes
-rw-r--r--mindus/assets/blocks/environment/redmat1.pngbin0 -> 142 bytes
-rw-r--r--mindus/assets/blocks/environment/redmat2.pngbin0 -> 161 bytes
-rw-r--r--mindus/assets/blocks/environment/redmat3.pngbin0 -> 132 bytes
-rw-r--r--mindus/assets/blocks/environment/redweed1.pngbin0 -> 366 bytes
-rw-r--r--mindus/assets/blocks/environment/redweed2.pngbin0 -> 174 bytes
-rw-r--r--mindus/assets/blocks/environment/redweed3.pngbin0 -> 223 bytes
-rw-r--r--mindus/assets/blocks/environment/regolith-wall-large.pngbin0 -> 561 bytes
-rw-r--r--mindus/assets/blocks/environment/regolith-wall1.pngbin0 -> 211 bytes
-rw-r--r--mindus/assets/blocks/environment/regolith-wall2.pngbin0 -> 209 bytes
-rw-r--r--mindus/assets/blocks/environment/regolith1.pngbin0 -> 136 bytes
-rw-r--r--mindus/assets/blocks/environment/regolith2.pngbin0 -> 164 bytes
-rw-r--r--mindus/assets/blocks/environment/regolith3.pngbin0 -> 154 bytes
-rw-r--r--mindus/assets/blocks/environment/rhyolite-boulder1.pngbin0 -> 417 bytes
-rw-r--r--mindus/assets/blocks/environment/rhyolite-boulder2.pngbin0 -> 396 bytes
-rw-r--r--mindus/assets/blocks/environment/rhyolite-boulder3.pngbin0 -> 396 bytes
-rw-r--r--mindus/assets/blocks/environment/rhyolite-crater1.pngbin0 -> 572 bytes
-rw-r--r--mindus/assets/blocks/environment/rhyolite-crater2.pngbin0 -> 563 bytes
-rw-r--r--mindus/assets/blocks/environment/rhyolite-crater3.pngbin0 -> 575 bytes
-rw-r--r--mindus/assets/blocks/environment/rhyolite-vent.pngbin0 -> 600 bytes
-rw-r--r--mindus/assets/blocks/environment/rhyolite-vent1.pngbin0 -> 808 bytes
-rw-r--r--mindus/assets/blocks/environment/rhyolite-vent2.pngbin0 -> 793 bytes
-rw-r--r--mindus/assets/blocks/environment/rhyolite-wall-large.pngbin0 -> 559 bytes
-rw-r--r--mindus/assets/blocks/environment/rhyolite-wall1.pngbin0 -> 214 bytes
-rw-r--r--mindus/assets/blocks/environment/rhyolite-wall2.pngbin0 -> 219 bytes
-rw-r--r--mindus/assets/blocks/environment/rhyolite1.pngbin0 -> 540 bytes
-rw-r--r--mindus/assets/blocks/environment/rhyolite2.pngbin0 -> 532 bytes
-rw-r--r--mindus/assets/blocks/environment/rhyolite3.pngbin0 -> 536 bytes
-rw-r--r--mindus/assets/blocks/environment/rough-rhyolite1.pngbin0 -> 151 bytes
-rw-r--r--mindus/assets/blocks/environment/rough-rhyolite2.pngbin0 -> 139 bytes
-rw-r--r--mindus/assets/blocks/environment/rough-rhyolite3.pngbin0 -> 134 bytes
-rw-r--r--mindus/assets/blocks/environment/rough-rhyolite4.pngbin0 -> 151 bytes
-rw-r--r--mindus/assets/blocks/environment/salt-wall-large.png (renamed from assets/blocks/environment/salt-wall-large.png)bin357 -> 357 bytes
-rw-r--r--mindus/assets/blocks/environment/salt-wall1.pngbin0 -> 196 bytes
-rw-r--r--mindus/assets/blocks/environment/salt-wall2.pngbin0 -> 193 bytes
-rw-r--r--mindus/assets/blocks/environment/salt1.pngbin0 -> 185 bytes
-rw-r--r--mindus/assets/blocks/environment/sand-boulder1.pngbin0 -> 237 bytes
-rw-r--r--mindus/assets/blocks/environment/sand-boulder2.pngbin0 -> 249 bytes
-rw-r--r--mindus/assets/blocks/environment/sand-floor1.pngbin0 -> 140 bytes
-rw-r--r--mindus/assets/blocks/environment/sand-floor2.pngbin0 -> 146 bytes
-rw-r--r--mindus/assets/blocks/environment/sand-floor3.pngbin0 -> 129 bytes
-rw-r--r--mindus/assets/blocks/environment/sand-wall-large.pngbin0 -> 456 bytes
-rw-r--r--mindus/assets/blocks/environment/sand-wall1.pngbin0 -> 211 bytes
-rw-r--r--mindus/assets/blocks/environment/sand-wall2.pngbin0 -> 200 bytes
-rw-r--r--mindus/assets/blocks/environment/sand-water.pngbin0 -> 306 bytes
-rw-r--r--mindus/assets/blocks/environment/shale-boulder1.pngbin0 -> 237 bytes
-rw-r--r--mindus/assets/blocks/environment/shale-boulder2.pngbin0 -> 249 bytes
-rw-r--r--mindus/assets/blocks/environment/shale-wall-large.pngbin0 -> 342 bytes
-rw-r--r--mindus/assets/blocks/environment/shale-wall1.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/environment/shale-wall2.pngbin0 -> 186 bytes
-rw-r--r--mindus/assets/blocks/environment/shale1.pngbin0 -> 156 bytes
-rw-r--r--mindus/assets/blocks/environment/shale2.pngbin0 -> 158 bytes
-rw-r--r--mindus/assets/blocks/environment/shale3.pngbin0 -> 166 bytes
-rw-r--r--mindus/assets/blocks/environment/shallow-water.pngbin0 -> 160 bytes
-rw-r--r--mindus/assets/blocks/environment/shrubs-large.pngbin0 -> 365 bytes
-rw-r--r--mindus/assets/blocks/environment/shrubs1.pngbin0 -> 216 bytes
-rw-r--r--mindus/assets/blocks/environment/shrubs2.pngbin0 -> 210 bytes
l---------mindus/assets/blocks/environment/single/colored-floor.png1
l---------mindus/assets/blocks/environment/single/colored-wall.png1
l---------mindus/assets/blocks/environment/single/metal-tiles-1.png1
l---------mindus/assets/blocks/environment/single/metal-tiles-10.png1
l---------mindus/assets/blocks/environment/single/metal-tiles-11.png1
l---------mindus/assets/blocks/environment/single/metal-tiles-12.png1
l---------mindus/assets/blocks/environment/single/metal-tiles-2.png1
l---------mindus/assets/blocks/environment/single/metal-tiles-3.png1
l---------mindus/assets/blocks/environment/single/metal-tiles-4.png1
l---------mindus/assets/blocks/environment/single/metal-tiles-5.png1
l---------mindus/assets/blocks/environment/single/metal-tiles-6.png1
l---------mindus/assets/blocks/environment/single/metal-tiles-7.png1
l---------mindus/assets/blocks/environment/single/metal-tiles-8.png1
l---------mindus/assets/blocks/environment/single/metal-tiles-9.png1
-rw-r--r--mindus/assets/blocks/environment/single/metal-wall-1.pngbin0 -> 271 bytes
-rw-r--r--mindus/assets/blocks/environment/single/metal-wall-2.pngbin0 -> 262 bytes
-rw-r--r--mindus/assets/blocks/environment/single/metal-wall-3.pngbin0 -> 226 bytes
-rw-r--r--mindus/assets/blocks/environment/snow-boulder1.pngbin0 -> 340 bytes
-rw-r--r--mindus/assets/blocks/environment/snow-boulder2.pngbin0 -> 337 bytes
-rw-r--r--mindus/assets/blocks/environment/snow-pine.pngbin0 -> 462 bytes
-rw-r--r--mindus/assets/blocks/environment/snow-wall-large.pngbin0 -> 340 bytes
-rw-r--r--mindus/assets/blocks/environment/snow-wall1.pngbin0 -> 194 bytes
-rw-r--r--mindus/assets/blocks/environment/snow-wall2.pngbin0 -> 195 bytes
-rw-r--r--mindus/assets/blocks/environment/snow1.pngbin0 -> 172 bytes
-rw-r--r--mindus/assets/blocks/environment/snow2.pngbin0 -> 148 bytes
-rw-r--r--mindus/assets/blocks/environment/snow3.pngbin0 -> 213 bytes
-rw-r--r--mindus/assets/blocks/environment/space.png (renamed from assets/blocks/environment/space.png)bin96 -> 96 bytes
-rw-r--r--mindus/assets/blocks/environment/spawn.pngbin0 -> 217 bytes
-rw-r--r--mindus/assets/blocks/environment/spore-cluster1.pngbin0 -> 256 bytes
-rw-r--r--mindus/assets/blocks/environment/spore-cluster2.pngbin0 -> 279 bytes
-rw-r--r--mindus/assets/blocks/environment/spore-cluster3.pngbin0 -> 256 bytes
-rw-r--r--mindus/assets/blocks/environment/spore-moss1.pngbin0 -> 184 bytes
-rw-r--r--mindus/assets/blocks/environment/spore-moss2.pngbin0 -> 185 bytes
-rw-r--r--mindus/assets/blocks/environment/spore-moss3.pngbin0 -> 186 bytes
-rw-r--r--mindus/assets/blocks/environment/spore-pine.pngbin0 -> 460 bytes
-rw-r--r--mindus/assets/blocks/environment/spore-wall-large.pngbin0 -> 349 bytes
-rw-r--r--mindus/assets/blocks/environment/spore-wall1.pngbin0 -> 201 bytes
-rw-r--r--mindus/assets/blocks/environment/spore-wall2.pngbin0 -> 165 bytes
-rw-r--r--mindus/assets/blocks/environment/stone-vent.pngbin0 -> 641 bytes
-rw-r--r--mindus/assets/blocks/environment/stone-wall-large.pngbin0 -> 283 bytes
-rw-r--r--mindus/assets/blocks/environment/stone-wall1.pngbin0 -> 178 bytes
-rw-r--r--mindus/assets/blocks/environment/stone-wall2.pngbin0 -> 172 bytes
-rw-r--r--mindus/assets/blocks/environment/stone1.pngbin0 -> 142 bytes
-rw-r--r--mindus/assets/blocks/environment/stone2.pngbin0 -> 139 bytes
-rw-r--r--mindus/assets/blocks/environment/stone3.pngbin0 -> 143 bytes
-rw-r--r--mindus/assets/blocks/environment/tainted-water.pngbin0 -> 160 bytes
-rw-r--r--mindus/assets/blocks/environment/tar.png (renamed from assets/blocks/environment/tar.png)bin96 -> 96 bytes
-rw-r--r--mindus/assets/blocks/environment/tendrils1.pngbin0 -> 219 bytes
-rw-r--r--mindus/assets/blocks/environment/tendrils2.pngbin0 -> 219 bytes
-rw-r--r--mindus/assets/blocks/environment/tendrils3.pngbin0 -> 223 bytes
-rw-r--r--mindus/assets/blocks/environment/vibrant-crystal-cluster1.pngbin0 -> 875 bytes
-rw-r--r--mindus/assets/blocks/environment/vibrant-crystal-cluster2.pngbin0 -> 1217 bytes
-rw-r--r--mindus/assets/blocks/environment/vibrant-crystal-cluster3.pngbin0 -> 1331 bytes
-rw-r--r--mindus/assets/blocks/environment/white-tree-dead.pngbin0 -> 4700 bytes
-rw-r--r--mindus/assets/blocks/environment/white-tree.png (renamed from assets/blocks/environment/white-tree.png)bin4231 -> 4220 bytes
-rw-r--r--mindus/assets/blocks/environment/yellow-stone-boulder1.pngbin0 -> 423 bytes
-rw-r--r--mindus/assets/blocks/environment/yellow-stone-boulder2.pngbin0 -> 436 bytes
-rw-r--r--mindus/assets/blocks/environment/yellow-stone-plates1.pngbin0 -> 180 bytes
-rw-r--r--mindus/assets/blocks/environment/yellow-stone-plates2.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/environment/yellow-stone-plates3.png (renamed from assets/blocks/environment/yellow-stone-plates.png)bin179 -> 179 bytes
-rw-r--r--mindus/assets/blocks/environment/yellow-stone-vent1.pngbin0 -> 841 bytes
-rw-r--r--mindus/assets/blocks/environment/yellow-stone-vent2.pngbin0 -> 794 bytes
-rw-r--r--mindus/assets/blocks/environment/yellow-stone-wall-large.pngbin0 -> 472 bytes
-rw-r--r--mindus/assets/blocks/environment/yellow-stone-wall1.pngbin0 -> 208 bytes
-rw-r--r--mindus/assets/blocks/environment/yellow-stone-wall2.png (renamed from assets/blocks/environment/yellow-stone-wall.png)bin196 -> 196 bytes
-rw-r--r--mindus/assets/blocks/environment/yellow-stone1.pngbin0 -> 138 bytes
-rw-r--r--mindus/assets/blocks/environment/yellow-stone2.pngbin0 -> 150 bytes
-rw-r--r--mindus/assets/blocks/environment/yellow-stone3.pngbin0 -> 132 bytes
-rw-r--r--mindus/assets/blocks/environment/yellowcoral.pngbin0 -> 317 bytes
-rw-r--r--mindus/assets/blocks/liquid/bridge-conduit-arrow.pngbin0 -> 193 bytes
-rw-r--r--mindus/assets/blocks/liquid/bridge-conduit-bridge.pngbin0 -> 144 bytes
-rw-r--r--mindus/assets/blocks/liquid/bridge-conduit-end.pngbin0 -> 144 bytes
-rw-r--r--mindus/assets/blocks/liquid/bridge-conduit.pngbin0 -> 219 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-0-0.pngbin0 -> 172 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-0-1.png (renamed from assets/blocks/liquid/conduits/conduit-0-1.png)bin303 -> 303 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-0-2.pngbin0 -> 274 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-0-3.png (renamed from assets/blocks/liquid/conduits/conduit-0-3.png)bin305 -> 305 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-1-0-h.pngbin0 -> 334 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-1-0.pngbin0 -> 233 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-1-1-h.pngbin0 -> 332 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-1-1-v.pngbin0 -> 335 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-1-1.pngbin0 -> 331 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-1-2-h.pngbin0 -> 331 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-1-2.pngbin0 -> 332 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-1-3.pngbin0 -> 334 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-2-0-h.pngbin0 -> 299 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-2-0-v.pngbin0 -> 299 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-2-0.pngbin0 -> 196 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-2-1-h.png (renamed from assets/blocks/liquid/conduits/conduit-2-1-h.png)bin329 -> 329 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-2-1.png (renamed from assets/blocks/liquid/conduits/conduit-2-1.png)bin327 -> 327 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-2-2.pngbin0 -> 300 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-2-3-h.pngbin0 -> 315 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-2-3.png (renamed from assets/blocks/liquid/conduits/conduit-2-3.png)bin331 -> 331 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-3-0-h.pngbin0 -> 301 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-3-0.pngbin0 -> 206 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-3-1.pngbin0 -> 327 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-3-3.pngbin0 -> 317 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-4-0.pngbin0 -> 201 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-4-1.pngbin0 -> 301 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-4-3.pngbin0 -> 301 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-bottom-0.pngbin0 -> 118 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-bottom-1.pngbin0 -> 152 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-bottom-2.png (renamed from assets/blocks/liquid/conduits/conduit-bottom-3.png)bin71 -> 71 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-bottom-3.png (renamed from assets/blocks/liquid/conduits/conduit-bottom-4.png)bin71 -> 71 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/conduit-bottom-4.pngbin0 -> 71 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-0-0.pngbin0 -> 202 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-0-1.pngbin0 -> 348 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-0-2.pngbin0 -> 303 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-0-3.pngbin0 -> 348 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-1-0-h.pngbin0 -> 373 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-1-0.pngbin0 -> 268 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-1-1-h.pngbin0 -> 372 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-1-1-v.pngbin0 -> 370 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-1-1.pngbin0 -> 371 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-1-2-h.pngbin0 -> 371 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-1-2.pngbin0 -> 372 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-1-3.pngbin0 -> 373 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-2-0-h.pngbin0 -> 328 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-2-0-v.pngbin0 -> 332 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-2-0.pngbin0 -> 225 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-2-1-h.pngbin0 -> 349 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-2-1.png (renamed from assets/blocks/liquid/conduits/plated-conduit-2-1.png)bin370 -> 370 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-2-2.pngbin0 -> 332 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-2-3-h.pngbin0 -> 357 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-2-3.png (renamed from assets/blocks/liquid/conduits/plated-conduit-2-3.png)bin371 -> 371 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-3-0-h.pngbin0 -> 308 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-3-0.pngbin0 -> 209 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-3-1.pngbin0 -> 332 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-3-3.pngbin0 -> 328 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-4-0.png (renamed from assets/blocks/liquid/conduits/plated-conduit-4-0.png)bin228 -> 228 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-4-1.pngbin0 -> 323 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-4-3.pngbin0 -> 325 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/plated-conduit-cap.png (renamed from assets/blocks/liquid/conduits/plated-conduit-cap.png)bin1169 -> 1169 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-0-0.pngbin0 -> 202 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-0-1.png (renamed from assets/blocks/liquid/conduits/pulse-conduit-0-1.png)bin360 -> 360 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-0-2.pngbin0 -> 303 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-0-3.pngbin0 -> 348 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-1-0-h.pngbin0 -> 373 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-1-0.pngbin0 -> 268 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-1-1-h.pngbin0 -> 372 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-1-1-v.pngbin0 -> 370 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-1-1.pngbin0 -> 371 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-1-2-h.pngbin0 -> 371 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-1-2.pngbin0 -> 372 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-1-3.pngbin0 -> 373 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-2-0-h.pngbin0 -> 326 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-2-0-v.pngbin0 -> 332 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-2-0.pngbin0 -> 224 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-2-1-h.pngbin0 -> 349 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-2-1.png (renamed from assets/blocks/liquid/conduits/pulse-conduit-2-1.png)bin370 -> 370 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-2-2.pngbin0 -> 332 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-2-3-h.pngbin0 -> 357 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-2-3.png (renamed from assets/blocks/liquid/conduits/pulse-conduit-2-3.png)bin371 -> 371 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-3-0-h.pngbin0 -> 308 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-3-0.pngbin0 -> 240 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-3-1.pngbin0 -> 332 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-3-3.pngbin0 -> 328 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-4-0.pngbin0 -> 222 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-4-1.pngbin0 -> 323 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/pulse-conduit-4-3.pngbin0 -> 324 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-0-0.pngbin0 -> 204 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-0-1.pngbin0 -> 343 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-0-2.pngbin0 -> 307 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-0-3.pngbin0 -> 341 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-0-h.pngbin0 -> 357 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-0.pngbin0 -> 255 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-1-h.pngbin0 -> 354 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-1-v.pngbin0 -> 358 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-1.pngbin0 -> 356 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-2-h.pngbin0 -> 352 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-2.pngbin0 -> 356 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-3.pngbin0 -> 358 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-0-h.pngbin0 -> 306 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-0-v.pngbin0 -> 305 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-0.pngbin0 -> 204 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-1-h.pngbin0 -> 330 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-1.pngbin0 -> 333 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-2.pngbin0 -> 306 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-3-h.pngbin0 -> 328 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-3.pngbin0 -> 328 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-3-0-h.pngbin0 -> 282 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-3-0.pngbin0 -> 181 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-3-1.pngbin0 -> 293 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-3-3.pngbin0 -> 291 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-4-0.pngbin0 -> 214 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-4-1.pngbin0 -> 310 bytes
-rw-r--r--mindus/assets/blocks/liquid/conduits/reinforced-conduit-4-3.pngbin0 -> 312 bytes
-rw-r--r--mindus/assets/blocks/liquid/impulse-pump-liquid.pngbin0 -> 238 bytes
-rw-r--r--mindus/assets/blocks/liquid/impulse-pump.pngbin0 -> 936 bytes
-rw-r--r--mindus/assets/blocks/liquid/liquid-container-bottom.png (renamed from assets/blocks/liquid/liquid-container-bottom.png)bin99 -> 99 bytes
-rw-r--r--mindus/assets/blocks/liquid/liquid-container.pngbin0 -> 493 bytes
-rw-r--r--mindus/assets/blocks/liquid/liquid-junction.pngbin0 -> 210 bytes
-rw-r--r--mindus/assets/blocks/liquid/liquid-router-bottom.png (renamed from assets/blocks/liquid/liquid-router-bottom.png)bin96 -> 96 bytes
-rw-r--r--mindus/assets/blocks/liquid/liquid-router.pngbin0 -> 211 bytes
-rw-r--r--mindus/assets/blocks/liquid/liquid-source.pngbin0 -> 312 bytes
-rw-r--r--mindus/assets/blocks/liquid/liquid-tank-bottom.pngbin0 -> 217 bytes
-rw-r--r--mindus/assets/blocks/liquid/liquid-tank.pngbin0 -> 877 bytes
-rw-r--r--mindus/assets/blocks/liquid/liquid-void.pngbin0 -> 200 bytes
-rw-r--r--mindus/assets/blocks/liquid/mechanical-pump-liquid.pngbin0 -> 238 bytes
-rw-r--r--mindus/assets/blocks/liquid/mechanical-pump.pngbin0 -> 280 bytes
-rw-r--r--mindus/assets/blocks/liquid/phase-conduit-arrow.pngbin0 -> 193 bytes
-rw-r--r--mindus/assets/blocks/liquid/phase-conduit-bridge.pngbin0 -> 141 bytes
-rw-r--r--mindus/assets/blocks/liquid/phase-conduit-end.pngbin0 -> 103 bytes
-rw-r--r--mindus/assets/blocks/liquid/phase-conduit.pngbin0 -> 203 bytes
-rw-r--r--mindus/assets/blocks/liquid/reinforced-bridge-conduit-arrow.pngbin0 -> 105 bytes
-rw-r--r--mindus/assets/blocks/liquid/reinforced-bridge-conduit-bridge-liquid.pngbin0 -> 101 bytes
-rw-r--r--mindus/assets/blocks/liquid/reinforced-bridge-conduit-bridge.pngbin0 -> 103 bytes
-rw-r--r--mindus/assets/blocks/liquid/reinforced-bridge-conduit-dir.pngbin0 -> 115 bytes
-rw-r--r--mindus/assets/blocks/liquid/reinforced-bridge-conduit-liquid.pngbin0 -> 113 bytes
-rw-r--r--mindus/assets/blocks/liquid/reinforced-bridge-conduit.pngbin0 -> 256 bytes
-rw-r--r--mindus/assets/blocks/liquid/reinforced-liquid-container-bottom.png (renamed from assets/blocks/liquid/reinforced-liquid-container-bottom.png)bin182 -> 182 bytes
-rw-r--r--mindus/assets/blocks/liquid/reinforced-liquid-container.pngbin0 -> 598 bytes
-rw-r--r--mindus/assets/blocks/liquid/reinforced-liquid-junction.pngbin0 -> 354 bytes
-rw-r--r--mindus/assets/blocks/liquid/reinforced-liquid-router-bottom.png (renamed from assets/blocks/liquid/reinforced-liquid-router-bottom.png)bin137 -> 137 bytes
-rw-r--r--mindus/assets/blocks/liquid/reinforced-liquid-router.png (renamed from assets/blocks/liquid/reinforced-liquid-router.png)bin285 -> 285 bytes
-rw-r--r--mindus/assets/blocks/liquid/reinforced-liquid-tank-bottom.pngbin0 -> 309 bytes
-rw-r--r--mindus/assets/blocks/liquid/reinforced-liquid-tank.png (renamed from assets/blocks/liquid/reinforced-liquid-tank.png)bin954 -> 954 bytes
-rw-r--r--mindus/assets/blocks/liquid/reinforced-pump-liquid.pngbin0 -> 139 bytes
-rw-r--r--mindus/assets/blocks/liquid/reinforced-pump.pngbin0 -> 600 bytes
-rw-r--r--mindus/assets/blocks/liquid/rotary-pump-liquid.pngbin0 -> 238 bytes
-rw-r--r--mindus/assets/blocks/liquid/rotary-pump.pngbin0 -> 641 bytes
-rw-r--r--mindus/assets/blocks/logic/canvas.pngbin0 -> 393 bytes
-rw-r--r--mindus/assets/blocks/logic/hyper-processor.pngbin0 -> 1093 bytes
-rw-r--r--mindus/assets/blocks/logic/large-canvas.pngbin0 -> 330 bytes
-rw-r--r--mindus/assets/blocks/logic/large-logic-display.pngbin0 -> 562 bytes
-rw-r--r--mindus/assets/blocks/logic/logic-display.pngbin0 -> 464 bytes
-rw-r--r--mindus/assets/blocks/logic/logic-processor.pngbin0 -> 728 bytes
-rw-r--r--mindus/assets/blocks/logic/memory-bank.pngbin0 -> 460 bytes
-rw-r--r--mindus/assets/blocks/logic/memory-cell.pngbin0 -> 217 bytes
-rw-r--r--mindus/assets/blocks/logic/message.pngbin0 -> 191 bytes
-rw-r--r--mindus/assets/blocks/logic/micro-processor.pngbin0 -> 410 bytes
-rw-r--r--mindus/assets/blocks/logic/reinforced-message.pngbin0 -> 191 bytes
-rw-r--r--mindus/assets/blocks/logic/switch-on.pngbin0 -> 503 bytes
-rw-r--r--mindus/assets/blocks/logic/switch.pngbin0 -> 583 bytes
-rw-r--r--mindus/assets/blocks/logic/tile-logic-display.pngbin0 -> 96 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-0.pngbin0 -> 130 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-1.pngbin0 -> 104 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-10.pngbin0 -> 144 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-11.pngbin0 -> 133 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-12.pngbin0 -> 108 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-13.pngbin0 -> 80 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-14.pngbin0 -> 107 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-15.pngbin0 -> 112 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-16.pngbin0 -> 124 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-17.pngbin0 -> 149 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-18.pngbin0 -> 108 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-19.pngbin0 -> 119 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-2.pngbin0 -> 114 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-20.pngbin0 -> 125 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-21.pngbin0 -> 117 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-22.pngbin0 -> 136 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-23.pngbin0 -> 140 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-24.pngbin0 -> 115 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-25.pngbin0 -> 102 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-26.pngbin0 -> 131 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-27.pngbin0 -> 133 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-28.pngbin0 -> 134 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-29.pngbin0 -> 133 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-3.pngbin0 -> 133 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-30.pngbin0 -> 127 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-31.pngbin0 -> 116 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-32.pngbin0 -> 124 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-33.pngbin0 -> 127 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-34.pngbin0 -> 118 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-35.pngbin0 -> 132 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-36.pngbin0 -> 136 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-37.pngbin0 -> 109 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-38.pngbin0 -> 135 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-39.pngbin0 -> 150 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-4.pngbin0 -> 146 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-40.pngbin0 -> 132 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-41.pngbin0 -> 134 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-42.pngbin0 -> 117 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-43.pngbin0 -> 128 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-44.pngbin0 -> 126 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-45.pngbin0 -> 125 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-46.pngbin0 -> 140 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-5.pngbin0 -> 121 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-6.pngbin0 -> 117 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-7.pngbin0 -> 106 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-8.pngbin0 -> 116 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-9.pngbin0 -> 127 bytes
-rw-r--r--mindus/assets/blocks/logic/world-cell.pngbin0 -> 216 bytes
-rw-r--r--mindus/assets/blocks/logic/world-message.pngbin0 -> 191 bytes
-rw-r--r--mindus/assets/blocks/logic/world-processor.pngbin0 -> 410 bytes
-rw-r--r--mindus/assets/blocks/logic/world-switch-on.pngbin0 -> 143 bytes
-rw-r--r--mindus/assets/blocks/logic/world-switch.pngbin0 -> 223 bytes
-rw-r--r--mindus/assets/blocks/payload/constructor-top.pngbin0 -> 902 bytes
-rw-r--r--mindus/assets/blocks/payload/constructor.pngbin0 -> 816 bytes
-rw-r--r--mindus/assets/blocks/payload/deconstructor-top.pngbin0 -> 1294 bytes
-rw-r--r--mindus/assets/blocks/payload/deconstructor.pngbin0 -> 1714 bytes
-rw-r--r--mindus/assets/blocks/payload/factory-in-3-dark.pngbin0 -> 376 bytes
-rw-r--r--mindus/assets/blocks/payload/factory-in-3.pngbin0 -> 411 bytes
-rw-r--r--mindus/assets/blocks/payload/factory-in-5-dark.pngbin0 -> 611 bytes
-rw-r--r--mindus/assets/blocks/payload/factory-in-5.pngbin0 -> 630 bytes
-rw-r--r--mindus/assets/blocks/payload/factory-in-7.png (renamed from assets/blocks/payload/factory-in-7.png)bin1077 -> 1061 bytes
-rw-r--r--mindus/assets/blocks/payload/factory-in-9.png (renamed from assets/blocks/payload/factory-in-9.png)bin1263 -> 1247 bytes
-rw-r--r--mindus/assets/blocks/payload/factory-out-3-dark.pngbin0 -> 377 bytes
-rw-r--r--mindus/assets/blocks/payload/factory-out-3.pngbin0 -> 426 bytes
-rw-r--r--mindus/assets/blocks/payload/factory-out-5-dark.pngbin0 -> 600 bytes
-rw-r--r--mindus/assets/blocks/payload/factory-out-5.pngbin0 -> 684 bytes
-rw-r--r--mindus/assets/blocks/payload/factory-out-7.pngbin0 -> 859 bytes
-rw-r--r--mindus/assets/blocks/payload/factory-out-9.pngbin0 -> 1086 bytes
-rw-r--r--mindus/assets/blocks/payload/factory-top-3.pngbin0 -> 562 bytes
-rw-r--r--mindus/assets/blocks/payload/large-constructor-top.pngbin0 -> 1604 bytes
-rw-r--r--mindus/assets/blocks/payload/large-constructor.pngbin0 -> 1683 bytes
-rw-r--r--mindus/assets/blocks/payload/large-payload-mass-driver.pngbin0 -> 2298 bytes
-rw-r--r--mindus/assets/blocks/payload/payload-conveyor.pngbin0 -> 302 bytes
-rw-r--r--mindus/assets/blocks/payload/payload-loader-top.pngbin0 -> 573 bytes
-rw-r--r--mindus/assets/blocks/payload/payload-loader.pngbin0 -> 753 bytes
-rw-r--r--mindus/assets/blocks/payload/payload-mass-driver.pngbin0 -> 1122 bytes
-rw-r--r--mindus/assets/blocks/payload/payload-router-over.png (renamed from assets/blocks/payload/payload-router-over.png)bin440 -> 440 bytes
-rw-r--r--mindus/assets/blocks/payload/payload-router.pngbin0 -> 220 bytes
-rw-r--r--mindus/assets/blocks/payload/payload-source-top.pngbin0 -> 637 bytes
-rw-r--r--mindus/assets/blocks/payload/payload-source.png (renamed from assets/blocks/payload/payload-source.png)bin7026 -> 6987 bytes
-rw-r--r--mindus/assets/blocks/payload/payload-unloader-top.pngbin0 -> 573 bytes
-rw-r--r--mindus/assets/blocks/payload/payload-unloader.pngbin0 -> 753 bytes
-rw-r--r--mindus/assets/blocks/payload/payload-void-top.pngbin0 -> 634 bytes
-rw-r--r--mindus/assets/blocks/payload/payload-void.pngbin0 -> 1030 bytes
-rw-r--r--mindus/assets/blocks/payload/reinforced-payload-conveyor.pngbin0 -> 350 bytes
-rw-r--r--mindus/assets/blocks/payload/reinforced-payload-router-over.png (renamed from assets/blocks/payload/reinforced-payload-router-over.png)bin573 -> 573 bytes
-rw-r--r--mindus/assets/blocks/payload/reinforced-payload-router.pngbin0 -> 225 bytes
-rw-r--r--mindus/assets/blocks/payload/small-deconstructor-top.pngbin0 -> 690 bytes
-rw-r--r--mindus/assets/blocks/payload/small-deconstructor.pngbin0 -> 830 bytes
-rw-r--r--mindus/assets/blocks/power/battery-large.pngbin0 -> 824 bytes
-rw-r--r--mindus/assets/blocks/power/battery.pngbin0 -> 2495 bytes
-rw-r--r--mindus/assets/blocks/power/beam-link.pngbin0 -> 1121 bytes
-rw-r--r--mindus/assets/blocks/power/beam-node.pngbin0 -> 409 bytes
-rw-r--r--mindus/assets/blocks/power/beam-tower.pngbin0 -> 1056 bytes
-rw-r--r--mindus/assets/blocks/power/chemical-combustion-chamber.pngbin0 -> 1050 bytes
-rw-r--r--mindus/assets/blocks/power/combustion-generator.pngbin0 -> 238 bytes
-rw-r--r--mindus/assets/blocks/power/differential-generator-liquid.pngbin0 -> 712 bytes
-rw-r--r--mindus/assets/blocks/power/differential-generator.pngbin0 -> 956 bytes
-rw-r--r--mindus/assets/blocks/power/diode-arrow.pngbin0 -> 148 bytes
-rw-r--r--mindus/assets/blocks/power/diode.pngbin0 -> 204 bytes
-rw-r--r--mindus/assets/blocks/power/flux-reactor-bottom.pngbin0 -> 225 bytes
-rw-r--r--mindus/assets/blocks/power/flux-reactor-mid.pngbin0 -> 319 bytes
-rw-r--r--mindus/assets/blocks/power/flux-reactor.pngbin0 -> 1961 bytes
-rw-r--r--mindus/assets/blocks/power/illuminator.pngbin0 -> 236 bytes
-rw-r--r--mindus/assets/blocks/power/impact-reactor-bottom.pngbin0 -> 224 bytes
-rw-r--r--mindus/assets/blocks/power/impact-reactor.pngbin0 -> 1281 bytes
-rw-r--r--mindus/assets/blocks/power/neoplasia-reactor-bottom.pngbin0 -> 382 bytes
-rw-r--r--mindus/assets/blocks/power/neoplasia-reactor-center.pngbin0 -> 320 bytes
-rw-r--r--mindus/assets/blocks/power/neoplasia-reactor-top1.png (renamed from assets/blocks/power/neoplasia-reactor-top1.png)bin295 -> 295 bytes
-rw-r--r--mindus/assets/blocks/power/neoplasia-reactor-top2.png (renamed from assets/blocks/power/neoplasia-reactor-top2.png)bin297 -> 297 bytes
-rw-r--r--mindus/assets/blocks/power/neoplasia-reactor.pngbin0 -> 2163 bytes
-rw-r--r--mindus/assets/blocks/power/power-node-large.pngbin0 -> 319 bytes
-rw-r--r--mindus/assets/blocks/power/power-node.pngbin0 -> 215 bytes
-rw-r--r--mindus/assets/blocks/power/power-source.pngbin0 -> 383 bytes
-rw-r--r--mindus/assets/blocks/power/power-void.pngbin0 -> 372 bytes
-rw-r--r--mindus/assets/blocks/power/pyrolysis-generator.pngbin0 -> 1176 bytes
-rw-r--r--mindus/assets/blocks/power/rtg-generator.pngbin0 -> 710 bytes
-rw-r--r--mindus/assets/blocks/power/solar-panel-large.pngbin0 -> 770 bytes
-rw-r--r--mindus/assets/blocks/power/solar-panel.pngbin0 -> 559 bytes
-rw-r--r--mindus/assets/blocks/power/steam-generator-liquid.pngbin0 -> 564 bytes
-rw-r--r--mindus/assets/blocks/power/steam-generator.pngbin0 -> 625 bytes
-rw-r--r--mindus/assets/blocks/power/surge-tower.png (renamed from assets/blocks/power/surge-tower.png)bin405 -> 405 bytes
-rw-r--r--mindus/assets/blocks/power/thermal-generator.pngbin0 -> 565 bytes
-rw-r--r--mindus/assets/blocks/power/thorium-reactor.pngbin0 -> 797 bytes
-rw-r--r--mindus/assets/blocks/power/turbine-condenser.pngbin0 -> 1163 bytes
-rw-r--r--mindus/assets/blocks/production/atmospheric-concentrator-bottom.pngbin0 -> 319 bytes
-rw-r--r--mindus/assets/blocks/production/atmospheric-concentrator.pngbin0 -> 864 bytes
-rw-r--r--mindus/assets/blocks/production/blast-mixer.pngbin0 -> 619 bytes
-rw-r--r--mindus/assets/blocks/production/carbide-crucible-bottom.pngbin0 -> 217 bytes
-rw-r--r--mindus/assets/blocks/production/carbide-crucible.pngbin0 -> 1119 bytes
-rw-r--r--mindus/assets/blocks/production/coal-centrifuge.pngbin0 -> 485 bytes
-rw-r--r--mindus/assets/blocks/production/cryofluid-mixer-bottom.png (renamed from assets/blocks/production/cryofluid-mixer-bottom.png)bin99 -> 99 bytes
-rw-r--r--mindus/assets/blocks/production/cryofluid-mixer.pngbin0 -> 654 bytes
-rw-r--r--mindus/assets/blocks/production/cultivator.pngbin0 -> 605 bytes
-rw-r--r--mindus/assets/blocks/production/cyanogen-synthesizer-bottom.pngbin0 -> 319 bytes
-rw-r--r--mindus/assets/blocks/production/cyanogen-synthesizer.pngbin0 -> 1096 bytes
-rw-r--r--mindus/assets/blocks/production/disassembler-bottom.pngbin0 -> 217 bytes
-rw-r--r--mindus/assets/blocks/production/disassembler.pngbin0 -> 1033 bytes
-rw-r--r--mindus/assets/blocks/production/electric-heater-top1.pngbin0 -> 355 bytes
-rw-r--r--mindus/assets/blocks/production/electric-heater-top2.pngbin0 -> 355 bytes
-rw-r--r--mindus/assets/blocks/production/electric-heater.pngbin0 -> 625 bytes
-rw-r--r--mindus/assets/blocks/production/electrolyzer-bottom.pngbin0 -> 319 bytes
-rw-r--r--mindus/assets/blocks/production/electrolyzer-hydrogen-output1.png (renamed from assets/blocks/production/electrolyzer-hydrogen-output1.png)bin446 -> 446 bytes
-rw-r--r--mindus/assets/blocks/production/electrolyzer-hydrogen-output2.png (renamed from assets/blocks/production/electrolyzer-hydrogen-output2.png)bin447 -> 447 bytes
-rw-r--r--mindus/assets/blocks/production/electrolyzer-ozone-output1.png (renamed from assets/blocks/production/electrolyzer-ozone-output1.png)bin446 -> 446 bytes
-rw-r--r--mindus/assets/blocks/production/electrolyzer-ozone-output2.png (renamed from assets/blocks/production/electrolyzer-ozone-output2.png)bin447 -> 447 bytes
-rw-r--r--mindus/assets/blocks/production/electrolyzer.pngbin0 -> 1049 bytes
-rw-r--r--mindus/assets/blocks/production/graphite-press.png (renamed from assets/blocks/production/graphite-press.png)bin653 -> 637 bytes
-rw-r--r--mindus/assets/blocks/production/heat-reactor-top1.pngbin0 -> 358 bytes
-rw-r--r--mindus/assets/blocks/production/heat-reactor-top2.pngbin0 -> 359 bytes
-rw-r--r--mindus/assets/blocks/production/heat-reactor.pngbin0 -> 897 bytes
-rw-r--r--mindus/assets/blocks/production/heat-redirector-top1.png (renamed from assets/blocks/production/heat-redirector-top1.png)bin475 -> 459 bytes
-rw-r--r--mindus/assets/blocks/production/heat-redirector-top2.pngbin0 -> 458 bytes
-rw-r--r--mindus/assets/blocks/production/heat-redirector.pngbin0 -> 929 bytes
-rw-r--r--mindus/assets/blocks/production/heat-router-top1.pngbin0 -> 305 bytes
-rw-r--r--mindus/assets/blocks/production/heat-router-top2.png (renamed from assets/blocks/production/heat-router-top2.png)bin317 -> 317 bytes
-rw-r--r--mindus/assets/blocks/production/heat-router.pngbin0 -> 939 bytes
-rw-r--r--mindus/assets/blocks/production/heat-source-top1.png (renamed from assets/blocks/production/heat-source-top1.png)bin130 -> 130 bytes
-rw-r--r--mindus/assets/blocks/production/heat-source-top2.png (renamed from assets/blocks/production/heat-source-top2.png)bin130 -> 130 bytes
-rw-r--r--mindus/assets/blocks/production/heat-source.pngbin0 -> 374 bytes
-rw-r--r--mindus/assets/blocks/production/incinerator.pngbin0 -> 183 bytes
-rw-r--r--mindus/assets/blocks/production/kiln.pngbin0 -> 598 bytes
-rw-r--r--mindus/assets/blocks/production/melter-bottom.png (renamed from assets/blocks/production/melter-bottom.png)bin96 -> 96 bytes
-rw-r--r--mindus/assets/blocks/production/melter.pngbin0 -> 299 bytes
-rw-r--r--mindus/assets/blocks/production/multi-press.pngbin0 -> 795 bytes
-rw-r--r--mindus/assets/blocks/production/oxidation-chamber-liquid.png (renamed from assets/blocks/production/oxidation-chamber-liquid.png)bin430 -> 430 bytes
-rw-r--r--mindus/assets/blocks/production/oxidation-chamber-top1.pngbin0 -> 512 bytes
-rw-r--r--mindus/assets/blocks/production/oxidation-chamber-top2.pngbin0 -> 511 bytes
-rw-r--r--mindus/assets/blocks/production/oxidation-chamber.pngbin0 -> 1096 bytes
-rw-r--r--mindus/assets/blocks/production/phase-heater-top1.pngbin0 -> 361 bytes
-rw-r--r--mindus/assets/blocks/production/phase-heater-top2.pngbin0 -> 361 bytes
-rw-r--r--mindus/assets/blocks/production/phase-heater.pngbin0 -> 604 bytes
-rw-r--r--mindus/assets/blocks/production/phase-synthesizer.pngbin0 -> 1101 bytes
-rw-r--r--mindus/assets/blocks/production/phase-weaver.pngbin0 -> 594 bytes
-rw-r--r--mindus/assets/blocks/production/plastanium-compressor.pngbin0 -> 529 bytes
-rw-r--r--mindus/assets/blocks/production/pulverizer.pngbin0 -> 219 bytes
-rw-r--r--mindus/assets/blocks/production/pyratite-mixer.pngbin0 -> 496 bytes
-rw-r--r--mindus/assets/blocks/production/separator.pngbin0 -> 547 bytes
-rw-r--r--mindus/assets/blocks/production/silicon-arc-furnace.pngbin0 -> 1218 bytes
-rw-r--r--mindus/assets/blocks/production/silicon-crucible.pngbin0 -> 921 bytes
-rw-r--r--mindus/assets/blocks/production/silicon-smelter.pngbin0 -> 588 bytes
-rw-r--r--mindus/assets/blocks/production/slag-centrifuge.pngbin0 -> 1092 bytes
-rw-r--r--mindus/assets/blocks/production/slag-heater-bottom.pngbin0 -> 217 bytes
-rw-r--r--mindus/assets/blocks/production/slag-heater-top1.png (renamed from assets/blocks/production/slag-heater-top1.png)bin305 -> 305 bytes
-rw-r--r--mindus/assets/blocks/production/slag-heater-top2.png (renamed from assets/blocks/production/slag-heater-top2.png)bin305 -> 305 bytes
-rw-r--r--mindus/assets/blocks/production/slag-heater.pngbin0 -> 976 bytes
-rw-r--r--mindus/assets/blocks/production/slag-incinerator-liquid.pngbin0 -> 111 bytes
-rw-r--r--mindus/assets/blocks/production/slag-incinerator.pngbin0 -> 334 bytes
-rw-r--r--mindus/assets/blocks/production/small-heat-redirector-top1.pngbin0 -> 231 bytes
-rw-r--r--mindus/assets/blocks/production/small-heat-redirector-top2.pngbin0 -> 232 bytes
-rw-r--r--mindus/assets/blocks/production/small-heat-redirector.pngbin0 -> 522 bytes
-rw-r--r--mindus/assets/blocks/production/spore-press.pngbin0 -> 619 bytes
-rw-r--r--mindus/assets/blocks/production/surge-crucible-bottom.pngbin0 -> 319 bytes
-rw-r--r--mindus/assets/blocks/production/surge-crucible-liquid.pngbin0 -> 163 bytes
-rw-r--r--mindus/assets/blocks/production/surge-crucible.pngbin0 -> 1066 bytes
-rw-r--r--mindus/assets/blocks/production/surge-smelter.pngbin0 -> 996 bytes
-rw-r--r--mindus/assets/blocks/storage/container-team.png (renamed from assets/blocks/storage/container-team.png)bin438 -> 438 bytes
-rw-r--r--mindus/assets/blocks/storage/container.png (renamed from assets/blocks/storage/container.png)bin486 -> 486 bytes
-rw-r--r--mindus/assets/blocks/storage/core-acropolis-team.pngbin0 -> 1837 bytes
-rw-r--r--mindus/assets/blocks/storage/core-acropolis.pngbin0 -> 2829 bytes
-rw-r--r--mindus/assets/blocks/storage/core-bastion-team.pngbin0 -> 1047 bytes
-rw-r--r--mindus/assets/blocks/storage/core-bastion.pngbin0 -> 1529 bytes
-rw-r--r--mindus/assets/blocks/storage/core-citadel-team.pngbin0 -> 1401 bytes
-rw-r--r--mindus/assets/blocks/storage/core-citadel.pngbin0 -> 2078 bytes
-rw-r--r--mindus/assets/blocks/storage/core-foundation-team.pngbin0 -> 897 bytes
-rw-r--r--mindus/assets/blocks/storage/core-foundation.pngbin0 -> 1163 bytes
-rw-r--r--mindus/assets/blocks/storage/core-nucleus-team.pngbin0 -> 1195 bytes
-rw-r--r--mindus/assets/blocks/storage/core-nucleus.png (renamed from assets/blocks/storage/core-nucleus.png)bin1520 -> 1520 bytes
-rw-r--r--mindus/assets/blocks/storage/core-shard-team.pngbin0 -> 604 bytes
-rw-r--r--mindus/assets/blocks/storage/core-shard.pngbin0 -> 766 bytes
-rw-r--r--mindus/assets/blocks/storage/reinforced-container-team.pngbin0 -> 401 bytes
-rw-r--r--mindus/assets/blocks/storage/reinforced-container.pngbin0 -> 559 bytes
-rw-r--r--mindus/assets/blocks/storage/reinforced-vault-team.png (renamed from assets/blocks/storage/reinforced-vault-team.png)bin511 -> 511 bytes
-rw-r--r--mindus/assets/blocks/storage/reinforced-vault.pngbin0 -> 864 bytes
-rw-r--r--mindus/assets/blocks/storage/unloader-center.pngbin0 -> 243 bytes
-rw-r--r--mindus/assets/blocks/storage/unloader.pngbin0 -> 226 bytes
-rw-r--r--mindus/assets/blocks/storage/vault-team.pngbin0 -> 525 bytes
-rw-r--r--mindus/assets/blocks/storage/vault.png (renamed from assets/blocks/storage/vault.png)bin771 -> 771 bytes
-rw-r--r--mindus/assets/blocks/turrets/afflict.pngbin0 -> 1801 bytes
-rw-r--r--mindus/assets/blocks/turrets/arc.pngbin0 -> 377 bytes
-rw-r--r--mindus/assets/blocks/turrets/breach.pngbin0 -> 1152 bytes
-rw-r--r--mindus/assets/blocks/turrets/cyclone.pngbin0 -> 920 bytes
-rw-r--r--mindus/assets/blocks/turrets/diffuse.pngbin0 -> 1273 bytes
-rw-r--r--mindus/assets/blocks/turrets/disperse.pngbin0 -> 1553 bytes
-rw-r--r--mindus/assets/blocks/turrets/duo.pngbin0 -> 375 bytes
-rw-r--r--mindus/assets/blocks/turrets/foreshadow.pngbin0 -> 1379 bytes
-rw-r--r--mindus/assets/blocks/turrets/fuse.pngbin0 -> 1169 bytes
-rw-r--r--mindus/assets/blocks/turrets/hail.pngbin0 -> 382 bytes
-rw-r--r--mindus/assets/blocks/turrets/lancer.pngbin0 -> 697 bytes
-rw-r--r--mindus/assets/blocks/turrets/lustre.pngbin0 -> 1629 bytes
-rw-r--r--mindus/assets/blocks/turrets/malign.pngbin0 -> 2245 bytes
-rw-r--r--mindus/assets/blocks/turrets/meltdown.pngbin0 -> 1471 bytes
-rw-r--r--mindus/assets/blocks/turrets/parallax.pngbin0 -> 659 bytes
-rw-r--r--mindus/assets/blocks/turrets/ripple.pngbin0 -> 986 bytes
-rw-r--r--mindus/assets/blocks/turrets/salvo.pngbin0 -> 657 bytes
-rw-r--r--mindus/assets/blocks/turrets/scathe.pngbin0 -> 1645 bytes
-rw-r--r--mindus/assets/blocks/turrets/scatter.pngbin0 -> 653 bytes
-rw-r--r--mindus/assets/blocks/turrets/scorch.pngbin0 -> 374 bytes
-rw-r--r--mindus/assets/blocks/turrets/segment.pngbin0 -> 635 bytes
-rw-r--r--mindus/assets/blocks/turrets/smite.pngbin0 -> 2205 bytes
-rw-r--r--mindus/assets/blocks/turrets/spectre.pngbin0 -> 1365 bytes
-rw-r--r--mindus/assets/blocks/turrets/sublimate.pngbin0 -> 1150 bytes
-rw-r--r--mindus/assets/blocks/turrets/swarmer.pngbin0 -> 641 bytes
-rw-r--r--mindus/assets/blocks/turrets/titan.pngbin0 -> 1450 bytes
-rw-r--r--mindus/assets/blocks/turrets/tsunami.pngbin0 -> 1024 bytes
-rw-r--r--mindus/assets/blocks/turrets/wave.pngbin0 -> 709 bytes
-rw-r--r--mindus/assets/blocks/units/additive-reconstructor-top.pngbin0 -> 719 bytes
-rw-r--r--mindus/assets/blocks/units/additive-reconstructor.pngbin0 -> 728 bytes
-rw-r--r--mindus/assets/blocks/units/air-factory.pngbin0 -> 746 bytes
-rw-r--r--mindus/assets/blocks/units/basic-assembler-module-side1.pngbin0 -> 547 bytes
-rw-r--r--mindus/assets/blocks/units/basic-assembler-module-side2.pngbin0 -> 587 bytes
-rw-r--r--mindus/assets/blocks/units/basic-assembler-module.pngbin0 -> 1402 bytes
-rw-r--r--mindus/assets/blocks/units/exponential-reconstructor-top.pngbin0 -> 1590 bytes
-rw-r--r--mindus/assets/blocks/units/exponential-reconstructor.pngbin0 -> 2325 bytes
-rw-r--r--mindus/assets/blocks/units/ground-factory.pngbin0 -> 746 bytes
-rw-r--r--mindus/assets/blocks/units/mech-assembler-side1.pngbin0 -> 489 bytes
-rw-r--r--mindus/assets/blocks/units/mech-assembler-side2.pngbin0 -> 492 bytes
-rw-r--r--mindus/assets/blocks/units/mech-assembler-top.pngbin0 -> 1441 bytes
-rw-r--r--mindus/assets/blocks/units/mech-assembler.pngbin0 -> 1287 bytes
-rw-r--r--mindus/assets/blocks/units/mech-fabricator-top.pngbin0 -> 770 bytes
-rw-r--r--mindus/assets/blocks/units/mech-fabricator.pngbin0 -> 854 bytes
-rw-r--r--mindus/assets/blocks/units/mech-refabricator-top.pngbin0 -> 891 bytes
-rw-r--r--mindus/assets/blocks/units/mech-refabricator.pngbin0 -> 673 bytes
-rw-r--r--mindus/assets/blocks/units/multiplicative-reconstructor-top.pngbin0 -> 1162 bytes
-rw-r--r--mindus/assets/blocks/units/multiplicative-reconstructor.pngbin0 -> 1360 bytes
-rw-r--r--mindus/assets/blocks/units/naval-factory.pngbin0 -> 746 bytes
-rw-r--r--mindus/assets/blocks/units/prime-refabricator-top.pngbin0 -> 1576 bytes
-rw-r--r--mindus/assets/blocks/units/prime-refabricator.pngbin0 -> 1356 bytes
-rw-r--r--mindus/assets/blocks/units/repair-point.pngbin0 -> 367 bytes
-rw-r--r--mindus/assets/blocks/units/repair-turret.pngbin0 -> 715 bytes
-rw-r--r--mindus/assets/blocks/units/ship-assembler-side1.pngbin0 -> 489 bytes
-rw-r--r--mindus/assets/blocks/units/ship-assembler-side2.pngbin0 -> 492 bytes
-rw-r--r--mindus/assets/blocks/units/ship-assembler-top.pngbin0 -> 1441 bytes
-rw-r--r--mindus/assets/blocks/units/ship-assembler.pngbin0 -> 1287 bytes
-rw-r--r--mindus/assets/blocks/units/ship-fabricator-top.pngbin0 -> 770 bytes
-rw-r--r--mindus/assets/blocks/units/ship-fabricator.pngbin0 -> 853 bytes
-rw-r--r--mindus/assets/blocks/units/ship-refabricator-top.pngbin0 -> 891 bytes
-rw-r--r--mindus/assets/blocks/units/ship-refabricator.pngbin0 -> 673 bytes
-rw-r--r--mindus/assets/blocks/units/tank-assembler-side1.pngbin0 -> 489 bytes
-rw-r--r--mindus/assets/blocks/units/tank-assembler-side2.pngbin0 -> 492 bytes
-rw-r--r--mindus/assets/blocks/units/tank-assembler-top.pngbin0 -> 1441 bytes
-rw-r--r--mindus/assets/blocks/units/tank-assembler.pngbin0 -> 1287 bytes
-rw-r--r--mindus/assets/blocks/units/tank-fabricator-top.pngbin0 -> 770 bytes
-rw-r--r--mindus/assets/blocks/units/tank-fabricator.pngbin0 -> 854 bytes
-rw-r--r--mindus/assets/blocks/units/tank-refabricator-top.pngbin0 -> 891 bytes
-rw-r--r--mindus/assets/blocks/units/tank-refabricator.pngbin0 -> 673 bytes
-rw-r--r--mindus/assets/blocks/units/tetrative-reconstructor-top.pngbin0 -> 2052 bytes
-rw-r--r--mindus/assets/blocks/units/tetrative-reconstructor.pngbin0 -> 3982 bytes
-rw-r--r--mindus/assets/blocks/units/unit-cargo-loader.pngbin0 -> 966 bytes
-rw-r--r--mindus/assets/blocks/units/unit-repair-tower.pngbin0 -> 689 bytes
-rw-r--r--mindus/assets/blocks/walls/beryllium-wall-large.pngbin0 -> 500 bytes
-rw-r--r--mindus/assets/blocks/walls/beryllium-wall.pngbin0 -> 175 bytes
-rw-r--r--mindus/assets/blocks/walls/blast-door-open.pngbin0 -> 486 bytes
-rw-r--r--mindus/assets/blocks/walls/blast-door.pngbin0 -> 591 bytes
-rw-r--r--mindus/assets/blocks/walls/carbide-wall-large.pngbin0 -> 498 bytes
-rw-r--r--mindus/assets/blocks/walls/carbide-wall.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/walls/copper-wall-large.png (renamed from assets/blocks/walls/copper-wall-large.png)bin448 -> 448 bytes
-rw-r--r--mindus/assets/blocks/walls/copper-wall.pngbin0 -> 157 bytes
-rw-r--r--mindus/assets/blocks/walls/door-large-open.pngbin0 -> 473 bytes
-rw-r--r--mindus/assets/blocks/walls/door-large.pngbin0 -> 418 bytes
-rw-r--r--mindus/assets/blocks/walls/door-open.pngbin0 -> 243 bytes
-rw-r--r--mindus/assets/blocks/walls/door.pngbin0 -> 213 bytes
-rw-r--r--mindus/assets/blocks/walls/phase-wall-large.pngbin0 -> 409 bytes
-rw-r--r--mindus/assets/blocks/walls/phase-wall.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/walls/plastanium-wall-large.pngbin0 -> 409 bytes
-rw-r--r--mindus/assets/blocks/walls/plastanium-wall.pngbin0 -> 173 bytes
-rw-r--r--mindus/assets/blocks/walls/reinforced-surge-wall-large.pngbin0 -> 498 bytes
-rw-r--r--mindus/assets/blocks/walls/reinforced-surge-wall.pngbin0 -> 188 bytes
-rw-r--r--mindus/assets/blocks/walls/scrap-wall-gigantic.png (renamed from assets/blocks/walls/scrap-wall-gigantic.png)bin672 -> 672 bytes
-rw-r--r--mindus/assets/blocks/walls/scrap-wall-huge.pngbin0 -> 547 bytes
-rw-r--r--mindus/assets/blocks/walls/scrap-wall-large.pngbin0 -> 358 bytes
-rw-r--r--mindus/assets/blocks/walls/scrap-wall.pngbin0 -> 207 bytes
-rw-r--r--mindus/assets/blocks/walls/shielded-wall.png (renamed from assets/blocks/walls/shielded-wall.png)bin588 -> 588 bytes
-rw-r--r--mindus/assets/blocks/walls/surge-wall-large.pngbin0 -> 537 bytes
-rw-r--r--mindus/assets/blocks/walls/surge-wall.pngbin0 -> 190 bytes
-rw-r--r--mindus/assets/blocks/walls/thorium-wall-large.png (renamed from assets/blocks/walls/thorium-wall-large.png)bin535 -> 535 bytes
-rw-r--r--mindus/assets/blocks/walls/thorium-wall.pngbin0 -> 190 bytes
-rw-r--r--mindus/assets/blocks/walls/thruster-top.pngbin0 -> 511 bytes
-rw-r--r--mindus/assets/blocks/walls/thruster.png (renamed from assets/blocks/walls/thruster.png)bin531 -> 531 bytes
-rw-r--r--mindus/assets/blocks/walls/titanium-wall-large.png (renamed from assets/blocks/walls/titanium-wall-large.png)bin448 -> 448 bytes
-rw-r--r--mindus/assets/blocks/walls/titanium-wall.pngbin0 -> 157 bytes
-rw-r--r--mindus/assets/blocks/walls/tungsten-wall-large.pngbin0 -> 500 bytes
-rw-r--r--mindus/assets/blocks/walls/tungsten-wall.pngbin0 -> 175 bytes
-rw-r--r--mindus/assets/units/aegires.pngbin0 -> 7623 bytes
-rw-r--r--mindus/assets/units/alpha.pngbin0 -> 889 bytes
-rw-r--r--mindus/assets/units/anthicus-missile.pngbin0 -> 575 bytes
-rw-r--r--mindus/assets/units/anthicus.pngbin0 -> 2700 bytes
-rw-r--r--mindus/assets/units/antumbra.pngbin0 -> 7955 bytes
-rw-r--r--mindus/assets/units/arkyid.pngbin0 -> 4028 bytes
-rw-r--r--mindus/assets/units/assembly-drone.pngbin0 -> 972 bytes
-rw-r--r--mindus/assets/units/atrax.pngbin0 -> 1593 bytes
-rw-r--r--mindus/assets/units/avert.pngbin0 -> 2079 bytes
-rw-r--r--mindus/assets/units/beta.pngbin0 -> 1173 bytes
-rw-r--r--mindus/assets/units/bryde.pngbin0 -> 3457 bytes
-rw-r--r--mindus/assets/units/cleroi.pngbin0 -> 1968 bytes
-rw-r--r--mindus/assets/units/collaris.pngbin0 -> 6204 bytes
-rw-r--r--mindus/assets/units/conquer.pngbin0 -> 8398 bytes
-rw-r--r--mindus/assets/units/corvus.pngbin0 -> 4019 bytes
-rw-r--r--mindus/assets/units/crawler.pngbin0 -> 549 bytes
-rw-r--r--mindus/assets/units/cyerce.pngbin0 -> 4018 bytes
-rw-r--r--mindus/assets/units/dagger.pngbin0 -> 781 bytes
-rw-r--r--mindus/assets/units/disrupt-missile.pngbin0 -> 840 bytes
-rw-r--r--mindus/assets/units/disrupt.pngbin0 -> 7062 bytes
-rw-r--r--mindus/assets/units/eclipse.pngbin0 -> 12373 bytes
-rw-r--r--mindus/assets/units/elude.pngbin0 -> 1197 bytes
-rw-r--r--mindus/assets/units/emanate.pngbin0 -> 1760 bytes
-rw-r--r--mindus/assets/units/evoke.pngbin0 -> 1108 bytes
-rw-r--r--mindus/assets/units/flare.pngbin0 -> 802 bytes
-rw-r--r--mindus/assets/units/fortress.pngbin0 -> 1640 bytes
-rw-r--r--mindus/assets/units/gamma.pngbin0 -> 1375 bytes
-rw-r--r--mindus/assets/units/horizon.pngbin0 -> 1282 bytes
-rw-r--r--mindus/assets/units/incite.pngbin0 -> 1465 bytes
-rw-r--r--mindus/assets/units/latum.pngbin0 -> 7320 bytes
-rw-r--r--mindus/assets/units/locus.pngbin0 -> 2344 bytes
-rw-r--r--mindus/assets/units/mace.pngbin0 -> 1148 bytes
-rw-r--r--mindus/assets/units/manifold.pngbin0 -> 1483 bytes
-rw-r--r--mindus/assets/units/mega.pngbin0 -> 2145 bytes
-rw-r--r--mindus/assets/units/merui.pngbin0 -> 1028 bytes
-rw-r--r--mindus/assets/units/minke.pngbin0 -> 2169 bytes
-rw-r--r--mindus/assets/units/mono.pngbin0 -> 783 bytes
-rw-r--r--mindus/assets/units/navanax.pngbin0 -> 13437 bytes
-rw-r--r--mindus/assets/units/nova.pngbin0 -> 1034 bytes
-rw-r--r--mindus/assets/units/obviate.pngbin0 -> 3010 bytes
-rw-r--r--mindus/assets/units/oct.pngbin0 -> 11016 bytes
-rw-r--r--mindus/assets/units/omura.pngbin0 -> 10487 bytes
-rw-r--r--mindus/assets/units/oxynoe.pngbin0 -> 2369 bytes
-rw-r--r--mindus/assets/units/poly.pngbin0 -> 1232 bytes
-rw-r--r--mindus/assets/units/precept.pngbin0 -> 4039 bytes
-rw-r--r--mindus/assets/units/pulsar.pngbin0 -> 1517 bytes
-rw-r--r--mindus/assets/units/quad.pngbin0 -> 5661 bytes
-rw-r--r--mindus/assets/units/quasar.pngbin0 -> 1982 bytes
-rw-r--r--mindus/assets/units/quell-missile.pngbin0 -> 723 bytes
-rw-r--r--mindus/assets/units/quell.pngbin0 -> 4089 bytes
-rw-r--r--mindus/assets/units/reign.pngbin0 -> 4992 bytes
-rw-r--r--mindus/assets/units/renale.pngbin0 -> 993 bytes
-rw-r--r--mindus/assets/units/retusa.pngbin0 -> 1509 bytes
-rw-r--r--mindus/assets/units/risso.pngbin0 -> 1602 bytes
-rw-r--r--mindus/assets/units/scathe-missile.pngbin0 -> 1184 bytes
-rw-r--r--mindus/assets/units/scepter.pngbin0 -> 4260 bytes
-rw-r--r--mindus/assets/units/sei.pngbin0 -> 6565 bytes
-rw-r--r--mindus/assets/units/spiroct.pngbin0 -> 2256 bytes
-rw-r--r--mindus/assets/units/stell.pngbin0 -> 1516 bytes
-rw-r--r--mindus/assets/units/tecta.pngbin0 -> 4429 bytes
-rw-r--r--mindus/assets/units/toxopid.pngbin0 -> 5412 bytes
-rw-r--r--mindus/assets/units/vanquish.pngbin0 -> 4996 bytes
-rw-r--r--mindus/assets/units/vela.pngbin0 -> 3390 bytes
-rw-r--r--mindus/assets/units/zenith.pngbin0 -> 3066 bytes
-rw-r--r--mindus/build.rs187
-rw-r--r--mindus/items.py (renamed from items.py)0
-rw-r--r--mindus/res/team_names.txt (renamed from res/team_names.txt)0
-rw-r--r--mindus/src/block/campaign.rs90
-rw-r--r--mindus/src/block/content.rs455
-rw-r--r--mindus/src/block/defense.rs20
-rw-r--r--mindus/src/block/distribution.rs (renamed from src/block/distribution.rs)132
-rw-r--r--mindus/src/block/drills.rs31
-rw-r--r--mindus/src/block/liquid.rs128
-rw-r--r--mindus/src/block/logic.rs (renamed from src/block/logic.rs)180
-rw-r--r--mindus/src/block/mod.rs1094
-rw-r--r--mindus/src/block/payload.rs272
-rw-r--r--mindus/src/block/power.rs213
-rw-r--r--mindus/src/block/production.rs98
-rw-r--r--mindus/src/block/ratios.rs266
-rw-r--r--mindus/src/block/simple.rs (renamed from src/block/simple.rs)26
-rw-r--r--mindus/src/block/turrets.rs49
-rw-r--r--mindus/src/block/units.rs341
-rw-r--r--mindus/src/block/walls.rs80
-rw-r--r--mindus/src/block/x.rs18
-rw-r--r--mindus/src/color_mapped390
-rw-r--r--mindus/src/color_mapping.rs3
-rw-r--r--mindus/src/colorsbin0 -> 768 bytes
-rw-r--r--mindus/src/content.rs210
-rw-r--r--mindus/src/data/autotile.rs (renamed from src/data/autotile.rs)90
-rw-r--r--mindus/src/data/base64.rs (renamed from src/data/base64.rs)2
-rw-r--r--mindus/src/data/command.rs7
-rw-r--r--mindus/src/data/dynamic.rs (renamed from src/data/dynamic.rs)135
-rw-r--r--mindus/src/data/entity_mapping.rs31
-rw-r--r--mindus/src/data/map.rs1024
-rw-r--r--mindus/src/data/mod.rs499
-rw-r--r--mindus/src/data/planet.rs (renamed from src/data/planet.rs)0
-rw-r--r--mindus/src/data/renderer.rs862
-rw-r--r--mindus/src/data/schematic.rs (renamed from src/data/schematic.rs)274
-rw-r--r--mindus/src/data/sector.rs (renamed from src/data/sector.rs)0
-rw-r--r--mindus/src/data/weather.rs (renamed from src/data/weather.rs)0
-rw-r--r--mindus/src/exe/draw.rs41
-rw-r--r--mindus/src/exe/map.rs32
-rw-r--r--mindus/src/exe/mod.rs (renamed from src/exe/mod.rs)0
-rw-r--r--mindus/src/fluid.rs (renamed from src/fluid/mod.rs)0
-rw-r--r--mindus/src/item/mod.rs (renamed from src/item/mod.rs)0
-rw-r--r--mindus/src/item/storage.rs442
-rw-r--r--mindus/src/lib.rs37
-rw-r--r--mindus/src/modifier.rs (renamed from src/modifier.rs)6
-rw-r--r--mindus/src/team.rs (renamed from src/team.rs)40
-rw-r--r--mindus/src/unit.rs429
-rw-r--r--mindus/src/utils/array.rs (renamed from src/utils/array.rs)2
-rw-r--r--mindus/src/utils/image/holder.rs48
-rw-r--r--mindus/src/utils/image/mod.rs72
-rw-r--r--mindus/src/utils/mod.rs3
-rw-r--r--p2s/.gitignore1
-rw-r--r--p2s/Cargo.toml11
-rw-r--r--p2s/README.md4
-rw-r--r--p2s/src/main.rs101
-rw-r--r--src/block/campaign.rs7
-rw-r--r--src/block/content.rs420
-rw-r--r--src/block/defense.rs37
-rw-r--r--src/block/drills.rs44
-rw-r--r--src/block/environment.rs192
-rw-r--r--src/block/liquid.rs158
-rw-r--r--src/block/mod.rs642
-rw-r--r--src/block/payload.rs324
-rw-r--r--src/block/power.rs251
-rw-r--r--src/block/production.rs120
-rw-r--r--src/block/storage.rs16
-rw-r--r--src/block/turrets.rs82
-rw-r--r--src/block/units.rs380
-rw-r--r--src/block/walls.rs118
-rw-r--r--src/content.rs179
-rw-r--r--src/data/command.rs7
-rw-r--r--src/data/map.rs696
-rw-r--r--src/data/mod.rs530
-rw-r--r--src/data/renderer.rs296
-rw-r--r--src/exe/draw.rs24
-rw-r--r--src/exe/map.rs48
-rw-r--r--src/item/storage.rs425
-rw-r--r--src/lib.rs32
-rw-r--r--src/logic/mod.rs76
-rw-r--r--src/registry.rs51
-rw-r--r--src/unit/mod.rs75
-rw-r--r--src/utils/image.rs728
-rw-r--r--src/utils/mod.rs3
3112 files changed, 12239 insertions, 6608 deletions
diff --git a/.github/example.png b/.github/example.png
index 2197fd0..d19d4d5 100644
--- a/.github/example.png
+++ b/.github/example.png
Binary files differ
diff --git a/.gitignore b/.gitignore
index 43a3eb2..e4a6c59 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
# rustc/cargo outputs
-/Cargo.lock
-/target
+Cargo.lock
+target
+rustc-ice-*.txt
# Visual Studio Code
/.vscode
diff --git a/Cargo.toml b/Cargo.toml
index 6a873c1..69ed9e4 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,43 +1,6 @@
-[package]
-name = "mindus"
-version = "4.0.3"
-edition = "2021"
-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"
-license = "GPL-3.0"
-exclude = [".github/", "items.py"]
-
-[dependencies]
-flate2 = { version = "1.0", features = ["zlib"], default-features = false }
-base64 = "0.21"
-paste = "1.0"
-strconv = "0.1"
-image = { version = "0.24", features = [], default-features = false, optional = true }
-color-hex = "0.2"
-thiserror = "1.0"
-bobbin-bits = "0.1"
-blurslice = { version = "0.1" }
-enum_dispatch = "0.3"
-fast_image_resize = "2.7.3"
-rayon = "1.7.0"
-
-[features]
-bin = ["image/png"]
-default = ["bin"]
-
-[build-dependencies]
-image = { version = "0.24", features = ["png"], default-features = false }
-walkdir = "2"
-
-[[bin]]
-name = "mindus"
-doc = false
-required-features = ["bin"]
-path = "src/exe/mod.rs"
+[workspace]
+members = ["mindus", "lemu", "p2s"]
+resolver = "2"
[profile.release]
debug = 2
@@ -50,6 +13,3 @@ opt-level = 3
[profile.release.build-override]
opt-level = 3
-
-[dev-dependencies]
-diff = "0.1"
diff --git a/README.md b/README.md
index 9aa8287..f08c5b1 100644
--- a/README.md
+++ b/README.md
@@ -1,20 +1,4 @@
# mindus
-![msrv](https://img.shields.io/badge/msrv-nightly-blue?style=for-the-badge&logo=rust)
-
-Mindus is a library for working with [Mindustry](https://github.com/Anuken/Mindustry) formats.
-
-## Usage
-
-```rs
-use mindus::*;
-let reg = build_registry();
-let mut ss = SchematicSerializer(&reg);
-let s = ss.deserialize_base64("bXNjaAF4nD3SQW6DMBBA0bE94wF104vkDr1H1QVtWUQioTL0/oFJ/Fl9GXiy5ZFBhiJ6n26zvE9tv7T1f5/bZbtNyyJvv/P2065/+3W9i0hdpu952SR/fiWp29qOL4/lDzkfExkiEpWPGqMKpZRRlT/8VQkv4aXwnlUopYw6vRTVvRzeGJVYy1ShlDKqezk8O8+DV/AKXgkvRSllvK2sdU/xFE/xFE/xFE/xNLzxeRlU9wzPOK9xXsMzPMOr3EcNL0VlqlBKGVWpfh+O5+zPmRdnXpx5cebFmRd/eQ9KIReL")?;
-let output = s.render();
-output.save("output.png");
-```
-
-This produces:
-
-![image](https://raw.githubusercontent.com/bend-n/mindus/master/.github/example.png)
+- see the [mindus](mindus/) folder for schematic and map rendering and deserializing
+- see the [lemu](lemu/) folder for mlog execution \ No newline at end of file
diff --git a/assets/blocks/campaign/interplanetary-accelerator.png b/assets/blocks/campaign/interplanetary-accelerator.png
deleted file mode 100644
index 78f302b..0000000
--- a/assets/blocks/campaign/interplanetary-accelerator.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/campaign/launchpod.png b/assets/blocks/campaign/launchpod.png
deleted file mode 100644
index 1697897..0000000
--- a/assets/blocks/campaign/launchpod.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/defense/barrier-projector-team.png b/assets/blocks/defense/barrier-projector-team.png
deleted file mode 100644
index 9c0d534..0000000
--- a/assets/blocks/defense/barrier-projector-team.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/defense/barrier-projector.png b/assets/blocks/defense/barrier-projector.png
deleted file mode 100644
index 0b72218..0000000
--- a/assets/blocks/defense/barrier-projector.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/defense/build-tower.png b/assets/blocks/defense/build-tower.png
deleted file mode 100644
index cec7847..0000000
--- a/assets/blocks/defense/build-tower.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/defense/force-projector.png b/assets/blocks/defense/force-projector.png
deleted file mode 100644
index 72bd63e..0000000
--- a/assets/blocks/defense/force-projector.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/defense/large-shield-projector-team.png b/assets/blocks/defense/large-shield-projector-team.png
deleted file mode 100644
index b43d7d5..0000000
--- a/assets/blocks/defense/large-shield-projector-team.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/defense/large-shield-projector.png b/assets/blocks/defense/large-shield-projector.png
deleted file mode 100644
index ec01b32..0000000
--- a/assets/blocks/defense/large-shield-projector.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/defense/mend-projector.png b/assets/blocks/defense/mend-projector.png
deleted file mode 100644
index 0b70091..0000000
--- a/assets/blocks/defense/mend-projector.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/defense/mender.png b/assets/blocks/defense/mender.png
deleted file mode 100644
index 669378b..0000000
--- a/assets/blocks/defense/mender.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/defense/overdrive-dome.png b/assets/blocks/defense/overdrive-dome.png
deleted file mode 100644
index c52221e..0000000
--- a/assets/blocks/defense/overdrive-dome.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/defense/overdrive-projector.png b/assets/blocks/defense/overdrive-projector.png
deleted file mode 100644
index 55fb163..0000000
--- a/assets/blocks/defense/overdrive-projector.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/defense/regen-projector.png b/assets/blocks/defense/regen-projector.png
deleted file mode 100644
index 7bc0fd4..0000000
--- a/assets/blocks/defense/regen-projector.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/defense/shield-projector.png b/assets/blocks/defense/shield-projector.png
deleted file mode 100644
index 43717ca..0000000
--- a/assets/blocks/defense/shield-projector.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/defense/shock-mine-team-top.png b/assets/blocks/defense/shock-mine-team-top.png
deleted file mode 100644
index 4ee60bc..0000000
--- a/assets/blocks/defense/shock-mine-team-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/defense/shockwave-tower.png b/assets/blocks/defense/shockwave-tower.png
deleted file mode 100644
index f6780d8..0000000
--- a/assets/blocks/defense/shockwave-tower.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/bridge-arrow.png b/assets/blocks/distribution/bridge-arrow.png
deleted file mode 100644
index e6c8859..0000000
--- a/assets/blocks/distribution/bridge-arrow.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/bridge-conveyor-arrow.png b/assets/blocks/distribution/bridge-conveyor-arrow.png
deleted file mode 100644
index b8b62bc..0000000
--- a/assets/blocks/distribution/bridge-conveyor-arrow.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/bridge-conveyor-bridge.png b/assets/blocks/distribution/bridge-conveyor-bridge.png
deleted file mode 100644
index 947e48d..0000000
--- a/assets/blocks/distribution/bridge-conveyor-bridge.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/bridge-conveyor-end.png b/assets/blocks/distribution/bridge-conveyor-end.png
deleted file mode 100644
index 48d3f85..0000000
--- a/assets/blocks/distribution/bridge-conveyor-end.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/bridge-conveyor.png b/assets/blocks/distribution/bridge-conveyor.png
deleted file mode 100644
index 608ce88..0000000
--- a/assets/blocks/distribution/bridge-conveyor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/center.png b/assets/blocks/distribution/center.png
deleted file mode 100644
index 19def6b..0000000
--- a/assets/blocks/distribution/center.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-0-0.png b/assets/blocks/distribution/conveyors/armored-conveyor-0-0.png
deleted file mode 100644
index 9becfdf..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-0-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-0-1.png b/assets/blocks/distribution/conveyors/armored-conveyor-0-1.png
deleted file mode 100644
index 4685ab6..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-0-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-0-2.png b/assets/blocks/distribution/conveyors/armored-conveyor-0-2.png
deleted file mode 100644
index f10b176..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-0-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-0-3.png b/assets/blocks/distribution/conveyors/armored-conveyor-0-3.png
deleted file mode 100644
index 9c002ed..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-0-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-1-0-h.png b/assets/blocks/distribution/conveyors/armored-conveyor-1-0-h.png
deleted file mode 100644
index 25835e4..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-1-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-1-0.png b/assets/blocks/distribution/conveyors/armored-conveyor-1-0.png
deleted file mode 100644
index 21ed583..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-1-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-1-1-h.png b/assets/blocks/distribution/conveyors/armored-conveyor-1-1-h.png
deleted file mode 100644
index f7c2705..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-1-1-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-1-1-v.png b/assets/blocks/distribution/conveyors/armored-conveyor-1-1-v.png
deleted file mode 100644
index c31f105..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-1-1-v.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-1-1.png b/assets/blocks/distribution/conveyors/armored-conveyor-1-1.png
deleted file mode 100644
index be087fa..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-1-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-1-2.png b/assets/blocks/distribution/conveyors/armored-conveyor-1-2.png
deleted file mode 100644
index 5c7a30a..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-1-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-1-3.png b/assets/blocks/distribution/conveyors/armored-conveyor-1-3.png
deleted file mode 100644
index 32bf421..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-1-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-2-0-h.png b/assets/blocks/distribution/conveyors/armored-conveyor-2-0-h.png
deleted file mode 100644
index f2c6105..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-2-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-2-0-v.png b/assets/blocks/distribution/conveyors/armored-conveyor-2-0-v.png
deleted file mode 100644
index 04e8329..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-2-0-v.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-2-0.png b/assets/blocks/distribution/conveyors/armored-conveyor-2-0.png
deleted file mode 100644
index 72eba5c..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-2-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-2-1-h.png b/assets/blocks/distribution/conveyors/armored-conveyor-2-1-h.png
deleted file mode 100644
index def3ab3..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-2-1-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-2-1.png b/assets/blocks/distribution/conveyors/armored-conveyor-2-1.png
deleted file mode 100644
index efc9937..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-2-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-2-2.png b/assets/blocks/distribution/conveyors/armored-conveyor-2-2.png
deleted file mode 100644
index 7a70978..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-2-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-2-3-h.png b/assets/blocks/distribution/conveyors/armored-conveyor-2-3-h.png
deleted file mode 100644
index b491de9..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-2-3-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-2-3.png b/assets/blocks/distribution/conveyors/armored-conveyor-2-3.png
deleted file mode 100644
index 5e846e8..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-2-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-3-0-h.png b/assets/blocks/distribution/conveyors/armored-conveyor-3-0-h.png
deleted file mode 100644
index a5692f9..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-3-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-3-0.png b/assets/blocks/distribution/conveyors/armored-conveyor-3-0.png
deleted file mode 100644
index 7754791..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-3-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-3-1.png b/assets/blocks/distribution/conveyors/armored-conveyor-3-1.png
deleted file mode 100644
index 7b72bf6..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-3-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-3-3.png b/assets/blocks/distribution/conveyors/armored-conveyor-3-3.png
deleted file mode 100644
index ce0d878..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-3-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-4-0.png b/assets/blocks/distribution/conveyors/armored-conveyor-4-0.png
deleted file mode 100644
index 741bfdb..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-4-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-4-1.png b/assets/blocks/distribution/conveyors/armored-conveyor-4-1.png
deleted file mode 100644
index d4893ef..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-4-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/armored-conveyor-4-3.png b/assets/blocks/distribution/conveyors/armored-conveyor-4-3.png
deleted file mode 100644
index e0539ef..0000000
--- a/assets/blocks/distribution/conveyors/armored-conveyor-4-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-0-0.png b/assets/blocks/distribution/conveyors/conveyor-0-0.png
deleted file mode 100644
index 4de81c8..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-0-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-0-1.png b/assets/blocks/distribution/conveyors/conveyor-0-1.png
deleted file mode 100644
index e83ade5..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-0-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-0-2.png b/assets/blocks/distribution/conveyors/conveyor-0-2.png
deleted file mode 100644
index 3855016..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-0-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-0-3.png b/assets/blocks/distribution/conveyors/conveyor-0-3.png
deleted file mode 100644
index 5d0b247..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-0-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-1-0-h.png b/assets/blocks/distribution/conveyors/conveyor-1-0-h.png
deleted file mode 100644
index 75b477d..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-1-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-1-0.png b/assets/blocks/distribution/conveyors/conveyor-1-0.png
deleted file mode 100644
index a8cfa5d..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-1-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-1-1-h.png b/assets/blocks/distribution/conveyors/conveyor-1-1-h.png
deleted file mode 100644
index 8e6eb5f..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-1-1-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-1-1-v.png b/assets/blocks/distribution/conveyors/conveyor-1-1-v.png
deleted file mode 100644
index d78d194..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-1-1-v.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-1-1.png b/assets/blocks/distribution/conveyors/conveyor-1-1.png
deleted file mode 100644
index 90220b5..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-1-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-1-2.png b/assets/blocks/distribution/conveyors/conveyor-1-2.png
deleted file mode 100644
index 923223b..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-1-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-2-0-h.png b/assets/blocks/distribution/conveyors/conveyor-2-0-h.png
deleted file mode 100644
index 6649a28..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-2-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-2-0-v.png b/assets/blocks/distribution/conveyors/conveyor-2-0-v.png
deleted file mode 100644
index 4a266b0..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-2-0-v.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-2-0.png b/assets/blocks/distribution/conveyors/conveyor-2-0.png
deleted file mode 100644
index 5d9eb5e..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-2-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-2-1-h.png b/assets/blocks/distribution/conveyors/conveyor-2-1-h.png
deleted file mode 100644
index 7e8d16f..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-2-1-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-2-1.png b/assets/blocks/distribution/conveyors/conveyor-2-1.png
deleted file mode 100644
index 798f6a6..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-2-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-2-2.png b/assets/blocks/distribution/conveyors/conveyor-2-2.png
deleted file mode 100644
index 14a9d78..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-2-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-2-3-h.png b/assets/blocks/distribution/conveyors/conveyor-2-3-h.png
deleted file mode 100644
index 07176a5..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-2-3-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-2-3.png b/assets/blocks/distribution/conveyors/conveyor-2-3.png
deleted file mode 100644
index abcbebc..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-2-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-3-0-h.png b/assets/blocks/distribution/conveyors/conveyor-3-0-h.png
deleted file mode 100644
index 0ca52ba..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-3-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-3-0.png b/assets/blocks/distribution/conveyors/conveyor-3-0.png
deleted file mode 100644
index 6e38bc2..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-3-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-3-1.png b/assets/blocks/distribution/conveyors/conveyor-3-1.png
deleted file mode 100644
index ebfd3ee..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-3-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-3-3.png b/assets/blocks/distribution/conveyors/conveyor-3-3.png
deleted file mode 100644
index 4abdb24..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-3-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-4-1.png b/assets/blocks/distribution/conveyors/conveyor-4-1.png
deleted file mode 100644
index cf0ba78..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-4-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-4-3.png b/assets/blocks/distribution/conveyors/conveyor-4-3.png
deleted file mode 100644
index 84cbd2d..0000000
--- a/assets/blocks/distribution/conveyors/conveyor-4-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-0-0.png b/assets/blocks/distribution/conveyors/titanium-conveyor-0-0.png
deleted file mode 100644
index bb2b4b2..0000000
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-0-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-0-1.png b/assets/blocks/distribution/conveyors/titanium-conveyor-0-1.png
deleted file mode 100644
index bd17828..0000000
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-0-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-0-2.png b/assets/blocks/distribution/conveyors/titanium-conveyor-0-2.png
deleted file mode 100644
index 3de01c0..0000000
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-0-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-0-3.png b/assets/blocks/distribution/conveyors/titanium-conveyor-0-3.png
deleted file mode 100644
index 5073271..0000000
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-0-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-1-0.png b/assets/blocks/distribution/conveyors/titanium-conveyor-1-0.png
deleted file mode 100644
index 749b079..0000000
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-1-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-1-1-v.png b/assets/blocks/distribution/conveyors/titanium-conveyor-1-1-v.png
deleted file mode 100644
index bc8ed5e..0000000
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-1-1-v.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-1-2.png b/assets/blocks/distribution/conveyors/titanium-conveyor-1-2.png
deleted file mode 100644
index 368e08f..0000000
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-1-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-1-3.png b/assets/blocks/distribution/conveyors/titanium-conveyor-1-3.png
deleted file mode 100644
index d17a367..0000000
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-1-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-2-0-h.png b/assets/blocks/distribution/conveyors/titanium-conveyor-2-0-h.png
deleted file mode 100644
index 3775277..0000000
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-2-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-2-0-v.png b/assets/blocks/distribution/conveyors/titanium-conveyor-2-0-v.png
deleted file mode 100644
index fd4c2fb..0000000
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-2-0-v.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-2-0.png b/assets/blocks/distribution/conveyors/titanium-conveyor-2-0.png
deleted file mode 100644
index f5ba433..0000000
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-2-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-2-2.png b/assets/blocks/distribution/conveyors/titanium-conveyor-2-2.png
deleted file mode 100644
index 39379a8..0000000
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-2-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-2-3.png b/assets/blocks/distribution/conveyors/titanium-conveyor-2-3.png
deleted file mode 100644
index 546bd31..0000000
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-2-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-3-0-h.png b/assets/blocks/distribution/conveyors/titanium-conveyor-3-0-h.png
deleted file mode 100644
index 09f7114..0000000
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-3-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-3-0.png b/assets/blocks/distribution/conveyors/titanium-conveyor-3-0.png
deleted file mode 100644
index 24525f2..0000000
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-3-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-3-1.png b/assets/blocks/distribution/conveyors/titanium-conveyor-3-1.png
deleted file mode 100644
index 2ef4cdf..0000000
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-3-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-3-3.png b/assets/blocks/distribution/conveyors/titanium-conveyor-3-3.png
deleted file mode 100644
index 4877112..0000000
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-3-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-4-1.png b/assets/blocks/distribution/conveyors/titanium-conveyor-4-1.png
deleted file mode 100644
index e2b9517..0000000
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-4-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-4-3.png b/assets/blocks/distribution/conveyors/titanium-conveyor-4-3.png
deleted file mode 100644
index 2a1ca44..0000000
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-4-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-0-0.png b/assets/blocks/distribution/ducts/armored-duct-0-0.png
deleted file mode 100644
index 7cdf0be..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-0-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-0-1.png b/assets/blocks/distribution/ducts/armored-duct-0-1.png
deleted file mode 100644
index 9a5cd4d..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-0-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-0-2.png b/assets/blocks/distribution/ducts/armored-duct-0-2.png
deleted file mode 100644
index 793a84b..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-0-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-0-3.png b/assets/blocks/distribution/ducts/armored-duct-0-3.png
deleted file mode 100644
index 94aca00..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-0-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-1-0-h.png b/assets/blocks/distribution/ducts/armored-duct-1-0-h.png
deleted file mode 100644
index d9a6ca8..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-1-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-1-0.png b/assets/blocks/distribution/ducts/armored-duct-1-0.png
deleted file mode 100644
index 4c02046..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-1-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-1-1-h.png b/assets/blocks/distribution/ducts/armored-duct-1-1-h.png
deleted file mode 100644
index 220ea63..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-1-1-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-1-1-v.png b/assets/blocks/distribution/ducts/armored-duct-1-1-v.png
deleted file mode 100644
index 107e5e1..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-1-1-v.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-1-1.png b/assets/blocks/distribution/ducts/armored-duct-1-1.png
deleted file mode 100644
index ba68180..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-1-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-1-2.png b/assets/blocks/distribution/ducts/armored-duct-1-2.png
deleted file mode 100644
index 102b6c4..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-1-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-1-3.png b/assets/blocks/distribution/ducts/armored-duct-1-3.png
deleted file mode 100644
index d5c7688..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-1-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-2-0-h.png b/assets/blocks/distribution/ducts/armored-duct-2-0-h.png
deleted file mode 100644
index e2b75b7..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-2-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-2-0-v.png b/assets/blocks/distribution/ducts/armored-duct-2-0-v.png
deleted file mode 100644
index 51690bf..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-2-0-v.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-2-0.png b/assets/blocks/distribution/ducts/armored-duct-2-0.png
deleted file mode 100644
index fd0c731..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-2-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-2-1-h.png b/assets/blocks/distribution/ducts/armored-duct-2-1-h.png
deleted file mode 100644
index 209c984..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-2-1-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-2-1.png b/assets/blocks/distribution/ducts/armored-duct-2-1.png
deleted file mode 100644
index ab5b160..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-2-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-2-2.png b/assets/blocks/distribution/ducts/armored-duct-2-2.png
deleted file mode 100644
index 3a1d156..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-2-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-2-3-h.png b/assets/blocks/distribution/ducts/armored-duct-2-3-h.png
deleted file mode 100644
index 018ebc1..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-2-3-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-2-3.png b/assets/blocks/distribution/ducts/armored-duct-2-3.png
deleted file mode 100644
index ee904a0..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-2-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-3-0-h.png b/assets/blocks/distribution/ducts/armored-duct-3-0-h.png
deleted file mode 100644
index 0a384b3..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-3-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-3-0.png b/assets/blocks/distribution/ducts/armored-duct-3-0.png
deleted file mode 100644
index 9371f1c..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-3-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-3-1.png b/assets/blocks/distribution/ducts/armored-duct-3-1.png
deleted file mode 100644
index 2a82680..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-3-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-3-3.png b/assets/blocks/distribution/ducts/armored-duct-3-3.png
deleted file mode 100644
index d4ef678..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-3-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-4-1.png b/assets/blocks/distribution/ducts/armored-duct-4-1.png
deleted file mode 100644
index 44f767f..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-4-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-4-3.png b/assets/blocks/distribution/ducts/armored-duct-4-3.png
deleted file mode 100644
index 4024c61..0000000
--- a/assets/blocks/distribution/ducts/armored-duct-4-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-0-0.png b/assets/blocks/distribution/ducts/duct-0-0.png
deleted file mode 100644
index 3cec9b5..0000000
--- a/assets/blocks/distribution/ducts/duct-0-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-0-1.png b/assets/blocks/distribution/ducts/duct-0-1.png
deleted file mode 100644
index 2db5439..0000000
--- a/assets/blocks/distribution/ducts/duct-0-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-0-2.png b/assets/blocks/distribution/ducts/duct-0-2.png
deleted file mode 100644
index 6dac9e5..0000000
--- a/assets/blocks/distribution/ducts/duct-0-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-0-3.png b/assets/blocks/distribution/ducts/duct-0-3.png
deleted file mode 100644
index e25d7bb..0000000
--- a/assets/blocks/distribution/ducts/duct-0-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-1-0-h.png b/assets/blocks/distribution/ducts/duct-1-0-h.png
deleted file mode 100644
index 11e4482..0000000
--- a/assets/blocks/distribution/ducts/duct-1-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-1-0.png b/assets/blocks/distribution/ducts/duct-1-0.png
deleted file mode 100644
index 6adcdeb..0000000
--- a/assets/blocks/distribution/ducts/duct-1-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-1-1-h.png b/assets/blocks/distribution/ducts/duct-1-1-h.png
deleted file mode 100644
index 1461ef0..0000000
--- a/assets/blocks/distribution/ducts/duct-1-1-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-1-1-v.png b/assets/blocks/distribution/ducts/duct-1-1-v.png
deleted file mode 100644
index 50bdb4f..0000000
--- a/assets/blocks/distribution/ducts/duct-1-1-v.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-1-1.png b/assets/blocks/distribution/ducts/duct-1-1.png
deleted file mode 100644
index 093189f..0000000
--- a/assets/blocks/distribution/ducts/duct-1-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-1-2.png b/assets/blocks/distribution/ducts/duct-1-2.png
deleted file mode 100644
index 5b7aae2..0000000
--- a/assets/blocks/distribution/ducts/duct-1-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-1-3.png b/assets/blocks/distribution/ducts/duct-1-3.png
deleted file mode 100644
index cb72859..0000000
--- a/assets/blocks/distribution/ducts/duct-1-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-2-0-h.png b/assets/blocks/distribution/ducts/duct-2-0-h.png
deleted file mode 100644
index 4ddb3d1..0000000
--- a/assets/blocks/distribution/ducts/duct-2-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-2-0-v.png b/assets/blocks/distribution/ducts/duct-2-0-v.png
deleted file mode 100644
index f841ec1..0000000
--- a/assets/blocks/distribution/ducts/duct-2-0-v.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-2-0.png b/assets/blocks/distribution/ducts/duct-2-0.png
deleted file mode 100644
index c0afcfb..0000000
--- a/assets/blocks/distribution/ducts/duct-2-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-2-1-h.png b/assets/blocks/distribution/ducts/duct-2-1-h.png
deleted file mode 100644
index b40e77e..0000000
--- a/assets/blocks/distribution/ducts/duct-2-1-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-2-1.png b/assets/blocks/distribution/ducts/duct-2-1.png
deleted file mode 100644
index 09eb774..0000000
--- a/assets/blocks/distribution/ducts/duct-2-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-2-2.png b/assets/blocks/distribution/ducts/duct-2-2.png
deleted file mode 100644
index 4da21f8..0000000
--- a/assets/blocks/distribution/ducts/duct-2-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-2-3-h.png b/assets/blocks/distribution/ducts/duct-2-3-h.png
deleted file mode 100644
index 1506bac..0000000
--- a/assets/blocks/distribution/ducts/duct-2-3-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-2-3.png b/assets/blocks/distribution/ducts/duct-2-3.png
deleted file mode 100644
index 0dd6aa3..0000000
--- a/assets/blocks/distribution/ducts/duct-2-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-3-0-h.png b/assets/blocks/distribution/ducts/duct-3-0-h.png
deleted file mode 100644
index 4b51f6d..0000000
--- a/assets/blocks/distribution/ducts/duct-3-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-3-0.png b/assets/blocks/distribution/ducts/duct-3-0.png
deleted file mode 100644
index d1a331c..0000000
--- a/assets/blocks/distribution/ducts/duct-3-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-3-1.png b/assets/blocks/distribution/ducts/duct-3-1.png
deleted file mode 100644
index 6b20424..0000000
--- a/assets/blocks/distribution/ducts/duct-3-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-3-3.png b/assets/blocks/distribution/ducts/duct-3-3.png
deleted file mode 100644
index e457a4c..0000000
--- a/assets/blocks/distribution/ducts/duct-3-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-4-0.png b/assets/blocks/distribution/ducts/duct-4-0.png
deleted file mode 100644
index d490c36..0000000
--- a/assets/blocks/distribution/ducts/duct-4-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-4-1.png b/assets/blocks/distribution/ducts/duct-4-1.png
deleted file mode 100644
index ea57f4a..0000000
--- a/assets/blocks/distribution/ducts/duct-4-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-4-3.png b/assets/blocks/distribution/ducts/duct-4-3.png
deleted file mode 100644
index 50eef92..0000000
--- a/assets/blocks/distribution/ducts/duct-4-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-base.png b/assets/blocks/distribution/ducts/duct-base.png
deleted file mode 100644
index 6aa0df3..0000000
--- a/assets/blocks/distribution/ducts/duct-base.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-bridge-arrow.png b/assets/blocks/distribution/ducts/duct-bridge-arrow.png
deleted file mode 100644
index a00c8e9..0000000
--- a/assets/blocks/distribution/ducts/duct-bridge-arrow.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-bridge-bridge-bottom.png b/assets/blocks/distribution/ducts/duct-bridge-bridge-bottom.png
deleted file mode 100644
index 1625679..0000000
--- a/assets/blocks/distribution/ducts/duct-bridge-bridge-bottom.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-bridge-bridge.png b/assets/blocks/distribution/ducts/duct-bridge-bridge.png
deleted file mode 100644
index 533f3c3..0000000
--- a/assets/blocks/distribution/ducts/duct-bridge-bridge.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-bridge-dir.png b/assets/blocks/distribution/ducts/duct-bridge-dir.png
deleted file mode 100644
index edca5f1..0000000
--- a/assets/blocks/distribution/ducts/duct-bridge-dir.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-bridge.png b/assets/blocks/distribution/ducts/duct-bridge.png
deleted file mode 100644
index 2448bc8..0000000
--- a/assets/blocks/distribution/ducts/duct-bridge.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-router.png b/assets/blocks/distribution/ducts/duct-router.png
deleted file mode 100644
index 2448bc8..0000000
--- a/assets/blocks/distribution/ducts/duct-router.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-unloader-top.png b/assets/blocks/distribution/ducts/duct-unloader-top.png
deleted file mode 100644
index 781bea4..0000000
--- a/assets/blocks/distribution/ducts/duct-unloader-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/duct-unloader.png b/assets/blocks/distribution/ducts/duct-unloader.png
deleted file mode 100644
index b9ba79c..0000000
--- a/assets/blocks/distribution/ducts/duct-unloader.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/surge-router.png b/assets/blocks/distribution/ducts/surge-router.png
deleted file mode 100644
index c1cf722..0000000
--- a/assets/blocks/distribution/ducts/surge-router.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/ducts/top.png b/assets/blocks/distribution/ducts/top.png
deleted file mode 100644
index c7f9cd6..0000000
--- a/assets/blocks/distribution/ducts/top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/inverted-sorter.png b/assets/blocks/distribution/inverted-sorter.png
deleted file mode 100644
index 2a75d17..0000000
--- a/assets/blocks/distribution/inverted-sorter.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/item-source.png b/assets/blocks/distribution/item-source.png
deleted file mode 100644
index d38ce01..0000000
--- a/assets/blocks/distribution/item-source.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/item-void.png b/assets/blocks/distribution/item-void.png
deleted file mode 100644
index 0ef9612..0000000
--- a/assets/blocks/distribution/item-void.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/mass-driver-base.png b/assets/blocks/distribution/mass-driver-base.png
deleted file mode 100644
index 23ad8cc..0000000
--- a/assets/blocks/distribution/mass-driver-base.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/mass-driver.png b/assets/blocks/distribution/mass-driver.png
deleted file mode 100644
index 6c65bf1..0000000
--- a/assets/blocks/distribution/mass-driver.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/overflow-gate.png b/assets/blocks/distribution/overflow-gate.png
deleted file mode 100644
index 534859f..0000000
--- a/assets/blocks/distribution/overflow-gate.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/phase-conveyor-arrow.png b/assets/blocks/distribution/phase-conveyor-arrow.png
deleted file mode 100644
index 22198e8..0000000
--- a/assets/blocks/distribution/phase-conveyor-arrow.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/phase-conveyor-bridge.png b/assets/blocks/distribution/phase-conveyor-bridge.png
deleted file mode 100644
index 176c3fc..0000000
--- a/assets/blocks/distribution/phase-conveyor-bridge.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/phase-conveyor-end.png b/assets/blocks/distribution/phase-conveyor-end.png
deleted file mode 100644
index 090155a..0000000
--- a/assets/blocks/distribution/phase-conveyor-end.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/phase-conveyor.png b/assets/blocks/distribution/phase-conveyor.png
deleted file mode 100644
index 6911b37..0000000
--- a/assets/blocks/distribution/phase-conveyor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/sorter.png b/assets/blocks/distribution/sorter.png
deleted file mode 100644
index 9345206..0000000
--- a/assets/blocks/distribution/sorter.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-0.png b/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-0.png
deleted file mode 100644
index 2dc44db..0000000
--- a/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-1.png b/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-1.png
deleted file mode 100644
index e6d57f6..0000000
--- a/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-2.png b/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-2.png
deleted file mode 100644
index 5c0272b..0000000
--- a/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-0.png b/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-0.png
deleted file mode 100644
index 7057c6c..0000000
--- a/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-1.png b/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-1.png
deleted file mode 100644
index cc9890d..0000000
--- a/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-2.png b/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-2.png
deleted file mode 100644
index 0abdfc5..0000000
--- a/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-3.png b/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-3.png
deleted file mode 100644
index 34924be..0000000
--- a/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/stack-conveyors/surge-conveyor-0.png b/assets/blocks/distribution/stack-conveyors/surge-conveyor-0.png
deleted file mode 100644
index 67e479f..0000000
--- a/assets/blocks/distribution/stack-conveyors/surge-conveyor-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/stack-conveyors/surge-conveyor-1.png b/assets/blocks/distribution/stack-conveyors/surge-conveyor-1.png
deleted file mode 100644
index 3f3cf2d..0000000
--- a/assets/blocks/distribution/stack-conveyors/surge-conveyor-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-0.png b/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-0.png
deleted file mode 100644
index 5ef6959..0000000
--- a/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-1.png b/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-1.png
deleted file mode 100644
index ccc72e5..0000000
--- a/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-2.png b/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-2.png
deleted file mode 100644
index 05d6385..0000000
--- a/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-3.png b/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-3.png
deleted file mode 100644
index 8ae4559..0000000
--- a/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/stack-conveyors/surge-conveyor-stack.png b/assets/blocks/distribution/stack-conveyors/surge-conveyor-stack.png
deleted file mode 100644
index 3e82595..0000000
--- a/assets/blocks/distribution/stack-conveyors/surge-conveyor-stack.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/underflow-gate.png b/assets/blocks/distribution/underflow-gate.png
deleted file mode 100644
index 92b6f26..0000000
--- a/assets/blocks/distribution/underflow-gate.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/unit-cargo-unload-point-top.png b/assets/blocks/distribution/unit-cargo-unload-point-top.png
deleted file mode 100644
index f447882..0000000
--- a/assets/blocks/distribution/unit-cargo-unload-point-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/unit-cargo-unload-point.png b/assets/blocks/distribution/unit-cargo-unload-point.png
deleted file mode 100644
index 24cae6c..0000000
--- a/assets/blocks/distribution/unit-cargo-unload-point.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/drills/blast-drill.png b/assets/blocks/drills/blast-drill.png
deleted file mode 100644
index 13ff22b..0000000
--- a/assets/blocks/drills/blast-drill.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/drills/cliff-crusher-rotator.png b/assets/blocks/drills/cliff-crusher-rotator.png
deleted file mode 100644
index 6db2c8b..0000000
--- a/assets/blocks/drills/cliff-crusher-rotator.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/drills/cliff-crusher.png b/assets/blocks/drills/cliff-crusher.png
deleted file mode 100644
index 3c82a82..0000000
--- a/assets/blocks/drills/cliff-crusher.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/drills/eruption-drill.png b/assets/blocks/drills/eruption-drill.png
deleted file mode 100644
index 0b43aa7..0000000
--- a/assets/blocks/drills/eruption-drill.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/drills/impact-drill.png b/assets/blocks/drills/impact-drill.png
deleted file mode 100644
index 62be316..0000000
--- a/assets/blocks/drills/impact-drill.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/drills/large-plasma-bore-top.png b/assets/blocks/drills/large-plasma-bore-top.png
deleted file mode 100644
index 6bc63a7..0000000
--- a/assets/blocks/drills/large-plasma-bore-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/drills/large-plasma-bore.png b/assets/blocks/drills/large-plasma-bore.png
deleted file mode 100644
index 704a773..0000000
--- a/assets/blocks/drills/large-plasma-bore.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/drills/laser-drill.png b/assets/blocks/drills/laser-drill.png
deleted file mode 100644
index b0f94cb..0000000
--- a/assets/blocks/drills/laser-drill.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/drills/mechanical-drill.png b/assets/blocks/drills/mechanical-drill.png
deleted file mode 100644
index 354b9b0..0000000
--- a/assets/blocks/drills/mechanical-drill.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/drills/oil-extractor.png b/assets/blocks/drills/oil-extractor.png
deleted file mode 100644
index 18e84d7..0000000
--- a/assets/blocks/drills/oil-extractor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/drills/plasma-bore-top.png b/assets/blocks/drills/plasma-bore-top.png
deleted file mode 100644
index c6cffe7..0000000
--- a/assets/blocks/drills/plasma-bore-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/drills/plasma-bore.png b/assets/blocks/drills/plasma-bore.png
deleted file mode 100644
index 3fb5950..0000000
--- a/assets/blocks/drills/plasma-bore.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/drills/pneumatic-drill.png b/assets/blocks/drills/pneumatic-drill.png
deleted file mode 100644
index 3bbada9..0000000
--- a/assets/blocks/drills/pneumatic-drill.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/drills/vent-condenser.png b/assets/blocks/drills/vent-condenser.png
deleted file mode 100644
index ed715bd..0000000
--- a/assets/blocks/drills/vent-condenser.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/drills/water-extractor.png b/assets/blocks/drills/water-extractor.png
deleted file mode 100644
index 3579707..0000000
--- a/assets/blocks/drills/water-extractor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/arkycite-floor.png b/assets/blocks/environment/arkycite-floor.png
deleted file mode 100644
index 5ae0096..0000000
--- a/assets/blocks/environment/arkycite-floor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/arkyic-boulder.png b/assets/blocks/environment/arkyic-boulder.png
deleted file mode 100644
index de89b97..0000000
--- a/assets/blocks/environment/arkyic-boulder.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/arkyic-stone.png b/assets/blocks/environment/arkyic-stone.png
deleted file mode 100644
index 5f396a8..0000000
--- a/assets/blocks/environment/arkyic-stone.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/arkyic-vent.png b/assets/blocks/environment/arkyic-vent.png
deleted file mode 100644
index f67cbe3..0000000
--- a/assets/blocks/environment/arkyic-vent.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/arkyic-wall-large.png b/assets/blocks/environment/arkyic-wall-large.png
deleted file mode 100644
index 6e1f48a..0000000
--- a/assets/blocks/environment/arkyic-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/arkyic-wall.png b/assets/blocks/environment/arkyic-wall.png
deleted file mode 100644
index 2977b20..0000000
--- a/assets/blocks/environment/arkyic-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/basalt-boulder.png b/assets/blocks/environment/basalt-boulder.png
deleted file mode 100644
index 6f4ce91..0000000
--- a/assets/blocks/environment/basalt-boulder.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/basalt.png b/assets/blocks/environment/basalt.png
deleted file mode 100644
index 93ee858..0000000
--- a/assets/blocks/environment/basalt.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/beryllic-boulder.png b/assets/blocks/environment/beryllic-boulder.png
deleted file mode 100644
index a039a47..0000000
--- a/assets/blocks/environment/beryllic-boulder.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/beryllic-stone-wall-large.png b/assets/blocks/environment/beryllic-stone-wall-large.png
deleted file mode 100644
index 4f6eccf..0000000
--- a/assets/blocks/environment/beryllic-stone-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/beryllic-stone-wall.png b/assets/blocks/environment/beryllic-stone-wall.png
deleted file mode 100644
index 081d262..0000000
--- a/assets/blocks/environment/beryllic-stone-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/beryllic-stone.png b/assets/blocks/environment/beryllic-stone.png
deleted file mode 100644
index 6a6720a..0000000
--- a/assets/blocks/environment/beryllic-stone.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/bluemat.png b/assets/blocks/environment/bluemat.png
deleted file mode 100644
index e15530a..0000000
--- a/assets/blocks/environment/bluemat.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/boulder.png b/assets/blocks/environment/boulder.png
deleted file mode 100644
index a9bf280..0000000
--- a/assets/blocks/environment/boulder.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/carbon-boulder.png b/assets/blocks/environment/carbon-boulder.png
deleted file mode 100644
index 48c8efc..0000000
--- a/assets/blocks/environment/carbon-boulder.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/carbon-stone.png b/assets/blocks/environment/carbon-stone.png
deleted file mode 100644
index 76bde92..0000000
--- a/assets/blocks/environment/carbon-stone.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/carbon-vent.png b/assets/blocks/environment/carbon-vent.png
deleted file mode 100644
index d3e2570..0000000
--- a/assets/blocks/environment/carbon-vent.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/carbon-wall-large.png b/assets/blocks/environment/carbon-wall-large.png
deleted file mode 100644
index 653ae35..0000000
--- a/assets/blocks/environment/carbon-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/carbon-wall.png b/assets/blocks/environment/carbon-wall.png
deleted file mode 100644
index 92a5e81..0000000
--- a/assets/blocks/environment/carbon-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/char.png b/assets/blocks/environment/char.png
deleted file mode 100644
index c6340ed..0000000
--- a/assets/blocks/environment/char.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/core-zone.png b/assets/blocks/environment/core-zone.png
deleted file mode 100644
index 0a7bf40..0000000
--- a/assets/blocks/environment/core-zone.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/crater-stone.png b/assets/blocks/environment/crater-stone.png
deleted file mode 100644
index 9cfc92f..0000000
--- a/assets/blocks/environment/crater-stone.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/crystal-blocks.png b/assets/blocks/environment/crystal-blocks.png
deleted file mode 100644
index 0acc3d3..0000000
--- a/assets/blocks/environment/crystal-blocks.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/crystal-cluster.png b/assets/blocks/environment/crystal-cluster.png
deleted file mode 100644
index b3454ef..0000000
--- a/assets/blocks/environment/crystal-cluster.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/crystal-orbs.png b/assets/blocks/environment/crystal-orbs.png
deleted file mode 100644
index 4055f3b..0000000
--- a/assets/blocks/environment/crystal-orbs.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/crystalline-boulder.png b/assets/blocks/environment/crystalline-boulder.png
deleted file mode 100644
index 462dccd..0000000
--- a/assets/blocks/environment/crystalline-boulder.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/crystalline-stone-wall-large.png b/assets/blocks/environment/crystalline-stone-wall-large.png
deleted file mode 100644
index 17962ee..0000000
--- a/assets/blocks/environment/crystalline-stone-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/crystalline-stone-wall.png b/assets/blocks/environment/crystalline-stone-wall.png
deleted file mode 100644
index 427bf7f..0000000
--- a/assets/blocks/environment/crystalline-stone-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/crystalline-stone.png b/assets/blocks/environment/crystalline-stone.png
deleted file mode 100644
index 01fe740..0000000
--- a/assets/blocks/environment/crystalline-stone.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/crystalline-vent.png b/assets/blocks/environment/crystalline-vent.png
deleted file mode 100644
index 2de8864..0000000
--- a/assets/blocks/environment/crystalline-vent.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/dacite-boulder.png b/assets/blocks/environment/dacite-boulder.png
deleted file mode 100644
index 1a550b2..0000000
--- a/assets/blocks/environment/dacite-boulder.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/dacite-wall-large.png b/assets/blocks/environment/dacite-wall-large.png
deleted file mode 100644
index a1d94c5..0000000
--- a/assets/blocks/environment/dacite-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/dacite-wall.png b/assets/blocks/environment/dacite-wall.png
deleted file mode 100644
index 23ef79d..0000000
--- a/assets/blocks/environment/dacite-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/dacite.png b/assets/blocks/environment/dacite.png
deleted file mode 100644
index 470473a..0000000
--- a/assets/blocks/environment/dacite.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/dark-metal-large.png b/assets/blocks/environment/dark-metal-large.png
deleted file mode 100644
index aba348c..0000000
--- a/assets/blocks/environment/dark-metal-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/dark-metal.png b/assets/blocks/environment/dark-metal.png
deleted file mode 100644
index 2adeae1..0000000
--- a/assets/blocks/environment/dark-metal.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/dark-panel-1.png b/assets/blocks/environment/dark-panel-1.png
deleted file mode 100644
index 04e6b15..0000000
--- a/assets/blocks/environment/dark-panel-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/dark-panel-2.png b/assets/blocks/environment/dark-panel-2.png
deleted file mode 100644
index adbc44f..0000000
--- a/assets/blocks/environment/dark-panel-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/dark-panel-3.png b/assets/blocks/environment/dark-panel-3.png
deleted file mode 100644
index 7a3c38e..0000000
--- a/assets/blocks/environment/dark-panel-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/dark-panel-4.png b/assets/blocks/environment/dark-panel-4.png
deleted file mode 100644
index 3030229..0000000
--- a/assets/blocks/environment/dark-panel-4.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/dark-panel-6.png b/assets/blocks/environment/dark-panel-6.png
deleted file mode 100644
index d7d3ba2..0000000
--- a/assets/blocks/environment/dark-panel-6.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/darksand-tainted-water.png b/assets/blocks/environment/darksand-tainted-water.png
deleted file mode 100644
index 7f74cca..0000000
--- a/assets/blocks/environment/darksand-tainted-water.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/darksand-water.png b/assets/blocks/environment/darksand-water.png
deleted file mode 100644
index 61c769d..0000000
--- a/assets/blocks/environment/darksand-water.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/darksand.png b/assets/blocks/environment/darksand.png
deleted file mode 100644
index ef61797..0000000
--- a/assets/blocks/environment/darksand.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/deep-tainted-water.png b/assets/blocks/environment/deep-tainted-water.png
deleted file mode 100644
index e06ab6a..0000000
--- a/assets/blocks/environment/deep-tainted-water.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/deep-water.png b/assets/blocks/environment/deep-water.png
deleted file mode 100644
index ff4ee69..0000000
--- a/assets/blocks/environment/deep-water.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/dense-red-stone.png b/assets/blocks/environment/dense-red-stone.png
deleted file mode 100644
index 40d1694..0000000
--- a/assets/blocks/environment/dense-red-stone.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/dirt-wall-large.png b/assets/blocks/environment/dirt-wall-large.png
deleted file mode 100644
index 7e5f8f0..0000000
--- a/assets/blocks/environment/dirt-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/dirt.png b/assets/blocks/environment/dirt.png
deleted file mode 100644
index 1f2b788..0000000
--- a/assets/blocks/environment/dirt.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/dune-wall-large.png b/assets/blocks/environment/dune-wall-large.png
deleted file mode 100644
index 737b09d..0000000
--- a/assets/blocks/environment/dune-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/dune-wall.png b/assets/blocks/environment/dune-wall.png
deleted file mode 100644
index 22341de..0000000
--- a/assets/blocks/environment/dune-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/ferric-boulder.png b/assets/blocks/environment/ferric-boulder.png
deleted file mode 100644
index e7221a8..0000000
--- a/assets/blocks/environment/ferric-boulder.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/ferric-craters.png b/assets/blocks/environment/ferric-craters.png
deleted file mode 100644
index 83155f5..0000000
--- a/assets/blocks/environment/ferric-craters.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/ferric-stone-wall-large.png b/assets/blocks/environment/ferric-stone-wall-large.png
deleted file mode 100644
index a0bbb83..0000000
--- a/assets/blocks/environment/ferric-stone-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/ferric-stone.png b/assets/blocks/environment/ferric-stone.png
deleted file mode 100644
index 2dabf3d..0000000
--- a/assets/blocks/environment/ferric-stone.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/graphitic-wall-large.png b/assets/blocks/environment/graphitic-wall-large.png
deleted file mode 100644
index 0148959..0000000
--- a/assets/blocks/environment/graphitic-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/graphitic-wall.png b/assets/blocks/environment/graphitic-wall.png
deleted file mode 100644
index 0d5bbfa..0000000
--- a/assets/blocks/environment/graphitic-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/grass.png b/assets/blocks/environment/grass.png
deleted file mode 100644
index 662dc7b..0000000
--- a/assets/blocks/environment/grass.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/hotrock.png b/assets/blocks/environment/hotrock.png
deleted file mode 100644
index 1aa6bb3..0000000
--- a/assets/blocks/environment/hotrock.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/ice-snow.png b/assets/blocks/environment/ice-snow.png
deleted file mode 100644
index 3711749..0000000
--- a/assets/blocks/environment/ice-snow.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/ice-wall-large.png b/assets/blocks/environment/ice-wall-large.png
deleted file mode 100644
index e0ffd14..0000000
--- a/assets/blocks/environment/ice-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/ice-wall.png b/assets/blocks/environment/ice-wall.png
deleted file mode 100644
index 3e38dbc..0000000
--- a/assets/blocks/environment/ice-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/ice.png b/assets/blocks/environment/ice.png
deleted file mode 100644
index 664678d..0000000
--- a/assets/blocks/environment/ice.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/magmarock.png b/assets/blocks/environment/magmarock.png
deleted file mode 100644
index 45626c1..0000000
--- a/assets/blocks/environment/magmarock.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/metal-floor-2.png b/assets/blocks/environment/metal-floor-2.png
deleted file mode 100644
index 4b0569e..0000000
--- a/assets/blocks/environment/metal-floor-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/metal-floor-3.png b/assets/blocks/environment/metal-floor-3.png
deleted file mode 100644
index 38ecedb..0000000
--- a/assets/blocks/environment/metal-floor-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/metal-floor-5.png b/assets/blocks/environment/metal-floor-5.png
deleted file mode 100644
index ae13ed0..0000000
--- a/assets/blocks/environment/metal-floor-5.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/metal-floor-damaged.png b/assets/blocks/environment/metal-floor-damaged.png
deleted file mode 100644
index 5f60992..0000000
--- a/assets/blocks/environment/metal-floor-damaged.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/metal-floor.png b/assets/blocks/environment/metal-floor.png
deleted file mode 100644
index c8483c7..0000000
--- a/assets/blocks/environment/metal-floor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/molten-slag.png b/assets/blocks/environment/molten-slag.png
deleted file mode 100644
index 1d41627..0000000
--- a/assets/blocks/environment/molten-slag.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/moss.png b/assets/blocks/environment/moss.png
deleted file mode 100644
index a835175..0000000
--- a/assets/blocks/environment/moss.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/mud.png b/assets/blocks/environment/mud.png
deleted file mode 100644
index 834c1ee..0000000
--- a/assets/blocks/environment/mud.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/ore-beryllium.png b/assets/blocks/environment/ore-beryllium.png
deleted file mode 100644
index f44c8aa..0000000
--- a/assets/blocks/environment/ore-beryllium.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/ore-coal.png b/assets/blocks/environment/ore-coal.png
deleted file mode 100644
index 1c81d5f..0000000
--- a/assets/blocks/environment/ore-coal.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/ore-copper.png b/assets/blocks/environment/ore-copper.png
deleted file mode 100644
index 2bc09fb..0000000
--- a/assets/blocks/environment/ore-copper.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/ore-crystal-thorium.png b/assets/blocks/environment/ore-crystal-thorium.png
deleted file mode 100644
index 82bd3f2..0000000
--- a/assets/blocks/environment/ore-crystal-thorium.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/ore-lead.png b/assets/blocks/environment/ore-lead.png
deleted file mode 100644
index 0058d07..0000000
--- a/assets/blocks/environment/ore-lead.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/ore-scrap.png b/assets/blocks/environment/ore-scrap.png
deleted file mode 100644
index 27f40ac..0000000
--- a/assets/blocks/environment/ore-scrap.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/ore-thorium.png b/assets/blocks/environment/ore-thorium.png
deleted file mode 100644
index f374c01..0000000
--- a/assets/blocks/environment/ore-thorium.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/ore-titanium.png b/assets/blocks/environment/ore-titanium.png
deleted file mode 100644
index 944c4ff..0000000
--- a/assets/blocks/environment/ore-titanium.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/ore-tungsten.png b/assets/blocks/environment/ore-tungsten.png
deleted file mode 100644
index 10d2923..0000000
--- a/assets/blocks/environment/ore-tungsten.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/ore-wall-beryllium.png b/assets/blocks/environment/ore-wall-beryllium.png
deleted file mode 100644
index a1116d2..0000000
--- a/assets/blocks/environment/ore-wall-beryllium.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/ore-wall-thorium.png b/assets/blocks/environment/ore-wall-thorium.png
deleted file mode 100644
index 32b255a..0000000
--- a/assets/blocks/environment/ore-wall-thorium.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/ore-wall-tungsten.png b/assets/blocks/environment/ore-wall-tungsten.png
deleted file mode 100644
index 8c1b599..0000000
--- a/assets/blocks/environment/ore-wall-tungsten.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/pebbles.png b/assets/blocks/environment/pebbles.png
deleted file mode 100644
index 03b56d6..0000000
--- a/assets/blocks/environment/pebbles.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/pine.png b/assets/blocks/environment/pine.png
deleted file mode 100644
index dd252cc..0000000
--- a/assets/blocks/environment/pine.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/pooled-cryofluid.png b/assets/blocks/environment/pooled-cryofluid.png
deleted file mode 100644
index aa36067..0000000
--- a/assets/blocks/environment/pooled-cryofluid.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/pur-bush.png b/assets/blocks/environment/pur-bush.png
deleted file mode 100644
index 24fee97..0000000
--- a/assets/blocks/environment/pur-bush.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/red-diamond-wall.png b/assets/blocks/environment/red-diamond-wall.png
deleted file mode 100644
index b751674..0000000
--- a/assets/blocks/environment/red-diamond-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/red-ice-boulder.png b/assets/blocks/environment/red-ice-boulder.png
deleted file mode 100644
index 4ad47a5..0000000
--- a/assets/blocks/environment/red-ice-boulder.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/red-ice-wall-large.png b/assets/blocks/environment/red-ice-wall-large.png
deleted file mode 100644
index 7fe0b04..0000000
--- a/assets/blocks/environment/red-ice-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/red-ice-wall.png b/assets/blocks/environment/red-ice-wall.png
deleted file mode 100644
index 048c572..0000000
--- a/assets/blocks/environment/red-ice-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/red-ice.png b/assets/blocks/environment/red-ice.png
deleted file mode 100644
index d54cf8a..0000000
--- a/assets/blocks/environment/red-ice.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/red-stone-boulder.png b/assets/blocks/environment/red-stone-boulder.png
deleted file mode 100644
index 2770255..0000000
--- a/assets/blocks/environment/red-stone-boulder.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/red-stone-vent.png b/assets/blocks/environment/red-stone-vent.png
deleted file mode 100644
index b71ab18..0000000
--- a/assets/blocks/environment/red-stone-vent.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/red-stone-wall-large.png b/assets/blocks/environment/red-stone-wall-large.png
deleted file mode 100644
index 1cb7808..0000000
--- a/assets/blocks/environment/red-stone-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/red-stone.png b/assets/blocks/environment/red-stone.png
deleted file mode 100644
index 66e5b06..0000000
--- a/assets/blocks/environment/red-stone.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/redmat.png b/assets/blocks/environment/redmat.png
deleted file mode 100644
index f9df183..0000000
--- a/assets/blocks/environment/redmat.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/redweed.png b/assets/blocks/environment/redweed.png
deleted file mode 100644
index 2ac97d5..0000000
--- a/assets/blocks/environment/redweed.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/regolith-wall-large.png b/assets/blocks/environment/regolith-wall-large.png
deleted file mode 100644
index 271ed82..0000000
--- a/assets/blocks/environment/regolith-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/regolith-wall.png b/assets/blocks/environment/regolith-wall.png
deleted file mode 100644
index a8b0ec4..0000000
--- a/assets/blocks/environment/regolith-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/regolith.png b/assets/blocks/environment/regolith.png
deleted file mode 100644
index cb318b5..0000000
--- a/assets/blocks/environment/regolith.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/rhyolite-boulder.png b/assets/blocks/environment/rhyolite-boulder.png
deleted file mode 100644
index 26bb4e4..0000000
--- a/assets/blocks/environment/rhyolite-boulder.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/rhyolite-crater.png b/assets/blocks/environment/rhyolite-crater.png
deleted file mode 100644
index e35a1b3..0000000
--- a/assets/blocks/environment/rhyolite-crater.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/rhyolite-vent.png b/assets/blocks/environment/rhyolite-vent.png
deleted file mode 100644
index d7b7ed0..0000000
--- a/assets/blocks/environment/rhyolite-vent.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/rhyolite-wall-large.png b/assets/blocks/environment/rhyolite-wall-large.png
deleted file mode 100644
index 187550b..0000000
--- a/assets/blocks/environment/rhyolite-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/rhyolite-wall.png b/assets/blocks/environment/rhyolite-wall.png
deleted file mode 100644
index 5b84e45..0000000
--- a/assets/blocks/environment/rhyolite-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/rhyolite.png b/assets/blocks/environment/rhyolite.png
deleted file mode 100644
index 37fba67..0000000
--- a/assets/blocks/environment/rhyolite.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/rough-rhyolite.png b/assets/blocks/environment/rough-rhyolite.png
deleted file mode 100644
index 9700fff..0000000
--- a/assets/blocks/environment/rough-rhyolite.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/salt-wall.png b/assets/blocks/environment/salt-wall.png
deleted file mode 100644
index 037a1ce..0000000
--- a/assets/blocks/environment/salt-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/salt.png b/assets/blocks/environment/salt.png
deleted file mode 100644
index a693c13..0000000
--- a/assets/blocks/environment/salt.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/sand-boulder.png b/assets/blocks/environment/sand-boulder.png
deleted file mode 100644
index 3019018..0000000
--- a/assets/blocks/environment/sand-boulder.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/sand-floor.png b/assets/blocks/environment/sand-floor.png
deleted file mode 100644
index 9c5f4e9..0000000
--- a/assets/blocks/environment/sand-floor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/sand-wall-large.png b/assets/blocks/environment/sand-wall-large.png
deleted file mode 100644
index eed7bc9..0000000
--- a/assets/blocks/environment/sand-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/sand-wall.png b/assets/blocks/environment/sand-wall.png
deleted file mode 100644
index a67d570..0000000
--- a/assets/blocks/environment/sand-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/sand-water.png b/assets/blocks/environment/sand-water.png
deleted file mode 100644
index 0ff663c..0000000
--- a/assets/blocks/environment/sand-water.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/shale-boulder.png b/assets/blocks/environment/shale-boulder.png
deleted file mode 100644
index b12a026..0000000
--- a/assets/blocks/environment/shale-boulder.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/shale-wall-large.png b/assets/blocks/environment/shale-wall-large.png
deleted file mode 100644
index 0bdf3e2..0000000
--- a/assets/blocks/environment/shale-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/shale-wall.png b/assets/blocks/environment/shale-wall.png
deleted file mode 100644
index a102590..0000000
--- a/assets/blocks/environment/shale-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/shale.png b/assets/blocks/environment/shale.png
deleted file mode 100644
index a0469bc..0000000
--- a/assets/blocks/environment/shale.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/shallow-water.png b/assets/blocks/environment/shallow-water.png
deleted file mode 100644
index 16dc4d0..0000000
--- a/assets/blocks/environment/shallow-water.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/shrubs-large.png b/assets/blocks/environment/shrubs-large.png
deleted file mode 100644
index 26fb5d3..0000000
--- a/assets/blocks/environment/shrubs-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/shrubs.png b/assets/blocks/environment/shrubs.png
deleted file mode 100644
index 635a0d2..0000000
--- a/assets/blocks/environment/shrubs.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/snow-boulder.png b/assets/blocks/environment/snow-boulder.png
deleted file mode 100644
index f0cd270..0000000
--- a/assets/blocks/environment/snow-boulder.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/snow-pine.png b/assets/blocks/environment/snow-pine.png
deleted file mode 100644
index bb2d115..0000000
--- a/assets/blocks/environment/snow-pine.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/snow-wall-large.png b/assets/blocks/environment/snow-wall-large.png
deleted file mode 100644
index d597a66..0000000
--- a/assets/blocks/environment/snow-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/snow-wall.png b/assets/blocks/environment/snow-wall.png
deleted file mode 100644
index 718cff7..0000000
--- a/assets/blocks/environment/snow-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/snow.png b/assets/blocks/environment/snow.png
deleted file mode 100644
index afad902..0000000
--- a/assets/blocks/environment/snow.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/spawn.png b/assets/blocks/environment/spawn.png
deleted file mode 100644
index 01da5b5..0000000
--- a/assets/blocks/environment/spawn.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/spore-cluster.png b/assets/blocks/environment/spore-cluster.png
deleted file mode 100644
index 4b272a3..0000000
--- a/assets/blocks/environment/spore-cluster.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/spore-moss.png b/assets/blocks/environment/spore-moss.png
deleted file mode 100644
index 3661e8b..0000000
--- a/assets/blocks/environment/spore-moss.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/spore-pine.png b/assets/blocks/environment/spore-pine.png
deleted file mode 100644
index 14f6f59..0000000
--- a/assets/blocks/environment/spore-pine.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/spore-wall-large.png b/assets/blocks/environment/spore-wall-large.png
deleted file mode 100644
index 3e5b976..0000000
--- a/assets/blocks/environment/spore-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/spore-wall.png b/assets/blocks/environment/spore-wall.png
deleted file mode 100644
index b2dec36..0000000
--- a/assets/blocks/environment/spore-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/stone-wall-large.png b/assets/blocks/environment/stone-wall-large.png
deleted file mode 100644
index 26173e9..0000000
--- a/assets/blocks/environment/stone-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/stone-wall.png b/assets/blocks/environment/stone-wall.png
deleted file mode 100644
index 39c0d9c..0000000
--- a/assets/blocks/environment/stone-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/stone.png b/assets/blocks/environment/stone.png
deleted file mode 100644
index 9fdeff0..0000000
--- a/assets/blocks/environment/stone.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/tainted-water.png b/assets/blocks/environment/tainted-water.png
deleted file mode 100644
index 244610a..0000000
--- a/assets/blocks/environment/tainted-water.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/tendrils.png b/assets/blocks/environment/tendrils.png
deleted file mode 100644
index 31727ee..0000000
--- a/assets/blocks/environment/tendrils.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/vibrant-crystal-cluster.png b/assets/blocks/environment/vibrant-crystal-cluster.png
deleted file mode 100644
index 0f61531..0000000
--- a/assets/blocks/environment/vibrant-crystal-cluster.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/white-tree-dead.png b/assets/blocks/environment/white-tree-dead.png
deleted file mode 100644
index f313de4..0000000
--- a/assets/blocks/environment/white-tree-dead.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/yellow-stone-boulder.png b/assets/blocks/environment/yellow-stone-boulder.png
deleted file mode 100644
index bafe3b5..0000000
--- a/assets/blocks/environment/yellow-stone-boulder.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/yellow-stone-vent.png b/assets/blocks/environment/yellow-stone-vent.png
deleted file mode 100644
index effb1ca..0000000
--- a/assets/blocks/environment/yellow-stone-vent.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/yellow-stone-wall-large.png b/assets/blocks/environment/yellow-stone-wall-large.png
deleted file mode 100644
index d3189b2..0000000
--- a/assets/blocks/environment/yellow-stone-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/yellow-stone.png b/assets/blocks/environment/yellow-stone.png
deleted file mode 100644
index fb0c640..0000000
--- a/assets/blocks/environment/yellow-stone.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/yellowcoral.png b/assets/blocks/environment/yellowcoral.png
deleted file mode 100644
index 5e3d6cc..0000000
--- a/assets/blocks/environment/yellowcoral.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/bridge-conduit-arrow.png b/assets/blocks/liquid/bridge-conduit-arrow.png
deleted file mode 100644
index b8b62bc..0000000
--- a/assets/blocks/liquid/bridge-conduit-arrow.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/bridge-conduit-bridge.png b/assets/blocks/liquid/bridge-conduit-bridge.png
deleted file mode 100644
index 5f23ff3..0000000
--- a/assets/blocks/liquid/bridge-conduit-bridge.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/bridge-conduit-end.png b/assets/blocks/liquid/bridge-conduit-end.png
deleted file mode 100644
index 844be19..0000000
--- a/assets/blocks/liquid/bridge-conduit-end.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/bridge-conduit.png b/assets/blocks/liquid/bridge-conduit.png
deleted file mode 100644
index d57c2bb..0000000
--- a/assets/blocks/liquid/bridge-conduit.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-0-0.png b/assets/blocks/liquid/conduits/conduit-0-0.png
deleted file mode 100644
index 89e0a19..0000000
--- a/assets/blocks/liquid/conduits/conduit-0-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-0-2.png b/assets/blocks/liquid/conduits/conduit-0-2.png
deleted file mode 100644
index 96b202c..0000000
--- a/assets/blocks/liquid/conduits/conduit-0-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-1-0-h.png b/assets/blocks/liquid/conduits/conduit-1-0-h.png
deleted file mode 100644
index 90ef53c..0000000
--- a/assets/blocks/liquid/conduits/conduit-1-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-1-0.png b/assets/blocks/liquid/conduits/conduit-1-0.png
deleted file mode 100644
index dc86dd4..0000000
--- a/assets/blocks/liquid/conduits/conduit-1-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-1-1-h.png b/assets/blocks/liquid/conduits/conduit-1-1-h.png
deleted file mode 100644
index 3e2dec1..0000000
--- a/assets/blocks/liquid/conduits/conduit-1-1-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-1-1-v.png b/assets/blocks/liquid/conduits/conduit-1-1-v.png
deleted file mode 100644
index ed292b3..0000000
--- a/assets/blocks/liquid/conduits/conduit-1-1-v.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-1-1.png b/assets/blocks/liquid/conduits/conduit-1-1.png
deleted file mode 100644
index 678f81a..0000000
--- a/assets/blocks/liquid/conduits/conduit-1-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-1-2.png b/assets/blocks/liquid/conduits/conduit-1-2.png
deleted file mode 100644
index 69c4473..0000000
--- a/assets/blocks/liquid/conduits/conduit-1-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-1-3.png b/assets/blocks/liquid/conduits/conduit-1-3.png
deleted file mode 100644
index 90ef53c..0000000
--- a/assets/blocks/liquid/conduits/conduit-1-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-2-0-h.png b/assets/blocks/liquid/conduits/conduit-2-0-h.png
deleted file mode 100644
index d30d5f4..0000000
--- a/assets/blocks/liquid/conduits/conduit-2-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-2-0-v.png b/assets/blocks/liquid/conduits/conduit-2-0-v.png
deleted file mode 100644
index 67d0833..0000000
--- a/assets/blocks/liquid/conduits/conduit-2-0-v.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-2-0.png b/assets/blocks/liquid/conduits/conduit-2-0.png
deleted file mode 100644
index e8a7bb0..0000000
--- a/assets/blocks/liquid/conduits/conduit-2-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-2-2.png b/assets/blocks/liquid/conduits/conduit-2-2.png
deleted file mode 100644
index a3bbaab..0000000
--- a/assets/blocks/liquid/conduits/conduit-2-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-2-3-h.png b/assets/blocks/liquid/conduits/conduit-2-3-h.png
deleted file mode 100644
index 6815dd9..0000000
--- a/assets/blocks/liquid/conduits/conduit-2-3-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-3-0-h.png b/assets/blocks/liquid/conduits/conduit-3-0-h.png
deleted file mode 100644
index 31a4dec..0000000
--- a/assets/blocks/liquid/conduits/conduit-3-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-3-0.png b/assets/blocks/liquid/conduits/conduit-3-0.png
deleted file mode 100644
index d27ac67..0000000
--- a/assets/blocks/liquid/conduits/conduit-3-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-3-1.png b/assets/blocks/liquid/conduits/conduit-3-1.png
deleted file mode 100644
index 0911857..0000000
--- a/assets/blocks/liquid/conduits/conduit-3-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-3-3.png b/assets/blocks/liquid/conduits/conduit-3-3.png
deleted file mode 100644
index 0f57eef..0000000
--- a/assets/blocks/liquid/conduits/conduit-3-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-4-0.png b/assets/blocks/liquid/conduits/conduit-4-0.png
deleted file mode 100644
index 3d0f869..0000000
--- a/assets/blocks/liquid/conduits/conduit-4-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-4-1.png b/assets/blocks/liquid/conduits/conduit-4-1.png
deleted file mode 100644
index 37cd8a9..0000000
--- a/assets/blocks/liquid/conduits/conduit-4-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-4-3.png b/assets/blocks/liquid/conduits/conduit-4-3.png
deleted file mode 100644
index 76501b4..0000000
--- a/assets/blocks/liquid/conduits/conduit-4-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-bottom-0.png b/assets/blocks/liquid/conduits/conduit-bottom-0.png
deleted file mode 100644
index b5f2d11..0000000
--- a/assets/blocks/liquid/conduits/conduit-bottom-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-bottom-1.png b/assets/blocks/liquid/conduits/conduit-bottom-1.png
deleted file mode 100644
index 82bcbcb..0000000
--- a/assets/blocks/liquid/conduits/conduit-bottom-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-0-0.png b/assets/blocks/liquid/conduits/plated-conduit-0-0.png
deleted file mode 100644
index 9b1dcd0..0000000
--- a/assets/blocks/liquid/conduits/plated-conduit-0-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-0-1.png b/assets/blocks/liquid/conduits/plated-conduit-0-1.png
deleted file mode 100644
index 6363f68..0000000
--- a/assets/blocks/liquid/conduits/plated-conduit-0-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-0-2.png b/assets/blocks/liquid/conduits/plated-conduit-0-2.png
deleted file mode 100644
index 2450421..0000000
--- a/assets/blocks/liquid/conduits/plated-conduit-0-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-0-3.png b/assets/blocks/liquid/conduits/plated-conduit-0-3.png
deleted file mode 100644
index e3f2046..0000000
--- a/assets/blocks/liquid/conduits/plated-conduit-0-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-1-0-h.png b/assets/blocks/liquid/conduits/plated-conduit-1-0-h.png
deleted file mode 100644
index deb7005..0000000
--- a/assets/blocks/liquid/conduits/plated-conduit-1-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-1-0.png b/assets/blocks/liquid/conduits/plated-conduit-1-0.png
deleted file mode 100644
index 201ffa2..0000000
--- a/assets/blocks/liquid/conduits/plated-conduit-1-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-1-1-h.png b/assets/blocks/liquid/conduits/plated-conduit-1-1-h.png
deleted file mode 100644
index 4bef575..0000000
--- a/assets/blocks/liquid/conduits/plated-conduit-1-1-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-1-1-v.png b/assets/blocks/liquid/conduits/plated-conduit-1-1-v.png
deleted file mode 100644
index ffb6987..0000000
--- a/assets/blocks/liquid/conduits/plated-conduit-1-1-v.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-1-1.png b/assets/blocks/liquid/conduits/plated-conduit-1-1.png
deleted file mode 100644
index 6d6733a..0000000
--- a/assets/blocks/liquid/conduits/plated-conduit-1-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-1-2.png b/assets/blocks/liquid/conduits/plated-conduit-1-2.png
deleted file mode 100644
index 8cff629..0000000
--- a/assets/blocks/liquid/conduits/plated-conduit-1-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-1-3.png b/assets/blocks/liquid/conduits/plated-conduit-1-3.png
deleted file mode 100644
index deb7005..0000000
--- a/assets/blocks/liquid/conduits/plated-conduit-1-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-2-0-h.png b/assets/blocks/liquid/conduits/plated-conduit-2-0-h.png
deleted file mode 100644
index 8f2ce35..0000000
--- a/assets/blocks/liquid/conduits/plated-conduit-2-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-2-0-v.png b/assets/blocks/liquid/conduits/plated-conduit-2-0-v.png
deleted file mode 100644
index 222edf9..0000000
--- a/assets/blocks/liquid/conduits/plated-conduit-2-0-v.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-2-0.png b/assets/blocks/liquid/conduits/plated-conduit-2-0.png
deleted file mode 100644
index 4a32d66..0000000
--- a/assets/blocks/liquid/conduits/plated-conduit-2-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-2-1-h.png b/assets/blocks/liquid/conduits/plated-conduit-2-1-h.png
deleted file mode 100644
index 67385d9..0000000
--- a/assets/blocks/liquid/conduits/plated-conduit-2-1-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-2-2.png b/assets/blocks/liquid/conduits/plated-conduit-2-2.png
deleted file mode 100644
index 334adad..0000000
--- a/assets/blocks/liquid/conduits/plated-conduit-2-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-2-3-h.png b/assets/blocks/liquid/conduits/plated-conduit-2-3-h.png
deleted file mode 100644
index 416a574..0000000
--- a/assets/blocks/liquid/conduits/plated-conduit-2-3-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-3-0-h.png b/assets/blocks/liquid/conduits/plated-conduit-3-0-h.png
deleted file mode 100644
index cdff048..0000000
--- a/assets/blocks/liquid/conduits/plated-conduit-3-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-3-0.png b/assets/blocks/liquid/conduits/plated-conduit-3-0.png
deleted file mode 100644
index ea24f9a..0000000
--- a/assets/blocks/liquid/conduits/plated-conduit-3-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-3-1.png b/assets/blocks/liquid/conduits/plated-conduit-3-1.png
deleted file mode 100644
index a13c498..0000000
--- a/assets/blocks/liquid/conduits/plated-conduit-3-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-3-3.png b/assets/blocks/liquid/conduits/plated-conduit-3-3.png
deleted file mode 100644
index a78f468..0000000
--- a/assets/blocks/liquid/conduits/plated-conduit-3-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-4-1.png b/assets/blocks/liquid/conduits/plated-conduit-4-1.png
deleted file mode 100644
index 70e0859..0000000
--- a/assets/blocks/liquid/conduits/plated-conduit-4-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-4-3.png b/assets/blocks/liquid/conduits/plated-conduit-4-3.png
deleted file mode 100644
index 8c0c95f..0000000
--- a/assets/blocks/liquid/conduits/plated-conduit-4-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-0-0.png b/assets/blocks/liquid/conduits/pulse-conduit-0-0.png
deleted file mode 100644
index 09ee3e3..0000000
--- a/assets/blocks/liquid/conduits/pulse-conduit-0-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-0-2.png b/assets/blocks/liquid/conduits/pulse-conduit-0-2.png
deleted file mode 100644
index 875ebfa..0000000
--- a/assets/blocks/liquid/conduits/pulse-conduit-0-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-0-3.png b/assets/blocks/liquid/conduits/pulse-conduit-0-3.png
deleted file mode 100644
index b641d4d..0000000
--- a/assets/blocks/liquid/conduits/pulse-conduit-0-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-1-0-h.png b/assets/blocks/liquid/conduits/pulse-conduit-1-0-h.png
deleted file mode 100644
index 2f57ce8..0000000
--- a/assets/blocks/liquid/conduits/pulse-conduit-1-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-1-0.png b/assets/blocks/liquid/conduits/pulse-conduit-1-0.png
deleted file mode 100644
index 170ffc9..0000000
--- a/assets/blocks/liquid/conduits/pulse-conduit-1-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-1-1-h.png b/assets/blocks/liquid/conduits/pulse-conduit-1-1-h.png
deleted file mode 100644
index 7d7acf2..0000000
--- a/assets/blocks/liquid/conduits/pulse-conduit-1-1-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-1-1-v.png b/assets/blocks/liquid/conduits/pulse-conduit-1-1-v.png
deleted file mode 100644
index ab23178..0000000
--- a/assets/blocks/liquid/conduits/pulse-conduit-1-1-v.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-1-1.png b/assets/blocks/liquid/conduits/pulse-conduit-1-1.png
deleted file mode 100644
index fbbbc9c..0000000
--- a/assets/blocks/liquid/conduits/pulse-conduit-1-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-1-2.png b/assets/blocks/liquid/conduits/pulse-conduit-1-2.png
deleted file mode 100644
index ff58bf2..0000000
--- a/assets/blocks/liquid/conduits/pulse-conduit-1-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-1-3.png b/assets/blocks/liquid/conduits/pulse-conduit-1-3.png
deleted file mode 100644
index 2f57ce8..0000000
--- a/assets/blocks/liquid/conduits/pulse-conduit-1-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-2-0-h.png b/assets/blocks/liquid/conduits/pulse-conduit-2-0-h.png
deleted file mode 100644
index 6e2f52b..0000000
--- a/assets/blocks/liquid/conduits/pulse-conduit-2-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-2-0-v.png b/assets/blocks/liquid/conduits/pulse-conduit-2-0-v.png
deleted file mode 100644
index 7ee5d5d..0000000
--- a/assets/blocks/liquid/conduits/pulse-conduit-2-0-v.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-2-0.png b/assets/blocks/liquid/conduits/pulse-conduit-2-0.png
deleted file mode 100644
index 35d1735..0000000
--- a/assets/blocks/liquid/conduits/pulse-conduit-2-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-2-1-h.png b/assets/blocks/liquid/conduits/pulse-conduit-2-1-h.png
deleted file mode 100644
index b2978fb..0000000
--- a/assets/blocks/liquid/conduits/pulse-conduit-2-1-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-2-2.png b/assets/blocks/liquid/conduits/pulse-conduit-2-2.png
deleted file mode 100644
index 831d55e..0000000
--- a/assets/blocks/liquid/conduits/pulse-conduit-2-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-2-3-h.png b/assets/blocks/liquid/conduits/pulse-conduit-2-3-h.png
deleted file mode 100644
index 56a7446..0000000
--- a/assets/blocks/liquid/conduits/pulse-conduit-2-3-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-3-0-h.png b/assets/blocks/liquid/conduits/pulse-conduit-3-0-h.png
deleted file mode 100644
index 6527245..0000000
--- a/assets/blocks/liquid/conduits/pulse-conduit-3-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-3-0.png b/assets/blocks/liquid/conduits/pulse-conduit-3-0.png
deleted file mode 100644
index b7a411b..0000000
--- a/assets/blocks/liquid/conduits/pulse-conduit-3-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-3-1.png b/assets/blocks/liquid/conduits/pulse-conduit-3-1.png
deleted file mode 100644
index ffb0e87..0000000
--- a/assets/blocks/liquid/conduits/pulse-conduit-3-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-3-3.png b/assets/blocks/liquid/conduits/pulse-conduit-3-3.png
deleted file mode 100644
index cf614d2..0000000
--- a/assets/blocks/liquid/conduits/pulse-conduit-3-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-4-0.png b/assets/blocks/liquid/conduits/pulse-conduit-4-0.png
deleted file mode 100644
index 7958647..0000000
--- a/assets/blocks/liquid/conduits/pulse-conduit-4-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-4-1.png b/assets/blocks/liquid/conduits/pulse-conduit-4-1.png
deleted file mode 100644
index d4a5e50..0000000
--- a/assets/blocks/liquid/conduits/pulse-conduit-4-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-4-3.png b/assets/blocks/liquid/conduits/pulse-conduit-4-3.png
deleted file mode 100644
index 949c1e2..0000000
--- a/assets/blocks/liquid/conduits/pulse-conduit-4-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-0-0.png b/assets/blocks/liquid/conduits/reinforced-conduit-0-0.png
deleted file mode 100644
index 6280303..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-0-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-0-1.png b/assets/blocks/liquid/conduits/reinforced-conduit-0-1.png
deleted file mode 100644
index 033767c..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-0-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-0-2.png b/assets/blocks/liquid/conduits/reinforced-conduit-0-2.png
deleted file mode 100644
index ec838d6..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-0-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-0-3.png b/assets/blocks/liquid/conduits/reinforced-conduit-0-3.png
deleted file mode 100644
index f795439..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-0-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-1-0-h.png b/assets/blocks/liquid/conduits/reinforced-conduit-1-0-h.png
deleted file mode 100644
index 5fb892c..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-1-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-1-0.png b/assets/blocks/liquid/conduits/reinforced-conduit-1-0.png
deleted file mode 100644
index e393c9c..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-1-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-1-1-h.png b/assets/blocks/liquid/conduits/reinforced-conduit-1-1-h.png
deleted file mode 100644
index 2f4f9e9..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-1-1-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-1-1-v.png b/assets/blocks/liquid/conduits/reinforced-conduit-1-1-v.png
deleted file mode 100644
index c303f7d..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-1-1-v.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-1-1.png b/assets/blocks/liquid/conduits/reinforced-conduit-1-1.png
deleted file mode 100644
index 2dce114..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-1-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-1-2.png b/assets/blocks/liquid/conduits/reinforced-conduit-1-2.png
deleted file mode 100644
index 115b526..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-1-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-1-3.png b/assets/blocks/liquid/conduits/reinforced-conduit-1-3.png
deleted file mode 100644
index 95c1d9f..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-1-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-2-0-h.png b/assets/blocks/liquid/conduits/reinforced-conduit-2-0-h.png
deleted file mode 100644
index eb069a9..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-2-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-2-0-v.png b/assets/blocks/liquid/conduits/reinforced-conduit-2-0-v.png
deleted file mode 100644
index c6b9470..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-2-0-v.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-2-0.png b/assets/blocks/liquid/conduits/reinforced-conduit-2-0.png
deleted file mode 100644
index 5099798..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-2-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-2-1-h.png b/assets/blocks/liquid/conduits/reinforced-conduit-2-1-h.png
deleted file mode 100644
index 35606ba..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-2-1-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-2-1.png b/assets/blocks/liquid/conduits/reinforced-conduit-2-1.png
deleted file mode 100644
index 8037de2..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-2-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-2-2.png b/assets/blocks/liquid/conduits/reinforced-conduit-2-2.png
deleted file mode 100644
index 3402395..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-2-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-2-3-h.png b/assets/blocks/liquid/conduits/reinforced-conduit-2-3-h.png
deleted file mode 100644
index 32a2fd2..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-2-3-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-2-3.png b/assets/blocks/liquid/conduits/reinforced-conduit-2-3.png
deleted file mode 100644
index 80ce744..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-2-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-3-0-h.png b/assets/blocks/liquid/conduits/reinforced-conduit-3-0-h.png
deleted file mode 100644
index f2ef533..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-3-0-h.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-3-0.png b/assets/blocks/liquid/conduits/reinforced-conduit-3-0.png
deleted file mode 100644
index 2ed95f1..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-3-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-3-1.png b/assets/blocks/liquid/conduits/reinforced-conduit-3-1.png
deleted file mode 100644
index e52c759..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-3-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-3-3.png b/assets/blocks/liquid/conduits/reinforced-conduit-3-3.png
deleted file mode 100644
index 3e6195d..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-3-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-4-0.png b/assets/blocks/liquid/conduits/reinforced-conduit-4-0.png
deleted file mode 100644
index 46deb70..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-4-0.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-4-1.png b/assets/blocks/liquid/conduits/reinforced-conduit-4-1.png
deleted file mode 100644
index 14845e4..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-4-1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/conduits/reinforced-conduit-4-3.png b/assets/blocks/liquid/conduits/reinforced-conduit-4-3.png
deleted file mode 100644
index 4901d38..0000000
--- a/assets/blocks/liquid/conduits/reinforced-conduit-4-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/impulse-pump-liquid.png b/assets/blocks/liquid/impulse-pump-liquid.png
deleted file mode 100644
index bd62682..0000000
--- a/assets/blocks/liquid/impulse-pump-liquid.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/impulse-pump.png b/assets/blocks/liquid/impulse-pump.png
deleted file mode 100644
index 7f41faf..0000000
--- a/assets/blocks/liquid/impulse-pump.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/liquid-container.png b/assets/blocks/liquid/liquid-container.png
deleted file mode 100644
index 5336e28..0000000
--- a/assets/blocks/liquid/liquid-container.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/liquid-junction.png b/assets/blocks/liquid/liquid-junction.png
deleted file mode 100644
index 0c92792..0000000
--- a/assets/blocks/liquid/liquid-junction.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/liquid-router.png b/assets/blocks/liquid/liquid-router.png
deleted file mode 100644
index 75adcb1..0000000
--- a/assets/blocks/liquid/liquid-router.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/liquid-source.png b/assets/blocks/liquid/liquid-source.png
deleted file mode 100644
index 3f230be..0000000
--- a/assets/blocks/liquid/liquid-source.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/liquid-tank-bottom.png b/assets/blocks/liquid/liquid-tank-bottom.png
deleted file mode 100644
index 5133507..0000000
--- a/assets/blocks/liquid/liquid-tank-bottom.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/liquid-tank.png b/assets/blocks/liquid/liquid-tank.png
deleted file mode 100644
index f4e9396..0000000
--- a/assets/blocks/liquid/liquid-tank.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/liquid-void.png b/assets/blocks/liquid/liquid-void.png
deleted file mode 100644
index 34b20dd..0000000
--- a/assets/blocks/liquid/liquid-void.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/mechanical-pump-liquid.png b/assets/blocks/liquid/mechanical-pump-liquid.png
deleted file mode 100644
index bd62682..0000000
--- a/assets/blocks/liquid/mechanical-pump-liquid.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/mechanical-pump.png b/assets/blocks/liquid/mechanical-pump.png
deleted file mode 100644
index 771d52d..0000000
--- a/assets/blocks/liquid/mechanical-pump.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/phase-conduit-arrow.png b/assets/blocks/liquid/phase-conduit-arrow.png
deleted file mode 100644
index 62bcb0c..0000000
--- a/assets/blocks/liquid/phase-conduit-arrow.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/phase-conduit-bridge.png b/assets/blocks/liquid/phase-conduit-bridge.png
deleted file mode 100644
index fcdef72..0000000
--- a/assets/blocks/liquid/phase-conduit-bridge.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/phase-conduit-end.png b/assets/blocks/liquid/phase-conduit-end.png
deleted file mode 100644
index cdcc522..0000000
--- a/assets/blocks/liquid/phase-conduit-end.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/phase-conduit.png b/assets/blocks/liquid/phase-conduit.png
deleted file mode 100644
index a571e30..0000000
--- a/assets/blocks/liquid/phase-conduit.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/reinforced-bridge-conduit-arrow.png b/assets/blocks/liquid/reinforced-bridge-conduit-arrow.png
deleted file mode 100644
index 5309b37..0000000
--- a/assets/blocks/liquid/reinforced-bridge-conduit-arrow.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/reinforced-bridge-conduit-bridge-liquid.png b/assets/blocks/liquid/reinforced-bridge-conduit-bridge-liquid.png
deleted file mode 100644
index afef676..0000000
--- a/assets/blocks/liquid/reinforced-bridge-conduit-bridge-liquid.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/reinforced-bridge-conduit-bridge.png b/assets/blocks/liquid/reinforced-bridge-conduit-bridge.png
deleted file mode 100644
index 12c5bde..0000000
--- a/assets/blocks/liquid/reinforced-bridge-conduit-bridge.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/reinforced-bridge-conduit-dir.png b/assets/blocks/liquid/reinforced-bridge-conduit-dir.png
deleted file mode 100644
index 233e43a..0000000
--- a/assets/blocks/liquid/reinforced-bridge-conduit-dir.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/reinforced-bridge-conduit-liquid.png b/assets/blocks/liquid/reinforced-bridge-conduit-liquid.png
deleted file mode 100644
index 6c42419..0000000
--- a/assets/blocks/liquid/reinforced-bridge-conduit-liquid.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/reinforced-bridge-conduit.png b/assets/blocks/liquid/reinforced-bridge-conduit.png
deleted file mode 100644
index 9e694e0..0000000
--- a/assets/blocks/liquid/reinforced-bridge-conduit.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/reinforced-liquid-container.png b/assets/blocks/liquid/reinforced-liquid-container.png
deleted file mode 100644
index b769691..0000000
--- a/assets/blocks/liquid/reinforced-liquid-container.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/reinforced-liquid-junction.png b/assets/blocks/liquid/reinforced-liquid-junction.png
deleted file mode 100644
index 778c5a6..0000000
--- a/assets/blocks/liquid/reinforced-liquid-junction.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/reinforced-liquid-tank-bottom.png b/assets/blocks/liquid/reinforced-liquid-tank-bottom.png
deleted file mode 100644
index 9b95d26..0000000
--- a/assets/blocks/liquid/reinforced-liquid-tank-bottom.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/reinforced-pump-liquid.png b/assets/blocks/liquid/reinforced-pump-liquid.png
deleted file mode 100644
index 25f07b0..0000000
--- a/assets/blocks/liquid/reinforced-pump-liquid.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/reinforced-pump.png b/assets/blocks/liquid/reinforced-pump.png
deleted file mode 100644
index 22f25d4..0000000
--- a/assets/blocks/liquid/reinforced-pump.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/rotary-pump-liquid.png b/assets/blocks/liquid/rotary-pump-liquid.png
deleted file mode 100644
index bd62682..0000000
--- a/assets/blocks/liquid/rotary-pump-liquid.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/rotary-pump.png b/assets/blocks/liquid/rotary-pump.png
deleted file mode 100644
index 0b94fea..0000000
--- a/assets/blocks/liquid/rotary-pump.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/logic/canvas.png b/assets/blocks/logic/canvas.png
deleted file mode 100644
index 8f05174..0000000
--- a/assets/blocks/logic/canvas.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/logic/hyper-processor.png b/assets/blocks/logic/hyper-processor.png
deleted file mode 100644
index 7976567..0000000
--- a/assets/blocks/logic/hyper-processor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/logic/large-logic-display.png b/assets/blocks/logic/large-logic-display.png
deleted file mode 100644
index 28c8c75..0000000
--- a/assets/blocks/logic/large-logic-display.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/logic/logic-display.png b/assets/blocks/logic/logic-display.png
deleted file mode 100644
index 5d38ebe..0000000
--- a/assets/blocks/logic/logic-display.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/logic/logic-processor.png b/assets/blocks/logic/logic-processor.png
deleted file mode 100644
index 85dffe9..0000000
--- a/assets/blocks/logic/logic-processor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/logic/memory-bank.png b/assets/blocks/logic/memory-bank.png
deleted file mode 100644
index f4a4b48..0000000
--- a/assets/blocks/logic/memory-bank.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/logic/memory-cell.png b/assets/blocks/logic/memory-cell.png
deleted file mode 100644
index a8a5343..0000000
--- a/assets/blocks/logic/memory-cell.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/logic/message.png b/assets/blocks/logic/message.png
deleted file mode 100644
index 0e7b631..0000000
--- a/assets/blocks/logic/message.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/logic/micro-processor.png b/assets/blocks/logic/micro-processor.png
deleted file mode 100644
index 9995834..0000000
--- a/assets/blocks/logic/micro-processor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/logic/reinforced-message.png b/assets/blocks/logic/reinforced-message.png
deleted file mode 100644
index 7ed093c..0000000
--- a/assets/blocks/logic/reinforced-message.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/logic/switch-on.png b/assets/blocks/logic/switch-on.png
deleted file mode 100644
index 5560abf..0000000
--- a/assets/blocks/logic/switch-on.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/logic/switch.png b/assets/blocks/logic/switch.png
deleted file mode 100644
index 37a1c02..0000000
--- a/assets/blocks/logic/switch.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/logic/world-cell.png b/assets/blocks/logic/world-cell.png
deleted file mode 100644
index 4397cb2..0000000
--- a/assets/blocks/logic/world-cell.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/logic/world-message.png b/assets/blocks/logic/world-message.png
deleted file mode 100644
index 6fa79f9..0000000
--- a/assets/blocks/logic/world-message.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/logic/world-processor.png b/assets/blocks/logic/world-processor.png
deleted file mode 100644
index 7638016..0000000
--- a/assets/blocks/logic/world-processor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/constructor-top.png b/assets/blocks/payload/constructor-top.png
deleted file mode 100644
index ca8288c..0000000
--- a/assets/blocks/payload/constructor-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/constructor.png b/assets/blocks/payload/constructor.png
deleted file mode 100644
index c982f18..0000000
--- a/assets/blocks/payload/constructor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/deconstructor-top.png b/assets/blocks/payload/deconstructor-top.png
deleted file mode 100644
index 102c5fb..0000000
--- a/assets/blocks/payload/deconstructor-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/deconstructor.png b/assets/blocks/payload/deconstructor.png
deleted file mode 100644
index f2dd416..0000000
--- a/assets/blocks/payload/deconstructor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/factory-in-3-dark.png b/assets/blocks/payload/factory-in-3-dark.png
deleted file mode 100644
index c7a3c0e..0000000
--- a/assets/blocks/payload/factory-in-3-dark.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/factory-in-3.png b/assets/blocks/payload/factory-in-3.png
deleted file mode 100644
index 19f0b7d..0000000
--- a/assets/blocks/payload/factory-in-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/factory-in-5-dark.png b/assets/blocks/payload/factory-in-5-dark.png
deleted file mode 100644
index c6eb89b..0000000
--- a/assets/blocks/payload/factory-in-5-dark.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/factory-in-5.png b/assets/blocks/payload/factory-in-5.png
deleted file mode 100644
index 1a65fed..0000000
--- a/assets/blocks/payload/factory-in-5.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/factory-out-3-dark.png b/assets/blocks/payload/factory-out-3-dark.png
deleted file mode 100644
index 11d66aa..0000000
--- a/assets/blocks/payload/factory-out-3-dark.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/factory-out-3.png b/assets/blocks/payload/factory-out-3.png
deleted file mode 100644
index da9153d..0000000
--- a/assets/blocks/payload/factory-out-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/factory-out-5-dark.png b/assets/blocks/payload/factory-out-5-dark.png
deleted file mode 100644
index 40a3ed8..0000000
--- a/assets/blocks/payload/factory-out-5-dark.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/factory-out-5.png b/assets/blocks/payload/factory-out-5.png
deleted file mode 100644
index 3a8d9ed..0000000
--- a/assets/blocks/payload/factory-out-5.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/factory-out-7.png b/assets/blocks/payload/factory-out-7.png
deleted file mode 100644
index c1fcf4b..0000000
--- a/assets/blocks/payload/factory-out-7.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/factory-out-9.png b/assets/blocks/payload/factory-out-9.png
deleted file mode 100644
index 007369a..0000000
--- a/assets/blocks/payload/factory-out-9.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/factory-top-3.png b/assets/blocks/payload/factory-top-3.png
deleted file mode 100644
index 2b69b0a..0000000
--- a/assets/blocks/payload/factory-top-3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/large-constructor-top.png b/assets/blocks/payload/large-constructor-top.png
deleted file mode 100644
index ef4e9fc..0000000
--- a/assets/blocks/payload/large-constructor-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/large-constructor.png b/assets/blocks/payload/large-constructor.png
deleted file mode 100644
index b45e650..0000000
--- a/assets/blocks/payload/large-constructor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/large-payload-mass-driver.png b/assets/blocks/payload/large-payload-mass-driver.png
deleted file mode 100644
index 42e9350..0000000
--- a/assets/blocks/payload/large-payload-mass-driver.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/payload-conveyor.png b/assets/blocks/payload/payload-conveyor.png
deleted file mode 100644
index ea511d4..0000000
--- a/assets/blocks/payload/payload-conveyor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/payload-loader-top.png b/assets/blocks/payload/payload-loader-top.png
deleted file mode 100644
index 3612bef..0000000
--- a/assets/blocks/payload/payload-loader-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/payload-loader.png b/assets/blocks/payload/payload-loader.png
deleted file mode 100644
index acbb9a6..0000000
--- a/assets/blocks/payload/payload-loader.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/payload-mass-driver.png b/assets/blocks/payload/payload-mass-driver.png
deleted file mode 100644
index df38883..0000000
--- a/assets/blocks/payload/payload-mass-driver.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/payload-router.png b/assets/blocks/payload/payload-router.png
deleted file mode 100644
index 43e4c68..0000000
--- a/assets/blocks/payload/payload-router.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/payload-source-top.png b/assets/blocks/payload/payload-source-top.png
deleted file mode 100644
index 6b54ca6..0000000
--- a/assets/blocks/payload/payload-source-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/payload-unloader-top.png b/assets/blocks/payload/payload-unloader-top.png
deleted file mode 100644
index caad844..0000000
--- a/assets/blocks/payload/payload-unloader-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/payload-unloader.png b/assets/blocks/payload/payload-unloader.png
deleted file mode 100644
index 9b564db..0000000
--- a/assets/blocks/payload/payload-unloader.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/payload-void-top.png b/assets/blocks/payload/payload-void-top.png
deleted file mode 100644
index 8725a43..0000000
--- a/assets/blocks/payload/payload-void-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/payload-void.png b/assets/blocks/payload/payload-void.png
deleted file mode 100644
index a2390c4..0000000
--- a/assets/blocks/payload/payload-void.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/reinforced-payload-conveyor.png b/assets/blocks/payload/reinforced-payload-conveyor.png
deleted file mode 100644
index ee67544..0000000
--- a/assets/blocks/payload/reinforced-payload-conveyor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/reinforced-payload-router.png b/assets/blocks/payload/reinforced-payload-router.png
deleted file mode 100644
index 4d426a9..0000000
--- a/assets/blocks/payload/reinforced-payload-router.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/small-deconstructor-top.png b/assets/blocks/payload/small-deconstructor-top.png
deleted file mode 100644
index e9b25ed..0000000
--- a/assets/blocks/payload/small-deconstructor-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/payload/small-deconstructor.png b/assets/blocks/payload/small-deconstructor.png
deleted file mode 100644
index c04f6d4..0000000
--- a/assets/blocks/payload/small-deconstructor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/battery-large.png b/assets/blocks/power/battery-large.png
deleted file mode 100644
index bc90f9c..0000000
--- a/assets/blocks/power/battery-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/battery.png b/assets/blocks/power/battery.png
deleted file mode 100644
index 66aea4b..0000000
--- a/assets/blocks/power/battery.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/beam-link.png b/assets/blocks/power/beam-link.png
deleted file mode 100644
index 1804555..0000000
--- a/assets/blocks/power/beam-link.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/beam-node.png b/assets/blocks/power/beam-node.png
deleted file mode 100644
index 67c3a94..0000000
--- a/assets/blocks/power/beam-node.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/beam-tower.png b/assets/blocks/power/beam-tower.png
deleted file mode 100644
index f86568c..0000000
--- a/assets/blocks/power/beam-tower.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/chemical-combustion-chamber.png b/assets/blocks/power/chemical-combustion-chamber.png
deleted file mode 100644
index 9d25357..0000000
--- a/assets/blocks/power/chemical-combustion-chamber.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/combustion-generator.png b/assets/blocks/power/combustion-generator.png
deleted file mode 100644
index dcf2039..0000000
--- a/assets/blocks/power/combustion-generator.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/differential-generator-liquid.png b/assets/blocks/power/differential-generator-liquid.png
deleted file mode 100644
index 83eb5ca..0000000
--- a/assets/blocks/power/differential-generator-liquid.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/differential-generator.png b/assets/blocks/power/differential-generator.png
deleted file mode 100644
index a4986a6..0000000
--- a/assets/blocks/power/differential-generator.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/diode-arrow.png b/assets/blocks/power/diode-arrow.png
deleted file mode 100644
index 91b3090..0000000
--- a/assets/blocks/power/diode-arrow.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/diode.png b/assets/blocks/power/diode.png
deleted file mode 100644
index 3963401..0000000
--- a/assets/blocks/power/diode.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/flux-reactor-bottom.png b/assets/blocks/power/flux-reactor-bottom.png
deleted file mode 100644
index 31b441e..0000000
--- a/assets/blocks/power/flux-reactor-bottom.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/flux-reactor-mid.png b/assets/blocks/power/flux-reactor-mid.png
deleted file mode 100644
index 25c0b27..0000000
--- a/assets/blocks/power/flux-reactor-mid.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/flux-reactor.png b/assets/blocks/power/flux-reactor.png
deleted file mode 100644
index 5cbbb43..0000000
--- a/assets/blocks/power/flux-reactor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/illuminator.png b/assets/blocks/power/illuminator.png
deleted file mode 100644
index 5c7607d..0000000
--- a/assets/blocks/power/illuminator.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/impact-reactor-bottom.png b/assets/blocks/power/impact-reactor-bottom.png
deleted file mode 100644
index 40d985c..0000000
--- a/assets/blocks/power/impact-reactor-bottom.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/impact-reactor.png b/assets/blocks/power/impact-reactor.png
deleted file mode 100644
index 1f3d2dd..0000000
--- a/assets/blocks/power/impact-reactor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/neoplasia-reactor-bottom.png b/assets/blocks/power/neoplasia-reactor-bottom.png
deleted file mode 100644
index 25cd97e..0000000
--- a/assets/blocks/power/neoplasia-reactor-bottom.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/neoplasia-reactor-center.png b/assets/blocks/power/neoplasia-reactor-center.png
deleted file mode 100644
index 7336772..0000000
--- a/assets/blocks/power/neoplasia-reactor-center.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/neoplasia-reactor.png b/assets/blocks/power/neoplasia-reactor.png
deleted file mode 100644
index 3376dec..0000000
--- a/assets/blocks/power/neoplasia-reactor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/power-node-large.png b/assets/blocks/power/power-node-large.png
deleted file mode 100644
index a5ebe5e..0000000
--- a/assets/blocks/power/power-node-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/power-node.png b/assets/blocks/power/power-node.png
deleted file mode 100644
index 3d98ab0..0000000
--- a/assets/blocks/power/power-node.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/power-source.png b/assets/blocks/power/power-source.png
deleted file mode 100644
index 9d5c8ed..0000000
--- a/assets/blocks/power/power-source.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/power-void.png b/assets/blocks/power/power-void.png
deleted file mode 100644
index 5fd2c22..0000000
--- a/assets/blocks/power/power-void.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/pyrolysis-generator.png b/assets/blocks/power/pyrolysis-generator.png
deleted file mode 100644
index 5f6556d..0000000
--- a/assets/blocks/power/pyrolysis-generator.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/rtg-generator.png b/assets/blocks/power/rtg-generator.png
deleted file mode 100644
index 3578bbc..0000000
--- a/assets/blocks/power/rtg-generator.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/solar-panel-large.png b/assets/blocks/power/solar-panel-large.png
deleted file mode 100644
index a994aaf..0000000
--- a/assets/blocks/power/solar-panel-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/solar-panel.png b/assets/blocks/power/solar-panel.png
deleted file mode 100644
index af53536..0000000
--- a/assets/blocks/power/solar-panel.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/steam-generator-liquid.png b/assets/blocks/power/steam-generator-liquid.png
deleted file mode 100644
index da16999..0000000
--- a/assets/blocks/power/steam-generator-liquid.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/steam-generator.png b/assets/blocks/power/steam-generator.png
deleted file mode 100644
index 3b2bcd6..0000000
--- a/assets/blocks/power/steam-generator.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/thermal-generator.png b/assets/blocks/power/thermal-generator.png
deleted file mode 100644
index 6700994..0000000
--- a/assets/blocks/power/thermal-generator.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/thorium-reactor.png b/assets/blocks/power/thorium-reactor.png
deleted file mode 100644
index f7dfb2e..0000000
--- a/assets/blocks/power/thorium-reactor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/turbine-condenser.png b/assets/blocks/power/turbine-condenser.png
deleted file mode 100644
index 3c29973..0000000
--- a/assets/blocks/power/turbine-condenser.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/atmospheric-concentrator-bottom.png b/assets/blocks/production/atmospheric-concentrator-bottom.png
deleted file mode 100644
index 61dde0d..0000000
--- a/assets/blocks/production/atmospheric-concentrator-bottom.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/atmospheric-concentrator.png b/assets/blocks/production/atmospheric-concentrator.png
deleted file mode 100644
index f535fde..0000000
--- a/assets/blocks/production/atmospheric-concentrator.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/blast-mixer.png b/assets/blocks/production/blast-mixer.png
deleted file mode 100644
index 81e8d86..0000000
--- a/assets/blocks/production/blast-mixer.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/carbide-crucible-bottom.png b/assets/blocks/production/carbide-crucible-bottom.png
deleted file mode 100644
index 3fcb6ab..0000000
--- a/assets/blocks/production/carbide-crucible-bottom.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/carbide-crucible.png b/assets/blocks/production/carbide-crucible.png
deleted file mode 100644
index 309d70f..0000000
--- a/assets/blocks/production/carbide-crucible.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/coal-centrifuge.png b/assets/blocks/production/coal-centrifuge.png
deleted file mode 100644
index 10265b6..0000000
--- a/assets/blocks/production/coal-centrifuge.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/cryofluid-mixer.png b/assets/blocks/production/cryofluid-mixer.png
deleted file mode 100644
index e9e4ecb..0000000
--- a/assets/blocks/production/cryofluid-mixer.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/cultivator.png b/assets/blocks/production/cultivator.png
deleted file mode 100644
index 5d7e152..0000000
--- a/assets/blocks/production/cultivator.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/cyanogen-synthesizer-bottom.png b/assets/blocks/production/cyanogen-synthesizer-bottom.png
deleted file mode 100644
index 3452f9d..0000000
--- a/assets/blocks/production/cyanogen-synthesizer-bottom.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/cyanogen-synthesizer.png b/assets/blocks/production/cyanogen-synthesizer.png
deleted file mode 100644
index b67f16f..0000000
--- a/assets/blocks/production/cyanogen-synthesizer.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/disassembler-bottom.png b/assets/blocks/production/disassembler-bottom.png
deleted file mode 100644
index 87f0295..0000000
--- a/assets/blocks/production/disassembler-bottom.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/disassembler.png b/assets/blocks/production/disassembler.png
deleted file mode 100644
index 9860ac0..0000000
--- a/assets/blocks/production/disassembler.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/electric-heater-top1.png b/assets/blocks/production/electric-heater-top1.png
deleted file mode 100644
index b807ab9..0000000
--- a/assets/blocks/production/electric-heater-top1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/electric-heater-top2.png b/assets/blocks/production/electric-heater-top2.png
deleted file mode 100644
index 78c0e49..0000000
--- a/assets/blocks/production/electric-heater-top2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/electric-heater.png b/assets/blocks/production/electric-heater.png
deleted file mode 100644
index 62ca7c7..0000000
--- a/assets/blocks/production/electric-heater.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/electrolyzer-bottom.png b/assets/blocks/production/electrolyzer-bottom.png
deleted file mode 100644
index bb2d46e..0000000
--- a/assets/blocks/production/electrolyzer-bottom.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/electrolyzer.png b/assets/blocks/production/electrolyzer.png
deleted file mode 100644
index c8d66e4..0000000
--- a/assets/blocks/production/electrolyzer.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/heat-redirector-top2.png b/assets/blocks/production/heat-redirector-top2.png
deleted file mode 100644
index 2f6fc72..0000000
--- a/assets/blocks/production/heat-redirector-top2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/heat-redirector.png b/assets/blocks/production/heat-redirector.png
deleted file mode 100644
index fd7dc0b..0000000
--- a/assets/blocks/production/heat-redirector.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/heat-router-top1.png b/assets/blocks/production/heat-router-top1.png
deleted file mode 100644
index 75a62a4..0000000
--- a/assets/blocks/production/heat-router-top1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/heat-router.png b/assets/blocks/production/heat-router.png
deleted file mode 100644
index 7f71e4d..0000000
--- a/assets/blocks/production/heat-router.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/heat-source.png b/assets/blocks/production/heat-source.png
deleted file mode 100644
index b4f09d9..0000000
--- a/assets/blocks/production/heat-source.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/incinerator.png b/assets/blocks/production/incinerator.png
deleted file mode 100644
index ae6a34f..0000000
--- a/assets/blocks/production/incinerator.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/kiln.png b/assets/blocks/production/kiln.png
deleted file mode 100644
index 4180563..0000000
--- a/assets/blocks/production/kiln.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/melter.png b/assets/blocks/production/melter.png
deleted file mode 100644
index 97b0278..0000000
--- a/assets/blocks/production/melter.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/multi-press.png b/assets/blocks/production/multi-press.png
deleted file mode 100644
index d8874fd..0000000
--- a/assets/blocks/production/multi-press.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/oxidation-chamber-top1.png b/assets/blocks/production/oxidation-chamber-top1.png
deleted file mode 100644
index 580c74b..0000000
--- a/assets/blocks/production/oxidation-chamber-top1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/oxidation-chamber-top2.png b/assets/blocks/production/oxidation-chamber-top2.png
deleted file mode 100644
index 9e5489f..0000000
--- a/assets/blocks/production/oxidation-chamber-top2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/oxidation-chamber.png b/assets/blocks/production/oxidation-chamber.png
deleted file mode 100644
index 55ce729..0000000
--- a/assets/blocks/production/oxidation-chamber.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/phase-heater-top1.png b/assets/blocks/production/phase-heater-top1.png
deleted file mode 100644
index 2374f39..0000000
--- a/assets/blocks/production/phase-heater-top1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/phase-heater-top2.png b/assets/blocks/production/phase-heater-top2.png
deleted file mode 100644
index 750434c..0000000
--- a/assets/blocks/production/phase-heater-top2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/phase-heater.png b/assets/blocks/production/phase-heater.png
deleted file mode 100644
index 28302b2..0000000
--- a/assets/blocks/production/phase-heater.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/phase-synthesizer.png b/assets/blocks/production/phase-synthesizer.png
deleted file mode 100644
index 8081f6d..0000000
--- a/assets/blocks/production/phase-synthesizer.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/phase-weaver.png b/assets/blocks/production/phase-weaver.png
deleted file mode 100644
index 576fa32..0000000
--- a/assets/blocks/production/phase-weaver.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/plastanium-compressor.png b/assets/blocks/production/plastanium-compressor.png
deleted file mode 100644
index 2556143..0000000
--- a/assets/blocks/production/plastanium-compressor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/pulverizer.png b/assets/blocks/production/pulverizer.png
deleted file mode 100644
index 0d5d93a..0000000
--- a/assets/blocks/production/pulverizer.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/pyratite-mixer.png b/assets/blocks/production/pyratite-mixer.png
deleted file mode 100644
index 206a970..0000000
--- a/assets/blocks/production/pyratite-mixer.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/separator.png b/assets/blocks/production/separator.png
deleted file mode 100644
index 7c72cc3..0000000
--- a/assets/blocks/production/separator.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/silicon-arc-furnace.png b/assets/blocks/production/silicon-arc-furnace.png
deleted file mode 100644
index 6d4f0b5..0000000
--- a/assets/blocks/production/silicon-arc-furnace.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/silicon-crucible.png b/assets/blocks/production/silicon-crucible.png
deleted file mode 100644
index 2efe121..0000000
--- a/assets/blocks/production/silicon-crucible.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/silicon-smelter.png b/assets/blocks/production/silicon-smelter.png
deleted file mode 100644
index 4cb470e..0000000
--- a/assets/blocks/production/silicon-smelter.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/slag-heater-bottom.png b/assets/blocks/production/slag-heater-bottom.png
deleted file mode 100644
index 836d531..0000000
--- a/assets/blocks/production/slag-heater-bottom.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/slag-heater.png b/assets/blocks/production/slag-heater.png
deleted file mode 100644
index 4709577..0000000
--- a/assets/blocks/production/slag-heater.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/slag-incinerator-liquid.png b/assets/blocks/production/slag-incinerator-liquid.png
deleted file mode 100644
index 618be80..0000000
--- a/assets/blocks/production/slag-incinerator-liquid.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/slag-incinerator.png b/assets/blocks/production/slag-incinerator.png
deleted file mode 100644
index 8cb0be7..0000000
--- a/assets/blocks/production/slag-incinerator.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/spore-press.png b/assets/blocks/production/spore-press.png
deleted file mode 100644
index 6d9271c..0000000
--- a/assets/blocks/production/spore-press.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/surge-crucible-bottom.png b/assets/blocks/production/surge-crucible-bottom.png
deleted file mode 100644
index 302d76b..0000000
--- a/assets/blocks/production/surge-crucible-bottom.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/surge-crucible-liquid.png b/assets/blocks/production/surge-crucible-liquid.png
deleted file mode 100644
index e628a34..0000000
--- a/assets/blocks/production/surge-crucible-liquid.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/surge-crucible.png b/assets/blocks/production/surge-crucible.png
deleted file mode 100644
index 33af200..0000000
--- a/assets/blocks/production/surge-crucible.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/surge-smelter.png b/assets/blocks/production/surge-smelter.png
deleted file mode 100644
index a0f863b..0000000
--- a/assets/blocks/production/surge-smelter.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/storage/core-acropolis-team.png b/assets/blocks/storage/core-acropolis-team.png
deleted file mode 100644
index 1c7a3f0..0000000
--- a/assets/blocks/storage/core-acropolis-team.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/storage/core-acropolis.png b/assets/blocks/storage/core-acropolis.png
deleted file mode 100644
index 5ad4e3e..0000000
--- a/assets/blocks/storage/core-acropolis.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/storage/core-bastion-team.png b/assets/blocks/storage/core-bastion-team.png
deleted file mode 100644
index 8848dff..0000000
--- a/assets/blocks/storage/core-bastion-team.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/storage/core-bastion.png b/assets/blocks/storage/core-bastion.png
deleted file mode 100644
index 0e8f6e5..0000000
--- a/assets/blocks/storage/core-bastion.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/storage/core-citadel-team.png b/assets/blocks/storage/core-citadel-team.png
deleted file mode 100644
index 1df2773..0000000
--- a/assets/blocks/storage/core-citadel-team.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/storage/core-citadel.png b/assets/blocks/storage/core-citadel.png
deleted file mode 100644
index 9451f70..0000000
--- a/assets/blocks/storage/core-citadel.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/storage/core-foundation-team.png b/assets/blocks/storage/core-foundation-team.png
deleted file mode 100644
index d8a5374..0000000
--- a/assets/blocks/storage/core-foundation-team.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/storage/core-foundation.png b/assets/blocks/storage/core-foundation.png
deleted file mode 100644
index 8c02e4f..0000000
--- a/assets/blocks/storage/core-foundation.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/storage/core-nucleus-team.png b/assets/blocks/storage/core-nucleus-team.png
deleted file mode 100644
index 0b9533d..0000000
--- a/assets/blocks/storage/core-nucleus-team.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/storage/core-shard-team.png b/assets/blocks/storage/core-shard-team.png
deleted file mode 100644
index d8cef0e..0000000
--- a/assets/blocks/storage/core-shard-team.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/storage/core-shard.png b/assets/blocks/storage/core-shard.png
deleted file mode 100644
index f6ce140..0000000
--- a/assets/blocks/storage/core-shard.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/storage/reinforced-container-team.png b/assets/blocks/storage/reinforced-container-team.png
deleted file mode 100644
index 9283811..0000000
--- a/assets/blocks/storage/reinforced-container-team.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/storage/reinforced-container.png b/assets/blocks/storage/reinforced-container.png
deleted file mode 100644
index 2c52768..0000000
--- a/assets/blocks/storage/reinforced-container.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/storage/reinforced-vault.png b/assets/blocks/storage/reinforced-vault.png
deleted file mode 100644
index 82afb8c..0000000
--- a/assets/blocks/storage/reinforced-vault.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/storage/unloader-center.png b/assets/blocks/storage/unloader-center.png
deleted file mode 100644
index 847b884..0000000
--- a/assets/blocks/storage/unloader-center.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/storage/unloader.png b/assets/blocks/storage/unloader.png
deleted file mode 100644
index e5f891e..0000000
--- a/assets/blocks/storage/unloader.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/storage/vault-team.png b/assets/blocks/storage/vault-team.png
deleted file mode 100644
index be63faf..0000000
--- a/assets/blocks/storage/vault-team.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/afflict.png b/assets/blocks/turrets/afflict.png
deleted file mode 100644
index 7b37826..0000000
--- a/assets/blocks/turrets/afflict.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/arc.png b/assets/blocks/turrets/arc.png
deleted file mode 100644
index be61590..0000000
--- a/assets/blocks/turrets/arc.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/breach.png b/assets/blocks/turrets/breach.png
deleted file mode 100644
index e9a490c..0000000
--- a/assets/blocks/turrets/breach.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/cyclone.png b/assets/blocks/turrets/cyclone.png
deleted file mode 100644
index 96cabd4..0000000
--- a/assets/blocks/turrets/cyclone.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/diffuse.png b/assets/blocks/turrets/diffuse.png
deleted file mode 100644
index 3475747..0000000
--- a/assets/blocks/turrets/diffuse.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/disperse.png b/assets/blocks/turrets/disperse.png
deleted file mode 100644
index 641ae4b..0000000
--- a/assets/blocks/turrets/disperse.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/duo.png b/assets/blocks/turrets/duo.png
deleted file mode 100644
index 2f7e385..0000000
--- a/assets/blocks/turrets/duo.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/foreshadow.png b/assets/blocks/turrets/foreshadow.png
deleted file mode 100644
index 381a2fe..0000000
--- a/assets/blocks/turrets/foreshadow.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/fuse.png b/assets/blocks/turrets/fuse.png
deleted file mode 100644
index bb9a0b6..0000000
--- a/assets/blocks/turrets/fuse.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/hail.png b/assets/blocks/turrets/hail.png
deleted file mode 100644
index 8250d37..0000000
--- a/assets/blocks/turrets/hail.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/lancer.png b/assets/blocks/turrets/lancer.png
deleted file mode 100644
index 9fff5ba..0000000
--- a/assets/blocks/turrets/lancer.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/lustre.png b/assets/blocks/turrets/lustre.png
deleted file mode 100644
index e436f52..0000000
--- a/assets/blocks/turrets/lustre.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/malign.png b/assets/blocks/turrets/malign.png
deleted file mode 100644
index 03e692f..0000000
--- a/assets/blocks/turrets/malign.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/meltdown.png b/assets/blocks/turrets/meltdown.png
deleted file mode 100644
index d63c8fb..0000000
--- a/assets/blocks/turrets/meltdown.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/parallax.png b/assets/blocks/turrets/parallax.png
deleted file mode 100644
index 4d581dd..0000000
--- a/assets/blocks/turrets/parallax.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/ripple.png b/assets/blocks/turrets/ripple.png
deleted file mode 100644
index 507f0b6..0000000
--- a/assets/blocks/turrets/ripple.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/salvo.png b/assets/blocks/turrets/salvo.png
deleted file mode 100644
index 09136e0..0000000
--- a/assets/blocks/turrets/salvo.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/scathe.png b/assets/blocks/turrets/scathe.png
deleted file mode 100644
index 897532a..0000000
--- a/assets/blocks/turrets/scathe.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/scatter.png b/assets/blocks/turrets/scatter.png
deleted file mode 100644
index 1cc620a..0000000
--- a/assets/blocks/turrets/scatter.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/scorch.png b/assets/blocks/turrets/scorch.png
deleted file mode 100644
index 473e8d3..0000000
--- a/assets/blocks/turrets/scorch.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/segment.png b/assets/blocks/turrets/segment.png
deleted file mode 100644
index c34929c..0000000
--- a/assets/blocks/turrets/segment.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/smite.png b/assets/blocks/turrets/smite.png
deleted file mode 100644
index 3402149..0000000
--- a/assets/blocks/turrets/smite.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/spectre.png b/assets/blocks/turrets/spectre.png
deleted file mode 100644
index 811ef6e..0000000
--- a/assets/blocks/turrets/spectre.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/sublimate.png b/assets/blocks/turrets/sublimate.png
deleted file mode 100644
index 5155235..0000000
--- a/assets/blocks/turrets/sublimate.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/swarmer.png b/assets/blocks/turrets/swarmer.png
deleted file mode 100644
index 1680beb..0000000
--- a/assets/blocks/turrets/swarmer.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/titan.png b/assets/blocks/turrets/titan.png
deleted file mode 100644
index e781843..0000000
--- a/assets/blocks/turrets/titan.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/tsunami.png b/assets/blocks/turrets/tsunami.png
deleted file mode 100644
index 6f72793..0000000
--- a/assets/blocks/turrets/tsunami.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/wave.png b/assets/blocks/turrets/wave.png
deleted file mode 100644
index 360994d..0000000
--- a/assets/blocks/turrets/wave.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/additive-reconstructor-top.png b/assets/blocks/units/additive-reconstructor-top.png
deleted file mode 100644
index 235e672..0000000
--- a/assets/blocks/units/additive-reconstructor-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/additive-reconstructor.png b/assets/blocks/units/additive-reconstructor.png
deleted file mode 100644
index fbc893b..0000000
--- a/assets/blocks/units/additive-reconstructor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/air-factory.png b/assets/blocks/units/air-factory.png
deleted file mode 100644
index 0644c21..0000000
--- a/assets/blocks/units/air-factory.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/basic-assembler-module-side1.png b/assets/blocks/units/basic-assembler-module-side1.png
deleted file mode 100644
index 2bc2f85..0000000
--- a/assets/blocks/units/basic-assembler-module-side1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/basic-assembler-module-side2.png b/assets/blocks/units/basic-assembler-module-side2.png
deleted file mode 100644
index 6ac7279..0000000
--- a/assets/blocks/units/basic-assembler-module-side2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/basic-assembler-module.png b/assets/blocks/units/basic-assembler-module.png
deleted file mode 100644
index 328c982..0000000
--- a/assets/blocks/units/basic-assembler-module.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/exponential-reconstructor-top.png b/assets/blocks/units/exponential-reconstructor-top.png
deleted file mode 100644
index fb14b35..0000000
--- a/assets/blocks/units/exponential-reconstructor-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/exponential-reconstructor.png b/assets/blocks/units/exponential-reconstructor.png
deleted file mode 100644
index d448f39..0000000
--- a/assets/blocks/units/exponential-reconstructor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/ground-factory.png b/assets/blocks/units/ground-factory.png
deleted file mode 100644
index 4897ec4..0000000
--- a/assets/blocks/units/ground-factory.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/mech-assembler-side1.png b/assets/blocks/units/mech-assembler-side1.png
deleted file mode 100644
index bfa591c..0000000
--- a/assets/blocks/units/mech-assembler-side1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/mech-assembler-side2.png b/assets/blocks/units/mech-assembler-side2.png
deleted file mode 100644
index 9cd4cde..0000000
--- a/assets/blocks/units/mech-assembler-side2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/mech-assembler-top.png b/assets/blocks/units/mech-assembler-top.png
deleted file mode 100644
index eaeb699..0000000
--- a/assets/blocks/units/mech-assembler-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/mech-assembler.png b/assets/blocks/units/mech-assembler.png
deleted file mode 100644
index d49f5a2..0000000
--- a/assets/blocks/units/mech-assembler.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/mech-fabricator-top.png b/assets/blocks/units/mech-fabricator-top.png
deleted file mode 100644
index d4e4d62..0000000
--- a/assets/blocks/units/mech-fabricator-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/mech-fabricator.png b/assets/blocks/units/mech-fabricator.png
deleted file mode 100644
index 2556a96..0000000
--- a/assets/blocks/units/mech-fabricator.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/mech-refabricator-top.png b/assets/blocks/units/mech-refabricator-top.png
deleted file mode 100644
index 48446c0..0000000
--- a/assets/blocks/units/mech-refabricator-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/mech-refabricator.png b/assets/blocks/units/mech-refabricator.png
deleted file mode 100644
index 5d89f8f..0000000
--- a/assets/blocks/units/mech-refabricator.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/multiplicative-reconstructor-top.png b/assets/blocks/units/multiplicative-reconstructor-top.png
deleted file mode 100644
index e319530..0000000
--- a/assets/blocks/units/multiplicative-reconstructor-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/multiplicative-reconstructor.png b/assets/blocks/units/multiplicative-reconstructor.png
deleted file mode 100644
index 5ea5f9f..0000000
--- a/assets/blocks/units/multiplicative-reconstructor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/naval-factory.png b/assets/blocks/units/naval-factory.png
deleted file mode 100644
index f022ba2..0000000
--- a/assets/blocks/units/naval-factory.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/prime-refabricator-top.png b/assets/blocks/units/prime-refabricator-top.png
deleted file mode 100644
index 675639a..0000000
--- a/assets/blocks/units/prime-refabricator-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/prime-refabricator.png b/assets/blocks/units/prime-refabricator.png
deleted file mode 100644
index d48e63c..0000000
--- a/assets/blocks/units/prime-refabricator.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/repair-point.png b/assets/blocks/units/repair-point.png
deleted file mode 100644
index 1f81c2c..0000000
--- a/assets/blocks/units/repair-point.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/repair-turret.png b/assets/blocks/units/repair-turret.png
deleted file mode 100644
index f410dbf..0000000
--- a/assets/blocks/units/repair-turret.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/ship-assembler-side1.png b/assets/blocks/units/ship-assembler-side1.png
deleted file mode 100644
index ec57520..0000000
--- a/assets/blocks/units/ship-assembler-side1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/ship-assembler-side2.png b/assets/blocks/units/ship-assembler-side2.png
deleted file mode 100644
index 5bac81c..0000000
--- a/assets/blocks/units/ship-assembler-side2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/ship-assembler-top.png b/assets/blocks/units/ship-assembler-top.png
deleted file mode 100644
index c055289..0000000
--- a/assets/blocks/units/ship-assembler-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/ship-assembler.png b/assets/blocks/units/ship-assembler.png
deleted file mode 100644
index 1617c27..0000000
--- a/assets/blocks/units/ship-assembler.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/ship-fabricator-top.png b/assets/blocks/units/ship-fabricator-top.png
deleted file mode 100644
index b120238..0000000
--- a/assets/blocks/units/ship-fabricator-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/ship-fabricator.png b/assets/blocks/units/ship-fabricator.png
deleted file mode 100644
index 3f02145..0000000
--- a/assets/blocks/units/ship-fabricator.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/ship-refabricator-top.png b/assets/blocks/units/ship-refabricator-top.png
deleted file mode 100644
index aa8cc85..0000000
--- a/assets/blocks/units/ship-refabricator-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/ship-refabricator.png b/assets/blocks/units/ship-refabricator.png
deleted file mode 100644
index 1c921a4..0000000
--- a/assets/blocks/units/ship-refabricator.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/tank-assembler-side1.png b/assets/blocks/units/tank-assembler-side1.png
deleted file mode 100644
index 6ea0859..0000000
--- a/assets/blocks/units/tank-assembler-side1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/tank-assembler-side2.png b/assets/blocks/units/tank-assembler-side2.png
deleted file mode 100644
index c549831..0000000
--- a/assets/blocks/units/tank-assembler-side2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/tank-assembler-top.png b/assets/blocks/units/tank-assembler-top.png
deleted file mode 100644
index 1478f2c..0000000
--- a/assets/blocks/units/tank-assembler-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/tank-assembler.png b/assets/blocks/units/tank-assembler.png
deleted file mode 100644
index 74e2017..0000000
--- a/assets/blocks/units/tank-assembler.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/tank-fabricator-top.png b/assets/blocks/units/tank-fabricator-top.png
deleted file mode 100644
index 18ef34f..0000000
--- a/assets/blocks/units/tank-fabricator-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/tank-fabricator.png b/assets/blocks/units/tank-fabricator.png
deleted file mode 100644
index 91eec5d..0000000
--- a/assets/blocks/units/tank-fabricator.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/tank-refabricator-top.png b/assets/blocks/units/tank-refabricator-top.png
deleted file mode 100644
index f57933e..0000000
--- a/assets/blocks/units/tank-refabricator-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/tank-refabricator.png b/assets/blocks/units/tank-refabricator.png
deleted file mode 100644
index 3d73664..0000000
--- a/assets/blocks/units/tank-refabricator.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/tetrative-reconstructor-top.png b/assets/blocks/units/tetrative-reconstructor-top.png
deleted file mode 100644
index 9db3308..0000000
--- a/assets/blocks/units/tetrative-reconstructor-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/tetrative-reconstructor.png b/assets/blocks/units/tetrative-reconstructor.png
deleted file mode 100644
index 391f483..0000000
--- a/assets/blocks/units/tetrative-reconstructor.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/unit-cargo-loader.png b/assets/blocks/units/unit-cargo-loader.png
deleted file mode 100644
index 6b8de38..0000000
--- a/assets/blocks/units/unit-cargo-loader.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/units/unit-repair-tower.png b/assets/blocks/units/unit-repair-tower.png
deleted file mode 100644
index 59530d8..0000000
--- a/assets/blocks/units/unit-repair-tower.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/beryllium-wall-large.png b/assets/blocks/walls/beryllium-wall-large.png
deleted file mode 100644
index 6280f13..0000000
--- a/assets/blocks/walls/beryllium-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/beryllium-wall.png b/assets/blocks/walls/beryllium-wall.png
deleted file mode 100644
index 575bfe0..0000000
--- a/assets/blocks/walls/beryllium-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/blast-door-open.png b/assets/blocks/walls/blast-door-open.png
deleted file mode 100644
index ba18d5a..0000000
--- a/assets/blocks/walls/blast-door-open.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/blast-door.png b/assets/blocks/walls/blast-door.png
deleted file mode 100644
index 088eed5..0000000
--- a/assets/blocks/walls/blast-door.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/carbide-wall-large.png b/assets/blocks/walls/carbide-wall-large.png
deleted file mode 100644
index 959b005..0000000
--- a/assets/blocks/walls/carbide-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/carbide-wall.png b/assets/blocks/walls/carbide-wall.png
deleted file mode 100644
index 98ea5f4..0000000
--- a/assets/blocks/walls/carbide-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/copper-wall.png b/assets/blocks/walls/copper-wall.png
deleted file mode 100644
index 04d0cf8..0000000
--- a/assets/blocks/walls/copper-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/door-large-open.png b/assets/blocks/walls/door-large-open.png
deleted file mode 100644
index bd1a2b1..0000000
--- a/assets/blocks/walls/door-large-open.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/door-large.png b/assets/blocks/walls/door-large.png
deleted file mode 100644
index 3527334..0000000
--- a/assets/blocks/walls/door-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/door-open.png b/assets/blocks/walls/door-open.png
deleted file mode 100644
index 78e5708..0000000
--- a/assets/blocks/walls/door-open.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/door.png b/assets/blocks/walls/door.png
deleted file mode 100644
index 63d2431..0000000
--- a/assets/blocks/walls/door.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/phase-wall-large.png b/assets/blocks/walls/phase-wall-large.png
deleted file mode 100644
index c571315..0000000
--- a/assets/blocks/walls/phase-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/phase-wall.png b/assets/blocks/walls/phase-wall.png
deleted file mode 100644
index ffd84f0..0000000
--- a/assets/blocks/walls/phase-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/plastanium-wall-large.png b/assets/blocks/walls/plastanium-wall-large.png
deleted file mode 100644
index 3c61d22..0000000
--- a/assets/blocks/walls/plastanium-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/plastanium-wall.png b/assets/blocks/walls/plastanium-wall.png
deleted file mode 100644
index 2278aa3..0000000
--- a/assets/blocks/walls/plastanium-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/reinforced-surge-wall-large.png b/assets/blocks/walls/reinforced-surge-wall-large.png
deleted file mode 100644
index 626dc9e..0000000
--- a/assets/blocks/walls/reinforced-surge-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/reinforced-surge-wall.png b/assets/blocks/walls/reinforced-surge-wall.png
deleted file mode 100644
index 2268733..0000000
--- a/assets/blocks/walls/reinforced-surge-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/scrap-wall-huge.png b/assets/blocks/walls/scrap-wall-huge.png
deleted file mode 100644
index d5c5822..0000000
--- a/assets/blocks/walls/scrap-wall-huge.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/scrap-wall-large.png b/assets/blocks/walls/scrap-wall-large.png
deleted file mode 100644
index 5785da4..0000000
--- a/assets/blocks/walls/scrap-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/scrap-wall.png b/assets/blocks/walls/scrap-wall.png
deleted file mode 100644
index 49ac797..0000000
--- a/assets/blocks/walls/scrap-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/surge-wall-large.png b/assets/blocks/walls/surge-wall-large.png
deleted file mode 100644
index 6ecdbfa..0000000
--- a/assets/blocks/walls/surge-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/surge-wall.png b/assets/blocks/walls/surge-wall.png
deleted file mode 100644
index 5a24918..0000000
--- a/assets/blocks/walls/surge-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/thorium-wall.png b/assets/blocks/walls/thorium-wall.png
deleted file mode 100644
index 6e10b09..0000000
--- a/assets/blocks/walls/thorium-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/thruster-top.png b/assets/blocks/walls/thruster-top.png
deleted file mode 100644
index 4b8e315..0000000
--- a/assets/blocks/walls/thruster-top.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/titanium-wall.png b/assets/blocks/walls/titanium-wall.png
deleted file mode 100644
index d712b42..0000000
--- a/assets/blocks/walls/titanium-wall.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/tungsten-wall-large.png b/assets/blocks/walls/tungsten-wall-large.png
deleted file mode 100644
index 8f10e22..0000000
--- a/assets/blocks/walls/tungsten-wall-large.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/walls/tungsten-wall.png b/assets/blocks/walls/tungsten-wall.png
deleted file mode 100644
index d8d7615..0000000
--- a/assets/blocks/walls/tungsten-wall.png
+++ /dev/null
Binary files differ
diff --git a/build.rs b/build.rs
deleted file mode 100644
index 94230a4..0000000
--- a/build.rs
+++ /dev/null
@@ -1,115 +0,0 @@
-#![feature(let_chains)]
-use image::codecs::png::PngDecoder;
-use image::DynamicImage;
-use std::fs::File;
-use std::io::{BufReader, Write as _};
-use std::iter::Iterator;
-use std::path::Path;
-use walkdir::WalkDir;
-
-macro_rules! wr {
- ($dst:expr => $($arg:tt)*) => { writeln!($dst, $($arg)*).unwrap() };
-}
-
-fn kebab2bigsnek(kebab: &str) -> String {
- let mut n = String::new();
- n.reserve(kebab.len());
- for c in kebab.chars() {
- if c == '-' {
- n.push('_');
- } else {
- n.push(c.to_ascii_uppercase());
- }
- }
- n
-}
-
-fn main() {
- let _ = std::fs::remove_dir_all("target/out");
- let walkdir = WalkDir::new("assets");
- println!("cargo:rerun-if-changed=assets/");
- println!("cargo:rerun-if-changed=build.rs");
- let o = std::env::var("OUT_DIR").unwrap();
- let o = Path::new(&o);
- let mut full = File::create(o.join("full.rs")).unwrap();
- // let mut half = File::create(o.join("half.rs")).unwrap();
- let mut quar = File::create(o.join("quar.rs")).unwrap();
- let mut eigh = File::create(o.join("eigh.rs")).unwrap();
- let mut n = 22usize;
-
- wr!(full => "pub mod full {{");
- wr!(full => "pub static EMPTY: Image<&[u8], 4> = Image::new(unsafe {{ std::num::NonZeroU32::new_unchecked(32) }}, unsafe {{ std::num::NonZeroU32::new_unchecked(32) }}, &[0; 32 * 32 * 4]);");
-
- wr!(quar => "pub mod quar {{");
- // forced to do this because try_into isnt const
- wr!(quar => "pub static EMPTY: Image<&[u8], 4> = Image::new(unsafe {{ std::num::NonZeroU32::new_unchecked(8) }}, unsafe {{ std::num::NonZeroU32::new_unchecked(8) }}, &[0; 8 * 8 * 4]);");
-
- wr!(eigh => "pub mod eigh {{");
- wr!(eigh => "pub static EMPTY: Image<&[u8], 4> = Image::new(unsafe {{ std::num::NonZeroU32::new_unchecked(4) }}, unsafe {{ std::num::NonZeroU32::new_unchecked(4) }}, &[0; 4 * 4 * 4]);");
-
- for mut file in [&full, &quar, &eigh] {
- wr!(file => "use crate::utils::Image;");
- wr!(file => "pub static CLIFF: Image<&[u8], 4> = EMPTY.copy();");
- for i in 1..=16 {
- wr!(file => "pub static BUILD{}: Image<&[u8], 4> = EMPTY.copy();", i);
- }
- }
- for e in walkdir.into_iter().filter_map(Result::ok) {
- let path = e.path();
- if path.is_file() && let Some(e) = path.extension() && e == "png" {
- let p = DynamicImage::from_decoder(PngDecoder::new(BufReader::new(File::open(path).unwrap())).unwrap()).unwrap().into_rgba8();
- if path.file_name().unwrap().to_str().unwrap().contains("-liquid.png") {
- continue
- }
- let f = path.file_name().unwrap().to_str().unwrap();
- if f.contains("bottom") || f.contains("-team") || f.contains("-end") || f.contains("stack") {
- continue;
- }
- let path = kebab2bigsnek(path.with_extension("").file_name().unwrap().to_str().unwrap());
- if matches!(path.as_str(), "CLIFF_CRUSHER_ROTATOR" | "NEOPLASIA_REACTOR_CENTER" | "FLUX_REACTOR_MID" | "EDGE" | "PHASE_CONVEYOR_BRIDGE" | "BRIDGE_ARROW" | "DUCT_BRIDGE_BRIDGE" | "DUCT_BRIDGE_ARROW" | "LAUNCHPOD" | "BRIDGE_CONVEYOR_BRIDGE" | "BRIDGE_CONVEYOR_ARROW" | "PHASE_CONVEYOR_ARROW" | "REINFORCED_BRIDGE_CONDUIT_ARROW" | "REINFORCED_BRIDGE_CONDUIT_BRIDGE" | "PHASE_CONDUIT_BRIDGE" | "BRIDGE_CONDUIT_ARROW" | "PHASE_CONDUIT_ARROW" | "BRIDGE_CONDUIT_BRIDGE" | "PLATED_CONDUIT_CAP") {
- continue
- }
- macro_rules! writ {
- ($ext:ident / $scale:literal) => {
- let mut buf = File::create(o.join(n.to_string() + "-" + stringify!($ext))).unwrap();
- let new = if $scale == 1 {
- p.clone()
- } else {
- // boulders
- let (mx, my) = if p.width() + p.height() == 48+48 {
- (32, 32)
- // vents (dont match VENT_CONDENSER, do match (RHYOLITE_VENT)
- } else if path.contains("_VENT")
- // talls
- || matches!(path.as_str(), "YELLOWCORAL" | "WHITE_TREE" | "WHITE_TREE_DEAD" | "REDWEED" | "SPORE_CLUSTER" | "CRYSTAL_BLOCKS" | "CRYSTAL_CLUSTER" | "VIBRANT_CRYSTAL_CLUSTER" | "CRYSTAL_ORBS") {
- (32, 32)
- } else {
- (p.height(), p.height())
- };
- image::imageops::resize(
- &p,
- mx / $scale,
- my / $scale,
- image::imageops::Nearest,
- )
- };
- let x = new.width();
- let y = new.height();
- buf.write_all(&new.into_raw()).unwrap();
- wr!($ext =>
- r#"pub(crate) static {path}: Image<&[u8], 4> = Image::new(unsafe {{ std::num::NonZeroU32::new_unchecked( {x} ) }}, unsafe {{ std::num::NonZeroU32::new_unchecked( {y} ) }}, include_bytes!(concat!(env!("OUT_DIR"), "/{n}-{}")));"#,
- stringify!($ext)
- );
- };
- }
- writ!(full / 1);
- // writ!(half + 0.5);
- writ!(quar / 4);
- writ!(eigh / 8);
- n += 1;
- }
- }
- for mut f in [full, eigh, quar] {
- f.write_all(b"}").unwrap();
- }
-}
diff --git a/lemu/.gitignore b/lemu/.gitignore
new file mode 100644
index 0000000..53739ff
--- /dev/null
+++ b/lemu/.gitignore
@@ -0,0 +1 @@
+image*.png
diff --git a/lemu/Cargo.toml b/lemu/Cargo.toml
new file mode 100644
index 0000000..551d41f
--- /dev/null
+++ b/lemu/Cargo.toml
@@ -0,0 +1,36 @@
+[package]
+name = "lemu"
+version = "0.2.22"
+edition = "2024"
+description = "M-LOG runner"
+authors = ["bend-n <[email protected]>"]
+repository = "https://github.com/bend-n/mindus.git"
+license = "MIT"
+readme = "README.md"
+keywords = ["mindustry", "logic", "emulator", "executor"]
+
+[dependencies]
+thiserror = "1.0"
+enum_dispatch = "0.3"
+fimg = { version = "0.4.52", default-features = false }
+logos = "0.14.0"
+rust-fuzzy-search = { version = "0.1.1", optional = true }
+beef = "0.5"
+lerr = { version = "0.1.5", optional = true }
+comat = { version = "0.1.2", optional = true }
+vecto = "0.1.1"
+phf = { version = "0.12.1", features = ["macros"] }
+atools = "0.1.7"
+car = "0.1.2"
+
+[features]
+debug = ["comat"]
+bin = ["fimg/save", "diagnose"]
+diagnose = ["rust-fuzzy-search", "lerr", "comat"]
+default = ["bin"]
+
+[[bin]]
+name = "lemu"
+doc = false
+required-features = ["bin"]
+path = "src/main.rs"
diff --git a/lemu/LICENSE b/lemu/LICENSE
new file mode 100644
index 0000000..8c33164
--- /dev/null
+++ b/lemu/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2026 bendn
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/lemu/README.md b/lemu/README.md
new file mode 100644
index 0000000..34044f9
--- /dev/null
+++ b/lemu/README.md
@@ -0,0 +1,11 @@
+# lemu
+
+mindustry Logic EMUlator.
+
+## Usage
+
+```rust
+use lemu::Executor;
+let mut lex = Executor::with_output(std::io::stdout()).program(r#"print "hello world""#).expect("program ok");
+lex.run();
+``` \ No newline at end of file
diff --git a/lemu/rust-toolchain.toml b/lemu/rust-toolchain.toml
new file mode 100644
index 0000000..5d56faf
--- /dev/null
+++ b/lemu/rust-toolchain.toml
@@ -0,0 +1,2 @@
+[toolchain]
+channel = "nightly"
diff --git a/lemu/rustfmt.toml b/lemu/rustfmt.toml
new file mode 100644
index 0000000..d4d3d50
--- /dev/null
+++ b/lemu/rustfmt.toml
@@ -0,0 +1 @@
+version = "Two" \ No newline at end of file
diff --git a/lemu/speed.mlog b/lemu/speed.mlog
new file mode 100644
index 0000000..3931523
--- /dev/null
+++ b/lemu/speed.mlog
@@ -0,0 +1,7 @@
+set n 10000000
+loop:
+ jump ret lessThanEq n 0
+ op sub n n 1
+ jump loop always
+ret:
+ end
diff --git a/lemu/src/celliterate.mlog b/lemu/src/celliterate.mlog
new file mode 100644
index 0000000..d0a53ec
--- /dev/null
+++ b/lemu/src/celliterate.mlog
@@ -0,0 +1,3 @@
+read result cell1 0
+op add result result 1
+write result cell1 0
diff --git a/lemu/src/code.rs b/lemu/src/code.rs
new file mode 100644
index 0000000..b57cb55
--- /dev/null
+++ b/lemu/src/code.rs
@@ -0,0 +1,62 @@
+use crate::debug::{info::DebugInfo, printable::Printable};
+
+use super::{
+ instructions::{DrawInstr, Instr},
+ lexer::Token,
+};
+
+#[derive(Debug)]
+pub enum PInstr<'s> {
+ Instr(Instr),
+ Draw(DrawInstr),
+ Code(Box<[Token<'s>]>),
+ Comment(&'s str),
+}
+
+impl Printable for PInstr<'_> {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl std::fmt::Write) -> std::fmt::Result {
+ match self {
+ Self::Instr(i) => i.print(info, f),
+ Self::Draw(i) => i.print(info, f),
+ Self::Code(c) => {
+ let mut toks = c.iter();
+ if let Some(t) = toks.next() {
+ write!(f, "{t}")?;
+ }
+ for token in toks {
+ write!(f, " {token}")?;
+ }
+ Ok(())
+ }
+ Self::Comment(c) => write!(f, "{c}"),
+ }
+ }
+}
+
+impl Printable for Code<'_> {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl std::fmt::Write) -> std::fmt::Result {
+ for instr in &*self.0 {
+ instr.print(info, f)?;
+ writeln!(f)?;
+ }
+ Ok(())
+ }
+}
+
+#[repr(transparent)]
+#[derive(Debug)]
+pub struct Code<'s>(Box<[PInstr<'s>]>);
+
+// Pin requires
+impl<'s> std::ops::Deref for Code<'s> {
+ type Target = [PInstr<'s>];
+
+ fn deref(&self) -> &Self::Target {
+ &self.0
+ }
+}
+impl<'s> Code<'s> {
+ pub(crate) fn new(code: Box<[PInstr<'s>]>) -> Self {
+ Self(code)
+ }
+}
diff --git a/lemu/src/debug/info.rs b/lemu/src/debug/info.rs
new file mode 100644
index 0000000..e23f23b
--- /dev/null
+++ b/lemu/src/debug/info.rs
@@ -0,0 +1,58 @@
+use std::ops::Range;
+
+use crate::{
+ executor::Instruction,
+ memory::{LAddress, LVar},
+};
+
+pub struct DebugInfo<'s> {
+ pub variables: Box<[VarInfo<'s>]>,
+ /// maps "start" to 0
+ pub labels: Vec<(&'s str, Instruction)>,
+}
+
+impl<'s> Default for DebugInfo<'s> {
+ fn default() -> Self {
+ Self {
+ variables: vec![].into(),
+ labels: vec![],
+ }
+ }
+}
+
+impl<'s> DebugInfo<'s> {
+ pub fn label(&self, of: Instruction) -> Option<&'s str> {
+ self.labels.iter().find(|(_, i)| *i == of).map(|&(x, _)| x)
+ }
+}
+
+impl<'s> std::ops::Index<LAddress> for DebugInfo<'s> {
+ type Output = VarData<'s>;
+
+ fn index(&self, index: LAddress) -> &Self::Output {
+ &self.variables[index.address as usize].data
+ }
+}
+
+#[derive(Clone, Debug)]
+pub struct VarInfo<'s> {
+ pub data: VarData<'s>,
+ #[allow(dead_code)]
+ pub span: Range<usize>,
+}
+
+#[derive(Clone, Debug)]
+pub enum VarData<'s> {
+ Variable(&'s str),
+ // not necessary, but convenient.
+ Constant(LVar<'s>),
+}
+
+impl std::fmt::Display for VarData<'_> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ match self {
+ VarData::Variable(name) => f.write_str(name),
+ VarData::Constant(c) => write!(f, "{c}"),
+ }
+ }
+}
diff --git a/lemu/src/debug/mod.rs b/lemu/src/debug/mod.rs
new file mode 100644
index 0000000..4d7ba0a
--- /dev/null
+++ b/lemu/src/debug/mod.rs
@@ -0,0 +1,24 @@
+pub mod info;
+pub mod printable;
+
+/// kill me
+pub fn ff(f: f64) -> String {
+ let mut s = f.to_string().into_bytes();
+ if let Some((dot, _)) = s.iter().enumerate().find(|&(_, b)| *b == b'.') {
+ let mut real = 0;
+ for b in &mut s[dot..].iter_mut().skip(1) {
+ match b {
+ _ if real > 4 => {
+ s.truncate(dot + real);
+ break;
+ }
+ b'1'..=b'9' => real += 1,
+ _ => {
+ s.truncate(dot + real);
+ break;
+ }
+ }
+ }
+ }
+ String::from_utf8(s).unwrap()
+}
diff --git a/lemu/src/debug/printable.rs b/lemu/src/debug/printable.rs
new file mode 100644
index 0000000..243da57
--- /dev/null
+++ b/lemu/src/debug/printable.rs
@@ -0,0 +1,7 @@
+use std::fmt::{Debug, Result, Write};
+
+use super::info::DebugInfo;
+
+pub trait Printable: Debug {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl Write) -> Result;
+}
diff --git a/lemu/src/executor/builder.rs b/lemu/src/executor/builder.rs
new file mode 100644
index 0000000..83bec1e
--- /dev/null
+++ b/lemu/src/executor/builder.rs
@@ -0,0 +1,159 @@
+use fimg::Image;
+use std::{collections::VecDeque, io::Write as Wr};
+
+use super::{
+ BANK_SIZE, CELL_SIZE, Display, DisplayState, Drawing, Executor, ExecutorContext, Instruction,
+ Limit, Memory, PInstr, UPInstr,
+};
+use crate::{
+ code::Code,
+ debug::info::DebugInfo,
+ instructions::{DrawInstr, Instr},
+ lexer::Token,
+ memory::{LRegistry, LVar},
+};
+
+/// for internal use by [parser](crate::parser) only
+pub struct ExecutorBuilderInternal<'v, W: Wr> {
+ displays: Box<[(Image<Vec<u8>, 4>, DisplayState)]>,
+ pub(crate) program: Vec<UPInstr<'v>>,
+ output: Option<W>,
+ banks: Vec<f64>,
+ cells: Vec<f64>,
+ iteration_limit: Limit,
+ instruction_limit: Limit,
+ pub(crate) mem: Vec<LVar<'v>>,
+ pub(crate) debug_info: DebugInfo<'v>,
+}
+
+impl<'s, W: Wr> ExecutorBuilderInternal<'s, W> {
+ pub(crate) fn new(w: Option<W>, d: Vec<Image<Vec<u8>, 4>>) -> Self {
+ Self {
+ output: w,
+ displays: d
+ .into_iter()
+ .map(|d| (d, DisplayState::default()))
+ .collect(),
+ program: vec![],
+ banks: vec![],
+ cells: vec![],
+ iteration_limit: Limit::limited(1),
+ instruction_limit: Limit::Unlimited,
+ mem: Vec::with_capacity(64),
+ debug_info: DebugInfo::default(),
+ }
+ }
+
+ pub(crate) fn inslimit(&mut self, ilimit: Limit) -> &mut Self {
+ self.instruction_limit = ilimit;
+ self
+ }
+
+ pub(crate) fn itrlimit(&mut self, ilimit: Limit) -> &mut Self {
+ self.iteration_limit = ilimit;
+ self
+ }
+
+ pub(crate) fn jmp(&mut self) {
+ self.program.push(UPInstr::UnfinishedJump);
+ }
+
+ pub(crate) fn code(&mut self, v: Box<[Token<'s>]>) {
+ self.program.push(UPInstr::Code(v));
+ }
+
+ pub(crate) fn bank(&mut self, n: usize) -> Memory {
+ assert!(n != 0);
+ if n * BANK_SIZE > self.banks.len() {
+ self.banks.resize(n * BANK_SIZE, 0.0);
+ println!("resized");
+ }
+ Memory::Bank(((self.banks.len() - BANK_SIZE) / BANK_SIZE) as u8)
+ }
+
+ pub(crate) fn cell(&mut self, n: usize) -> Memory {
+ assert!(n != 0);
+ if n * CELL_SIZE > self.cells.len() {
+ self.cells.resize(n * CELL_SIZE, 0.0);
+ }
+ Memory::Cell(((self.cells.len() - CELL_SIZE) / CELL_SIZE) as u8)
+ }
+
+ pub(crate) fn next(&self) -> Instruction {
+ Instruction(self.program.len())
+ }
+
+ pub(crate) fn last(&self) -> Instruction {
+ Instruction(self.program.len() - 1)
+ }
+
+ pub(crate) fn add(&mut self, i: impl Into<Instr>) {
+ self.program.push(UPInstr::Instr(i.into()));
+ }
+
+ pub(crate) fn draw(&mut self, i: impl Into<DrawInstr>) {
+ self.program.push(UPInstr::Draw(i.into()));
+ }
+
+ pub(crate) fn valid(&self, Instruction(i): Instruction) -> bool {
+ self.program.len() > i
+ }
+
+ pub(crate) fn display(&mut self, n: usize) -> Result<Display, usize> {
+ self.displays
+ .get(n.checked_sub(1).ok_or(n)?)
+ .map(|_| Display(n - 1))
+ .ok_or(n)
+ }
+
+ pub(crate) fn finish(self) -> Executor<'s, W> {
+ fn cst<const N: usize>(a: Vec<f64>) -> Box<[[f64; N]]> {
+ let len = a.len();
+ let ptr: *mut [f64] = Box::into_raw(a.into());
+ let ptr: *mut [[f64; N]] =
+ core::ptr::slice_from_raw_parts_mut(ptr.cast::<[f64; N]>(), len / N);
+ unsafe { Box::from_raw(ptr) }
+ }
+ let program = Code::new(
+ self.program
+ .into_iter()
+ .map(|v| match v {
+ UPInstr::Instr(i) => PInstr::Instr(i),
+ UPInstr::Draw(i) => PInstr::Draw(i),
+ UPInstr::Comment(c) => PInstr::Comment(c),
+ UPInstr::UnfinishedJump => panic!("all jumps should have finished"),
+ UPInstr::Code(c) => PInstr::Code(c),
+ })
+ .collect::<Box<[PInstr]>>(),
+ );
+ let Self {
+ instruction_limit,
+ iteration_limit,
+ displays,
+ output,
+ banks,
+ debug_info,
+ cells,
+ mem,
+ ..
+ } = self;
+ Executor {
+ instruction_limit,
+ iteration_limit,
+ inner: ExecutorContext {
+ cells: cst::<CELL_SIZE>(cells),
+ banks: cst::<BANK_SIZE>(banks),
+ memory: LRegistry(mem.into()),
+ iterations: 0,
+ display: Drawing {
+ displays,
+ buffer: VecDeque::new(),
+ },
+ output,
+ },
+ instructions_ran: 0,
+ debug_info,
+ program,
+ }
+ }
+}
diff --git a/lemu/src/executor/mod.rs b/lemu/src/executor/mod.rs
new file mode 100644
index 0000000..0989bc0
--- /dev/null
+++ b/lemu/src/executor/mod.rs
@@ -0,0 +1,320 @@
+mod builder;
+const COUNTER: LAddress = unsafe { LAddress::addr(0) };
+use crate::{
+ debug::{info::DebugInfo, printable::Printable},
+ instructions::draw::Drawn,
+};
+
+use super::{
+ code::{Code, PInstr},
+ instructions::{DrawInstr, Flow, Frozen, Instr, LInstruction},
+ lexer::Token,
+ memory::{LAddress, LRegistry, LVar},
+};
+pub use builder::ExecutorBuilderInternal;
+use fimg::Image;
+use std::{collections::VecDeque, io::Write, num::NonZeroUsize};
+
+#[derive(Debug, Copy, Clone, Default)]
+pub struct Display(pub usize);
+
+impl std::fmt::Display for Display {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ write!(f, "display{}", self.0 + 1)
+ }
+}
+
+#[derive(Debug, Copy, Clone)]
+pub enum Memory {
+ Cell(u8),
+ Bank(u8),
+}
+
+impl Memory {
+ pub(crate) const fn fits(self, i: usize) -> bool {
+ match self {
+ Self::Bank(_) => i < BANK_SIZE,
+ Self::Cell(_) => i < CELL_SIZE,
+ }
+ }
+
+ pub(crate) const fn size(&self) -> usize {
+ match self {
+ Self::Bank(_) => BANK_SIZE,
+ Self::Cell(_) => CELL_SIZE,
+ }
+ }
+}
+
+impl std::fmt::Display for Memory {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ match self {
+ Self::Bank(n) => write!(f, "bank{}", n + 1),
+ Self::Cell(n) => write!(f, "cell{}", n + 1),
+ }
+ }
+}
+
+pub const BANK_SIZE: usize = 512;
+pub const CELL_SIZE: usize = 64;
+
+#[derive(Copy, Clone, PartialEq, Eq)]
+pub struct Instruction(usize);
+
+impl Instruction {
+ /// # Safety
+ /// verify n is valid.
+ pub const unsafe fn new(n: usize) -> Self {
+ Self(n)
+ }
+
+ pub const fn get(self) -> usize {
+ self.0
+ }
+}
+
+impl std::fmt::Debug for Instruction {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ write!(f, "Instruction#{}", self.0)
+ }
+}
+
+#[derive(Debug, Copy, Clone)]
+pub enum Limit {
+ /// limited to n
+ Limited(NonZeroUsize),
+ /// unlimited
+ Unlimited,
+}
+
+impl Limit {
+ /// panics if n != 0
+ pub fn limited(n: usize) -> Self {
+ Self::Limited(n.try_into().expect("nonzero"))
+ }
+}
+
+impl Limit {
+ pub(crate) const fn reached(self, n: usize) -> bool {
+ match self {
+ Self::Limited(v) => v.get() <= n,
+ Self::Unlimited => false,
+ }
+ }
+}
+
+/// One time use logic executor.
+pub struct Executor<'varnames, W: Write> {
+ /// if limited, will run n instructions before exiting.
+ pub instruction_limit: Limit,
+ /// if limtited, will loop(go from a end to the start) n times before exiting
+ /// both unlimited does not mean this function will never return;
+ /// a `Stop` instruction will break the loop.
+ pub iteration_limit: Limit,
+ pub(crate) inner: ExecutorContext<'varnames, W>,
+ /// gets pointed to by drawbuf (pls no move)
+ pub(crate) program: Code<'varnames>,
+ /// Counter for the number of instructions we have run so far.
+ pub instructions_ran: usize,
+ debug_info: DebugInfo<'varnames>,
+}
+
+impl<W: Write> std::fmt::Display for Executor<'_, W> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ self.program.print(&self.debug_info, f)
+ }
+}
+
+#[derive(Debug)]
+pub enum UPInstr<'s> {
+ Instr(Instr),
+ Draw(DrawInstr),
+ UnfinishedJump,
+ Code(Box<[Token<'s>]>),
+ Comment(&'s str),
+}
+
+pub struct Drawing {
+ pub displays: Box<[(fimg::Image<Vec<u8>, 4>, DisplayState)]>,
+ pub buffer: VecDeque<Drawn>,
+}
+
+impl Drawing {
+ fn buffer(&mut self, i: Drawn) {
+ self.buffer.push_back(i);
+ }
+}
+pub struct ExecutorContext<'strings, W: Write> {
+ // maximum of 128 elements, so can use ~60KB
+ pub cells: Box<[[f64; CELL_SIZE]]>, // screw world cells
+ // maximum of 127 elements, so can use ~500KB
+ pub banks: Box<[[f64; BANK_SIZE]]>,
+ pub memory: LRegistry<'strings>,
+ pub display: Drawing,
+ pub output: Option<W>,
+ /// Counter for the number of iterations we have run so far.
+ pub iterations: usize,
+}
+
+/// State of a display.
+#[derive(Debug)]
+pub struct DisplayState {
+ /// Color to draw
+ pub color: (u8, u8, u8, u8),
+ /// Stroke to draw
+ pub stroke: f64,
+}
+
+impl DisplayState {
+ pub const fn col(&self) -> [u8; 4] {
+ [self.color.0, self.color.1, self.color.2, self.color.3]
+ }
+}
+
+impl Default for DisplayState {
+ fn default() -> Self {
+ Self {
+ color: Default::default(),
+ stroke: 5.0,
+ }
+ }
+}
+
+impl<'s, W: Write> ExecutorContext<'s, W> {
+ pub fn flush(&mut self, to: Display) {
+ let (img, state) = &mut self.display.displays[to.0];
+ while let Some(d) = self.display.buffer.pop_front() {
+ use crate::instructions::draw::Apply;
+ #[cfg(feature = "debug")]
+ comat::cprintln!("{d:blue}");
+ d.apply(img.as_mut(), state);
+ }
+ }
+
+ pub fn mem(&mut self, m: Memory) -> &mut [f64] {
+ match m {
+ Memory::Bank(m) => &mut self.banks[m as usize],
+ Memory::Cell(m) => &mut self.cells[m as usize],
+ }
+ }
+
+ pub fn set(&mut self, a: LAddress, b: LAddress) {
+ self.memory[a] = self.memory[b].clone();
+ }
+
+ pub fn get_mut(&mut self, a: LAddress) -> &mut LVar<'s> {
+ &mut self.memory[a]
+ }
+
+ pub fn jump(&mut self, Instruction(n): Instruction) {
+ *self.counter() = n as f64;
+ }
+
+ pub fn counter(&mut self) -> &mut f64 {
+ unsafe {
+ self.memory
+ .0
+ .get_unchecked_mut(0)
+ .num_mut()
+ .unwrap_unchecked()
+ }
+ }
+
+ pub fn get<'a>(&'a self, a: LAddress) -> &LVar<'s> {
+ &self.memory[a]
+ }
+}
+
+/// Returned by the [`output`](Executor::output).function.
+pub struct Output<W: Write> {
+ /// Everything created by a `print` instruction.
+ pub output: Option<W>,
+ /// Logic displays that were drawn with `draw` instructions.
+ pub displays: Box<[(Image<Vec<u8>, 4>, DisplayState)]>,
+ /// Memory banks, written to with the `write`/`read` instructions
+ pub cells: Box<[[f64; CELL_SIZE]]>,
+ /// Memory cells, written to with the `write`/`read` instructions
+ pub banks: Box<[[f64; BANK_SIZE]]>,
+}
+
+impl<'s, W: Write> Executor<'s, W> {
+ /// Consume this executor, returning all output.
+ pub fn output(mut self) -> Output<W> {
+ for (display, _) in &mut *self.inner.display.displays {
+ // TODO make the instructions draw flipped-ly
+ display.flip_v();
+ }
+ Output {
+ output: self.inner.output,
+ displays: self.inner.display.displays,
+ cells: self.inner.cells,
+ banks: self.inner.banks,
+ }
+ }
+
+ /// # Safety
+ ///
+ /// `counter` *must* be in bounds.
+ unsafe fn run_current(&mut self) -> Flow {
+ // SAFETY: yee
+ let c = self.inner.counter();
+ let i = unsafe { self.program.get_unchecked(*c as usize) };
+ *c += 1.0;
+ match i {
+ PInstr::Instr(i) => {
+ #[cfg(feature = "debug")]
+ {
+ let mut instr = String::new();
+ i.print(&self.debug_info, &mut instr).unwrap();
+ let mut mem = String::new();
+ self.inner.memory.print(&self.debug_info, &mut mem).unwrap();
+ comat::cprintln!(
+ "{black}{:0<2} | {green}{instr} {black}({mem}){reset}",
+ self.inner.counter(),
+ );
+ }
+
+ i.run(&mut self.inner)
+ }
+ PInstr::Draw(i) => {
+ if let Some(i) = i.freeze(&self.inner.memory) {
+ #[cfg(feature = "debug")]
+ {
+ let mut mem = String::new();
+ self.inner.memory.print(&self.debug_info, &mut mem).unwrap();
+ comat::cprintln!(
+ "{black}{:0<2} | {magenta}{i} {black}({mem}){reset}",
+ self.inner.counter()
+ );
+ }
+ self.inner.display.buffer(i)
+ }
+ Flow::Continue
+ }
+ _ => Flow::Continue,
+ }
+ }
+
+ /// Begin code execution.
+ pub fn run(&mut self) {
+ while !self.instruction_limit.reached(self.instructions_ran)
+ && !self.iteration_limit.reached(self.inner.iterations)
+ {
+ // SAFETY: we have a check
+ match unsafe { self.run_current() } {
+ Flow::Continue => {}
+ Flow::Exit => break,
+ Flow::Stay => {
+ self.instructions_ran += 1;
+ continue;
+ }
+ };
+ self.instructions_ran += 1;
+ let c = self.inner.counter();
+ if *c as usize >= self.program.len() {
+ *c = 0.0;
+ self.inner.iterations += 1;
+ }
+ }
+ }
+}
diff --git a/lemu/src/fib.mlog b/lemu/src/fib.mlog
new file mode 100644
index 0000000..6c09c3e
--- /dev/null
+++ b/lemu/src/fib.mlog
@@ -0,0 +1,15 @@
+ set n 50
+ set previous 0
+ set fib 1
+ op add end n 1
+ set i 2
+loop:
+ jump ret greaterThanEq i end
+ op add tmp previous fib
+ set previous fib
+ set fib tmp
+ op add i i 1
+ jump loop always
+ret:
+ print fib
+ stop \ No newline at end of file
diff --git a/lemu/src/hello.mlog b/lemu/src/hello.mlog
new file mode 100644
index 0000000..3aac8c4
--- /dev/null
+++ b/lemu/src/hello.mlog
@@ -0,0 +1,2 @@
+print "hello world"
+stop
diff --git a/lemu/src/instructions/cop.rs b/lemu/src/instructions/cop.rs
new file mode 100644
index 0000000..0079bfa
--- /dev/null
+++ b/lemu/src/instructions/cop.rs
@@ -0,0 +1,40 @@
+use crate::{lexer::Token, memory::LVar};
+
+super::op_enum! { pub enum ConditionOp {
+ Equal,
+ NotEqual,
+ LessThan,
+ LessThanEq,
+ GreaterThan,
+ GreaterThanEq,
+ StrictEqual,
+} }
+
+macro_rules! op {
+ ($name: ident $op:tt ) => {
+ fn $name<'v>(a: &LVar<'v>, b: &LVar<'v>) -> bool {
+ if let &LVar::Num(a) = a && let &LVar::Num(b) = b { a $op b } else { false }
+ }
+ };
+}
+
+fn eq<'v>(a: &LVar<'v>, b: &LVar<'v>) -> bool {
+ a == b
+}
+fn ne<'v>(a: &LVar<'v>, b: &LVar<'v>) -> bool {
+ a != b
+}
+op!(lt <);
+op!(gt >);
+op!(le <=);
+op!(ge >=);
+
+super::op_impl!(ConditionOp, ptr type = for<'f> fn(&LVar<'f>, &LVar<'f>) -> bool {
+ Equal => eq,
+ StrictEqual => eq,
+ NotEqual => ne,
+ LessThan => lt,
+ GreaterThan => gt,
+ LessThanEq => le,
+ GreaterThanEq => ge,
+});
diff --git a/lemu/src/instructions/draw.rs b/lemu/src/instructions/draw.rs
new file mode 100644
index 0000000..1644da0
--- /dev/null
+++ b/lemu/src/instructions/draw.rs
@@ -0,0 +1,601 @@
+use super::{Flow, LInstruction, get_num};
+use crate::{
+ debug::{info::DebugInfo, printable::Printable},
+ executor::{Display, DisplayState, ExecutorContext},
+ memory::{LAddress, LRegistry, LVar},
+};
+use enum_dispatch::enum_dispatch;
+use fimg::Image;
+use std::fmt::{self, Display as Disp};
+use vecto::Vec2;
+
+pub const INSTRS: &[&str] = &[
+ "clear", "color", "col", "stroke", "line", "rect", "lineRect", "triangle", "poly", "linePoly",
+];
+
+#[enum_dispatch]
+pub trait Apply: Disp {
+ fn apply(self, image: Image<&mut [u8], 4>, state: &mut DisplayState);
+}
+
+#[derive(Debug)]
+#[enum_dispatch(Apply)]
+pub enum Drawn {
+ Line(LineD),
+ RectBordered(RectBorderedD),
+ RectFilled(RectFilledD),
+ Triangle(TriangleD),
+ Clear(ClearD),
+ SetColor(SetColorD),
+ SetStroke(SetStrokeD),
+ Poly(PolyD),
+ LinePoly(LinePolyD),
+}
+
+impl std::fmt::Display for Drawn {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match self {
+ Self::Line(i) => write!(f, "{i}"),
+ Self::RectBordered(i) => write!(f, "{i}"),
+ Self::RectFilled(i) => write!(f, "{i}"),
+ Self::Triangle(i) => write!(f, "{i}"),
+ Self::Clear(i) => write!(f, "{i}"),
+ Self::SetColor(i) => write!(f, "{i}"),
+ Self::SetStroke(i) => write!(f, "{i}"),
+ Self::Poly(i) => write!(f, "{i}"),
+ Self::LinePoly(i) => write!(f, "{i}"),
+ }
+ }
+}
+
+pub trait Frozen<A: Apply>: Printable {
+ fn freeze(&self, mem: &LRegistry<'_>) -> Option<A>;
+}
+
+macro_rules! dinstr {
+ [$($x:ident),+] => {
+ #[derive(Debug, Copy, Clone)]
+ pub enum DrawInstr {
+ $($x($x),)+
+ }
+
+ $(impl From<$x> for DrawInstr {
+ fn from(v: $x) -> Self { Self::$x(v) }
+ })+
+
+ impl Frozen<Drawn> for DrawInstr {
+ fn freeze(&self, mem: &LRegistry<'_>) -> Option<Drawn> {
+ Some(match self {
+ $(Self::$x(i) => Drawn::from(i.freeze(mem)?),)+
+ })
+ }
+ }
+ impl Printable for DrawInstr {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ match self {
+ $(Self::$x(i) => i.print(info, f)),+
+ }
+ }
+ }
+ }
+}
+
+dinstr! {
+ Line,
+ RectBordered,
+ RectFilled,
+ Triangle,
+ Clear,
+ SetColor,
+ SetCol,
+ SetStroke,
+ Poly,
+ LinePoly
+}
+
+#[derive(Debug, Copy, Clone)]
+
+pub struct Clear {
+ pub r: LAddress,
+ pub g: LAddress,
+ pub b: LAddress,
+}
+
+#[derive(Debug, Copy, Clone)]
+pub struct ClearD((u8, u8, u8));
+
+impl Apply for ClearD {
+ fn apply(self, mut image: Image<&mut [u8], 4>, _: &mut DisplayState) {
+ let (r, g, b) = self.0;
+ for [r2, g2, b2, a2] in image.chunked_mut() {
+ (*r2, *b2, *g2, *a2) = (r, g, b, 255);
+ }
+ }
+}
+
+macro_rules! u8 {
+ ($self:ident, $mem:expr, $($v:ident)+) => {
+ ($(match $mem.get($self.$v) {
+ LVar::Num(n) => n.round() as u8,
+ _ => return None,
+ },)+)
+ };
+}
+
+impl Frozen<ClearD> for Clear {
+ fn freeze(&self, mem: &LRegistry<'_>) -> Option<ClearD> {
+ Some(ClearD(u8!(self, mem, r g b)))
+ }
+}
+
+impl Printable for Clear {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ write!(
+ f,
+ "draw clear {} {} {}",
+ info[self.r], info[self.g], info[self.b]
+ )
+ }
+}
+
+impl Disp for ClearD {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "draw clear {} {} {}", self.0.0, self.0.1, self.0.2)
+ }
+}
+
+#[derive(Debug, Copy, Clone)]
+pub struct SetColorD((u8, u8, u8, u8));
+
+impl Apply for SetColorD {
+ fn apply(self, _: Image<&mut [u8], 4>, state: &mut DisplayState) {
+ state.color = self.0;
+ }
+}
+
+#[derive(Debug, Copy, Clone)]
+
+pub struct SetColor {
+ pub r: LAddress,
+ pub g: LAddress,
+ pub b: LAddress,
+ pub a: LAddress,
+}
+
+impl Frozen<SetColorD> for SetColor {
+ fn freeze(&self, mem: &LRegistry<'_>) -> Option<SetColorD> {
+ Some(SetColorD(u8!(self, mem, r g b a)))
+ }
+}
+
+impl Printable for SetColor {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ write!(
+ f,
+ "draw color {} {} {} {}",
+ info[self.r], info[self.g], info[self.b], info[self.a]
+ )
+ }
+}
+
+#[derive(Debug, Copy, Clone)]
+pub struct SetCol {
+ pub col: LAddress,
+}
+
+impl Printable for SetCol {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ write!(f, "draw col ")?;
+ match &info[self.col] {
+ crate::debug::info::VarData::Variable(v) => write!(f, "{v}"),
+ crate::debug::info::VarData::Constant(c) => match c {
+ LVar::Num(n) => write!(f, "0x{:0<6x}", *n as u32),
+ LVar::String(s) => write!(f, r#""{s}""#),
+ },
+ }
+ }
+}
+
+impl Frozen<SetColorD> for SetCol {
+ fn freeze(&self, mem: &LRegistry<'_>) -> Option<SetColorD> {
+ let [r, g, b, a] = fimg::Pack::unpack(mem.get(self.col).num()? as u32);
+ Some(SetColorD((r, g, b, a)))
+ }
+}
+
+impl Disp for SetColorD {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(
+ f,
+ "draw color {} {} {} {}",
+ self.0.0, self.0.1, self.0.2, self.0.3
+ )
+ }
+}
+
+#[derive(Debug, Copy, Clone)]
+
+pub struct SetStroke {
+ pub size: LAddress,
+}
+
+#[derive(Debug, Copy, Clone)]
+pub struct SetStrokeD(f64);
+
+impl Apply for SetStrokeD {
+ fn apply(self, _: Image<&mut [u8], 4>, state: &mut DisplayState) {
+ state.stroke = self.0;
+ }
+}
+
+impl Frozen<SetStrokeD> for SetStroke {
+ fn freeze(&self, mem: &LRegistry<'_>) -> Option<SetStrokeD> {
+ mem.get(self.size).num().map(SetStrokeD)
+ }
+}
+
+impl Disp for SetStrokeD {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "draw stroke {}", self.0)
+ }
+}
+
+impl Printable for SetStroke {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ write!(f, "draw stroke {}", info[self.size])
+ }
+}
+
+pub type Point = (LAddress, LAddress);
+#[rustfmt::skip]
+macro_rules! point {
+ ($mem:ident@$point:expr) => {
+ ($mem.get($point.0).num()?, $mem.get($point.1).num()?)
+ }
+}
+
+macro_rules! map {
+ ($tup:expr, $fn:expr) => {{
+ let (a, b) = $tup;
+ ($fn(a), $fn(b))
+ }};
+}
+#[derive(Debug, Copy, Clone)]
+
+pub struct Line {
+ pub point_a: Point,
+ pub point_b: Point,
+}
+
+#[derive(Debug)]
+pub struct LineD(Vec2, Vec2);
+
+impl Apply for LineD {
+ fn apply(self, mut image: Image<&mut [u8], 4>, state: &mut DisplayState) {
+ image.thick_line(self.0, self.1, state.stroke as f32, state.col());
+ }
+}
+
+impl Frozen<LineD> for Line {
+ fn freeze(&self, mem: &LRegistry<'_>) -> Option<LineD> {
+ Some(LineD(
+ map!(point!([email protected]_a), |n| n as f32).into(),
+ map!(point!([email protected]_b), |n| n as f32).into(),
+ ))
+ }
+}
+
+impl Disp for LineD {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(
+ f,
+ "draw line {} {} {} {}",
+ self.0.x, self.0.y, self.1.x, self.1.y
+ )
+ }
+}
+
+impl Printable for Line {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ write!(
+ f,
+ "draw line {} {} {} {}",
+ info[self.point_a.0], info[self.point_a.1], info[self.point_b.0], info[self.point_b.1]
+ )
+ }
+}
+
+#[derive(Debug, Copy, Clone)]
+
+pub struct RectFilled {
+ pub position: Point,
+ pub width: LAddress,
+ pub height: LAddress,
+}
+
+#[derive(Debug)]
+pub struct RectFilledD((u32, u32), (u32, u32));
+
+impl Apply for RectFilledD {
+ fn apply(self, mut image: Image<&mut [u8], 4>, state: &mut DisplayState) {
+ image.filled_box(self.0, self.1.0, self.1.1, state.col());
+ }
+}
+
+impl Frozen<RectFilledD> for RectFilled {
+ fn freeze(&self, mem: &LRegistry<'_>) -> Option<RectFilledD> {
+ Some(RectFilledD(
+ map!(point!([email protected]), |n| n as u32),
+ (
+ get_num!(mem.get(self.width)) as u32,
+ get_num!(mem.get(self.height)) as u32,
+ ),
+ ))
+ }
+}
+
+impl Disp for RectFilledD {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(
+ f,
+ "draw rect {} {} {} {}",
+ self.0.0, self.0.1, self.1.0, self.1.1
+ )
+ }
+}
+
+impl Printable for RectFilled {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ write!(
+ f,
+ "draw rect {} {} {} {}",
+ info[self.position.0], info[self.position.1], info[self.width], info[self.height]
+ )
+ }
+}
+
+#[derive(Debug, Copy, Clone)]
+
+pub struct RectBordered {
+ pub position: Point,
+ pub width: LAddress,
+ pub height: LAddress,
+}
+
+impl Disp for RectBorderedD {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(
+ f,
+ "draw lineRect {} {} {} {}",
+ self.0.0, self.0.1, self.1.0, self.1.1
+ )
+ }
+}
+
+impl Printable for RectBordered {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ write!(
+ f,
+ "draw lineRect {} {} {} {}",
+ info[self.position.0], info[self.position.1], info[self.width], info[self.height]
+ )
+ }
+}
+
+#[derive(Debug)]
+pub struct RectBorderedD((u32, u32), (u32, u32));
+
+impl Apply for RectBorderedD {
+ fn apply(self, mut image: Image<&mut [u8], 4>, state: &mut DisplayState) {
+ image.stroked_box(
+ self.0,
+ self.1.0,
+ self.1.1,
+ state.stroke.round() as u32,
+ state.col(),
+ );
+ }
+}
+
+impl Frozen<RectBorderedD> for RectBordered {
+ fn freeze(&self, mem: &LRegistry<'_>) -> Option<RectBorderedD> {
+ Some(RectBorderedD(
+ map!(point!([email protected]), |n| n as u32),
+ (
+ get_num!(mem.get(self.width)) as u32,
+ get_num!(mem.get(self.height)) as u32,
+ ),
+ ))
+ }
+}
+
+#[derive(Debug, Copy, Clone)]
+
+pub struct Triangle {
+ pub points: (Point, Point, Point),
+}
+
+#[derive(Debug)]
+pub struct TriangleD(Vec2, Vec2, Vec2);
+
+impl Apply for TriangleD {
+ fn apply(self, mut image: Image<&mut [u8], 4>, state: &mut DisplayState) {
+ image.tri::<f32>(self.0, self.1, self.2, state.col());
+ }
+}
+
+impl Frozen<TriangleD> for Triangle {
+ fn freeze(&self, mem: &LRegistry<'_>) -> Option<TriangleD> {
+ Some(TriangleD(
+ map!(point!([email protected]), |n| n as f32).into(),
+ map!(point!([email protected]), |n| n as f32).into(),
+ map!(point!([email protected]), |n| n as f32).into(),
+ ))
+ }
+}
+
+impl Disp for TriangleD {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(
+ f,
+ "draw triangle {} {} {} {} {} {}",
+ self.0.x, self.0.y, self.1.x, self.1.y, self.2.x, self.2.y
+ )
+ }
+}
+
+impl Printable for Triangle {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ write!(
+ f,
+ "draw triangle {} {} {} {} {} {}",
+ info[self.points.0.0],
+ info[self.points.0.1],
+ info[self.points.1.0],
+ info[self.points.1.1],
+ info[self.points.2.0],
+ info[self.points.2.1]
+ )
+ }
+}
+
+#[derive(Debug, Copy, Clone)]
+
+pub struct Poly {
+ pub(crate) pos: Point,
+ pub(crate) sides: LAddress,
+ pub(crate) radius: LAddress,
+ pub(crate) rot: LAddress,
+}
+
+#[derive(Debug)]
+pub enum PolyD {
+ Poly(Vec2, usize, f32, f32),
+ Circle((i32, i32), i32),
+}
+
+impl Apply for PolyD {
+ fn apply(self, mut image: Image<&mut [u8], 4>, state: &mut DisplayState) {
+ match self {
+ PolyD::Poly(pos, sides, radius, rotation) => {
+ image.poly(pos, sides, radius, rotation, state.col())
+ }
+ PolyD::Circle(pos, radius) => image.circle(pos, radius, state.col()),
+ }
+ }
+}
+
+impl Frozen<PolyD> for Poly {
+ fn freeze(&self, mem: &LRegistry<'_>) -> Option<PolyD> {
+ let sides = get_num!(mem.get(self.sides)).round() as usize;
+ Some(if sides < 90 {
+ PolyD::Poly(
+ map!(point!([email protected]), |n| n as f32).into(),
+ sides,
+ get_num!(mem.get(self.radius)) as f32,
+ get_num!(mem.get(self.rot)) as f32,
+ )
+ } else {
+ PolyD::Circle(
+ map!(point!([email protected]), |n: f64| n.round() as i32),
+ get_num!(mem.get(self.radius)).round() as i32,
+ )
+ })
+ }
+}
+
+impl Disp for PolyD {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match self {
+ PolyD::Poly(Vec2 { x, y }, sides, radius, rot) => {
+ write!(f, "draw poly {x} {y} {sides} {radius} {rot}")
+ }
+ PolyD::Circle((x, y), sides) => write!(f, "draw poly {x} {y} {sides}"),
+ }
+ }
+}
+
+impl Printable for Poly {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ write!(
+ f,
+ "draw poly {} {} {} {} {}",
+ info[self.pos.0], info[self.pos.1], info[self.sides], info[self.radius], info[self.rot],
+ )
+ }
+}
+
+#[derive(Debug, Copy, Clone)]
+
+pub struct LinePoly {
+ pub(crate) pos: Point,
+ pub(crate) sides: LAddress,
+ pub(crate) radius: LAddress,
+ pub(crate) rot: LAddress,
+}
+
+#[derive(Debug)]
+/// border_Circle doesnt let you specify a stroke
+pub struct LinePolyD(Vec2, usize, f32, f32);
+
+impl Apply for LinePolyD {
+ fn apply(self, mut image: Image<&mut [u8], 4>, state: &mut DisplayState) {
+ image.border_poly(
+ self.0,
+ self.1,
+ self.2,
+ self.3,
+ state.stroke as f32,
+ state.col(),
+ )
+ }
+}
+
+impl Frozen<LinePolyD> for LinePoly {
+ fn freeze(&self, mem: &LRegistry<'_>) -> Option<LinePolyD> {
+ Some(LinePolyD(
+ map!(point!([email protected]), |n| n as f32).into(),
+ get_num!(mem.get(self.sides)).round() as usize,
+ get_num!(mem.get(self.radius)) as f32,
+ get_num!(mem.get(self.rot)) as f32,
+ ))
+ }
+}
+
+impl Disp for LinePolyD {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(
+ f,
+ "draw linePoly {} {} {} {} {}",
+ self.0.x, self.0.y, self.1, self.2, self.3
+ )
+ }
+}
+
+impl Printable for LinePoly {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ write!(
+ f,
+ "draw linePoly {} {} {} {} {}",
+ info[self.pos.0], info[self.pos.1], info[self.sides], info[self.radius], info[self.rot],
+ )
+ }
+}
+
+#[derive(Debug, Copy, Clone, Default)]
+
+pub struct Flush {
+ pub(crate) display: Display,
+}
+impl LInstruction for Flush {
+ fn run<W: std::io::Write>(&self, exec: &mut ExecutorContext<'_, W>) -> Flow {
+ exec.flush(self.display);
+ Flow::Continue
+ }
+}
+
+impl Printable for Flush {
+ fn print(&self, _: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ write!(f, "drawflush {}", self.display)
+ }
+}
diff --git a/lemu/src/instructions/io.rs b/lemu/src/instructions/io.rs
new file mode 100644
index 0000000..22d1b52
--- /dev/null
+++ b/lemu/src/instructions/io.rs
@@ -0,0 +1,90 @@
+use super::{get_num, Flow, LInstruction};
+use crate::{
+ debug::{info::DebugInfo, printable::Printable},
+ executor::{ExecutorContext, Memory},
+ memory::{LAddress, LVar},
+};
+use std::{fmt, io::Write as Wr};
+
+#[derive(Debug, Copy, Clone)]
+
+pub struct Read {
+ pub(crate) index: LAddress,
+ pub(crate) output: LAddress,
+ pub(crate) container: Memory,
+}
+
+impl LInstruction for Read {
+ fn run<W: Wr>(&self, exec: &mut ExecutorContext<'_, W>) -> Flow {
+ let i = get_num!(exec.get(self.index)).round() as usize;
+ if let Some(&n) = exec.mem(self.container).get(i) {
+ *exec.get_mut(self.output) = LVar::from(n);
+ };
+ Flow::Continue
+ }
+}
+
+impl Printable for Read {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ write!(
+ f,
+ "read {} {} {}",
+ info[self.output], self.container, info[self.index]
+ )
+ }
+}
+
+#[derive(Debug, Copy, Clone)]
+
+pub struct Write {
+ pub(crate) index: LAddress,
+ pub(crate) set: LAddress,
+ pub(crate) container: Memory,
+}
+
+impl LInstruction for Write {
+ fn run<W: Wr>(&self, exec: &mut ExecutorContext<'_, W>) -> Flow {
+ let i = get_num!(exec.get(self.index)).round() as usize;
+ if let &LVar::Num(b) = exec.get(self.set) {
+ if let Some(a) = exec.mem(self.container).get_mut(i) {
+ *a = b;
+ }
+ }
+ Flow::Continue
+ }
+}
+
+impl Printable for Write {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ write!(
+ f,
+ "write {} {} {}",
+ info[self.set], self.container, info[self.index]
+ )
+ }
+}
+
+#[derive(Debug, Copy, Clone)]
+
+pub struct Print {
+ pub(crate) val: LAddress,
+}
+impl LInstruction for Print {
+ fn run<W: Wr>(&self, exec: &mut ExecutorContext<'_, W>) -> Flow {
+ let v = exec.get(self.val).clone();
+ if let Some(o) = &mut exec.output {
+ match v {
+ LVar::Num(n) => write!(o, "{n}"),
+ LVar::String(s) => write!(o, r#"{s}"#),
+ }
+ .unwrap();
+ }
+ Flow::Continue
+ }
+}
+// haha
+impl Printable for Print {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ write!(f, "print {}", info[self.val])
+ }
+}
diff --git a/lemu/src/instructions/mod.rs b/lemu/src/instructions/mod.rs
new file mode 100644
index 0000000..6724ed1
--- /dev/null
+++ b/lemu/src/instructions/mod.rs
@@ -0,0 +1,500 @@
+//! supported instrs
+//!
+//! ```text
+//! jump
+//! op
+//! stop
+//! end
+//! set
+//! read
+//! write
+//! print
+//! packcolor
+//!
+//! draw {color, col, flush, line, rect, lineRect, triangle, stroke, clear}
+//! ```
+mod cop;
+pub mod draw;
+pub mod io;
+mod mop;
+mod mop2;
+
+pub use cop::ConditionOp;
+pub use draw::{DrawInstr, Frozen};
+use enum_dispatch::enum_dispatch;
+pub use mop::MathOp1;
+pub use mop2::MathOp2;
+use std::{fmt, io::Write};
+
+use crate::debug::{info::DebugInfo, printable::Printable};
+
+use super::{
+ executor::{ExecutorContext, Instruction},
+ memory::{LAddress, LVar},
+};
+
+pub const OPS: &[&str] = &[
+ "equal",
+ "notEqual",
+ "lessThan",
+ "lessThanEq",
+ "greaterThan",
+ "greaterThanEq",
+ "strictEqual",
+ "always",
+ "add",
+ "sub",
+ "mul",
+ "div",
+ "idiv",
+ "mod",
+ "pow",
+ "land",
+ "not",
+ "shl",
+ "shr",
+ "or",
+ "and",
+ "xor",
+ "max",
+ "min",
+ "angle",
+ "angleDiff",
+ "len",
+ "noise",
+ "abs",
+ "log",
+ "log10",
+ "floor",
+ "ceil",
+ "sqrt",
+ "rand",
+ "sin",
+ "cos",
+ "tan",
+ "asin",
+ "acos",
+ "atan",
+];
+
+#[must_use = "to change control flow"]
+#[derive(Default)]
+pub enum Flow {
+ #[default]
+ Continue,
+ Stay,
+ Exit,
+}
+
+#[enum_dispatch]
+pub trait LInstruction: Printable {
+ fn run<W: Write>(&self, exec: &mut ExecutorContext<'_, W>) -> Flow;
+}
+
+#[derive(Debug, Copy, Clone)]
+#[enum_dispatch(LInstruction)]
+pub enum Instr {
+ Op2(Op2),
+ Jump(Jump),
+ AlwaysJump(AlwaysJump),
+ Set(Set),
+ Op1(Op1),
+ Read(io::Read),
+ Write(io::Write),
+ DrawFlush(draw::Flush),
+ DynJump(DynJump),
+ Print(io::Print),
+ Stop(Stop),
+ PackColor(PackColor),
+ Select(Select),
+ Noop(Noop),
+ End(End),
+}
+
+impl Printable for Instr {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ match self {
+ Self::Op2(i) => i.print(info, f),
+ Self::Jump(i) => i.print(info, f),
+ Self::AlwaysJump(i) => i.print(info, f),
+ Self::Set(i) => i.print(info, f),
+ Self::Op1(i) => i.print(info, f),
+ Self::Read(i) => i.print(info, f),
+ Self::Write(i) => i.print(info, f),
+ Self::DrawFlush(i) => i.print(info, f),
+ Self::DynJump(i) => i.print(info, f),
+ Self::Print(i) => i.print(info, f),
+ Self::Stop(i) => i.print(info, f),
+ Self::End(i) => i.print(info, f),
+ Self::PackColor(i) => i.print(info, f),
+ Self::Select(i) => i.print(info, f),
+ Self::Noop(i) => i.print(info, f),
+ }
+ }
+}
+
+#[derive(Debug, Copy, Clone)]
+pub struct Set {
+ pub(crate) from: LAddress,
+ pub(crate) to: LAddress,
+}
+impl LInstruction for Set {
+ fn run<W: Write>(&self, exec: &mut ExecutorContext<'_, W>) -> Flow {
+ exec.set(self.from, self.to);
+ Flow::Continue
+ }
+}
+
+impl Printable for Set {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ write!(f, "set {} {}", info[self.from], info[self.to])
+ }
+}
+
+macro_rules! op_enum {
+ ($v:vis enum $name:ident {
+ $($variant:ident),+ $(,)?
+ }) => {
+ #[derive(Debug, Copy, Clone, Eq, PartialEq)]
+ $v enum $name {
+ $($variant),+
+ }
+
+ impl<'a> TryFrom<Token<'a>> for $name {
+ type Error = Token<'a>;
+ fn try_from(value: Token<'a>) -> Result<Self, Self::Error> {
+ match value {
+ $(Token::$variant => Ok(Self::$variant),)+
+ v => Err(v)
+ }
+ }
+ }
+
+ impl std::fmt::Display for $name {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
+ write!(f, "{}", Token::from(*self))
+ }
+ }
+
+ impl<'a> From<$name> for Token<'a> {
+ fn from(value: $name) -> Self {
+ match value {
+ $($name::$variant => Self::$variant,)+
+ }
+ }
+ }
+ }
+}
+use op_enum;
+
+// not part of op_enum due to rem
+macro_rules! op_impl {
+ ($name:ident, ptr type = $ptr:ty { $($own:ident => $fn:ident,)+ }) => {
+ impl $name {
+ pub const fn get_fn(self) -> $ptr {
+ match self {
+ $(Self::$own => $fn,)+
+ }
+ }
+ }
+
+ impl TryFrom<$ptr> for $name {
+ type Error = ();
+ fn try_from(f:$ptr) -> Result<Self, ()> {
+ match f {
+ $(f if f == $fn => Ok(Self::$own),)+
+ _ => Err(()),
+ }
+ }
+ }
+ }
+}
+use op_impl;
+
+macro_rules! get_num {
+ ($x:expr) => {
+ match $x {
+ LVar::Num(x) => *x,
+ _ => return Default::default(),
+ }
+ };
+}
+use get_num;
+
+#[derive(Debug, Copy, Clone)]
+pub struct Op1 {
+ op: for<'v> fn(&LVar<'v>) -> f64,
+ x: LAddress,
+ out: LAddress,
+}
+impl Op1 {
+ pub(crate) const fn new(op: MathOp1, x: LAddress, out: LAddress) -> Self {
+ Self {
+ op: op.get_fn(),
+ x,
+ out,
+ }
+ }
+}
+
+impl LInstruction for Op1 {
+ fn run<W: Write>(&self, exec: &mut ExecutorContext<'_, W>) -> Flow {
+ let x = (self.op)(exec.get(self.x));
+ *exec.get_mut(self.out) = LVar::Num(x);
+ Flow::Continue
+ }
+}
+
+impl Printable for Op1 {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ let op = mop::MathOp1::try_from(self.op).unwrap();
+ write!(f, "op {op} {} {}", info[self.out], info[self.x])
+ }
+}
+
+#[derive(Debug, Copy, Clone)]
+pub struct Op2 {
+ op: for<'v> fn(&LVar<'v>, &LVar<'v>) -> f64,
+ a: LAddress,
+ b: LAddress,
+ out: LAddress,
+}
+impl Op2 {
+ pub(crate) const fn new(op: MathOp2, a: LAddress, b: LAddress, out: LAddress) -> Self {
+ Self {
+ op: op.get_fn(),
+ a,
+ b,
+ out,
+ }
+ }
+}
+
+impl LInstruction for Op2 {
+ #[inline]
+ fn run<W: Write>(&self, exec: &mut ExecutorContext<'_, W>) -> Flow {
+ let x = (self.op)(exec.get(self.a), exec.get(self.b));
+ exec.memory[self.out] = LVar::Num(x);
+ Flow::Continue
+ }
+}
+
+impl Printable for Op2 {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ let op = mop2::MathOp2::try_from(self.op).unwrap();
+ write!(
+ f,
+ "op {op} {} {} {}",
+ info[self.out], info[self.a], info[self.b]
+ )
+ }
+}
+
+#[derive(Debug, Copy, Clone)]
+pub struct End {}
+
+impl LInstruction for End {
+ fn run<W: Write>(&self, exec: &mut ExecutorContext<'_, W>) -> Flow {
+ exec.iterations += 1;
+ // SAFETY: if we exist, 0 exists.
+ unsafe { exec.jump(Instruction::new(0)) };
+ Flow::Stay
+ }
+}
+
+impl Printable for End {
+ fn print(&self, _: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ write!(f, "end")
+ }
+}
+
+#[derive(Debug, Copy, Clone)]
+pub struct Noop {}
+
+impl LInstruction for Noop {
+ fn run<W: Write>(&self, _: &mut ExecutorContext<'_, W>) -> Flow {
+ Flow::Continue
+ }
+}
+
+impl Printable for Noop {
+ fn print(&self, _: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ write!(f, "noop")
+ }
+}
+
+#[derive(Debug, Copy, Clone)]
+pub struct AlwaysJump {
+ pub(crate) to: Instruction,
+}
+impl LInstruction for AlwaysJump {
+ fn run<W: Write>(&self, exec: &mut ExecutorContext<'_, W>) -> Flow {
+ exec.jump(self.to);
+ Flow::Stay
+ }
+}
+
+impl Printable for AlwaysJump {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ write!(f, "jump ")?;
+ match info.label(self.to) {
+ Some(l) => f.write_str(l)?,
+ None => write!(f, "{}", self.to.get())?,
+ }
+ write!(f, " always")
+ }
+}
+
+#[derive(Debug, Copy, Clone)]
+pub struct Jump {
+ op: for<'v> fn(&LVar<'v>, &LVar<'v>) -> bool,
+ pub(crate) to: Instruction,
+ a: LAddress,
+ b: LAddress,
+}
+impl Jump {
+ pub fn new(op: ConditionOp, to: Instruction, a: LAddress, b: LAddress) -> Self {
+ Self {
+ op: op.get_fn(),
+ to,
+ a,
+ b,
+ }
+ }
+}
+
+impl LInstruction for Jump {
+ fn run<W: Write>(&self, exec: &mut ExecutorContext<'_, W>) -> Flow {
+ if (self.op)(exec.get(self.a), exec.get(self.b)) {
+ exec.jump(self.to);
+ Flow::Stay
+ } else {
+ Flow::Continue
+ }
+ }
+}
+
+impl Printable for Jump {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ let op = ConditionOp::try_from(self.op).unwrap();
+ write!(f, "jump {op} ")?;
+ match info.label(self.to) {
+ Some(l) => f.write_str(l)?,
+ None => write!(f, "{}", self.to.get())?,
+ };
+ write!(f, " {} {}", info[self.a], info[self.b])
+ }
+}
+
+#[derive(Debug, Copy, Clone)]
+pub struct DynJump {
+ pub to: LAddress,
+ pub proglen: usize,
+}
+
+impl LInstruction for DynJump {
+ fn run<W: Write>(&self, exec: &mut ExecutorContext<'_, W>) -> Flow {
+ if let &LVar::Num(n) = exec.get(self.to) {
+ let i = n.round() as usize;
+ if i < self.proglen {
+ // SAFETY: just checked bounds
+ exec.jump(unsafe { Instruction::new(i) });
+ return Flow::Stay;
+ }
+ }
+ Flow::Continue
+ }
+}
+
+impl Printable for DynJump {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ write!(f, "set @counter {}", info[self.to])
+ }
+}
+
+#[derive(Debug, Copy, Clone)]
+pub struct Stop {}
+impl LInstruction for Stop {
+ fn run<W: Write>(&self, _: &mut ExecutorContext<'_, W>) -> Flow {
+ Flow::Exit
+ }
+}
+
+impl Printable for Stop {
+ fn print(&self, _: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ write!(f, "stop")
+ }
+}
+
+#[derive(Copy, Clone, Debug)]
+pub struct PackColor {
+ pub out: LAddress,
+ pub r: LAddress,
+ pub g: LAddress,
+ pub b: LAddress,
+ pub a: LAddress,
+}
+
+impl LInstruction for PackColor {
+ fn run<W: Write>(&self, exec: &mut ExecutorContext<'_, W>) -> Flow {
+ macro_rules! num {
+ ($($n:ident)+) => {
+ ($(match exec.memory[self.$n] {
+ LVar::Num(n) => (n.clamp(0.0, 1.0) * 255.0) as u8,
+ _ => 255,
+ },)+)
+ };
+ }
+ let (r, g, b, a) = num!(r g b a);
+ exec.memory[self.out] = LVar::from(fimg::Pack::pack(&[r, g, b, a]) as f64);
+ Flow::Continue
+ }
+}
+
+impl Printable for PackColor {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ write!(
+ f,
+ "packcolor {} {} {} {} {}",
+ info[self.out], info[self.r], info[self.g], info[self.b], info[self.a]
+ )
+ }
+}
+#[derive(Debug, Copy, Clone)]
+pub struct Select {
+ pub op: for<'v> fn(&LVar<'v>, &LVar<'v>) -> bool,
+ pub(crate) to: LAddress,
+
+ pub x: LAddress,
+ pub y: LAddress,
+
+ pub a: LAddress,
+ pub b: LAddress,
+}
+
+impl LInstruction for Select {
+ fn run<W: Write>(&self, exec: &mut ExecutorContext<'_, W>) -> Flow {
+ *exec.get_mut(self.to) = if (self.op)(exec.get(self.x), exec.get(self.y)) {
+ exec.get(self.a)
+ } else {
+ exec.get(self.b)
+ }
+ .clone();
+ Flow::Continue
+ }
+}
+
+impl Printable for Select {
+ fn print(&self, info: &DebugInfo<'_>, f: &mut impl fmt::Write) -> fmt::Result {
+ write!(
+ f,
+ "select {} {} {} {} {} {}",
+ info[self.to],
+ ConditionOp::try_from(self.op).unwrap(),
+ info[self.x],
+ info[self.y],
+ info[self.a],
+ info[self.b]
+ )
+ }
+}
diff --git a/lemu/src/instructions/mop.rs b/lemu/src/instructions/mop.rs
new file mode 100644
index 0000000..715cd3d
--- /dev/null
+++ b/lemu/src/instructions/mop.rs
@@ -0,0 +1,79 @@
+use super::get_num;
+use crate::{lexer::Token, memory::LVar};
+
+super::op_enum! { pub enum MathOp1 {
+ Floor,
+ Not,
+ Log,
+ Abs,
+ Rand,
+ Ceil,
+ Sqrt,
+ Sin,
+ Cos,
+ Tan,
+ ASin,
+ ACos,
+ ATan,
+ Log10,
+} }
+
+macro_rules! num {
+ ($fn: ident $c:expr) => {
+ fn $fn(x: &LVar<'_>) -> f64 {
+ f64::from($c(get_num!(x)))
+ }
+ };
+ (deg $fn: ident $c:expr) => {
+ fn $fn(x: &LVar<'_>) -> f64 {
+ f64::from($c(get_num!(x).to_radians()))
+ }
+ };
+ (to_deg $fn: ident $c:expr) => {
+ fn $fn(x: &LVar<'_>) -> f64 {
+ f64::from($c(get_num!(x))).to_radians()
+ }
+ };
+}
+
+macro_rules! flbop {
+ ($f: expr, $fn: expr) => {
+ $fn($f as u64) as f64
+ };
+}
+
+num!(floor f64::floor);
+fn not(x: &LVar<'_>) -> f64 {
+ flbop!(get_num!(x), |n: u64| !n)
+}
+num!(log f64::ln);
+num!(abs f64::abs);
+const fn rand(_: &LVar<'_>) -> f64 {
+ 4.0
+}
+num!(ceil f64::ceil);
+num!(sqrt f64::sqrt);
+num!(deg sin f64::sin);
+num!(deg cos f64::cos);
+num!(deg tan f64::tan);
+num!(to_deg asin f64::asin);
+num!(to_deg acos f64::acos);
+num!(to_deg atan f64::atan);
+num!(log10 f64::log10);
+
+super::op_impl!(MathOp1, ptr type = for<'v> fn(&LVar<'v>) -> f64 {
+ Floor => floor,
+ Not => not,
+ Log => log,
+ Abs => abs,
+ Rand => rand,
+ Ceil => ceil,
+ Sqrt => sqrt,
+ Sin => sin,
+ Cos => cos,
+ Tan => tan,
+ ASin => asin,
+ ACos => acos,
+ ATan => atan,
+ Log10 => log10,
+});
diff --git a/lemu/src/instructions/mop2.rs b/lemu/src/instructions/mop2.rs
new file mode 100644
index 0000000..7751736
--- /dev/null
+++ b/lemu/src/instructions/mop2.rs
@@ -0,0 +1,140 @@
+use super::get_num;
+use crate::{lexer::Token, memory::LVar};
+use std::f64::consts::PI;
+
+super::op_enum! { pub enum MathOp2 {
+ Angle,
+ Add,
+ Sub,
+ Mul,
+ Div,
+ IDiv,
+ Mod,
+ Pow,
+ Equal,
+ NotEqual,
+ And,
+ LessThan,
+ LessThanEq,
+ GreaterThan,
+ GreaterThanEq,
+ StrictEqual,
+ ShiftLeft,
+ ShiftRight,
+ BitOr,
+ BitAnd,
+ ExclusiveOr,
+ Max,
+ Min,
+ AngleDiff,
+ Len,
+ Noise, // unimplemented
+} }
+
+macro_rules! num {
+ ($fn:ident $closure:expr) => {
+ fn $fn<'v>(a: &LVar<'v>, b: &LVar<'v>) -> f64 {
+ f64::from($closure(get_num!(a), get_num!(b)))
+ }
+ };
+}
+macro_rules! op {
+ ($fn:ident $op:tt) => {
+ fn $fn<'v>(a: &LVar<'v>, b: &LVar<'v>) -> f64 {
+ f64::from(get_num!(a) $op get_num!(b))
+ }
+ }
+}
+macro_rules! bop {
+ ($fn: ident $op: tt) => {
+ fn $fn<'v>(a: &LVar<'v>, b:& LVar<'v>) -> f64 {
+ f64::from(((get_num!(a) as u64) $op (get_num!(b) as u64)) as f64)
+ }
+ };
+}
+macro_rules! nofun {
+ ($fn:ident $closure:expr) => {
+ fn $fn<'v>(a: &LVar<'v>, b: &LVar<'v>) -> f64 {
+ f64::from($closure(a, b))
+ }
+ };
+}
+nofun!(eq | a, b | a == b);
+nofun!(ne | a, b | a != b);
+num!(and | a, b | a != 0.0 && b != 0.0);
+#[rustfmt::skip]
+op!(add +);
+op!(sub -);
+op!(mul *);
+num!(idiv | a: f64 , b: f64 | (a / b).floor());
+op!(lt <);
+op!(le <=);
+op!(gt >);
+op!(ge >=);
+op!(div /);
+op!(rem %);
+num!(pow f64::powf);
+bop!(shl <<);
+bop!(shr >>);
+bop!(or |);
+bop!(band &);
+bop!(xor ^);
+num!(max f64::max);
+num!(min f64::min);
+#[rustfmt::skip]
+num!(angle_diff |a, b| {
+ let a = a % (360.0 * PI);
+ let b = b % (360.0 * PI);
+ f64::min(
+ if (a - b) < 0.0 { a - b + 360.0 } else { a - b },
+ if (b - a) < 0.0 { b - a + 360.0 } else { b - a },
+ )
+});
+num!(len f64::hypot);
+nofun!(noise | _, _ | 9.0);
+num!(angle |a: f64, b: f64| {
+ let mut x = a.atan2(b) * (180.0 / PI);
+ if x < 0.0 {
+ x += 360.0;
+ }
+ x
+});
+
+super::op_impl!(MathOp2, ptr type = for<'f> fn(&LVar<'f>, &LVar<'f>) -> f64 {
+ Equal => eq,
+ StrictEqual => eq,
+ NotEqual => ne,
+ And => and,
+ Add => add,
+ Sub => sub,
+ Mul => mul,
+ IDiv => idiv,
+ LessThan => lt,
+ LessThanEq => le,
+ GreaterThan => gt,
+ GreaterThanEq => ge,
+ Div => div,
+ Mod => rem,
+ Pow => pow,
+ ShiftLeft => shl,
+ ShiftRight => shr,
+ BitOr => or,
+ BitAnd => band,
+ ExclusiveOr => xor,
+ Max => max,
+ Min => min,
+ AngleDiff => angle_diff,
+ Len => len,
+ Noise => noise,
+ Angle => angle,
+});
+
+// // no macro cuz funky rem
+// impl MathOp2 {
+// pub const fn get_fn(self) -> for<'f> fn(&LVar<'f>, &LVar<'f>) -> f64 {
+// match self {
+// // we kind of interpret strings as numbers so yeah
+
+// }
+// }
+// }
diff --git a/lemu/src/lexer.rs b/lemu/src/lexer.rs
new file mode 100644
index 0000000..e6b85c6
--- /dev/null
+++ b/lemu/src/lexer.rs
@@ -0,0 +1,213 @@
+use atools::prelude::*;
+use beef::lean::Cow;
+use fimg::Pack;
+use logos::{Lexer as RealLexer, Logos, Span};
+
+macro_rules! instrs {
+ ($($z:literal => $v:ident,)+) => {
+ #[derive(Logos, Debug, PartialEq, Clone)]
+ #[logos(skip r"[ \t]+")]
+ pub enum Token<'strings> {
+ #[token("\n")]
+ #[token(";")]
+ Newline,
+ #[regex("#[^\n]+", priority = 8)]
+ Comment(&'strings str),
+ #[regex(r"-?[0-9]+(\.[0-9]+)?", |lex| lex.slice().parse().ok())]
+ #[regex(r"(true)|(false)", |lex| lex.slice().parse::<bool>().ok().map(f64::from), priority = 10)]
+ #[regex(r#"0[xX][0-9a-fA-F]+"#, |lex| u64::from_str_radix(&lex.slice()[2..], 16).map(|v| v as f64).ok())]
+ #[regex(r#"0[bB][01]+"#, |lex| u64::from_str_radix(&lex.slice()[2..], 2).map(|v| v as f64).ok())]
+ #[regex(r#""[0-9]+(\.[0-9]+)?""#, callback = |lex| lex.slice()[1..lex.slice().len()-1].parse().ok(), priority = 13)]
+ #[regex(r#"%\[([a-z]+)\]"#, |lex| COLORS.get(dbg!(&lex.slice()[2..lex.slice().len()-1])).copied().unwrap_or_default().join(255).pack() as f64)]
+ #[regex(r#"%[0-9a-fA-F]+"#, callback = |lex| {
+ let mut x = lex.slice()[1..].bytes()
+ .map(|b| (b & 0xF) + 9 * (b >> 6))
+ .array_chunks::<2>()
+ .map(|[a, b]| a * 16 + b);
+ if lex.slice()[1..].len() == 6 { x.carr::<3>().join(255) }
+ else if lex.slice()[1..].len() == 8 { x.carr::<4>() }
+ else { [255; 4] }.pack() as f64
+ })]
+ Num(f64), // TODO have bool and integer tokens, and parser converts
+ #[regex(r#""([^\\"\n])*""#, callback = |lex| Cow::from(&lex.slice()[1..lex.slice().len()-1]), priority = 12)]
+ #[regex(r#"@[^ "\n]*"#, |lex| Cow::from(lex.slice()))]
+ #[regex(r#""[^"]*""#, callback = |lex| Cow::from(lex.slice()[1..lex.slice().len()-1].replace(r"\n", "\n")), priority = 8)]
+ String(Cow<'strings, str>),
+ #[regex("[^%0-9- \t\n][^ \t\n]*", priority = 7)]
+ Ident(&'strings str),
+
+ $(#[token($z, priority = 8)] $v,)+
+ }
+
+ impl std::fmt::Display for Token<'_> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
+ match self {
+ $(Self::$v => write!(f, $z,),)+
+ Self::Ident(s)| Self::Comment(s) => write!(f, "{s}"),
+ Self::String(s) => write!(f, "{s}"),
+ Self::Num(n) => write!(f, "{n}"),
+ Self::Newline => write!(f, "\n"),
+ }
+ }
+ }
+ }
+}
+
+instrs! {
+ "null" => Null,
+ "read" => Read,
+ "write" => Write,
+ "set" => Set,
+ "op" => Op,
+ "end" => End,
+ "packcolor" => PackColor,
+ "drawflush" => DrawFlush,
+ "draw" => Draw,
+ "select" => Select,
+ "print" => Print,
+ "jump" => Jump,
+ "stop" => Stop,
+ "equal" => Equal,
+ "notEqual" => NotEqual,
+ "lessThan" => LessThan,
+ "lessThanEq" => LessThanEq,
+ "greaterThan" => GreaterThan,
+ "greaterThanEq" => GreaterThanEq,
+ "strictEqual" => StrictEqual,
+ "always" => Always,
+ "add" => Add,
+ "sub" => Sub,
+ "mul" => Mul,
+ "div" => Div,
+ "idiv" => IDiv,
+ "mod" => Mod,
+ "pow" => Pow,
+ "land" => And,
+ "not" => Not,
+ "shl" => ShiftLeft,
+ "shr" => ShiftRight,
+ "or" => BitOr,
+ "and" => BitAnd,
+ "xor" => ExclusiveOr,
+ "max" => Max,
+ "min" => Min,
+ "angle" => Angle,
+ "angleDiff" => AngleDiff,
+ "len" => Len,
+ "noise" => Noise,
+ "abs" => Abs,
+ "log" => Log,
+ "log10" => Log10,
+ "floor" => Floor,
+ "ceil" => Ceil,
+ "sqrt" => Sqrt,
+ "rand" => Rand,
+ "sin" => Sin,
+ "cos" => Cos,
+ "tan" => Tan,
+ "asin" => ASin,
+ "acos" => ACos,
+ "atan" => ATan,
+}
+
+pub fn lex(s: &str) -> Lexer<'_> {
+ Lexer {
+ inner: Token::lexer(s),
+ }
+}
+
+pub struct Lexer<'s> {
+ inner: RealLexer<'s, Token<'s>>,
+}
+
+impl<'s> Lexer<'s> {
+ pub fn next(&mut self) -> Option<Token<'s>> {
+ self.inner.find_map(Result::ok)
+ }
+
+ pub fn span(&self) -> Span {
+ self.inner.span()
+ }
+}
+
+#[allow(dead_code)]
+pub fn print_stream(mut stream: Lexer) {
+ print!("[");
+ let Some(tok) = stream.next() else {
+ println!("]");
+ return;
+ };
+ print!("{tok:?}");
+ while let Some(tok) = stream.next() {
+ print!(", {tok:?}");
+ }
+ println!("]");
+}
+
+#[test]
+fn lexer() {
+ let mut lex = lex(r#"
+ start:
+ print "xd"
+ jump start always
+ set x "4""#);
+ macro_rules! test {
+ ($($tok:ident$(($var:literal))?),+ $(,)?) => {{
+ $(assert_eq!(lex.next(), Some(Token::$tok$(($var.into()))?));)+
+ assert_eq!(lex.next(), None);
+ }}
+ }
+ test![
+ Newline,
+ Ident("start:"),
+ Newline,
+ Print,
+ String("xd"),
+ Newline,
+ Jump,
+ Ident("start"),
+ Always,
+ Newline,
+ Set,
+ Ident("x"),
+ Num(4),
+ ];
+}
+
+const COLORS: phf::Map<&str, [u8; 3]> = phf::phf_map! {
+ "clear" => [0, 0, 0],
+ "black" => [0, 0, 0],
+ "white" => [255, 255, 255],
+ "lightgray" => [191, 191, 191],
+ "gray" => [127, 127, 127],
+ "darkgray" => [63, 63, 63],
+ "blue" => [0, 0, 255],
+ "navy" => [0, 0, 128],
+ "royal" => [65, 105, 225],
+ "slate" => [112, 128, 144],
+ "sky" => [135, 206, 235],
+ "cyan" => [0, 255, 255],
+ "teal" => [0, 128, 128],
+ "green" => [0, 255, 0],
+ "acid" => [127, 255, 0],
+ "lime" => [50, 205, 50],
+ "forest" => [34, 139, 34],
+ "olive" => [107, 142, 35],
+ "yellow" => [255, 255, 0],
+ "gold" => [255, 215, 0],
+ "goldenrod" => [218, 165, 32],
+ "orange" => [255, 165, 0],
+ "brown" => [139, 69, 19],
+ "tan" => [210, 180, 140],
+ "brick" => [178, 34, 34],
+ "red" => [255, 0, 0],
+ "scarlet" => [255, 52, 28],
+ "coral" => [255, 127, 80],
+ "salmon" => [250, 128, 114],
+ "pink" => [255, 105, 180],
+ "magenta" => [255, 0, 255],
+ "purple" => [160, 32, 240],
+ "violet" => [238, 130, 238],
+ "maroon" => [176, 48, 96],
+ "accent" => [255, 211, 127],
+};
diff --git a/lemu/src/lib.rs b/lemu/src/lib.rs
new file mode 100644
index 0000000..25d571b
--- /dev/null
+++ b/lemu/src/lib.rs
@@ -0,0 +1,185 @@
+//! crate for [MLOG](https://mindustrygame.github.io/wiki/logic/0-introduction/#what-is-mindustry-logic) emulation.
+#![allow(clippy::redundant_closure_call)]
+// yeah so like well you see i kinda well kinda have to yes but sorta
+#![allow(clippy::fn_address_comparisons)]
+#![feature(generic_const_exprs, iter_array_chunks)]
+#![warn(
+ clippy::multiple_unsafe_ops_per_block,
+ clippy::missing_const_for_fn,
+ clippy::redundant_pub_crate,
+ clippy::missing_safety_doc,
+ clippy::imprecise_flops,
+ unsafe_op_in_unsafe_fn,
+ clippy::dbg_macro,
+ missing_docs
+)]
+pub(crate) mod code;
+mod debug;
+mod executor;
+mod instructions;
+mod lexer;
+mod memory;
+mod parser;
+
+use std::io::Write;
+
+pub use executor::{Executor, Output};
+use executor::{ExecutorBuilderInternal, Limit};
+use fimg::Image;
+pub use parser::Error;
+
+impl<W: Write + Default> Executor<'_, W> {
+ /// Create a new [`ExecutorBuilder`]
+ pub fn build() -> ExecutorBuilder<W> {
+ ExecutorBuilder::default()
+ }
+}
+impl<W: Write> Executor<'_, W> {
+ /// Create a new [`ExecutorBuilder`] with a output.
+ ///
+ /// Output simply must impement [`Write`], so this can be set to stdout.
+ /// Or simply set it to [`Vec<u8>`].
+ pub fn with_output(w: W) -> ExecutorBuilder<W> {
+ ExecutorBuilder {
+ displays: Vec::new(),
+ output: Some(w),
+ instruction_limit: Limit::Unlimited,
+ iteration_limit: Limit::limited(1),
+ }
+ }
+}
+
+/// Builder for a [`Executor`].
+/// ```
+/// # use lemu::Executor;
+/// let mut lex = Executor::with_output(std::io::stdout()).program(r#"print "hello world""#).expect("program ok");
+/// lex.run();
+/// ```
+pub struct ExecutorBuilder<W: Write> {
+ output: Option<W>,
+ displays: Vec<Image<Vec<u8>, 4>>,
+ instruction_limit: Limit,
+ iteration_limit: Limit,
+}
+
+impl<W: Write> Default for ExecutorBuilder<W> {
+ fn default() -> Self {
+ Self {
+ output: None,
+ displays: Vec::new(),
+ instruction_limit: Limit::Unlimited,
+ iteration_limit: Limit::limited(1),
+ }
+ }
+}
+
+impl<W: Write> ExecutorBuilder<W> {
+ /// Limit the number of iterations.
+ pub fn limit_iterations(self, n: usize) -> Self {
+ Self {
+ iteration_limit: Limit::limited(n),
+ ..self
+ }
+ }
+
+ /// Unlimit the number of iterations.
+ pub fn unlimit_iterations(self) -> Self {
+ Self {
+ iteration_limit: Limit::Unlimited,
+ ..self
+ }
+ }
+
+ /// Unlimit the number of instructions.
+ /// Make sure to limit the number of the iterations, else it will possibly run forever.
+ pub fn unlimit_instructions(self) -> Self {
+ Self {
+ iteration_limit: Limit::Unlimited,
+ ..self
+ }
+ }
+
+ /// Limit the number of processed instructions.
+ ///
+ /// Use this if you want it to *definetly finish*.
+ pub fn limit_instructions(self, n: usize) -> Self {
+ Self {
+ instruction_limit: Limit::limited(n),
+ ..self
+ }
+ }
+
+ /// Add a small (`80x80`) logic display.
+ pub fn display(self) -> Self {
+ let mut d = self.displays;
+ d.push(Image::alloc(80, 80));
+ Self {
+ displays: d,
+ ..self
+ }
+ }
+
+ /// Add a large (`176x176`) logic display.
+ pub fn large_display(self) -> Self {
+ let mut d = self.displays;
+ d.push(Image::alloc(176, 176));
+ Self {
+ displays: d,
+ ..self
+ }
+ }
+
+ /// Build the [`Executor`] with this code.
+ ///
+ /// # Errors
+ ///
+ /// errors if the code is malformed.
+ pub fn program(self, program: &str) -> Result<Executor<'_, W>, Error<'_>> {
+ let Self {
+ output,
+ displays,
+ instruction_limit,
+ iteration_limit,
+ } = self;
+ let mut executor = ExecutorBuilderInternal::new(output, displays);
+ executor
+ .inslimit(instruction_limit)
+ .itrlimit(iteration_limit);
+ // #[cfg(debug_assertions)]
+ // lexer::print_stream(lexer::lex(program));
+ parser::parse(lexer::lex(program), &mut executor)?;
+ Ok(executor.finish())
+ }
+}
+
+#[cfg(test)]
+mod test {
+ use super::*;
+
+ macro_rules! test {
+ (run $fn:ident.mlog $($times:literal times)?;
+ $(output = $to_be:literal $(;)?)?
+ $(cell[$cell_n:literal][$cell_index:literal] = $what:literal $(;)?)?
+ ) => {
+ #[test]
+ fn $fn() -> Result<(), Error<'static>> {
+ let v = vec![];
+ let mut lex = Executor::with_output(v)
+ .unlimit_instructions()
+ $(.limit_iterations($times))?
+ .program(include_str!(concat!(stringify!($fn), ".mlog")))?;
+ lex.run();
+ let output = lex.output();
+ $(assert_eq!(output.output.unwrap(), $to_be);)?
+ $(assert_eq!(output.cells[$cell_n][$cell_index], $what);)?
+ Ok(())
+ }
+ };
+ }
+
+ test!(run fib.mlog; output = b"12586269025");
+ test!(run primes.mlog; output = b"2 | 3 | 5 | 7 | 11 | 13 | 17 | 19 | 23 | 29 | 31 | 37 | 41 | 43 | 47 | 53 | 59 | 61 | 67 | 71 | 73 | 79 | 83 | 89 | 97 | 101 | 103 | 107 | 109 | 113 | 127 | 131 | 137 | 139 | 149 | 151 | 157 | 163 | 167 | 173 | 179 | 181 | 191 | 193 | 197 | 199 | 211 | 223 | 227 | 229 | 233 | 239 | 241 | 251 | 257 | 263 | 269 | 271 | 277 | 281 | 283 | 293 | 307 | 311 | 313 | 317 | 331 | 337 | 347 | 349 | 353 | 359 | 367 | 373 | 379 | 383 | 389 | 397 | 401 | 409 | 419 | 421 | 431 | 433 | 439 | 443 | 449 | 457 | 461 | 463 | 467 | 479 | 487 | 491 | 499 | 503 | 509 | ");
+ test!(run numbers.mlog; output = b"121212");
+ test!(run celliterate.mlog 5 times; cell[0][0] = 5.0);
+ test!(run hello.mlog; output = b"hello world");
+}
diff --git a/lemu/src/main.rs b/lemu/src/main.rs
new file mode 100644
index 0000000..36eb84f
--- /dev/null
+++ b/lemu/src/main.rs
@@ -0,0 +1,34 @@
+use std::{
+ io::{self, Stdout},
+ process::ExitCode,
+};
+
+use lemu::{Executor, Output};
+
+fn main() -> ExitCode {
+ let mut args = std::env::args();
+ args.next().unwrap(); // path to executable
+ for file in args {
+ let f = std::fs::read_to_string(&file).unwrap();
+ let mut lex: Executor<Stdout> = match Executor::with_output(io::stdout())
+ .large_display()
+ .program(&f)
+ {
+ Ok(x) => x,
+ Err(e) => {
+ eprint!("{}", e.diagnose(&f));
+ return ExitCode::FAILURE;
+ }
+ };
+ println!("{lex}");
+ let now = std::time::Instant::now();
+ lex.run();
+ dbg!(now.elapsed());
+ dbg!(lex.instructions_ran);
+ let Output { displays, .. } = lex.output();
+ for ((d, _), i) in displays.iter().zip(1..=displays.len()) {
+ d.save(format!("image{i}.png"));
+ }
+ }
+ ExitCode::SUCCESS
+}
diff --git a/lemu/src/memory.rs b/lemu/src/memory.rs
new file mode 100644
index 0000000..bd9ca52
--- /dev/null
+++ b/lemu/src/memory.rs
@@ -0,0 +1,185 @@
+use beef::lean::Cow;
+
+use crate::debug::{info::VarData, printable::Printable};
+#[derive(Clone, Debug)]
+pub enum LVar<'string> {
+ Num(f64),
+ String(Cow<'string, str>),
+}
+
+impl PartialEq for LVar<'_> {
+ fn eq(&self, other: &Self) -> bool {
+ match (self, other) {
+ (Self::Num(a), Self::Num(b)) => (a - b).abs() < 0.000_001,
+ (Self::String(l0), Self::String(r0)) => l0 == r0,
+ _ => false,
+ }
+ }
+}
+
+impl Default for LVar<'static> {
+ fn default() -> Self {
+ Self::Num(0.0)
+ }
+}
+
+impl LVar<'_> {
+ // get null
+ pub const fn null() -> LVar<'static> {
+ LVar::Num(0.0)
+ }
+
+ pub const fn num(&self) -> Option<f64> {
+ match *self {
+ Self::Num(n) => Some(n),
+ Self::String(_) => None,
+ }
+ }
+
+ pub const fn num_mut(&mut self) -> Option<&mut f64> {
+ match self {
+ LVar::Num(x) => Some(x),
+ LVar::String(_) => None,
+ }
+ }
+}
+
+#[derive(Clone, Copy)]
+pub struct LAddress {
+ pub address: u32,
+}
+
+impl LAddress {
+ /// # Safety
+ ///
+ /// ensure that address is valid
+ pub(crate) const unsafe fn addr(address: u32) -> Self {
+ LAddress { address }
+ }
+}
+
+#[derive(Copy, Clone)]
+pub struct Priv {
+ _priv: (),
+}
+
+impl std::fmt::Debug for LAddress {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ write!(f, "{:x}", self.address)
+ }
+}
+
+impl std::fmt::Display for LVar<'_> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ match self {
+ Self::Num(n) => write!(f, "{}", crate::debug::ff(*n)), // yeeeeahhhh
+ Self::String(s) => write!(f, r#""{s}""#),
+ }
+ }
+}
+
+impl From<f64> for LVar<'_> {
+ fn from(value: f64) -> Self {
+ Self::Num(value)
+ }
+}
+
+impl From<bool> for LVar<'_> {
+ fn from(value: bool) -> Self {
+ Self::Num(value.into())
+ }
+}
+
+impl From<usize> for LVar<'_> {
+ fn from(value: usize) -> Self {
+ Self::Num(value as f64)
+ }
+}
+
+impl<'s> From<&'s str> for LVar<'s> {
+ fn from(value: &'s str) -> Self {
+ Self::String(value.into())
+ }
+}
+
+impl<'s> From<Cow<'s, str>> for LVar<'s> {
+ fn from(value: Cow<'s, str>) -> Self {
+ Self::String(value)
+ }
+}
+
+#[derive(Debug)]
+pub struct LRegistry<'str>(pub Box<[LVar<'str>]>);
+
+impl<'s> std::ops::Index<LAddress> for LRegistry<'s> {
+ type Output = LVar<'s>;
+
+ fn index(&self, index: LAddress) -> &Self::Output {
+ debug_assert!((index.address as usize) < self.0.len());
+ // SAFETY: LAddress promises to be in our bounds.
+ // lreg has no constructors, so unless you keep one around, grab a laddr, and use it on the old lreg,
+ // this is safeish.
+ // lreg is private to the outside world, so its ok
+ unsafe { self.0.get_unchecked(index.address as usize) }
+ }
+}
+
+impl<'s> std::ops::IndexMut<LAddress> for LRegistry<'s> {
+ fn index_mut(&mut self, index: LAddress) -> &mut Self::Output {
+ debug_assert!((index.address as usize) < self.0.len());
+ // SAFETY: see above
+ unsafe { self.0.get_unchecked_mut(index.address as usize) }
+ }
+}
+
+impl std::fmt::Display for LRegistry<'_> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ write!(f, "R[")?;
+ let mut iter = self
+ .0
+ .iter()
+ .enumerate()
+ .filter(|&(_, v)| v != &LVar::null());
+ if let Some((i, v)) = iter.next() {
+ write!(f, "{i}: {v}")?;
+ }
+ for (i, v) in iter {
+ write!(f, ", {i}: {v}")?;
+ }
+ write!(f, "]")
+ }
+}
+
+impl LRegistry<'_> {
+ pub fn get(&self, a: LAddress) -> &LVar {
+ &self[a]
+ }
+}
+
+impl Printable for LRegistry<'_> {
+ fn print(
+ &self,
+ info: &crate::debug::info::DebugInfo<'_>,
+ f: &mut impl std::fmt::Write,
+ ) -> std::fmt::Result {
+ write!(f, "R[")?;
+ let mut iter = self
+ .0
+ .iter()
+ .zip(0..self.0.len() as u32)
+ .filter(|&(v, _)| v != &LVar::null())
+ // SAFETY: the address comes from me
+ .map(|(v, i)| (&info[unsafe { LAddress::addr(i) }], v))
+ .filter_map(|(d, v)| match d {
+ VarData::Variable(d) => Some((*d, v)),
+ VarData::Constant(_) => None,
+ });
+ if let Some((i, v)) = iter.next() {
+ write!(f, "{i}: {v}")?;
+ }
+ for (i, v) in iter {
+ write!(f, ", {i}: {v}")?;
+ }
+ write!(f, "]")
+ }
+}
diff --git a/lemu/src/numbers.mlog b/lemu/src/numbers.mlog
new file mode 100644
index 0000000..120ae6d
--- /dev/null
+++ b/lemu/src/numbers.mlog
@@ -0,0 +1,4 @@
+print 0b1100
+print 0xc
+print 12
+stop \ No newline at end of file
diff --git a/lemu/src/parser/error.rs b/lemu/src/parser/error.rs
new file mode 100644
index 0000000..c2b053b
--- /dev/null
+++ b/lemu/src/parser/error.rs
@@ -0,0 +1,442 @@
+use super::tokstr;
+use crate::executor::Instruction;
+use crate::lexer::Token;
+use logos::Span;
+
+/// Errors returned when parsing fails.
+#[derive(thiserror::Error, Debug)]
+pub enum Error<'s> {
+ /// Occurs from eg `set x`. (needs a value to set to)
+ #[error("unexpected end of stream")]
+ UnexpectedEof,
+ /// Occurs from eg `op add\n...` (needs a variable)
+ #[error("expected variable, got {0:?}")]
+ ExpectedVar(Token<'s>, Span),
+ /// Occurs from eg `draw 4` (needs a ident of the type of drawing)
+ #[error("expected identifier, got {0:?}")]
+ ExpectedIdent(Token<'s>, Span),
+ /// Occurs from eg `jump house` (assuming house isnt a label).
+ #[error("expected jump target, got {0:?}")]
+ ExpectedJump(Token<'s>, Span),
+ /// Occurs from eg `op add "three" "four"`
+ #[error("expected number, got {0:?}")]
+ ExpectedNum(Token<'s>, Span),
+ /// Occurs from eg `op 4` (4 is not add/mul/...)
+ #[error("expected operator, got {0:?}")]
+ ExpectedOp(Token<'s>, Span),
+ /// Occurs from eg `write cell1 5.5` (5.5 is not int)
+ #[error("expected integer, got {0:?}")]
+ ExpectedInt(Token<'s>, Span),
+ /// Occurs from eg `control shootp building 4`
+ #[error("expected string, got {0:?}")]
+ ExpectedString(Token<'s>, Span),
+ /// Occurs from `status not_a_bool`
+ #[error("expected bool, got {0:?}")]
+ ExpectedBool(Token<'s>, Span),
+ /// Occurs from eg `4.0 add 5.0`
+ #[error("expected instruction, got {0:?}")]
+ ExpectedInstr(Token<'s>, Span),
+ /// Occurs from eg
+ /// ```text
+ /// lable:
+ /// jump label always
+ /// ```
+ /// (typo: lable not label)
+ #[error("unable to find label {0}")]
+ LabelNotFound(&'s str, Span),
+ /// Occurs from eg `jump 4910294029 always`
+ #[error("unable to jump to instruction {0:?}")]
+ InvalidJump(Instruction, Span),
+ /// Occurs from eg `read bank9223372036854775807 5` (only `126` banks can exist)
+ #[error("cannot get cell>{0}")]
+ MemoryTooFar(usize, Span),
+ /// Occurs from eg `read bank1 512`
+ #[error("index {0} out of bounds ({1} max)")]
+ IndexOutOfBounds(usize, usize, Span),
+ /// Occurs from `read register1`
+ #[error("unknown memory type {0:?}, expected (cell)|(bank)")]
+ InvalidMemoryType(&'s str, Span),
+ /// Occurs from `drawflush bank1`
+ #[error("unknown display type {0}, expected 'display'")]
+ InvalidDisplayType(&'s str, Span),
+ /// Occurs from `draw house` (or `draw image`, a valid but unsupported instruction here)
+ #[error("unknown image operation {0}")]
+ UnsupportedImageOp(&'s str, Span),
+ /// Occurs from `control what`
+ #[error("unknown control operation {0}")]
+ UnknownControlOp(&'s str, Span),
+ /// Occurs from `ucontrol kill`
+ #[error("unknown ucontrol operation {0}")]
+ UnknownUnitControlOp(&'s str, Span),
+ /// Occurs from `ulocate five`
+ #[error("unknown ulocate operation {0}")]
+ UnknownUnitLocateOp(&'s str, Span),
+ /// Occurs from `getblock core`
+ #[error("unknown getblock operation {0}")]
+ UnknownGetBlockOp(&'s str, Span),
+ /// Occurs from `setblock unit`
+ #[error("unknown setblock operation {0}")]
+ UnknownSetBlockOp(&'s str, Span),
+ /// Occurs from `setrule hello`
+ #[error("unknown rule {0}")]
+ UnknownRule(&'s str, Span),
+ /// Occurs from `cutscene begin`
+ #[error("unknown cutscene {0}")]
+ UnknownCutscene(&'s str, Span),
+ /// Occurs from `fetch hostages`
+ #[error("unknown fetch operation {0}")]
+ UnknownFetchOp(&'s str, Span),
+ #[error("couldnt get display #{0:?}.")]
+ /// Occurs from eg `display 50`.
+ ///
+ /// call `display` 50 more times to have more display options:
+ /// ```rust,ignore
+ /// executor
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display()
+ /// .display();
+ /// ```
+ NoDisplay(usize, Span),
+ /// We have a limit of [`u32::MAX`] variables.
+ #[error("too many variables")]
+ TooManyVariables(Span),
+}
+
+impl Error<'_> {
+ /// Produces a [`Error`](lerr::Error) from this error.
+ #[cfg(feature = "diagnose")]
+ pub fn diagnose<'s>(&self, source: &'s str) -> lerr::Error<'s> {
+ use comat::{cformat as cmt, cformat_args};
+ use lerr::Error;
+
+ let error = cformat_args!("{bold_red}error{reset}");
+ let note = cformat_args!("{bold_blue}note{reset}");
+ let help = cformat_args!("{bold_green}help{reset}");
+ let mut e = Error::new(source);
+ macro_rules! msg {
+ ($ms:literal $(, $args:expr)* $(,)?) => {
+ e.message(cmt!($ms $(, $args)*))
+ };
+ }
+ macro_rules! op {
+ ($op:ident, $ops:expr) => {{
+ let mut out = String::from("{");
+ let mut ops = $ops.iter();
+ use std::fmt::Write;
+ write!(out, "{}", ops.next().unwrap()).unwrap();
+ for op in ops {
+ write!(out, ", {}", op).unwrap();
+ }
+ out.write_char('}').unwrap();
+ if let Some((mat, score)) =
+ rust_fuzzy_search::fuzzy_search_best_n($op, $ops, 1).first()
+ && *score > 0.5
+ {
+ e.note(cmt!("{help}: you may have meant {bold_green}{mat}{reset}"));
+ }
+ out
+ }};
+ }
+ match self {
+ Self::UnexpectedEof => {
+ msg!("{error}: wasnt able to finish read, got newline").label((
+ source.len()..source.len(),
+ cmt!("there was supposed to be another token here"),
+ ));
+ }
+ Self::ExpectedVar(t, s) => {
+ msg!("{error}: expected variable, got {:?}", t)
+ .label((s, cmt!("this was supposed to be a {blue}variable{reset} ({magenta}identifier{reset}, {magenta}number{reset}, or {magenta}string{reset})")));
+ }
+ Self::ExpectedIdent(_, s) => {
+ msg!("{error}: expected identifier").label((
+ s,
+ cmt!("this was supposed to be a {bold_blue}identifier{reset} (eg. {magenta}name{reset})"),
+ ));
+ }
+ Self::ExpectedJump(t, s) => {
+ msg!("{error}: expected jump target")
+ .label((s, cmt!("this was supposed to be a jump target")))
+ .note(
+ cmt!("{note}: a jump target is a {bold_blue}label{reset} ({magenta}ident{reset}, or {magenta}integer{reset})"),
+ );
+ if let Token::Num(n) = t {
+ e.note(cmt!(
+ "{help}: remove the fractional part: {bold_green}{n:.0}{reset}"
+ ));
+ }
+ }
+ Self::ExpectedNum(_, s) => {
+ msg!("{error}: expected number")
+ .label((s, cmt!("this was supposed to be a {bold_blue}number{reset} (eg. {magenta}3.14159{reset})")));
+ }
+ Self::ExpectedString(_, s) => {
+ msg!("{error}: expected string").label((s, cmt!(r#"this was supposed to be a {bold_blue}string{reset} (eg. {magenta}"a cool string"{reset})"#)));
+ }
+ Self::ExpectedBool(_, s) => {
+ msg!("{error}: expected bool").label((s, cmt!("this was supposed to be a {bold_blue}boolean{reset} (eg. {magenta}true{reset})")));
+ }
+ Self::ExpectedOp(t, s) => {
+ msg!("{error}: expected operator")
+ .label((s, cmt!("this was supposed to be a {bold_blue}operator{reset} (eg. {magenta}equal{reset})")));
+ if let Some(i) = tokstr!(*t)
+ && let Some((mat, score)) =
+ rust_fuzzy_search::fuzzy_search_best_n(i, crate::instructions::OPS, 1)
+ .first()
+ && *score > 0.5
+ {
+ e.note(cmt!("{help}: maybe you meant {bold_green}{mat}{reset}"));
+ }
+ }
+ Self::ExpectedInt(t, s) => {
+ msg!("{error}: expected integer")
+ .label((s, cmt!("this was supposed to be a {bold_blue}integer{reset} (eg. {magenta}4{reset})")));
+ if let Token::Num(n) = t {
+ e.note(cmt!(
+ "{help}: remove the mantissa: {bold_green}{n:.0}{reset}"
+ ));
+ }
+ }
+ Self::ExpectedInstr(t, s) => {
+ msg!("{error}: expected instruction")
+ .label((s, cmt!("this was supposed to be a {bold_blue}instruction{reset} (eg. {magenta}print{reset})")));
+ if let Some(i) = tokstr!(*t)
+ && let Some((mat, score)) = rust_fuzzy_search::fuzzy_search_best_n(
+ i,
+ &[
+ "getlink",
+ "read",
+ "write",
+ "set",
+ "op",
+ "end",
+ "drawflush",
+ "draw",
+ "print",
+ "packcolor",
+ "jump",
+ "stop",
+ "printflush",
+ "control",
+ "radar",
+ "sensor",
+ "wait",
+ "lookup",
+ "packcolor",
+ "ubind",
+ "ucontrol",
+ "uradar",
+ "ulocate",
+ "getblock",
+ "setblock",
+ "spawn",
+ "status",
+ "spawnwave",
+ "setrule",
+ "cutscene",
+ "explosion",
+ "setrate",
+ "fetch",
+ "getflag",
+ "setflag",
+ "setprop",
+ "effect",
+ ],
+ 1,
+ )
+ .first()
+ && *score > 0.5
+ {
+ e.note(cmt!("{help}: maybe you meant {mat}"));
+ }
+ }
+ Self::LabelNotFound(_, s) => {
+ msg!("{error}: label not found").label((
+ s,
+ cmt!("this was supposed to be a (existing) {bold_blue}label{reset}"),
+ )).note(cmt!("{help}: define a label with {yellow}`label_name:`{reset}, then you can {yellow}`jump label_name`{reset}."));
+ }
+ Self::InvalidJump(target, s) => {
+ msg!("{error}: invalid jump")
+ .label((
+ s,
+ cmt!(
+ "line#{bold_red}{}{reset} is not in the program",
+ target.get()
+ ),
+ ))
+ .note(cmt!(
+ "{help}: there are {bold_blue}{}{reset} available lines",
+ source.lines().count()
+ ));
+ }
+ Self::MemoryTooFar(b, s) => {
+ msg!("{error}: invalid memory cell/bank")
+ .label((s, cmt!("cant get cell/bank#{bold_red}{b}{reset}")))
+ .note(cmt!(
+ "{note}: only {blue}126{reset} cells/banks are allowed"
+ ));
+ }
+ Self::InvalidMemoryType(t, s) => {
+ msg!("{error}: invalid memory type {bold_red}{}{reset}", t)
+ .label((s, "here"))
+ .note(cmt!("{note}: only banks/cells are allowed"));
+ }
+ Self::InvalidDisplayType(disp, s) => {
+ msg!("{error}: invalid display type {bold_red}{}{reset}", disp)
+ .label((s, "here"))
+ .note(cmt!("{help}: change this to {bold_green}'display'{reset}"));
+ }
+ Self::UnknownControlOp(op, s) => {
+ let available = op!(op, &["enabled", "shoot", "shootp", "config", "color"]);
+ msg!("{error}: invalid control op {}", op)
+ .label((s, cmt!("must be one of {available}",)));
+ }
+ Self::UnknownUnitControlOp(op, s) => {
+ let available = op!(
+ op,
+ &[
+ "idle", "stop", "move", "approach", "boost", "pathfind", "target",
+ "targetp", "itemDrop", "itemTake", "payDrop", "payEnter", "mine", "flag",
+ "build", "getBlock", "within"
+ ]
+ );
+ msg!("{error}: unknown unit control op {}", op)
+ .label((s, cmt!("must be one of {available}",)));
+ }
+ Self::UnknownSetBlockOp(op, s) => {
+ let available = op!(op, &["floor", "ore", "block"]);
+ msg!("{error}: unknown set block op {}", op)
+ .label((s, cmt!("must be one of {available}")));
+ }
+ Self::UnknownUnitLocateOp(op, s) => {
+ let a = op!(op, &["ore", "spawn", "damaged", "building"]);
+ msg!("{error}: unkown unit locate op {}", op)
+ .label((s, cmt!("must be one of {a}",)));
+ }
+ Self::UnknownGetBlockOp(op, s) => {
+ let a = op!(op, &["floor", "ore", "block", "building"]);
+ msg!("{error}: unknown getblock op {}", op).label((s, cmt!("must be one of {a}",)));
+ }
+ Self::UnsupportedImageOp(op, s) => {
+ let a = op!(op, crate::instructions::draw::INSTRS);
+ msg!("{error}: invalid image op {}", op).label((s, cmt!("must be one of {a}")));
+ }
+ Self::UnknownRule(rule, s) => {
+ let a = op!(
+ rule,
+ &[
+ "currentWaveTime",
+ "waveTimer",
+ "waves",
+ "wave",
+ "waveSpacing",
+ "waveSending",
+ "attackMode",
+ "enemyCoreBuildRadius",
+ "dropZoneRadius",
+ "unitCap",
+ "wave",
+ "lighting",
+ "ambientLight",
+ "solarMultiplier",
+ "mapArea",
+ "buildSpeed",
+ "unitHealth",
+ "unitBuildSpeed",
+ "unitCost",
+ "unitDamage",
+ "blockHealth",
+ "blockDamage",
+ "rtsMinWeight",
+ "rtsMinSquad",
+ ]
+ );
+ msg!("{error}: invalid rule {}", rule).label((s, cmt!("must be one of {a}")));
+ }
+ Self::UnknownCutscene(op, s) => {
+ let a = op!(op, &["pan", "zoom", "stop"]);
+ msg!("{error}: invalid cutscene type {}", op)
+ .label((s, cmt!("must be one of {a}")));
+ }
+ Self::UnknownFetchOp(op, s) => {
+ let a = op!(
+ op,
+ &[
+ "buildCount",
+ "coreCount",
+ "playerCount",
+ "unitCount",
+ "build",
+ "core",
+ "player",
+ "unit"
+ ]
+ );
+ msg!("{error}: invalid op {}", op).label((s, cmt!("must be one of {a}")));
+ }
+ Self::NoDisplay(disp, s) => {
+ msg!("{error}: no display allocated")
+ .label((s, cmt!("display#{bold_red}{disp}{reset} has not been created")))
+ .note(cmt!("{note}: it is impossible for me to dynamically allocate displays, as {blue}'display1'{reset} could be large or small"));
+ }
+ Self::IndexOutOfBounds(index, size, s) => {
+ msg!("{error}: {bold_red}index{reset} {} out of bounds", index)
+ .label((s, cmt!("memory has only {magenta}{size}{reset} elements")));
+ }
+ Self::TooManyVariables(s) => {
+ msg!("{error}: {bold_red}too many variables{reset}. ")
+ .label((s, cmt!("we only have 65536 variable slots")))
+ .note(cmt!("consider not using variables"));
+ }
+ };
+ e
+ }
+}
diff --git a/lemu/src/parser/mod.rs b/lemu/src/parser/mod.rs
new file mode 100644
index 0000000..0764189
--- /dev/null
+++ b/lemu/src/parser/mod.rs
@@ -0,0 +1,856 @@
+use std::io::Write as Wr;
+
+mod error;
+pub use error::Error;
+
+#[rustfmt::skip]
+macro_rules! three { ($a:expr) => { ($a, $a, $a) }; }
+#[rustfmt::skip]
+macro_rules! four { ($a:expr) => { ($a, $a, $a, $a) }; }
+#[rustfmt::skip]
+macro_rules! five { ($a:expr) => { ($a, $a, $a, $a, $a) }; }
+#[rustfmt::skip]
+macro_rules! six { ($a:expr) => { ($a, $a, $a, $a, $a, $a) }; }
+
+use super::{
+ debug::info::{VarData, VarInfo},
+ executor::{ExecutorBuilderInternal, Instruction, UPInstr},
+ instructions::{
+ AlwaysJump, ConditionOp, DynJump, End, Instr, Jump, MathOp1, MathOp2, Op1, Op2, PackColor,
+ Select, Set, Stop,
+ draw::{
+ Clear, Flush, Line, LinePoly, Poly, RectBordered, RectFilled, SetCol, SetColor,
+ SetStroke, Triangle,
+ },
+ io::{Print, Read, Write},
+ },
+ lexer::{Lexer, Token},
+ memory::{LAddress, LVar},
+};
+
+macro_rules! tokstr {
+ ($tok:expr) => {
+ match $tok {
+ Token::Ident(i) => Some(i),
+ Token::PackColor => Some("packcolor"),
+ Token::Null => Some("null"),
+ Token::Read => Some("read"),
+ Token::Write => Some("write"),
+ Token::Set => Some("set"),
+ Token::Op => Some("op"),
+ Token::End => Some("end"),
+ Token::Draw => Some("draw"),
+ Token::DrawFlush => Some("drawflush"),
+ Token::Print => Some("print"),
+ Token::Jump => Some("jump"),
+ Token::Stop => Some("stop"),
+ Token::Equal => Some("equal"),
+ Token::NotEqual => Some("notEqual"),
+ Token::LessThan => Some("lessThan"),
+ Token::LessThanEq => Some("lessThanEq"),
+ Token::GreaterThan => Some("greaterThan"),
+ Token::GreaterThanEq => Some("greaterThanEq"),
+ Token::StrictEqual => Some("strictEqual"),
+ Token::Always => Some("always"),
+ Token::Add => Some("add"),
+ Token::Sub => Some("sub"),
+ Token::Mul => Some("mul"),
+ Token::Div => Some("div"),
+ Token::IDiv => Some("idiv"),
+ Token::Mod => Some("mod"),
+ Token::Pow => Some("pow"),
+ Token::And => Some("land"),
+ Token::Not => Some("not"),
+ Token::ShiftLeft => Some("shl"),
+ Token::ShiftRight => Some("shr"),
+ Token::BitOr => Some("or"),
+ Token::BitAnd => Some("and"),
+ Token::ExclusiveOr => Some("xor"),
+ Token::Max => Some("max"),
+ Token::Min => Some("min"),
+ Token::Angle => Some("angle"),
+ Token::AngleDiff => Some("angleDiff"),
+ Token::Len => Some("len"),
+ Token::Noise => Some("noise"),
+ Token::Abs => Some("abs"),
+ Token::Log => Some("log"),
+ Token::Log10 => Some("log10"),
+ Token::Floor => Some("floor"),
+ Token::Ceil => Some("ceil"),
+ Token::Sqrt => Some("sqrt"),
+ Token::Rand => Some("rand"),
+ Token::Sin => Some("sin"),
+ Token::Cos => Some("cos"),
+ Token::Tan => Some("tan"),
+ Token::ASin => Some("asin"),
+ Token::ACos => Some("acos"),
+ Token::ATan => Some("atan"),
+ _ => None,
+ }
+ };
+}
+use tokstr;
+
+#[derive(Debug)]
+enum UJump {
+ Sometimes {
+ a: LAddress,
+ b: LAddress,
+ op: ConditionOp,
+ },
+ Always,
+}
+
+pub fn parse<'source, W: Wr>(
+ mut tokens: Lexer<'source>,
+ executor: &mut ExecutorBuilderInternal<'source, W>,
+) -> Result<(), Error<'source>> {
+ let mut used = 0u32;
+ let mut mem: Vec<Option<&str>> = Vec::with_capacity(64); // maps &str to usize
+ let mut dbg_info: Vec<VarInfo> = Vec::with_capacity(64);
+ macro_rules! push {
+ // push a ident
+ (const $var:expr) => {{
+ let v = $var;
+ dbg_info.push(VarInfo {
+ data: VarData::Constant(v.clone().into()),
+ span: tokens.span(),
+ });
+ executor.mem.push(LVar::from(v));
+ mem.push(None);
+ used = used
+ .checked_add(1)
+ .ok_or(Error::TooManyVariables(tokens.span()))?;
+ unsafe { Ok(LAddress::addr(used - 1)) }
+ }};
+ ($var:expr) => {{
+ let v = $var;
+ dbg_info.push(VarInfo {
+ data: VarData::Variable(v),
+ span: tokens.span(),
+ });
+ executor.mem.push(LVar::null());
+ mem.push(Some(v));
+ used = used
+ .checked_add(1)
+ .ok_or(Error::TooManyVariables(tokens.span()))?;
+ // SAFETY: just initialized executor.mem
+ unsafe { Ok(LAddress::addr(used - 1)) }
+ }};
+ }
+ push!("@counter")?;
+ macro_rules! addr {
+ ($val:expr) => {{
+ let val = $val;
+ match mem
+ .iter()
+ .zip(0..used)
+ .find(|&(&v, _)| v == Some(val))
+ .map(|(_, i)| i)
+ {
+ Some(n) => unsafe { Ok(LAddress::addr(n)) },
+ None => push!(val),
+ }
+ }};
+ }
+
+ let mut unfinished_jumps = Vec::new();
+ macro_rules! tok {
+ () => {
+ tokens.next().ok_or(Error::UnexpectedEof)
+ };
+ }
+ macro_rules! err {
+ ($e:ident($($stuff:expr),+)) => {
+ Error::$e($($stuff,)+ tokens.span())
+ }
+ }
+ macro_rules! yeet {
+ ($e:ident($($stuff:expr),+)) => {
+ return Err(Error::$e($($stuff,)+ tokens.span()))
+ };
+ }
+ #[rustfmt::skip]
+ macro_rules! nextline {
+ () => {
+ while let Some(tok) = tokens.next() && tok != Token::Newline { }
+ };
+ }
+ macro_rules! take_int {
+ ($tok:expr) => {
+ match $tok {
+ Token::Num(n) if n.fract() == 0.0 && n >= 0.0 => Ok(n as usize),
+ t => Err(err!(ExpectedInt(t))),
+ }
+ };
+ }
+ macro_rules! take_memory {
+ () => {{
+ let t = tok!()?;
+ let container = take_ident!(t.clone())?;
+ let mut out = String::new();
+ for ch in container.chars() {
+ if matches!(ch, '0'..='9') {
+ out.push(ch);
+ continue;
+ }
+ if out.len() != 0 {
+ yeet!(InvalidMemoryType(container));
+ }
+ }
+ let container = &container[..container.len() - out.len()];
+ let n_span = tokens.span().start + container.len()..tokens.span().end;
+ let cell_n = out
+ .parse::<usize>()
+ .map_err(|_| Error::ExpectedInt(t, n_span.clone()))?;
+ if cell_n > 126 || cell_n == 0 {
+ return Err(Error::MemoryTooFar(cell_n, n_span));
+ }
+ match container {
+ "bank" => executor.bank(cell_n),
+ "cell" => executor.cell(cell_n),
+ _ => {
+ return Err(Error::InvalidMemoryType(
+ container,
+ tokens.span().start..tokens.span().end - out.len(),
+ ));
+ }
+ }
+ }};
+ }
+ macro_rules! take_ident {
+ ($tok:expr) => {{
+ let tok = $tok;
+ tokstr!(tok).ok_or(err!(ExpectedIdent(tok)))
+ }};
+ }
+ macro_rules! take_var {
+ ($tok:expr) => {{
+ let tok = $tok;
+ if let Some(i) = tokstr!(tok) {
+ addr!(i)
+ } else {
+ match tok {
+ Token::Num(n) => push!(const n),
+ Token::String(s) => push!(const s),
+ t => Err(err!(ExpectedVar(t))),
+ }
+ }
+ }};
+ }
+ macro_rules! take_numvar {
+ ($tok:expr) => {{
+ let tok = $tok;
+ if let Some(i) = tokstr!(tok) {
+ addr!(i)
+ } else {
+ match tok {
+ Token::Num(n) => push!(const n),
+ t => Err(err!(ExpectedNum(t))),
+ }
+ }
+ }};
+ }
+ macro_rules! num_or_255 {
+ ($tok:expr) => {
+ match $tok {
+ Ok(t) => match take_numvar!(t) {
+ Err(_) => push!(const 255),
+ n => n,
+ },
+ Err(_) => push!(const 255),
+ }
+ }
+ }
+ while let Some(token) = tokens.next() {
+ match token {
+ // # omg
+ Token::Comment(c) => executor.program.push(UPInstr::Comment(c)),
+ // label:
+ Token::Ident(v) if v.ends_with(':') => executor
+ .debug_info
+ .labels
+ .push((&v[..v.len() - 1], executor.next())),
+ // print "5"
+ Token::Print => {
+ let val = take_var!(tok!()?)?;
+ executor.add(Print { val });
+ }
+ // set x 4
+ Token::Set => {
+ let from = tok!()?;
+ let from = addr!(take_ident!(from)?)?;
+ let to = take_var!(tok!()?)?;
+ executor.add(Set { from, to });
+ }
+ // stop
+ Token::Stop => {
+ executor.add(Stop {});
+ }
+ // jump start equal a b
+ Token::Jump => {
+ let tok = tok!()?;
+ // label jump
+ if let Some(i) = tokstr!(tok) {
+ let span = tokens.span();
+ let op = tok!()?;
+ if op == Token::Always {
+ executor.jmp();
+ unfinished_jumps.push((UJump::Always, (i, span), executor.last()));
+ } else {
+ let op = op.try_into().map_err(|op| err!(ExpectedOp(op)))?;
+ let a = take_var!(tok!()?)?;
+ let b = take_var!(tok!()?)?;
+ executor.jmp();
+ unfinished_jumps.push((
+ UJump::Sometimes { a, b, op },
+ (i, span),
+ executor.last(),
+ ));
+ }
+ } else if let Ok(n) = take_int!(tok.clone()) {
+ // SAFETY: we check at the end of the block that it is valid
+ let to = unsafe { Instruction::new(n) };
+ let op = tok!()?;
+ if op == Token::Always {
+ executor.add(AlwaysJump { to });
+ } else {
+ let op = op.try_into().map_err(|op| err!(ExpectedOp(op)))?;
+ let a = take_var!(tok!()?)?;
+ let b = take_var!(tok!()?)?;
+ executor.add(Jump::new(op, to, a, b));
+ }
+ } else {
+ yeet!(ExpectedJump(tok));
+ };
+ }
+ // op add c 1 2
+ Token::Op => {
+ let op = tok!()?;
+ if let Ok(op) = MathOp1::try_from(op.clone()) {
+ // assigning to a var is useless but legal
+ let out = take_numvar!(tok!()?)?;
+ let x = take_numvar!(tok!()?)?;
+ executor.add(Op1::new(op, x, out));
+ } else if let Ok(op) = MathOp2::try_from(op.clone()) {
+ let out = take_numvar!(tok!()?)?;
+ let a = take_numvar!(tok!()?)?;
+ let b = take_numvar!(tok!()?)?;
+ executor.add(Op2::new(op, a, b, out));
+ } else {
+ yeet!(ExpectedOp(op));
+ }
+ }
+ // write 5.0 bank1 4 (aka bank1[4] = 5.0)
+ Token::Write => {
+ let set = take_numvar!(tok!()?)?;
+ let container = take_memory!();
+ let index = take_numvar!(tok!()?)?;
+ // this is the parser so i wont bother getting unchecked
+ if let LVar::Num(v) = executor.mem[index.address as usize]
+ && !container.fits(v.round() as usize)
+ {
+ yeet!(IndexOutOfBounds(v.round() as usize, container.size()));
+ }
+ executor.add(Write {
+ index,
+ set,
+ container,
+ });
+ }
+ // read result cell1 4 (aka result = cell1[4])
+ Token::Read => {
+ let output = take_var!(tok!()?)?;
+ let container = take_memory!();
+ let index = take_numvar!(tok!()?)?;
+ if let LVar::Num(v) = executor.mem[index.address as usize]
+ && !container.fits(v.round() as usize)
+ {
+ yeet!(IndexOutOfBounds(v.round() as usize, container.size()));
+ }
+ executor.add(Read {
+ index,
+ output,
+ container,
+ });
+ }
+ Token::Draw => {
+ let dty = tok!()?;
+ let Token::Ident(instr) = dty else {
+ yeet!(ExpectedIdent(dty));
+ };
+ match instr {
+ "clear" => {
+ let (r, g, b) = three! { num_or_255!(tok!())? };
+ executor.draw(Clear { r, g, b });
+ }
+ "color" => {
+ let (r, g, b, a) = four! { num_or_255!(tok!())? };
+ executor.draw(SetColor { r, g, b, a });
+ }
+ "col" => {
+ let col = take_numvar!(tok!()?)?;
+ executor.draw(SetCol { col });
+ }
+ "stroke" => {
+ let size = take_numvar!(tok!()?)?;
+ executor.draw(SetStroke { size });
+ }
+ "line" => {
+ let (x, y, x2, y2) = four! { take_numvar!(tok!()?)? };
+ executor.draw(Line {
+ point_a: (x, y),
+ point_b: (x2, y2),
+ });
+ }
+ "rect" => {
+ let (x, y, width, height) = four! { take_numvar!(tok!()?)? };
+ executor.draw(RectFilled {
+ position: (x, y),
+ width,
+ height,
+ });
+ }
+ "lineRect" => {
+ let (x, y, width, height) = four! { take_numvar!(tok!()?)? };
+ executor.draw(RectBordered {
+ position: (x, y),
+ width,
+ height,
+ });
+ }
+ "triangle" => {
+ let (x, y, x2, y2, x3, y3) = six! { take_numvar!(tok!()?)? };
+ executor.draw(Triangle {
+ points: ((x, y), (x2, y2), (x3, y3)),
+ });
+ }
+ "poly" => {
+ let (x, y, sides, radius, rot) = five! { take_numvar!(tok!()?)? };
+ executor.draw(Poly {
+ pos: (x, y),
+ sides,
+ radius,
+ rot,
+ })
+ }
+ "linePoly" => {
+ let (x, y, sides, radius, rot) = five! { take_numvar!(tok!()?)? };
+ executor.draw(LinePoly {
+ pos: (x, y),
+ sides,
+ radius,
+ rot,
+ })
+ }
+ // image is WONTFIX
+ i => yeet!(UnsupportedImageOp(i)),
+ }
+ }
+ Token::PackColor => {
+ let out = take_numvar!(tok!()?)?;
+ let (r, g, b, a) = four! { take_numvar!(tok!()?)? };
+ executor.add(PackColor { out, r, g, b, a });
+ }
+ Token::DrawFlush => {
+ let t = tok!();
+ if let Ok(t) = t
+ && t != Token::Newline
+ {
+ let screen = take_ident!(t.clone())?;
+ let mut out = String::new();
+ for ch in screen.chars() {
+ if ch.is_ascii_digit() {
+ out.push(ch);
+ continue;
+ }
+ if !out.is_empty() {
+ yeet!(InvalidDisplayType(screen));
+ }
+ }
+ let screen = &screen[..screen.len() - out.len()];
+ if screen != "display" {
+ yeet!(InvalidDisplayType(screen));
+ }
+ let n_span = tokens.span().start + screen.len()..tokens.span().end;
+ let screen_n = out
+ .parse::<usize>()
+ .map_err(|_| Error::ExpectedInt(t, n_span.clone()))?;
+ let display = executor
+ .display(screen_n)
+ .map_err(|n| Error::NoDisplay(n, n_span))?;
+ executor.add(Flush { display });
+ } else {
+ executor.add(Flush::default())
+ }
+ }
+ // end
+ Token::End => {
+ executor.add(End {});
+ }
+ Token::Select => {
+ let to = addr!(take_ident!(tok!()?)?)?; // =
+ // if
+ let op: ConditionOp = tok!()?.try_into().map_err(|op| err!(ExpectedOp(op)))?;
+
+ let x = take_var!(tok!()?)?;
+ let y = take_var!(tok!()?)?;
+
+ let a = take_var!(tok!()?)?; // then
+ let b = take_var!(tok!()?)?; // else
+
+ executor.add(Select {
+ op: op.get_fn(),
+ to,
+ x,
+ y,
+ a,
+ b,
+ })
+ }
+ // starting newline, simply skip. continue, so as not to to trigger the nextline!()
+ Token::Newline => continue,
+ // unknown instruction
+ Token::Ident(i) => {
+ macro_rules! all {
+ ($is:expr) => {
+ |b| {
+ for var in &mut *b {
+ *var = $is;
+ }
+ Ok(())
+ }
+ };
+ }
+ macro_rules! take {
+ (@ $b:ident $n:ident skip) => {
+ $b[$n]=tok!()?;
+
+ };
+ (@ $b:ident $n:ident skip, $($rest:tt)*) => {
+ $b[$n] = tok!()?;$n+=1; take!(@ $b $n $($rest)*);
+ };
+ (@ $b:ident $n:ident $v: expr) => {
+ $b[$n] = $v;
+ };
+ (@ $b:ident $n:ident $v: expr, $($rest:tt)*) => {
+ $b[$n] = $v;
+ $n += 1;
+ take!(@ $b $n $($rest)*);
+ };
+ [$($this:tt)*] => {
+ |b| {
+ let mut n = 0;
+ take!(@ b n $($this)*);
+ Ok(())
+ }
+ };
+ }
+ macro_rules! num {
+ () => {{
+ let tok = tok!()?;
+ if let Some(i) = tokstr!(tok) {
+ Token::Ident(i)
+ } else {
+ match tok {
+ Token::Num(n) => Token::Num(n),
+ t => yeet!(ExpectedNum(t)),
+ }
+ }
+ }};
+ }
+ macro_rules! bool {
+ () => {{
+ let tok = tok!()?;
+ if let Some(i) = tokstr!(tok) {
+ Token::Ident(i)
+ } else {
+ match tok {
+ Token::Num(n) => Token::Num(n),
+ t => yeet!(ExpectedBool(t)),
+ }
+ }
+ }};
+ }
+ macro_rules! ident {
+ () => {
+ take_ident!(tok!()?).map(|v| Token::Ident(v))?
+ };
+ }
+ #[rustfmt::skip]
+ macro_rules! build { () => { ident!() }}
+ macro_rules! str {
+ () => {
+ match tok!()? {
+ Token::String(s) => Token::String(s),
+ t => yeet!(ExpectedString(t)),
+ }
+ };
+ }
+ macro_rules! var {
+ () => {{
+ let tok = tok!()?;
+ if let Some(i) = tokstr!(tok) {
+ Token::Ident(i)
+ } else {
+ match tok {
+ Token::Num(n) => Token::Num(n),
+ Token::String(s) => Token::String(s),
+ t => yeet!(ExpectedVar(t)),
+ }
+ }
+ }};
+ }
+ macro_rules! instr {
+ (($argc:literal) => $block:expr) => {{
+ let mut v: Box<[_; $argc + 1]> =
+ Box::new(std::array::from_fn(|_| Token::Newline));
+ v[0] = Token::Ident(i);
+ const fn castor<
+ 'source,
+ F: FnMut(&mut [Token<'source>; $argc]) -> Result<(), Error<'source>>,
+ >(
+ f: F,
+ ) -> F {
+ f
+ }
+ castor($block)((&mut v[1..]).try_into().unwrap())?;
+ executor.code(v as Box<[Token<'source>]>);
+ nextline!();
+ continue;
+ }};
+ }
+ macro_rules! minstr {
+ ($($sub:ident($argc:literal) => $block:expr)+ => $err:expr $(,)?) => {{
+ let t = tok!()?;
+ let idnt = take_ident!(t.clone())?;
+ $(if idnt == stringify!($sub) {
+ let mut v: Box<[_; $argc + 2]> = Box::new(std::array::from_fn(|_| Token::Newline));
+ v[0]=Token::Ident(i);
+ v[1]=Token::Ident(stringify!($sub));
+ const fn castor<'source, F: FnMut(&mut [Token<'source>; $argc]) -> Result<(), Error<'source>>>(f: F) -> F { f }
+ castor($block)((&mut v[2..]).try_into().unwrap())?;
+ executor.code(v);
+ nextline!();
+ continue;
+ })+
+ return Err($err(idnt, t));
+ }};
+ }
+ match i {
+ "noop" => {
+ // executor.program.push(UPInstr::Comment("a"));
+ executor.add(crate::instructions::Noop {});
+ }
+ "printflush" => instr! {
+ (1) => |b| {
+ let t = tok!()?;
+ if let Some(t) = tokstr!(t) {
+ b[0] = Token::Ident(t);
+ } else if t == Token::Null {
+ b[0] = Token::Null;
+ } else {
+ b[0] = Token::Ident("message1");
+ }
+ Ok(())
+ }
+ },
+ "getlink" => instr! { (2) => take![var!(), num!()] },
+ "control" => minstr! {
+ enabled(2) => take![build!(), bool!()]
+ shoot(4) => take![build!(), num!(), num!(), bool!()]
+ shootp(3) => take![build!(), str!(), bool!()]
+ config(2) => take![build!(), tok!()?]
+ color(4) => take![build!(), num!(), num!(), num!()]
+ => |t, _| { err!(UnknownControlOp(t)) },
+ },
+ "radar" => {
+ instr! { (7) => take![ident!(), ident!(), ident!(), ident!(), build!(), num!(), var!()] }
+ }
+ "sensor" => instr! { (3) => take![var!(), tok!()?, tok!()?] },
+ "wait" => instr! { (1) => all!(num!()) },
+ "lookup" => instr! { (3) => take![ident!(), var!(), num!()] },
+ "packcolor" => instr! { (4) => all!(num!()) },
+ "ubind" => instr! { (1) => |b| {
+ let t = tok!()?;
+ if tokstr!(t).is_some() || matches!(t, Token::Null) {
+ b[0] = t;
+ } else {
+ yeet!(ExpectedString(t));
+ };
+ Ok(())
+ } },
+ "ucontrol" => minstr! {
+ idle(0) => |_| Ok(())
+ stop(0) => |_| Ok(())
+ move(2) => all!(num!())
+ approach(3) => all!(num!())
+ boost(1) => all!(bool!())
+ pathfind(2) => all!(num!())
+ target(3) => take![num!(), num!(), bool!()]
+ targetp(2) => take![str!(), bool!()]
+ itemDrop(2) => take![build!(), num!()]
+ itemTake(3) => take![build!(), str!(), num!()]
+ payDrop(0) => |_| Ok(())
+ payTake(1) => all!(bool!())
+ payEnter(0) => |_| Ok(())
+ mine(2) => all!(num!())
+ flag(1) => all!(num!())
+ build(5) => take![num!(), num!(), build!(), num!(), tok!()?]
+ getBlock(4) => take![num!(), num!(), build!(), build!()]
+ within(4) => take![num!(), num!(), num!(), var!()]
+ => |t, _| { err!(UnknownUnitControlOp(t)) }
+ },
+ "uradar" => {
+ instr! { (7) => take![ident!(), ident!(), ident!(), ident!(), build!(), num!(), var!()] }
+ }
+ "ulocate" => {
+ minstr! {
+ building(7) => take![build!(), bool!(), skip, num!(), num!(), bool!(), build!()]
+ spawn(6) => take![skip, skip, skip, num!(), num!(), bool!()]
+ damaged(7) => take![skip, skip, skip, num!(), num!(), var!(), var!()]
+ ore(6) => take![skip, skip, tok!()?, num!(), num!(), bool!()]
+ => |t, _| { err!(UnknownUnitLocateOp(t)) }
+ }
+ }
+ "getblock" => minstr! {
+ floor(3) => take![tok!()?, num!(), num!()]
+ ore(3) => take![tok!()?, num!(), num!()]
+ block(3) => take![tok!()?, num!(), num!()]
+ building(3) => take![tok!()?, num!(), num!()]
+ => |t, _| { err!(UnknownGetBlockOp(t)) }
+ },
+ "setblock" => minstr! {
+ floor(3) => take![num!(), num!(), str!()]
+ ore(3) => take![num!(), num!(), str!()]
+ block(3) => take![num!(), num!(), str!(), str!(), num!()]
+ => |t, _| { err!(UnknownSetBlockOp(t)) }
+ },
+ "spawn" => {
+ instr! { (6) => take![str!(), num!(), num!(), num!(), str!(), var!()] }
+ }
+ "status" => minstr! {
+ true(3) => take![ident!(), var!(), num!()]
+ false(2) => take![ident!(), var!()]
+ => |_, t| { err!(ExpectedBool(t)) }
+ },
+ "spawnwave" => instr! { (3) => take![num!(), num!(), bool!()] },
+ "setrule" => {
+ #[rustfmt::skip]
+ macro_rules! rule { () => { take![num!(), str!()] }}
+ minstr! {
+ currentWaveTime(1) => all!(num!())
+ waveTimer(1) => all!(num!())
+ waves(1) => all!(num!())
+ wave(1) => all!(num!())
+ waveSpacing(1) => all!(num!())
+ waveSending(1) => all!(num!())
+ attackMode(1) => all!(num!())
+ enemyCoreBuildRadius(1) => all!(num!())
+ dropZoneRadius(1) => all!(num!())
+ unitCap(1) => all!(num!())
+ wave(1) => all!(num!())
+ mapArea(4) => |b| {
+ tok!()?;
+ for var in &mut *b {
+ *var = num!();
+ }
+ Ok(())
+ }
+ lighting(1) => all!(num!())
+ ambientLight(1) => all!(num!())
+ solarMultiplier(1) => all!(num!())
+ buildSpeed(2) => rule!{}
+ unitHealth(2) => rule!{}
+ unitBuildSpeed(2) => rule!{}
+ unitCost(2) => rule!{}
+ unitDamage(2) => rule!{}
+ blockHealth(2) => rule!{}
+ blockDamage(2) => rule!{}
+ rtsMinWeight(2) => rule!{}
+ rtsMinSquad(2) => rule!{}
+ => |t, _| { err!(UnknownRule(t)) }
+ }
+ }
+ "cutscene" => minstr! {
+ pan(3) => all!(num!())
+ zoom(1) => all!(num!())
+ stop(0) => |_| Ok(())
+ => |t, _| { err!(UnknownCutscene(t)) }
+ },
+ "explosion" => {
+ instr! { (8) => take![str!(), num!(), num!(), num!(), bool!(), bool!(), bool!()] }
+ }
+ "setrate" => instr! { (1) => all!(num!()) },
+ "fetch" => minstr! {
+ buildCount(4) => take![var!(), str!(), num!(), str!()] // useless 0
+ unitCount(4) => take![var!(), str!()]
+ playerCount(4) => take![var!(), str!()]
+ coreCount(4) => take![var!(), str!()]
+ unit(3) => take![var!(), str!(), num!()]
+ player(3) => take![var!(), str!(), num!()]
+ core(3) => take![var!(), str!(), num!()]
+ build(3) => take![var!(), str!(), num!()]
+ => |t, _| { err!(UnknownFetchOp(t)) }
+ },
+ "getflag" => instr! { (2) => take![bool!(), str!()] },
+ "setflag" => instr! { (2) => take![str!(), bool!()] },
+ "setprop" => instr! { (3) => take![str!(), var!(), tok!()?] },
+ "effect" => {
+ let mut v = Vec::with_capacity(6);
+ v.push(Token::Ident("effect"));
+ while let Some(tok) = tokens.next()
+ && tok != Token::Newline
+ {
+ v.push(tok);
+ }
+ executor.code(v.into_boxed_slice());
+ // we take the newline here
+ continue;
+ }
+ t => yeet!(ExpectedInstr(Token::Ident(t))),
+ }
+ }
+ t => yeet!(ExpectedInstr(t)),
+ }
+ nextline!();
+ }
+
+ for (j, (label, s), i) in unfinished_jumps {
+ let to = executor
+ .debug_info
+ .labels
+ .iter()
+ .find(|(v, _)| v == &label)
+ .ok_or_else(|| Error::LabelNotFound(label, s))?
+ .1;
+ executor.program[i.get()] = UPInstr::Instr(match j {
+ UJump::Always => Instr::from(AlwaysJump { to }),
+ UJump::Sometimes { a, b, op } => Instr::from(Jump::new(op, to, a, b)),
+ });
+ }
+
+ // check jump validity
+ for i in &executor.program {
+ if let UPInstr::Instr(
+ Instr::Jump(Jump { to, .. }) | Instr::AlwaysJump(AlwaysJump { to, .. }),
+ ) = i
+ {
+ if !executor.valid(*to) {
+ yeet!(InvalidJump(*to));
+ }
+ }
+ }
+
+ // set dynjumps
+ let len = executor.program.len();
+ for i in &mut executor.program {
+ if let UPInstr::Instr(Instr::DynJump(DynJump { proglen, .. })) = i {
+ *proglen = len;
+ }
+ }
+
+ executor.debug_info.variables = dbg_info.into();
+
+ Ok(())
+}
diff --git a/lemu/src/primes.mlog b/lemu/src/primes.mlog
new file mode 100644
index 0000000..67defe2
--- /dev/null
+++ b/lemu/src/primes.mlog
@@ -0,0 +1,21 @@
+set truth 0
+set:
+ op add truth truth 1
+ write true bank1 truth
+ jump set lessThanEq truth 512
+set prime 1
+loop:
+ op add prime prime 1
+ jump end greaterThanEq prime 512
+ read primality bank1 prime
+ jump loop notEqual primality true
+ print prime
+ print " | "
+ op mul multiple prime prime
+ inner:
+ write false bank1 multiple
+ op add multiple multiple prime
+ jump inner lessThanEq multiple 512
+ jump loop always
+end:
+ stop
diff --git a/lemu/yes.mlog b/lemu/yes.mlog
new file mode 100644
index 0000000..7186860
--- /dev/null
+++ b/lemu/yes.mlog
@@ -0,0 +1,4 @@
+set a 1
+select result notEqual x false a 2
+print result
+printflush message1
diff --git a/mindus/Cargo.toml b/mindus/Cargo.toml
new file mode 100644
index 0000000..8015603
--- /dev/null
+++ b/mindus/Cargo.toml
@@ -0,0 +1,69 @@
+[package]
+name = "mindus"
+version = "5.0.46"
+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://git.bendn.org/mindus.git"
+license = "GPL-3.0"
+exclude = [".github/", "items.py"]
+readme = "README.md"
+keywords = ["mindustry", "format", "drawing"]
+rust-version = "1.85"
+
+[dependencies]
+flate2 = "1.1"
+base64 = "0.22"
+paste = "1.0"
+strconv = "0.1"
+amap = "0.1"
+color-hex = "0.2"
+thiserror = "2.0"
+bobbin-bits = "0.1"
+enum_dispatch = "0.3"
+phf = { version = "0.14", features = ["macros"] }
+fimg = { version = "0.4.56", features = [
+ "scale",
+ "blur",
+ "save",
+], default-features = false }
+atools = "0.1.11"
+either = "1.17.0"
+implicit-fn = "0.1.0"
+lower = "0.2.1"
+car = "0.1.4"
+
+[features]
+bin = ["fimg/save"]
+square = []
+default = ["bin"]
+
+[build-dependencies]
+fimg = { version = "0.4.56", features = [
+ "scale",
+ "blur",
+ "save",
+], default-features = false }
+walkdir = "2"
+rand = "0.10.2"
+
+[[bin]]
+name = "mindus"
+doc = false
+required-features = ["bin"]
+path = "src/exe/mod.rs"
+
+[dev-dependencies]
+diff = "0.1"
+
+[profile.release]
+debug = 2
+opt-level = 3
+lto = "thin"
+incremental = true
+
+[package.metadata.docs.rs]
+rustdoc-args = ["--generate-link-to-definition"]
diff --git a/LICENSE.txt b/mindus/LICENSE.txt
index f288702..f288702 100644
--- a/LICENSE.txt
+++ b/mindus/LICENSE.txt
diff --git a/mindus/README.md b/mindus/README.md
new file mode 100644
index 0000000..28e1a26
--- /dev/null
+++ b/mindus/README.md
@@ -0,0 +1,18 @@
+# mindus
+
+![MSRV](https://img.shields.io/badge/msrv-nightly-blue?style=for-the-badge&logo=rust)
+
+Mindus is a library for working with [Mindustry](https://github.com/Anuken/Mindustry) formats.
+
+## Usage
+
+```rust
+use mindus::*;
+let s = Schematic::deserialize_base64("bXNjaAF4nD3SQW6DMBBA0bE94wF104vkDr1H1QVtWUQioTL0/oFJ/Fl9GXiy5ZFBhiJ6n26zvE9tv7T1f5/bZbtNyyJvv/P2065/+3W9i0hdpu952SR/fiWp29qOL4/lDzkfExkiEpWPGqMKpZRRlT/8VQkv4aXwnlUopYw6vRTVvRzeGJVYy1ShlDKqezk8O8+DV/AKXgkvRSllvK2sdU/xFE/xFE/xFE/xNLzxeRlU9wzPOK9xXsMzPMOr3EcNL0VlqlBKGVWpfh+O5+zPmRdnXpx5cebFmRd/eQ9KIReL").unwrap();
+let output = s.render();
+output.save("output.png");
+```
+
+This produces:
+
+![image](https://raw.githubusercontent.com/bend-n/mindus/master/.github/example.png)
diff --git a/mindus/assets/blocks/autotiles/colored-floor-0.png b/mindus/assets/blocks/autotiles/colored-floor-0.png
new file mode 100644
index 0000000..22cba9c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-0.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-1.png b/mindus/assets/blocks/autotiles/colored-floor-1.png
new file mode 100644
index 0000000..496a56f
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-1.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-10.png b/mindus/assets/blocks/autotiles/colored-floor-10.png
new file mode 100644
index 0000000..ee8388b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-10.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-11.png b/mindus/assets/blocks/autotiles/colored-floor-11.png
new file mode 100644
index 0000000..a2be8be
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-11.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-12.png b/mindus/assets/blocks/autotiles/colored-floor-12.png
new file mode 100644
index 0000000..af62702
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-12.png
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-bottom-2.png b/mindus/assets/blocks/autotiles/colored-floor-13.png
index 0d9e7e3..0d9e7e3 100644
--- a/assets/blocks/liquid/conduits/conduit-bottom-2.png
+++ b/mindus/assets/blocks/autotiles/colored-floor-13.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-14.png b/mindus/assets/blocks/autotiles/colored-floor-14.png
new file mode 100644
index 0000000..2b71568
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-14.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-15.png b/mindus/assets/blocks/autotiles/colored-floor-15.png
new file mode 100644
index 0000000..6013abb
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-15.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-16.png b/mindus/assets/blocks/autotiles/colored-floor-16.png
new file mode 100644
index 0000000..2e03b49
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-16.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-17.png b/mindus/assets/blocks/autotiles/colored-floor-17.png
new file mode 100644
index 0000000..fc704f0
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-17.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-18.png b/mindus/assets/blocks/autotiles/colored-floor-18.png
new file mode 100644
index 0000000..9cae9d9
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-18.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-19.png b/mindus/assets/blocks/autotiles/colored-floor-19.png
new file mode 100644
index 0000000..f27a86f
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-19.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-2.png b/mindus/assets/blocks/autotiles/colored-floor-2.png
new file mode 100644
index 0000000..8b2c939
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-2.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-20.png b/mindus/assets/blocks/autotiles/colored-floor-20.png
new file mode 100644
index 0000000..45988d0
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-20.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-21.png b/mindus/assets/blocks/autotiles/colored-floor-21.png
new file mode 100644
index 0000000..67efd86
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-21.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-22.png b/mindus/assets/blocks/autotiles/colored-floor-22.png
new file mode 100644
index 0000000..a1ea3c2
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-22.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-23.png b/mindus/assets/blocks/autotiles/colored-floor-23.png
new file mode 100644
index 0000000..65842ba
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-23.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-24.png b/mindus/assets/blocks/autotiles/colored-floor-24.png
new file mode 100644
index 0000000..a870b78
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-24.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-25.png b/mindus/assets/blocks/autotiles/colored-floor-25.png
new file mode 100644
index 0000000..cef04bc
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-25.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-26.png b/mindus/assets/blocks/autotiles/colored-floor-26.png
new file mode 100644
index 0000000..825af4d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-26.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-27.png b/mindus/assets/blocks/autotiles/colored-floor-27.png
new file mode 100644
index 0000000..49f3705
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-27.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-28.png b/mindus/assets/blocks/autotiles/colored-floor-28.png
new file mode 100644
index 0000000..80457c4
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-28.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-29.png b/mindus/assets/blocks/autotiles/colored-floor-29.png
new file mode 100644
index 0000000..e1a7996
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-29.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-3.png b/mindus/assets/blocks/autotiles/colored-floor-3.png
new file mode 100644
index 0000000..8565698
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-3.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-30.png b/mindus/assets/blocks/autotiles/colored-floor-30.png
new file mode 100644
index 0000000..11a82b7
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-30.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-31.png b/mindus/assets/blocks/autotiles/colored-floor-31.png
new file mode 100644
index 0000000..2b7f223
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-31.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-32.png b/mindus/assets/blocks/autotiles/colored-floor-32.png
new file mode 100644
index 0000000..63fa0a3
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-32.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-33.png b/mindus/assets/blocks/autotiles/colored-floor-33.png
new file mode 100644
index 0000000..4e911e5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-33.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-34.png b/mindus/assets/blocks/autotiles/colored-floor-34.png
new file mode 100644
index 0000000..7e6965e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-34.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-35.png b/mindus/assets/blocks/autotiles/colored-floor-35.png
new file mode 100644
index 0000000..532bf65
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-35.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-36.png b/mindus/assets/blocks/autotiles/colored-floor-36.png
new file mode 100644
index 0000000..22ca968
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-36.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-37.png b/mindus/assets/blocks/autotiles/colored-floor-37.png
new file mode 100644
index 0000000..2ecd96d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-37.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-38.png b/mindus/assets/blocks/autotiles/colored-floor-38.png
new file mode 100644
index 0000000..d0b8c0a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-38.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-39.png b/mindus/assets/blocks/autotiles/colored-floor-39.png
new file mode 100644
index 0000000..1b72549
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-39.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-4.png b/mindus/assets/blocks/autotiles/colored-floor-4.png
new file mode 100644
index 0000000..caf12f3
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-4.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-40.png b/mindus/assets/blocks/autotiles/colored-floor-40.png
new file mode 100644
index 0000000..ca27e4f
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-40.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-41.png b/mindus/assets/blocks/autotiles/colored-floor-41.png
new file mode 100644
index 0000000..e0cc528
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-41.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-42.png b/mindus/assets/blocks/autotiles/colored-floor-42.png
new file mode 100644
index 0000000..d508a2b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-42.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-43.png b/mindus/assets/blocks/autotiles/colored-floor-43.png
new file mode 100644
index 0000000..25d0499
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-43.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-44.png b/mindus/assets/blocks/autotiles/colored-floor-44.png
new file mode 100644
index 0000000..52e5881
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-44.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-45.png b/mindus/assets/blocks/autotiles/colored-floor-45.png
new file mode 100644
index 0000000..82b0df7
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-45.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-46.png b/mindus/assets/blocks/autotiles/colored-floor-46.png
new file mode 100644
index 0000000..9afe451
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-46.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-5.png b/mindus/assets/blocks/autotiles/colored-floor-5.png
new file mode 100644
index 0000000..01c394c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-5.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-6.png b/mindus/assets/blocks/autotiles/colored-floor-6.png
new file mode 100644
index 0000000..5a87652
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-6.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-7.png b/mindus/assets/blocks/autotiles/colored-floor-7.png
new file mode 100644
index 0000000..9b2725a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-7.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-8.png b/mindus/assets/blocks/autotiles/colored-floor-8.png
new file mode 100644
index 0000000..5c55479
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-8.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-floor-9.png b/mindus/assets/blocks/autotiles/colored-floor-9.png
new file mode 100644
index 0000000..e60dcad
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-floor-9.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-0.png b/mindus/assets/blocks/autotiles/colored-wall-0.png
new file mode 100644
index 0000000..39f5afe
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-0.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-1.png b/mindus/assets/blocks/autotiles/colored-wall-1.png
new file mode 100644
index 0000000..2faa0ce
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-1.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-10.png b/mindus/assets/blocks/autotiles/colored-wall-10.png
new file mode 100644
index 0000000..ac30b61
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-10.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-11.png b/mindus/assets/blocks/autotiles/colored-wall-11.png
new file mode 100644
index 0000000..953f79a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-11.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-12.png b/mindus/assets/blocks/autotiles/colored-wall-12.png
new file mode 100644
index 0000000..2d15a99
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-12.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-13.png b/mindus/assets/blocks/autotiles/colored-wall-13.png
new file mode 100644
index 0000000..3f8fe05
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-13.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-14.png b/mindus/assets/blocks/autotiles/colored-wall-14.png
new file mode 100644
index 0000000..b024a1e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-14.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-15.png b/mindus/assets/blocks/autotiles/colored-wall-15.png
new file mode 100644
index 0000000..a763093
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-15.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-16.png b/mindus/assets/blocks/autotiles/colored-wall-16.png
new file mode 100644
index 0000000..5ab4f5d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-16.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-17.png b/mindus/assets/blocks/autotiles/colored-wall-17.png
new file mode 100644
index 0000000..015096a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-17.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-18.png b/mindus/assets/blocks/autotiles/colored-wall-18.png
new file mode 100644
index 0000000..159f514
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-18.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-19.png b/mindus/assets/blocks/autotiles/colored-wall-19.png
new file mode 100644
index 0000000..f5c0b66
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-19.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-2.png b/mindus/assets/blocks/autotiles/colored-wall-2.png
new file mode 100644
index 0000000..1637868
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-2.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-20.png b/mindus/assets/blocks/autotiles/colored-wall-20.png
new file mode 100644
index 0000000..0acb776
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-20.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-21.png b/mindus/assets/blocks/autotiles/colored-wall-21.png
new file mode 100644
index 0000000..eb9ee89
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-21.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-22.png b/mindus/assets/blocks/autotiles/colored-wall-22.png
new file mode 100644
index 0000000..57b4256
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-22.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-23.png b/mindus/assets/blocks/autotiles/colored-wall-23.png
new file mode 100644
index 0000000..1c68e75
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-23.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-24.png b/mindus/assets/blocks/autotiles/colored-wall-24.png
new file mode 100644
index 0000000..85118cb
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-24.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-25.png b/mindus/assets/blocks/autotiles/colored-wall-25.png
new file mode 100644
index 0000000..14c7dec
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-25.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-26.png b/mindus/assets/blocks/autotiles/colored-wall-26.png
new file mode 100644
index 0000000..30d878f
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-26.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-27.png b/mindus/assets/blocks/autotiles/colored-wall-27.png
new file mode 100644
index 0000000..f8aadb1
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-27.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-28.png b/mindus/assets/blocks/autotiles/colored-wall-28.png
new file mode 100644
index 0000000..8562d0e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-28.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-29.png b/mindus/assets/blocks/autotiles/colored-wall-29.png
new file mode 100644
index 0000000..01db88b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-29.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-3.png b/mindus/assets/blocks/autotiles/colored-wall-3.png
new file mode 100644
index 0000000..be2b548
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-3.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-30.png b/mindus/assets/blocks/autotiles/colored-wall-30.png
new file mode 100644
index 0000000..9642c50
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-30.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-31.png b/mindus/assets/blocks/autotiles/colored-wall-31.png
new file mode 100644
index 0000000..b620bf7
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-31.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-32.png b/mindus/assets/blocks/autotiles/colored-wall-32.png
new file mode 100644
index 0000000..a023297
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-32.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-33.png b/mindus/assets/blocks/autotiles/colored-wall-33.png
new file mode 100644
index 0000000..07883ad
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-33.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-34.png b/mindus/assets/blocks/autotiles/colored-wall-34.png
new file mode 100644
index 0000000..2613d3f
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-34.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-35.png b/mindus/assets/blocks/autotiles/colored-wall-35.png
new file mode 100644
index 0000000..889550b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-35.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-36.png b/mindus/assets/blocks/autotiles/colored-wall-36.png
new file mode 100644
index 0000000..adaf0c6
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-36.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-37.png b/mindus/assets/blocks/autotiles/colored-wall-37.png
new file mode 100644
index 0000000..294c8df
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-37.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-38.png b/mindus/assets/blocks/autotiles/colored-wall-38.png
new file mode 100644
index 0000000..3f195d0
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-38.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-39.png b/mindus/assets/blocks/autotiles/colored-wall-39.png
new file mode 100644
index 0000000..214cea2
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-39.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-4.png b/mindus/assets/blocks/autotiles/colored-wall-4.png
new file mode 100644
index 0000000..dae6d01
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-4.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-40.png b/mindus/assets/blocks/autotiles/colored-wall-40.png
new file mode 100644
index 0000000..2e8e172
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-40.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-41.png b/mindus/assets/blocks/autotiles/colored-wall-41.png
new file mode 100644
index 0000000..5935f75
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-41.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-42.png b/mindus/assets/blocks/autotiles/colored-wall-42.png
new file mode 100644
index 0000000..2710d91
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-42.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-43.png b/mindus/assets/blocks/autotiles/colored-wall-43.png
new file mode 100644
index 0000000..858b978
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-43.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-44.png b/mindus/assets/blocks/autotiles/colored-wall-44.png
new file mode 100644
index 0000000..f89cc7b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-44.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-45.png b/mindus/assets/blocks/autotiles/colored-wall-45.png
new file mode 100644
index 0000000..ed8396e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-45.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-46.png b/mindus/assets/blocks/autotiles/colored-wall-46.png
new file mode 100644
index 0000000..ce677fc
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-46.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-5.png b/mindus/assets/blocks/autotiles/colored-wall-5.png
new file mode 100644
index 0000000..8375151
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-5.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-6.png b/mindus/assets/blocks/autotiles/colored-wall-6.png
new file mode 100644
index 0000000..dad87ce
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-6.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-7.png b/mindus/assets/blocks/autotiles/colored-wall-7.png
new file mode 100644
index 0000000..244c1e8
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-7.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-8.png b/mindus/assets/blocks/autotiles/colored-wall-8.png
new file mode 100644
index 0000000..b5e45d3
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-8.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/colored-wall-9.png b/mindus/assets/blocks/autotiles/colored-wall-9.png
new file mode 100644
index 0000000..12beb83
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/colored-wall-9.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-0.png b/mindus/assets/blocks/autotiles/metal-tiles-1-0.png
new file mode 100644
index 0000000..a83370c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-0.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-1.png b/mindus/assets/blocks/autotiles/metal-tiles-1-1.png
new file mode 100644
index 0000000..e53a55c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-1.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-10.png b/mindus/assets/blocks/autotiles/metal-tiles-1-10.png
new file mode 100644
index 0000000..f6547c0
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-10.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-11.png b/mindus/assets/blocks/autotiles/metal-tiles-1-11.png
new file mode 100644
index 0000000..3d93492
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-11.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-12.png b/mindus/assets/blocks/autotiles/metal-tiles-1-12.png
new file mode 100644
index 0000000..3b79fe6
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-12.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-13.png b/mindus/assets/blocks/autotiles/metal-tiles-1-13.png
new file mode 100644
index 0000000..08176d1
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-13.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-14.png b/mindus/assets/blocks/autotiles/metal-tiles-1-14.png
new file mode 100644
index 0000000..0396648
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-14.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-15.png b/mindus/assets/blocks/autotiles/metal-tiles-1-15.png
new file mode 100644
index 0000000..a808501
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-15.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-16.png b/mindus/assets/blocks/autotiles/metal-tiles-1-16.png
new file mode 100644
index 0000000..3ac250e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-16.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-17.png b/mindus/assets/blocks/autotiles/metal-tiles-1-17.png
new file mode 100644
index 0000000..d7567a9
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-17.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-18.png b/mindus/assets/blocks/autotiles/metal-tiles-1-18.png
new file mode 100644
index 0000000..33297d6
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-18.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-19.png b/mindus/assets/blocks/autotiles/metal-tiles-1-19.png
new file mode 100644
index 0000000..997c4f5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-19.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-2.png b/mindus/assets/blocks/autotiles/metal-tiles-1-2.png
new file mode 100644
index 0000000..a9dd2e0
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-2.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-20.png b/mindus/assets/blocks/autotiles/metal-tiles-1-20.png
new file mode 100644
index 0000000..461deeb
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-20.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-21.png b/mindus/assets/blocks/autotiles/metal-tiles-1-21.png
new file mode 100644
index 0000000..20e80c5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-21.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-22.png b/mindus/assets/blocks/autotiles/metal-tiles-1-22.png
new file mode 100644
index 0000000..797209d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-22.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-23.png b/mindus/assets/blocks/autotiles/metal-tiles-1-23.png
new file mode 100644
index 0000000..7ec5230
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-23.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-24.png b/mindus/assets/blocks/autotiles/metal-tiles-1-24.png
new file mode 100644
index 0000000..315befc
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-24.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-25.png b/mindus/assets/blocks/autotiles/metal-tiles-1-25.png
new file mode 100644
index 0000000..24b3f24
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-25.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-26.png b/mindus/assets/blocks/autotiles/metal-tiles-1-26.png
new file mode 100644
index 0000000..551ce8f
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-26.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-27.png b/mindus/assets/blocks/autotiles/metal-tiles-1-27.png
new file mode 100644
index 0000000..a4807ae
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-27.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-28.png b/mindus/assets/blocks/autotiles/metal-tiles-1-28.png
new file mode 100644
index 0000000..5007413
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-28.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-29.png b/mindus/assets/blocks/autotiles/metal-tiles-1-29.png
new file mode 100644
index 0000000..be6a420
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-29.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-3.png b/mindus/assets/blocks/autotiles/metal-tiles-1-3.png
new file mode 100644
index 0000000..3c7e43d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-3.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-30.png b/mindus/assets/blocks/autotiles/metal-tiles-1-30.png
new file mode 100644
index 0000000..a148a2f
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-30.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-31.png b/mindus/assets/blocks/autotiles/metal-tiles-1-31.png
new file mode 100644
index 0000000..df72b88
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-31.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-32.png b/mindus/assets/blocks/autotiles/metal-tiles-1-32.png
new file mode 100644
index 0000000..4ec33ff
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-32.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-33.png b/mindus/assets/blocks/autotiles/metal-tiles-1-33.png
new file mode 100644
index 0000000..3f42613
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-33.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-34.png b/mindus/assets/blocks/autotiles/metal-tiles-1-34.png
new file mode 100644
index 0000000..2637b42
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-34.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-35.png b/mindus/assets/blocks/autotiles/metal-tiles-1-35.png
new file mode 100644
index 0000000..9e9e603
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-35.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-36.png b/mindus/assets/blocks/autotiles/metal-tiles-1-36.png
new file mode 100644
index 0000000..1aec490
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-36.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-37.png b/mindus/assets/blocks/autotiles/metal-tiles-1-37.png
new file mode 100644
index 0000000..4142f49
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-37.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-38.png b/mindus/assets/blocks/autotiles/metal-tiles-1-38.png
new file mode 100644
index 0000000..ab35995
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-38.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-39.png b/mindus/assets/blocks/autotiles/metal-tiles-1-39.png
new file mode 100644
index 0000000..bf3f08d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-39.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-4.png b/mindus/assets/blocks/autotiles/metal-tiles-1-4.png
new file mode 100644
index 0000000..affdc8e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-4.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-40.png b/mindus/assets/blocks/autotiles/metal-tiles-1-40.png
new file mode 100644
index 0000000..c87e37d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-40.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-41.png b/mindus/assets/blocks/autotiles/metal-tiles-1-41.png
new file mode 100644
index 0000000..e69c9f5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-41.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-42.png b/mindus/assets/blocks/autotiles/metal-tiles-1-42.png
new file mode 100644
index 0000000..b3d26f6
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-42.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-43.png b/mindus/assets/blocks/autotiles/metal-tiles-1-43.png
new file mode 100644
index 0000000..6ce4f3e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-43.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-44.png b/mindus/assets/blocks/autotiles/metal-tiles-1-44.png
new file mode 100644
index 0000000..091ac7a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-44.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-45.png b/mindus/assets/blocks/autotiles/metal-tiles-1-45.png
new file mode 100644
index 0000000..d9eb3bf
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-45.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-46.png b/mindus/assets/blocks/autotiles/metal-tiles-1-46.png
new file mode 100644
index 0000000..ab44352
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-46.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-5.png b/mindus/assets/blocks/autotiles/metal-tiles-1-5.png
new file mode 100644
index 0000000..e65e1ec
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-5.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-6.png b/mindus/assets/blocks/autotiles/metal-tiles-1-6.png
new file mode 100644
index 0000000..9fab62b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-6.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-7.png b/mindus/assets/blocks/autotiles/metal-tiles-1-7.png
new file mode 100644
index 0000000..bc34b3a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-7.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-8.png b/mindus/assets/blocks/autotiles/metal-tiles-1-8.png
new file mode 100644
index 0000000..01a866c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-8.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-1-9.png b/mindus/assets/blocks/autotiles/metal-tiles-1-9.png
new file mode 100644
index 0000000..41c7fd4
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-1-9.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-0.png b/mindus/assets/blocks/autotiles/metal-tiles-10-0.png
new file mode 100644
index 0000000..e9d0477
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-0.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-1.png b/mindus/assets/blocks/autotiles/metal-tiles-10-1.png
new file mode 100644
index 0000000..a0ca0b1
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-1.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-10.png b/mindus/assets/blocks/autotiles/metal-tiles-10-10.png
new file mode 100644
index 0000000..34d1f84
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-10.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-11.png b/mindus/assets/blocks/autotiles/metal-tiles-10-11.png
new file mode 100644
index 0000000..34d1f84
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-11.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-12.png b/mindus/assets/blocks/autotiles/metal-tiles-10-12.png
new file mode 100644
index 0000000..fd71dc5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-12.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-13.png b/mindus/assets/blocks/autotiles/metal-tiles-10-13.png
new file mode 100644
index 0000000..28ee0f5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-13.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-14.png b/mindus/assets/blocks/autotiles/metal-tiles-10-14.png
new file mode 100644
index 0000000..98abbdb
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-14.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-15.png b/mindus/assets/blocks/autotiles/metal-tiles-10-15.png
new file mode 100644
index 0000000..57e4557
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-15.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-16.png b/mindus/assets/blocks/autotiles/metal-tiles-10-16.png
new file mode 100644
index 0000000..906257e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-16.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-17.png b/mindus/assets/blocks/autotiles/metal-tiles-10-17.png
new file mode 100644
index 0000000..6a52c03
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-17.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-18.png b/mindus/assets/blocks/autotiles/metal-tiles-10-18.png
new file mode 100644
index 0000000..09b9a12
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-18.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-19.png b/mindus/assets/blocks/autotiles/metal-tiles-10-19.png
new file mode 100644
index 0000000..29628fd
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-19.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-2.png b/mindus/assets/blocks/autotiles/metal-tiles-10-2.png
new file mode 100644
index 0000000..a77dafd
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-2.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-20.png b/mindus/assets/blocks/autotiles/metal-tiles-10-20.png
new file mode 100644
index 0000000..c888c24
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-20.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-21.png b/mindus/assets/blocks/autotiles/metal-tiles-10-21.png
new file mode 100644
index 0000000..b854935
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-21.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-22.png b/mindus/assets/blocks/autotiles/metal-tiles-10-22.png
new file mode 100644
index 0000000..34d1f84
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-22.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-23.png b/mindus/assets/blocks/autotiles/metal-tiles-10-23.png
new file mode 100644
index 0000000..34d1f84
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-23.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-24.png b/mindus/assets/blocks/autotiles/metal-tiles-10-24.png
new file mode 100644
index 0000000..95364a0
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-24.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-25.png b/mindus/assets/blocks/autotiles/metal-tiles-10-25.png
new file mode 100644
index 0000000..1e4f75c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-25.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-26.png b/mindus/assets/blocks/autotiles/metal-tiles-10-26.png
new file mode 100644
index 0000000..2bcd97b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-26.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-27.png b/mindus/assets/blocks/autotiles/metal-tiles-10-27.png
new file mode 100644
index 0000000..032a8af
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-27.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-28.png b/mindus/assets/blocks/autotiles/metal-tiles-10-28.png
new file mode 100644
index 0000000..1b086b8
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-28.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-29.png b/mindus/assets/blocks/autotiles/metal-tiles-10-29.png
new file mode 100644
index 0000000..82f3e1c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-29.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-3.png b/mindus/assets/blocks/autotiles/metal-tiles-10-3.png
new file mode 100644
index 0000000..f08b31c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-3.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-30.png b/mindus/assets/blocks/autotiles/metal-tiles-10-30.png
new file mode 100644
index 0000000..1b086b8
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-30.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-31.png b/mindus/assets/blocks/autotiles/metal-tiles-10-31.png
new file mode 100644
index 0000000..82f3e1c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-31.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-32.png b/mindus/assets/blocks/autotiles/metal-tiles-10-32.png
new file mode 100644
index 0000000..cf94896
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-32.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-33.png b/mindus/assets/blocks/autotiles/metal-tiles-10-33.png
new file mode 100644
index 0000000..70f62ab
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-33.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-34.png b/mindus/assets/blocks/autotiles/metal-tiles-10-34.png
new file mode 100644
index 0000000..34d1f84
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-34.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-35.png b/mindus/assets/blocks/autotiles/metal-tiles-10-35.png
new file mode 100644
index 0000000..34d1f84
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-35.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-36.png b/mindus/assets/blocks/autotiles/metal-tiles-10-36.png
new file mode 100644
index 0000000..28baa1d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-36.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-37.png b/mindus/assets/blocks/autotiles/metal-tiles-10-37.png
new file mode 100644
index 0000000..4bf374c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-37.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-38.png b/mindus/assets/blocks/autotiles/metal-tiles-10-38.png
new file mode 100644
index 0000000..4e46578
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-38.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-39.png b/mindus/assets/blocks/autotiles/metal-tiles-10-39.png
new file mode 100644
index 0000000..6e7049e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-39.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-4.png b/mindus/assets/blocks/autotiles/metal-tiles-10-4.png
new file mode 100644
index 0000000..5cd68ff
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-4.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-40.png b/mindus/assets/blocks/autotiles/metal-tiles-10-40.png
new file mode 100644
index 0000000..c888c24
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-40.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-41.png b/mindus/assets/blocks/autotiles/metal-tiles-10-41.png
new file mode 100644
index 0000000..b854935
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-41.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-42.png b/mindus/assets/blocks/autotiles/metal-tiles-10-42.png
new file mode 100644
index 0000000..c888c24
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-42.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-43.png b/mindus/assets/blocks/autotiles/metal-tiles-10-43.png
new file mode 100644
index 0000000..b854935
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-43.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-44.png b/mindus/assets/blocks/autotiles/metal-tiles-10-44.png
new file mode 100644
index 0000000..e888cb2
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-44.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-45.png b/mindus/assets/blocks/autotiles/metal-tiles-10-45.png
new file mode 100644
index 0000000..d384228
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-45.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-46.png b/mindus/assets/blocks/autotiles/metal-tiles-10-46.png
new file mode 100644
index 0000000..34d1f84
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-46.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-5.png b/mindus/assets/blocks/autotiles/metal-tiles-10-5.png
new file mode 100644
index 0000000..fe97ef0
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-5.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-6.png b/mindus/assets/blocks/autotiles/metal-tiles-10-6.png
new file mode 100644
index 0000000..cae903d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-6.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-7.png b/mindus/assets/blocks/autotiles/metal-tiles-10-7.png
new file mode 100644
index 0000000..65bb3d9
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-7.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-8.png b/mindus/assets/blocks/autotiles/metal-tiles-10-8.png
new file mode 100644
index 0000000..1b086b8
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-8.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-10-9.png b/mindus/assets/blocks/autotiles/metal-tiles-10-9.png
new file mode 100644
index 0000000..82f3e1c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-10-9.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-0.png b/mindus/assets/blocks/autotiles/metal-tiles-11-0.png
new file mode 100644
index 0000000..bfd2d60
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-0.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-1.png b/mindus/assets/blocks/autotiles/metal-tiles-11-1.png
new file mode 100644
index 0000000..be39313
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-1.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-10.png b/mindus/assets/blocks/autotiles/metal-tiles-11-10.png
new file mode 100644
index 0000000..4a3c2a0
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-10.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-11.png b/mindus/assets/blocks/autotiles/metal-tiles-11-11.png
new file mode 100644
index 0000000..d1db125
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-11.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-12.png b/mindus/assets/blocks/autotiles/metal-tiles-11-12.png
new file mode 100644
index 0000000..3528ba8
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-12.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-13.png b/mindus/assets/blocks/autotiles/metal-tiles-11-13.png
new file mode 100644
index 0000000..65b69e6
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-13.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-14.png b/mindus/assets/blocks/autotiles/metal-tiles-11-14.png
new file mode 100644
index 0000000..832e8f5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-14.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-15.png b/mindus/assets/blocks/autotiles/metal-tiles-11-15.png
new file mode 100644
index 0000000..ef36066
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-15.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-16.png b/mindus/assets/blocks/autotiles/metal-tiles-11-16.png
new file mode 100644
index 0000000..cac8453
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-16.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-17.png b/mindus/assets/blocks/autotiles/metal-tiles-11-17.png
new file mode 100644
index 0000000..8671dd2
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-17.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-18.png b/mindus/assets/blocks/autotiles/metal-tiles-11-18.png
new file mode 100644
index 0000000..305acd1
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-18.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-19.png b/mindus/assets/blocks/autotiles/metal-tiles-11-19.png
new file mode 100644
index 0000000..3e3e186
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-19.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-2.png b/mindus/assets/blocks/autotiles/metal-tiles-11-2.png
new file mode 100644
index 0000000..73f5b1f
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-2.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-20.png b/mindus/assets/blocks/autotiles/metal-tiles-11-20.png
new file mode 100644
index 0000000..4e35692
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-20.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-21.png b/mindus/assets/blocks/autotiles/metal-tiles-11-21.png
new file mode 100644
index 0000000..f11d990
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-21.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-22.png b/mindus/assets/blocks/autotiles/metal-tiles-11-22.png
new file mode 100644
index 0000000..53cb47f
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-22.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-23.png b/mindus/assets/blocks/autotiles/metal-tiles-11-23.png
new file mode 100644
index 0000000..3888c61
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-23.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-24.png b/mindus/assets/blocks/autotiles/metal-tiles-11-24.png
new file mode 100644
index 0000000..ab4a140
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-24.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-25.png b/mindus/assets/blocks/autotiles/metal-tiles-11-25.png
new file mode 100644
index 0000000..f3fd1df
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-25.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-26.png b/mindus/assets/blocks/autotiles/metal-tiles-11-26.png
new file mode 100644
index 0000000..4020303
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-26.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-27.png b/mindus/assets/blocks/autotiles/metal-tiles-11-27.png
new file mode 100644
index 0000000..43ad8e5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-27.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-28.png b/mindus/assets/blocks/autotiles/metal-tiles-11-28.png
new file mode 100644
index 0000000..e847622
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-28.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-29.png b/mindus/assets/blocks/autotiles/metal-tiles-11-29.png
new file mode 100644
index 0000000..c6c6a83
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-29.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-3.png b/mindus/assets/blocks/autotiles/metal-tiles-11-3.png
new file mode 100644
index 0000000..95a795f
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-3.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-30.png b/mindus/assets/blocks/autotiles/metal-tiles-11-30.png
new file mode 100644
index 0000000..4333147
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-30.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-31.png b/mindus/assets/blocks/autotiles/metal-tiles-11-31.png
new file mode 100644
index 0000000..2a46fe4
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-31.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-32.png b/mindus/assets/blocks/autotiles/metal-tiles-11-32.png
new file mode 100644
index 0000000..9476b23
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-32.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-33.png b/mindus/assets/blocks/autotiles/metal-tiles-11-33.png
new file mode 100644
index 0000000..fa3c88d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-33.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-34.png b/mindus/assets/blocks/autotiles/metal-tiles-11-34.png
new file mode 100644
index 0000000..22bbf43
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-34.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-35.png b/mindus/assets/blocks/autotiles/metal-tiles-11-35.png
new file mode 100644
index 0000000..0f18e6a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-35.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-36.png b/mindus/assets/blocks/autotiles/metal-tiles-11-36.png
new file mode 100644
index 0000000..10c825b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-36.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-37.png b/mindus/assets/blocks/autotiles/metal-tiles-11-37.png
new file mode 100644
index 0000000..cc2cb5c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-37.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-38.png b/mindus/assets/blocks/autotiles/metal-tiles-11-38.png
new file mode 100644
index 0000000..62b20d8
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-38.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-39.png b/mindus/assets/blocks/autotiles/metal-tiles-11-39.png
new file mode 100644
index 0000000..c2e4f68
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-39.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-4.png b/mindus/assets/blocks/autotiles/metal-tiles-11-4.png
new file mode 100644
index 0000000..88e57c5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-4.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-40.png b/mindus/assets/blocks/autotiles/metal-tiles-11-40.png
new file mode 100644
index 0000000..f019568
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-40.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-41.png b/mindus/assets/blocks/autotiles/metal-tiles-11-41.png
new file mode 100644
index 0000000..b9e126c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-41.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-42.png b/mindus/assets/blocks/autotiles/metal-tiles-11-42.png
new file mode 100644
index 0000000..76e63e4
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-42.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-43.png b/mindus/assets/blocks/autotiles/metal-tiles-11-43.png
new file mode 100644
index 0000000..3278744
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-43.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-44.png b/mindus/assets/blocks/autotiles/metal-tiles-11-44.png
new file mode 100644
index 0000000..fb2acbc
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-44.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-45.png b/mindus/assets/blocks/autotiles/metal-tiles-11-45.png
new file mode 100644
index 0000000..6ed640e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-45.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-46.png b/mindus/assets/blocks/autotiles/metal-tiles-11-46.png
new file mode 100644
index 0000000..248e481
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-46.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-5.png b/mindus/assets/blocks/autotiles/metal-tiles-11-5.png
new file mode 100644
index 0000000..0420352
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-5.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-6.png b/mindus/assets/blocks/autotiles/metal-tiles-11-6.png
new file mode 100644
index 0000000..18c94e3
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-6.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-7.png b/mindus/assets/blocks/autotiles/metal-tiles-11-7.png
new file mode 100644
index 0000000..902c08a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-7.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-8.png b/mindus/assets/blocks/autotiles/metal-tiles-11-8.png
new file mode 100644
index 0000000..dd7ebb3
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-8.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-11-9.png b/mindus/assets/blocks/autotiles/metal-tiles-11-9.png
new file mode 100644
index 0000000..ca97c56
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-11-9.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-0.png b/mindus/assets/blocks/autotiles/metal-tiles-12-0.png
new file mode 100644
index 0000000..cf5cd97
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-0.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-1.png b/mindus/assets/blocks/autotiles/metal-tiles-12-1.png
new file mode 100644
index 0000000..92f79d4
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-1.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-10.png b/mindus/assets/blocks/autotiles/metal-tiles-12-10.png
new file mode 100644
index 0000000..c26b212
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-10.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-11.png b/mindus/assets/blocks/autotiles/metal-tiles-12-11.png
new file mode 100644
index 0000000..5e9a5cf
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-11.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-12.png b/mindus/assets/blocks/autotiles/metal-tiles-12-12.png
new file mode 100644
index 0000000..d127031
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-12.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-13.png b/mindus/assets/blocks/autotiles/metal-tiles-12-13.png
new file mode 100644
index 0000000..65b69e6
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-13.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-14.png b/mindus/assets/blocks/autotiles/metal-tiles-12-14.png
new file mode 100644
index 0000000..6616ee1
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-14.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-15.png b/mindus/assets/blocks/autotiles/metal-tiles-12-15.png
new file mode 100644
index 0000000..75fc960
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-15.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-16.png b/mindus/assets/blocks/autotiles/metal-tiles-12-16.png
new file mode 100644
index 0000000..889bfa4
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-16.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-17.png b/mindus/assets/blocks/autotiles/metal-tiles-12-17.png
new file mode 100644
index 0000000..0766e09
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-17.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-18.png b/mindus/assets/blocks/autotiles/metal-tiles-12-18.png
new file mode 100644
index 0000000..85010d7
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-18.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-19.png b/mindus/assets/blocks/autotiles/metal-tiles-12-19.png
new file mode 100644
index 0000000..b269ab5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-19.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-2.png b/mindus/assets/blocks/autotiles/metal-tiles-12-2.png
new file mode 100644
index 0000000..7c7a991
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-2.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-20.png b/mindus/assets/blocks/autotiles/metal-tiles-12-20.png
new file mode 100644
index 0000000..63717db
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-20.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-21.png b/mindus/assets/blocks/autotiles/metal-tiles-12-21.png
new file mode 100644
index 0000000..848afba
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-21.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-22.png b/mindus/assets/blocks/autotiles/metal-tiles-12-22.png
new file mode 100644
index 0000000..b48307c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-22.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-23.png b/mindus/assets/blocks/autotiles/metal-tiles-12-23.png
new file mode 100644
index 0000000..33b462a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-23.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-24.png b/mindus/assets/blocks/autotiles/metal-tiles-12-24.png
new file mode 100644
index 0000000..54ea1a3
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-24.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-25.png b/mindus/assets/blocks/autotiles/metal-tiles-12-25.png
new file mode 100644
index 0000000..e936dae
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-25.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-26.png b/mindus/assets/blocks/autotiles/metal-tiles-12-26.png
new file mode 100644
index 0000000..1ac09d9
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-26.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-27.png b/mindus/assets/blocks/autotiles/metal-tiles-12-27.png
new file mode 100644
index 0000000..37d0a65
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-27.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-28.png b/mindus/assets/blocks/autotiles/metal-tiles-12-28.png
new file mode 100644
index 0000000..9ec4070
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-28.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-29.png b/mindus/assets/blocks/autotiles/metal-tiles-12-29.png
new file mode 100644
index 0000000..8d219de
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-29.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-3.png b/mindus/assets/blocks/autotiles/metal-tiles-12-3.png
new file mode 100644
index 0000000..fba8e12
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-3.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-30.png b/mindus/assets/blocks/autotiles/metal-tiles-12-30.png
new file mode 100644
index 0000000..7ae9281
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-30.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-31.png b/mindus/assets/blocks/autotiles/metal-tiles-12-31.png
new file mode 100644
index 0000000..b7c9bee
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-31.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-32.png b/mindus/assets/blocks/autotiles/metal-tiles-12-32.png
new file mode 100644
index 0000000..faef954
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-32.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-33.png b/mindus/assets/blocks/autotiles/metal-tiles-12-33.png
new file mode 100644
index 0000000..dbc4e6c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-33.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-34.png b/mindus/assets/blocks/autotiles/metal-tiles-12-34.png
new file mode 100644
index 0000000..5989738
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-34.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-35.png b/mindus/assets/blocks/autotiles/metal-tiles-12-35.png
new file mode 100644
index 0000000..80b3d72
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-35.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-36.png b/mindus/assets/blocks/autotiles/metal-tiles-12-36.png
new file mode 100644
index 0000000..721eac2
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-36.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-37.png b/mindus/assets/blocks/autotiles/metal-tiles-12-37.png
new file mode 100644
index 0000000..a535792
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-37.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-38.png b/mindus/assets/blocks/autotiles/metal-tiles-12-38.png
new file mode 100644
index 0000000..37e0c53
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-38.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-39.png b/mindus/assets/blocks/autotiles/metal-tiles-12-39.png
new file mode 100644
index 0000000..98b5cf5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-39.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-4.png b/mindus/assets/blocks/autotiles/metal-tiles-12-4.png
new file mode 100644
index 0000000..ad846b0
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-4.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-40.png b/mindus/assets/blocks/autotiles/metal-tiles-12-40.png
new file mode 100644
index 0000000..78f14e2
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-40.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-41.png b/mindus/assets/blocks/autotiles/metal-tiles-12-41.png
new file mode 100644
index 0000000..a22f9bd
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-41.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-42.png b/mindus/assets/blocks/autotiles/metal-tiles-12-42.png
new file mode 100644
index 0000000..07ee905
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-42.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-43.png b/mindus/assets/blocks/autotiles/metal-tiles-12-43.png
new file mode 100644
index 0000000..36f2892
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-43.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-44.png b/mindus/assets/blocks/autotiles/metal-tiles-12-44.png
new file mode 100644
index 0000000..4987599
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-44.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-45.png b/mindus/assets/blocks/autotiles/metal-tiles-12-45.png
new file mode 100644
index 0000000..a24214b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-45.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-46.png b/mindus/assets/blocks/autotiles/metal-tiles-12-46.png
new file mode 100644
index 0000000..8ff4705
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-46.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-5.png b/mindus/assets/blocks/autotiles/metal-tiles-12-5.png
new file mode 100644
index 0000000..6ed3b7e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-5.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-6.png b/mindus/assets/blocks/autotiles/metal-tiles-12-6.png
new file mode 100644
index 0000000..603498a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-6.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-7.png b/mindus/assets/blocks/autotiles/metal-tiles-12-7.png
new file mode 100644
index 0000000..27f2e1d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-7.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-8.png b/mindus/assets/blocks/autotiles/metal-tiles-12-8.png
new file mode 100644
index 0000000..14085b4
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-8.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-12-9.png b/mindus/assets/blocks/autotiles/metal-tiles-12-9.png
new file mode 100644
index 0000000..35e059c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-12-9.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-0.png b/mindus/assets/blocks/autotiles/metal-tiles-13-0.png
new file mode 100644
index 0000000..3332ddc
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-0.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-1.png b/mindus/assets/blocks/autotiles/metal-tiles-13-1.png
new file mode 100644
index 0000000..ca7f99b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-1.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-10.png b/mindus/assets/blocks/autotiles/metal-tiles-13-10.png
new file mode 100644
index 0000000..b9b6377
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-10.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-11.png b/mindus/assets/blocks/autotiles/metal-tiles-13-11.png
new file mode 100644
index 0000000..f737cd3
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-11.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-12.png b/mindus/assets/blocks/autotiles/metal-tiles-13-12.png
new file mode 100644
index 0000000..46f5c8a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-12.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-13.png b/mindus/assets/blocks/autotiles/metal-tiles-13-13.png
new file mode 100644
index 0000000..9b23b42
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-13.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-14.png b/mindus/assets/blocks/autotiles/metal-tiles-13-14.png
new file mode 100644
index 0000000..fa894c7
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-14.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-15.png b/mindus/assets/blocks/autotiles/metal-tiles-13-15.png
new file mode 100644
index 0000000..6141753
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-15.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-16.png b/mindus/assets/blocks/autotiles/metal-tiles-13-16.png
new file mode 100644
index 0000000..f118cc9
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-16.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-17.png b/mindus/assets/blocks/autotiles/metal-tiles-13-17.png
new file mode 100644
index 0000000..f381884
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-17.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-18.png b/mindus/assets/blocks/autotiles/metal-tiles-13-18.png
new file mode 100644
index 0000000..5327c77
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-18.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-19.png b/mindus/assets/blocks/autotiles/metal-tiles-13-19.png
new file mode 100644
index 0000000..9cac53f
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-19.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-2.png b/mindus/assets/blocks/autotiles/metal-tiles-13-2.png
new file mode 100644
index 0000000..d9ee678
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-2.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-20.png b/mindus/assets/blocks/autotiles/metal-tiles-13-20.png
new file mode 100644
index 0000000..34a9b97
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-20.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-21.png b/mindus/assets/blocks/autotiles/metal-tiles-13-21.png
new file mode 100644
index 0000000..c7d711a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-21.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-22.png b/mindus/assets/blocks/autotiles/metal-tiles-13-22.png
new file mode 100644
index 0000000..f839f76
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-22.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-23.png b/mindus/assets/blocks/autotiles/metal-tiles-13-23.png
new file mode 100644
index 0000000..a6dd10f
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-23.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-24.png b/mindus/assets/blocks/autotiles/metal-tiles-13-24.png
new file mode 100644
index 0000000..dc8ce47
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-24.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-25.png b/mindus/assets/blocks/autotiles/metal-tiles-13-25.png
new file mode 100644
index 0000000..351991c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-25.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-26.png b/mindus/assets/blocks/autotiles/metal-tiles-13-26.png
new file mode 100644
index 0000000..60e350a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-26.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-27.png b/mindus/assets/blocks/autotiles/metal-tiles-13-27.png
new file mode 100644
index 0000000..4ffdf70
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-27.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-28.png b/mindus/assets/blocks/autotiles/metal-tiles-13-28.png
new file mode 100644
index 0000000..5252471
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-28.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-29.png b/mindus/assets/blocks/autotiles/metal-tiles-13-29.png
new file mode 100644
index 0000000..03d8fad
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-29.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-3.png b/mindus/assets/blocks/autotiles/metal-tiles-13-3.png
new file mode 100644
index 0000000..b8258ab
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-3.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-30.png b/mindus/assets/blocks/autotiles/metal-tiles-13-30.png
new file mode 100644
index 0000000..1ad7c5d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-30.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-31.png b/mindus/assets/blocks/autotiles/metal-tiles-13-31.png
new file mode 100644
index 0000000..d489929
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-31.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-32.png b/mindus/assets/blocks/autotiles/metal-tiles-13-32.png
new file mode 100644
index 0000000..ad62d60
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-32.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-33.png b/mindus/assets/blocks/autotiles/metal-tiles-13-33.png
new file mode 100644
index 0000000..1579858
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-33.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-34.png b/mindus/assets/blocks/autotiles/metal-tiles-13-34.png
new file mode 100644
index 0000000..f9f1fd3
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-34.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-35.png b/mindus/assets/blocks/autotiles/metal-tiles-13-35.png
new file mode 100644
index 0000000..408c336
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-35.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-36.png b/mindus/assets/blocks/autotiles/metal-tiles-13-36.png
new file mode 100644
index 0000000..4dbbaa3
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-36.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-37.png b/mindus/assets/blocks/autotiles/metal-tiles-13-37.png
new file mode 100644
index 0000000..97ca011
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-37.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-38.png b/mindus/assets/blocks/autotiles/metal-tiles-13-38.png
new file mode 100644
index 0000000..3e81d7e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-38.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-39.png b/mindus/assets/blocks/autotiles/metal-tiles-13-39.png
new file mode 100644
index 0000000..4f1c6d9
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-39.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-4.png b/mindus/assets/blocks/autotiles/metal-tiles-13-4.png
new file mode 100644
index 0000000..e22663c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-4.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-40.png b/mindus/assets/blocks/autotiles/metal-tiles-13-40.png
new file mode 100644
index 0000000..4d4192b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-40.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-41.png b/mindus/assets/blocks/autotiles/metal-tiles-13-41.png
new file mode 100644
index 0000000..8fe32f0
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-41.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-42.png b/mindus/assets/blocks/autotiles/metal-tiles-13-42.png
new file mode 100644
index 0000000..4a21be1
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-42.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-43.png b/mindus/assets/blocks/autotiles/metal-tiles-13-43.png
new file mode 100644
index 0000000..7157336
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-43.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-44.png b/mindus/assets/blocks/autotiles/metal-tiles-13-44.png
new file mode 100644
index 0000000..871051a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-44.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-45.png b/mindus/assets/blocks/autotiles/metal-tiles-13-45.png
new file mode 100644
index 0000000..b3af2f7
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-45.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-46.png b/mindus/assets/blocks/autotiles/metal-tiles-13-46.png
new file mode 100644
index 0000000..f5286b9
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-46.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-5.png b/mindus/assets/blocks/autotiles/metal-tiles-13-5.png
new file mode 100644
index 0000000..237b627
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-5.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-6.png b/mindus/assets/blocks/autotiles/metal-tiles-13-6.png
new file mode 100644
index 0000000..49f5386
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-6.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-7.png b/mindus/assets/blocks/autotiles/metal-tiles-13-7.png
new file mode 100644
index 0000000..8ef2e71
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-7.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-8.png b/mindus/assets/blocks/autotiles/metal-tiles-13-8.png
new file mode 100644
index 0000000..47433e2
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-8.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-13-9.png b/mindus/assets/blocks/autotiles/metal-tiles-13-9.png
new file mode 100644
index 0000000..6c47f48
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-13-9.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-0.png b/mindus/assets/blocks/autotiles/metal-tiles-2-0.png
new file mode 100644
index 0000000..caeab95
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-0.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-1.png b/mindus/assets/blocks/autotiles/metal-tiles-2-1.png
new file mode 100644
index 0000000..c4698a0
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-1.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-10.png b/mindus/assets/blocks/autotiles/metal-tiles-2-10.png
new file mode 100644
index 0000000..1ba4986
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-10.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-11.png b/mindus/assets/blocks/autotiles/metal-tiles-2-11.png
new file mode 100644
index 0000000..097785d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-11.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-12.png b/mindus/assets/blocks/autotiles/metal-tiles-2-12.png
new file mode 100644
index 0000000..f35577d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-12.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-13.png b/mindus/assets/blocks/autotiles/metal-tiles-2-13.png
new file mode 100644
index 0000000..9b51823
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-13.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-14.png b/mindus/assets/blocks/autotiles/metal-tiles-2-14.png
new file mode 100644
index 0000000..e779740
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-14.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-15.png b/mindus/assets/blocks/autotiles/metal-tiles-2-15.png
new file mode 100644
index 0000000..ba79b92
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-15.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-16.png b/mindus/assets/blocks/autotiles/metal-tiles-2-16.png
new file mode 100644
index 0000000..3c18fd3
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-16.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-17.png b/mindus/assets/blocks/autotiles/metal-tiles-2-17.png
new file mode 100644
index 0000000..173cf84
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-17.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-18.png b/mindus/assets/blocks/autotiles/metal-tiles-2-18.png
new file mode 100644
index 0000000..d340820
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-18.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-19.png b/mindus/assets/blocks/autotiles/metal-tiles-2-19.png
new file mode 100644
index 0000000..32bd595
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-19.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-2.png b/mindus/assets/blocks/autotiles/metal-tiles-2-2.png
new file mode 100644
index 0000000..d955dff
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-2.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-20.png b/mindus/assets/blocks/autotiles/metal-tiles-2-20.png
new file mode 100644
index 0000000..8e1d65d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-20.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-21.png b/mindus/assets/blocks/autotiles/metal-tiles-2-21.png
new file mode 100644
index 0000000..7dac136
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-21.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-22.png b/mindus/assets/blocks/autotiles/metal-tiles-2-22.png
new file mode 100644
index 0000000..029dc90
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-22.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-23.png b/mindus/assets/blocks/autotiles/metal-tiles-2-23.png
new file mode 100644
index 0000000..6263765
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-23.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-24.png b/mindus/assets/blocks/autotiles/metal-tiles-2-24.png
new file mode 100644
index 0000000..b5ae8d3
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-24.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-25.png b/mindus/assets/blocks/autotiles/metal-tiles-2-25.png
new file mode 100644
index 0000000..50e8f3d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-25.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-26.png b/mindus/assets/blocks/autotiles/metal-tiles-2-26.png
new file mode 100644
index 0000000..f797daf
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-26.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-27.png b/mindus/assets/blocks/autotiles/metal-tiles-2-27.png
new file mode 100644
index 0000000..5ee3c8b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-27.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-28.png b/mindus/assets/blocks/autotiles/metal-tiles-2-28.png
new file mode 100644
index 0000000..dc096ad
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-28.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-29.png b/mindus/assets/blocks/autotiles/metal-tiles-2-29.png
new file mode 100644
index 0000000..785e827
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-29.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-3.png b/mindus/assets/blocks/autotiles/metal-tiles-2-3.png
new file mode 100644
index 0000000..30131f2
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-3.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-30.png b/mindus/assets/blocks/autotiles/metal-tiles-2-30.png
new file mode 100644
index 0000000..eca0259
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-30.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-31.png b/mindus/assets/blocks/autotiles/metal-tiles-2-31.png
new file mode 100644
index 0000000..32cd971
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-31.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-32.png b/mindus/assets/blocks/autotiles/metal-tiles-2-32.png
new file mode 100644
index 0000000..1bc9a79
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-32.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-33.png b/mindus/assets/blocks/autotiles/metal-tiles-2-33.png
new file mode 100644
index 0000000..7669099
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-33.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-34.png b/mindus/assets/blocks/autotiles/metal-tiles-2-34.png
new file mode 100644
index 0000000..f9811fc
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-34.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-35.png b/mindus/assets/blocks/autotiles/metal-tiles-2-35.png
new file mode 100644
index 0000000..1e76135
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-35.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-36.png b/mindus/assets/blocks/autotiles/metal-tiles-2-36.png
new file mode 100644
index 0000000..779b2e6
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-36.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-37.png b/mindus/assets/blocks/autotiles/metal-tiles-2-37.png
new file mode 100644
index 0000000..bb687e2
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-37.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-38.png b/mindus/assets/blocks/autotiles/metal-tiles-2-38.png
new file mode 100644
index 0000000..4cbc0a7
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-38.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-39.png b/mindus/assets/blocks/autotiles/metal-tiles-2-39.png
new file mode 100644
index 0000000..b52513d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-39.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-4.png b/mindus/assets/blocks/autotiles/metal-tiles-2-4.png
new file mode 100644
index 0000000..713c38d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-4.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-40.png b/mindus/assets/blocks/autotiles/metal-tiles-2-40.png
new file mode 100644
index 0000000..b0eb224
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-40.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-41.png b/mindus/assets/blocks/autotiles/metal-tiles-2-41.png
new file mode 100644
index 0000000..f96f95c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-41.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-42.png b/mindus/assets/blocks/autotiles/metal-tiles-2-42.png
new file mode 100644
index 0000000..76c52b9
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-42.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-43.png b/mindus/assets/blocks/autotiles/metal-tiles-2-43.png
new file mode 100644
index 0000000..ad5cdcf
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-43.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-44.png b/mindus/assets/blocks/autotiles/metal-tiles-2-44.png
new file mode 100644
index 0000000..d06d356
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-44.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-45.png b/mindus/assets/blocks/autotiles/metal-tiles-2-45.png
new file mode 100644
index 0000000..52ef069
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-45.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-46.png b/mindus/assets/blocks/autotiles/metal-tiles-2-46.png
new file mode 100644
index 0000000..7330cc5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-46.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-5.png b/mindus/assets/blocks/autotiles/metal-tiles-2-5.png
new file mode 100644
index 0000000..4679da5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-5.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-6.png b/mindus/assets/blocks/autotiles/metal-tiles-2-6.png
new file mode 100644
index 0000000..f63a416
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-6.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-7.png b/mindus/assets/blocks/autotiles/metal-tiles-2-7.png
new file mode 100644
index 0000000..0be8c91
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-7.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-8.png b/mindus/assets/blocks/autotiles/metal-tiles-2-8.png
new file mode 100644
index 0000000..311edc2
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-8.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-2-9.png b/mindus/assets/blocks/autotiles/metal-tiles-2-9.png
new file mode 100644
index 0000000..e2a0e42
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-2-9.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-0.png b/mindus/assets/blocks/autotiles/metal-tiles-3-0.png
new file mode 100644
index 0000000..bdae22e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-0.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-1.png b/mindus/assets/blocks/autotiles/metal-tiles-3-1.png
new file mode 100644
index 0000000..7520c5a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-1.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-10.png b/mindus/assets/blocks/autotiles/metal-tiles-3-10.png
new file mode 100644
index 0000000..c925ff0
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-10.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-11.png b/mindus/assets/blocks/autotiles/metal-tiles-3-11.png
new file mode 100644
index 0000000..9a1a7c5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-11.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-12.png b/mindus/assets/blocks/autotiles/metal-tiles-3-12.png
new file mode 100644
index 0000000..15e6f17
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-12.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-13.png b/mindus/assets/blocks/autotiles/metal-tiles-3-13.png
new file mode 100644
index 0000000..85fd4fc
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-13.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-14.png b/mindus/assets/blocks/autotiles/metal-tiles-3-14.png
new file mode 100644
index 0000000..a322a5d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-14.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-15.png b/mindus/assets/blocks/autotiles/metal-tiles-3-15.png
new file mode 100644
index 0000000..da52500
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-15.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-16.png b/mindus/assets/blocks/autotiles/metal-tiles-3-16.png
new file mode 100644
index 0000000..d72d97b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-16.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-17.png b/mindus/assets/blocks/autotiles/metal-tiles-3-17.png
new file mode 100644
index 0000000..832b149
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-17.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-18.png b/mindus/assets/blocks/autotiles/metal-tiles-3-18.png
new file mode 100644
index 0000000..4379723
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-18.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-19.png b/mindus/assets/blocks/autotiles/metal-tiles-3-19.png
new file mode 100644
index 0000000..93b266a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-19.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-2.png b/mindus/assets/blocks/autotiles/metal-tiles-3-2.png
new file mode 100644
index 0000000..50cd686
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-2.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-20.png b/mindus/assets/blocks/autotiles/metal-tiles-3-20.png
new file mode 100644
index 0000000..0a72dad
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-20.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-21.png b/mindus/assets/blocks/autotiles/metal-tiles-3-21.png
new file mode 100644
index 0000000..ce12293
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-21.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-22.png b/mindus/assets/blocks/autotiles/metal-tiles-3-22.png
new file mode 100644
index 0000000..902e067
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-22.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-23.png b/mindus/assets/blocks/autotiles/metal-tiles-3-23.png
new file mode 100644
index 0000000..a4007b5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-23.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-24.png b/mindus/assets/blocks/autotiles/metal-tiles-3-24.png
new file mode 100644
index 0000000..755a3b6
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-24.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-25.png b/mindus/assets/blocks/autotiles/metal-tiles-3-25.png
new file mode 100644
index 0000000..a4445fb
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-25.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-26.png b/mindus/assets/blocks/autotiles/metal-tiles-3-26.png
new file mode 100644
index 0000000..3f875f6
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-26.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-27.png b/mindus/assets/blocks/autotiles/metal-tiles-3-27.png
new file mode 100644
index 0000000..4dac529
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-27.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-28.png b/mindus/assets/blocks/autotiles/metal-tiles-3-28.png
new file mode 100644
index 0000000..7321f5f
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-28.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-29.png b/mindus/assets/blocks/autotiles/metal-tiles-3-29.png
new file mode 100644
index 0000000..2af14c9
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-29.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-3.png b/mindus/assets/blocks/autotiles/metal-tiles-3-3.png
new file mode 100644
index 0000000..88d3a5c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-3.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-30.png b/mindus/assets/blocks/autotiles/metal-tiles-3-30.png
new file mode 100644
index 0000000..bd38ece
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-30.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-31.png b/mindus/assets/blocks/autotiles/metal-tiles-3-31.png
new file mode 100644
index 0000000..f4abdc5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-31.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-32.png b/mindus/assets/blocks/autotiles/metal-tiles-3-32.png
new file mode 100644
index 0000000..b9cb1b4
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-32.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-33.png b/mindus/assets/blocks/autotiles/metal-tiles-3-33.png
new file mode 100644
index 0000000..fc69dba
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-33.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-34.png b/mindus/assets/blocks/autotiles/metal-tiles-3-34.png
new file mode 100644
index 0000000..711447f
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-34.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-35.png b/mindus/assets/blocks/autotiles/metal-tiles-3-35.png
new file mode 100644
index 0000000..4655808
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-35.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-36.png b/mindus/assets/blocks/autotiles/metal-tiles-3-36.png
new file mode 100644
index 0000000..74c02f8
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-36.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-37.png b/mindus/assets/blocks/autotiles/metal-tiles-3-37.png
new file mode 100644
index 0000000..1184018
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-37.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-38.png b/mindus/assets/blocks/autotiles/metal-tiles-3-38.png
new file mode 100644
index 0000000..d551d84
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-38.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-39.png b/mindus/assets/blocks/autotiles/metal-tiles-3-39.png
new file mode 100644
index 0000000..87e8748
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-39.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-4.png b/mindus/assets/blocks/autotiles/metal-tiles-3-4.png
new file mode 100644
index 0000000..76e25a5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-4.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-40.png b/mindus/assets/blocks/autotiles/metal-tiles-3-40.png
new file mode 100644
index 0000000..ff585e0
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-40.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-41.png b/mindus/assets/blocks/autotiles/metal-tiles-3-41.png
new file mode 100644
index 0000000..44b13f1
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-41.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-42.png b/mindus/assets/blocks/autotiles/metal-tiles-3-42.png
new file mode 100644
index 0000000..89b5b22
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-42.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-43.png b/mindus/assets/blocks/autotiles/metal-tiles-3-43.png
new file mode 100644
index 0000000..7dfc972
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-43.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-44.png b/mindus/assets/blocks/autotiles/metal-tiles-3-44.png
new file mode 100644
index 0000000..bdca804
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-44.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-45.png b/mindus/assets/blocks/autotiles/metal-tiles-3-45.png
new file mode 100644
index 0000000..eb5007e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-45.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-46.png b/mindus/assets/blocks/autotiles/metal-tiles-3-46.png
new file mode 100644
index 0000000..548e6f6
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-46.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-5.png b/mindus/assets/blocks/autotiles/metal-tiles-3-5.png
new file mode 100644
index 0000000..72c9e0d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-5.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-6.png b/mindus/assets/blocks/autotiles/metal-tiles-3-6.png
new file mode 100644
index 0000000..11ee010
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-6.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-7.png b/mindus/assets/blocks/autotiles/metal-tiles-3-7.png
new file mode 100644
index 0000000..4170a58
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-7.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-8.png b/mindus/assets/blocks/autotiles/metal-tiles-3-8.png
new file mode 100644
index 0000000..a9eefdc
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-8.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-3-9.png b/mindus/assets/blocks/autotiles/metal-tiles-3-9.png
new file mode 100644
index 0000000..3a35a5d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-3-9.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-0.png b/mindus/assets/blocks/autotiles/metal-tiles-4-0.png
new file mode 100644
index 0000000..00b4ad8
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-0.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-1.png b/mindus/assets/blocks/autotiles/metal-tiles-4-1.png
new file mode 100644
index 0000000..82275e2
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-1.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-10.png b/mindus/assets/blocks/autotiles/metal-tiles-4-10.png
new file mode 100644
index 0000000..10c768e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-10.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-11.png b/mindus/assets/blocks/autotiles/metal-tiles-4-11.png
new file mode 100644
index 0000000..b95958a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-11.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-12.png b/mindus/assets/blocks/autotiles/metal-tiles-4-12.png
new file mode 100644
index 0000000..35a4e45
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-12.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-13.png b/mindus/assets/blocks/autotiles/metal-tiles-4-13.png
new file mode 100644
index 0000000..6ae9f4a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-13.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-14.png b/mindus/assets/blocks/autotiles/metal-tiles-4-14.png
new file mode 100644
index 0000000..83747f9
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-14.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-15.png b/mindus/assets/blocks/autotiles/metal-tiles-4-15.png
new file mode 100644
index 0000000..c821401
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-15.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-16.png b/mindus/assets/blocks/autotiles/metal-tiles-4-16.png
new file mode 100644
index 0000000..d529f3c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-16.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-17.png b/mindus/assets/blocks/autotiles/metal-tiles-4-17.png
new file mode 100644
index 0000000..b6f09b7
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-17.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-18.png b/mindus/assets/blocks/autotiles/metal-tiles-4-18.png
new file mode 100644
index 0000000..d4a6738
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-18.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-19.png b/mindus/assets/blocks/autotiles/metal-tiles-4-19.png
new file mode 100644
index 0000000..fa0d55b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-19.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-2.png b/mindus/assets/blocks/autotiles/metal-tiles-4-2.png
new file mode 100644
index 0000000..7449f92
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-2.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-20.png b/mindus/assets/blocks/autotiles/metal-tiles-4-20.png
new file mode 100644
index 0000000..2346538
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-20.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-21.png b/mindus/assets/blocks/autotiles/metal-tiles-4-21.png
new file mode 100644
index 0000000..e232b9d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-21.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-22.png b/mindus/assets/blocks/autotiles/metal-tiles-4-22.png
new file mode 100644
index 0000000..4a0e524
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-22.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-23.png b/mindus/assets/blocks/autotiles/metal-tiles-4-23.png
new file mode 100644
index 0000000..74597c6
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-23.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-24.png b/mindus/assets/blocks/autotiles/metal-tiles-4-24.png
new file mode 100644
index 0000000..60f97bd
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-24.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-25.png b/mindus/assets/blocks/autotiles/metal-tiles-4-25.png
new file mode 100644
index 0000000..6acc66c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-25.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-26.png b/mindus/assets/blocks/autotiles/metal-tiles-4-26.png
new file mode 100644
index 0000000..e830d09
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-26.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-27.png b/mindus/assets/blocks/autotiles/metal-tiles-4-27.png
new file mode 100644
index 0000000..078e3de
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-27.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-28.png b/mindus/assets/blocks/autotiles/metal-tiles-4-28.png
new file mode 100644
index 0000000..9de1388
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-28.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-29.png b/mindus/assets/blocks/autotiles/metal-tiles-4-29.png
new file mode 100644
index 0000000..1810900
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-29.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-3.png b/mindus/assets/blocks/autotiles/metal-tiles-4-3.png
new file mode 100644
index 0000000..287abbf
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-3.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-30.png b/mindus/assets/blocks/autotiles/metal-tiles-4-30.png
new file mode 100644
index 0000000..7531ec6
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-30.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-31.png b/mindus/assets/blocks/autotiles/metal-tiles-4-31.png
new file mode 100644
index 0000000..e64da1a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-31.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-32.png b/mindus/assets/blocks/autotiles/metal-tiles-4-32.png
new file mode 100644
index 0000000..c6264f0
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-32.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-33.png b/mindus/assets/blocks/autotiles/metal-tiles-4-33.png
new file mode 100644
index 0000000..895288c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-33.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-34.png b/mindus/assets/blocks/autotiles/metal-tiles-4-34.png
new file mode 100644
index 0000000..ff0557e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-34.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-35.png b/mindus/assets/blocks/autotiles/metal-tiles-4-35.png
new file mode 100644
index 0000000..9b2bceb
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-35.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-36.png b/mindus/assets/blocks/autotiles/metal-tiles-4-36.png
new file mode 100644
index 0000000..8db4055
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-36.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-37.png b/mindus/assets/blocks/autotiles/metal-tiles-4-37.png
new file mode 100644
index 0000000..0182b7a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-37.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-38.png b/mindus/assets/blocks/autotiles/metal-tiles-4-38.png
new file mode 100644
index 0000000..f7820a3
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-38.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-39.png b/mindus/assets/blocks/autotiles/metal-tiles-4-39.png
new file mode 100644
index 0000000..3537e61
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-39.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-4.png b/mindus/assets/blocks/autotiles/metal-tiles-4-4.png
new file mode 100644
index 0000000..cbaa305
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-4.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-40.png b/mindus/assets/blocks/autotiles/metal-tiles-4-40.png
new file mode 100644
index 0000000..b21107f
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-40.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-41.png b/mindus/assets/blocks/autotiles/metal-tiles-4-41.png
new file mode 100644
index 0000000..9c40fa8
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-41.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-42.png b/mindus/assets/blocks/autotiles/metal-tiles-4-42.png
new file mode 100644
index 0000000..cb814d3
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-42.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-43.png b/mindus/assets/blocks/autotiles/metal-tiles-4-43.png
new file mode 100644
index 0000000..bc1dbd5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-43.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-44.png b/mindus/assets/blocks/autotiles/metal-tiles-4-44.png
new file mode 100644
index 0000000..563fb3c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-44.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-45.png b/mindus/assets/blocks/autotiles/metal-tiles-4-45.png
new file mode 100644
index 0000000..b4a3b75
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-45.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-46.png b/mindus/assets/blocks/autotiles/metal-tiles-4-46.png
new file mode 100644
index 0000000..4691589
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-46.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-5.png b/mindus/assets/blocks/autotiles/metal-tiles-4-5.png
new file mode 100644
index 0000000..9a9ff32
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-5.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-6.png b/mindus/assets/blocks/autotiles/metal-tiles-4-6.png
new file mode 100644
index 0000000..457ffa6
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-6.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-7.png b/mindus/assets/blocks/autotiles/metal-tiles-4-7.png
new file mode 100644
index 0000000..49c18a5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-7.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-8.png b/mindus/assets/blocks/autotiles/metal-tiles-4-8.png
new file mode 100644
index 0000000..2ed38c4
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-8.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-4-9.png b/mindus/assets/blocks/autotiles/metal-tiles-4-9.png
new file mode 100644
index 0000000..a353fc2
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-4-9.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-0.png b/mindus/assets/blocks/autotiles/metal-tiles-5-0.png
new file mode 100644
index 0000000..69467f2
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-0.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-1.png b/mindus/assets/blocks/autotiles/metal-tiles-5-1.png
new file mode 100644
index 0000000..22ead22
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-1.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-10.png b/mindus/assets/blocks/autotiles/metal-tiles-5-10.png
new file mode 100644
index 0000000..cf16663
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-10.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-11.png b/mindus/assets/blocks/autotiles/metal-tiles-5-11.png
new file mode 100644
index 0000000..95e9503
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-11.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-12.png b/mindus/assets/blocks/autotiles/metal-tiles-5-12.png
new file mode 100644
index 0000000..f439d21
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-12.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-13.png b/mindus/assets/blocks/autotiles/metal-tiles-5-13.png
new file mode 100644
index 0000000..5798fae
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-13.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-14.png b/mindus/assets/blocks/autotiles/metal-tiles-5-14.png
new file mode 100644
index 0000000..0569883
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-14.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-15.png b/mindus/assets/blocks/autotiles/metal-tiles-5-15.png
new file mode 100644
index 0000000..62a79ae
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-15.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-16.png b/mindus/assets/blocks/autotiles/metal-tiles-5-16.png
new file mode 100644
index 0000000..ee0235a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-16.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-17.png b/mindus/assets/blocks/autotiles/metal-tiles-5-17.png
new file mode 100644
index 0000000..a15bbc9
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-17.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-18.png b/mindus/assets/blocks/autotiles/metal-tiles-5-18.png
new file mode 100644
index 0000000..c76569b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-18.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-19.png b/mindus/assets/blocks/autotiles/metal-tiles-5-19.png
new file mode 100644
index 0000000..d54b262
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-19.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-2.png b/mindus/assets/blocks/autotiles/metal-tiles-5-2.png
new file mode 100644
index 0000000..cd1f86a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-2.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-20.png b/mindus/assets/blocks/autotiles/metal-tiles-5-20.png
new file mode 100644
index 0000000..a593240
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-20.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-21.png b/mindus/assets/blocks/autotiles/metal-tiles-5-21.png
new file mode 100644
index 0000000..13e19ce
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-21.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-22.png b/mindus/assets/blocks/autotiles/metal-tiles-5-22.png
new file mode 100644
index 0000000..5623e69
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-22.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-23.png b/mindus/assets/blocks/autotiles/metal-tiles-5-23.png
new file mode 100644
index 0000000..53c0630
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-23.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-24.png b/mindus/assets/blocks/autotiles/metal-tiles-5-24.png
new file mode 100644
index 0000000..7dbc8ae
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-24.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-25.png b/mindus/assets/blocks/autotiles/metal-tiles-5-25.png
new file mode 100644
index 0000000..79e5db2
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-25.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-26.png b/mindus/assets/blocks/autotiles/metal-tiles-5-26.png
new file mode 100644
index 0000000..d6bad14
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-26.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-27.png b/mindus/assets/blocks/autotiles/metal-tiles-5-27.png
new file mode 100644
index 0000000..70cbdee
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-27.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-28.png b/mindus/assets/blocks/autotiles/metal-tiles-5-28.png
new file mode 100644
index 0000000..2225801
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-28.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-29.png b/mindus/assets/blocks/autotiles/metal-tiles-5-29.png
new file mode 100644
index 0000000..4abb670
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-29.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-3.png b/mindus/assets/blocks/autotiles/metal-tiles-5-3.png
new file mode 100644
index 0000000..ba62f58
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-3.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-30.png b/mindus/assets/blocks/autotiles/metal-tiles-5-30.png
new file mode 100644
index 0000000..53b87ce
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-30.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-31.png b/mindus/assets/blocks/autotiles/metal-tiles-5-31.png
new file mode 100644
index 0000000..06a4bf4
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-31.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-32.png b/mindus/assets/blocks/autotiles/metal-tiles-5-32.png
new file mode 100644
index 0000000..d79b4ef
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-32.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-33.png b/mindus/assets/blocks/autotiles/metal-tiles-5-33.png
new file mode 100644
index 0000000..fcdc443
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-33.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-34.png b/mindus/assets/blocks/autotiles/metal-tiles-5-34.png
new file mode 100644
index 0000000..9a1e3e5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-34.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-35.png b/mindus/assets/blocks/autotiles/metal-tiles-5-35.png
new file mode 100644
index 0000000..59a4ec5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-35.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-36.png b/mindus/assets/blocks/autotiles/metal-tiles-5-36.png
new file mode 100644
index 0000000..c1b25ae
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-36.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-37.png b/mindus/assets/blocks/autotiles/metal-tiles-5-37.png
new file mode 100644
index 0000000..4c6905d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-37.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-38.png b/mindus/assets/blocks/autotiles/metal-tiles-5-38.png
new file mode 100644
index 0000000..9888aec
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-38.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-39.png b/mindus/assets/blocks/autotiles/metal-tiles-5-39.png
new file mode 100644
index 0000000..95185ac
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-39.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-4.png b/mindus/assets/blocks/autotiles/metal-tiles-5-4.png
new file mode 100644
index 0000000..e59e637
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-4.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-40.png b/mindus/assets/blocks/autotiles/metal-tiles-5-40.png
new file mode 100644
index 0000000..c50d43e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-40.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-41.png b/mindus/assets/blocks/autotiles/metal-tiles-5-41.png
new file mode 100644
index 0000000..3298734
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-41.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-42.png b/mindus/assets/blocks/autotiles/metal-tiles-5-42.png
new file mode 100644
index 0000000..c50d43e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-42.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-43.png b/mindus/assets/blocks/autotiles/metal-tiles-5-43.png
new file mode 100644
index 0000000..a477f91
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-43.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-44.png b/mindus/assets/blocks/autotiles/metal-tiles-5-44.png
new file mode 100644
index 0000000..d35790a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-44.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-45.png b/mindus/assets/blocks/autotiles/metal-tiles-5-45.png
new file mode 100644
index 0000000..af47e8f
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-45.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-46.png b/mindus/assets/blocks/autotiles/metal-tiles-5-46.png
new file mode 100644
index 0000000..3026e07
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-46.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-5.png b/mindus/assets/blocks/autotiles/metal-tiles-5-5.png
new file mode 100644
index 0000000..92aedb7
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-5.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-6.png b/mindus/assets/blocks/autotiles/metal-tiles-5-6.png
new file mode 100644
index 0000000..64ed301
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-6.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-7.png b/mindus/assets/blocks/autotiles/metal-tiles-5-7.png
new file mode 100644
index 0000000..07fd707
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-7.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-8.png b/mindus/assets/blocks/autotiles/metal-tiles-5-8.png
new file mode 100644
index 0000000..339280d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-8.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-5-9.png b/mindus/assets/blocks/autotiles/metal-tiles-5-9.png
new file mode 100644
index 0000000..4fdbfde
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-5-9.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-0.png b/mindus/assets/blocks/autotiles/metal-tiles-6-0.png
new file mode 100644
index 0000000..ad7d00d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-0.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-1.png b/mindus/assets/blocks/autotiles/metal-tiles-6-1.png
new file mode 100644
index 0000000..1f48765
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-1.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-10.png b/mindus/assets/blocks/autotiles/metal-tiles-6-10.png
new file mode 100644
index 0000000..bb073b3
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-10.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-11.png b/mindus/assets/blocks/autotiles/metal-tiles-6-11.png
new file mode 100644
index 0000000..42b80ef
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-11.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-12.png b/mindus/assets/blocks/autotiles/metal-tiles-6-12.png
new file mode 100644
index 0000000..8b7be57
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-12.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-13.png b/mindus/assets/blocks/autotiles/metal-tiles-6-13.png
new file mode 100644
index 0000000..6ef9434
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-13.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-14.png b/mindus/assets/blocks/autotiles/metal-tiles-6-14.png
new file mode 100644
index 0000000..61f2d64
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-14.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-15.png b/mindus/assets/blocks/autotiles/metal-tiles-6-15.png
new file mode 100644
index 0000000..26aae39
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-15.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-16.png b/mindus/assets/blocks/autotiles/metal-tiles-6-16.png
new file mode 100644
index 0000000..b9030ed
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-16.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-17.png b/mindus/assets/blocks/autotiles/metal-tiles-6-17.png
new file mode 100644
index 0000000..be1ef5c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-17.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-18.png b/mindus/assets/blocks/autotiles/metal-tiles-6-18.png
new file mode 100644
index 0000000..6af4202
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-18.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-19.png b/mindus/assets/blocks/autotiles/metal-tiles-6-19.png
new file mode 100644
index 0000000..2788249
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-19.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-2.png b/mindus/assets/blocks/autotiles/metal-tiles-6-2.png
new file mode 100644
index 0000000..8b88cf9
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-2.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-20.png b/mindus/assets/blocks/autotiles/metal-tiles-6-20.png
new file mode 100644
index 0000000..5ac2000
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-20.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-21.png b/mindus/assets/blocks/autotiles/metal-tiles-6-21.png
new file mode 100644
index 0000000..6610907
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-21.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-22.png b/mindus/assets/blocks/autotiles/metal-tiles-6-22.png
new file mode 100644
index 0000000..ef14ca5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-22.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-23.png b/mindus/assets/blocks/autotiles/metal-tiles-6-23.png
new file mode 100644
index 0000000..9f57666
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-23.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-24.png b/mindus/assets/blocks/autotiles/metal-tiles-6-24.png
new file mode 100644
index 0000000..5f8db4c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-24.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-25.png b/mindus/assets/blocks/autotiles/metal-tiles-6-25.png
new file mode 100644
index 0000000..696885b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-25.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-26.png b/mindus/assets/blocks/autotiles/metal-tiles-6-26.png
new file mode 100644
index 0000000..b353e68
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-26.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-27.png b/mindus/assets/blocks/autotiles/metal-tiles-6-27.png
new file mode 100644
index 0000000..c7c051e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-27.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-28.png b/mindus/assets/blocks/autotiles/metal-tiles-6-28.png
new file mode 100644
index 0000000..d39925e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-28.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-29.png b/mindus/assets/blocks/autotiles/metal-tiles-6-29.png
new file mode 100644
index 0000000..6c8ce52
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-29.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-3.png b/mindus/assets/blocks/autotiles/metal-tiles-6-3.png
new file mode 100644
index 0000000..3a9e4c4
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-3.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-30.png b/mindus/assets/blocks/autotiles/metal-tiles-6-30.png
new file mode 100644
index 0000000..a6cb0e6
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-30.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-31.png b/mindus/assets/blocks/autotiles/metal-tiles-6-31.png
new file mode 100644
index 0000000..92416de
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-31.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-32.png b/mindus/assets/blocks/autotiles/metal-tiles-6-32.png
new file mode 100644
index 0000000..194d2fa
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-32.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-33.png b/mindus/assets/blocks/autotiles/metal-tiles-6-33.png
new file mode 100644
index 0000000..65ac22d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-33.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-34.png b/mindus/assets/blocks/autotiles/metal-tiles-6-34.png
new file mode 100644
index 0000000..554f821
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-34.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-35.png b/mindus/assets/blocks/autotiles/metal-tiles-6-35.png
new file mode 100644
index 0000000..eaafb33
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-35.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-36.png b/mindus/assets/blocks/autotiles/metal-tiles-6-36.png
new file mode 100644
index 0000000..4cfa1fb
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-36.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-37.png b/mindus/assets/blocks/autotiles/metal-tiles-6-37.png
new file mode 100644
index 0000000..902f4f0
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-37.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-38.png b/mindus/assets/blocks/autotiles/metal-tiles-6-38.png
new file mode 100644
index 0000000..d6bd022
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-38.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-39.png b/mindus/assets/blocks/autotiles/metal-tiles-6-39.png
new file mode 100644
index 0000000..9d2985d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-39.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-4.png b/mindus/assets/blocks/autotiles/metal-tiles-6-4.png
new file mode 100644
index 0000000..a88d5dd
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-4.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-40.png b/mindus/assets/blocks/autotiles/metal-tiles-6-40.png
new file mode 100644
index 0000000..9f48b4c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-40.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-41.png b/mindus/assets/blocks/autotiles/metal-tiles-6-41.png
new file mode 100644
index 0000000..b0dac68
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-41.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-42.png b/mindus/assets/blocks/autotiles/metal-tiles-6-42.png
new file mode 100644
index 0000000..85efe7c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-42.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-43.png b/mindus/assets/blocks/autotiles/metal-tiles-6-43.png
new file mode 100644
index 0000000..5bc8a6d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-43.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-44.png b/mindus/assets/blocks/autotiles/metal-tiles-6-44.png
new file mode 100644
index 0000000..b405c26
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-44.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-45.png b/mindus/assets/blocks/autotiles/metal-tiles-6-45.png
new file mode 100644
index 0000000..75c89f9
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-45.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-46.png b/mindus/assets/blocks/autotiles/metal-tiles-6-46.png
new file mode 100644
index 0000000..76b180f
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-46.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-5.png b/mindus/assets/blocks/autotiles/metal-tiles-6-5.png
new file mode 100644
index 0000000..3b271b8
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-5.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-6.png b/mindus/assets/blocks/autotiles/metal-tiles-6-6.png
new file mode 100644
index 0000000..995d78d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-6.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-7.png b/mindus/assets/blocks/autotiles/metal-tiles-6-7.png
new file mode 100644
index 0000000..bb96155
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-7.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-8.png b/mindus/assets/blocks/autotiles/metal-tiles-6-8.png
new file mode 100644
index 0000000..8880f0d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-8.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-6-9.png b/mindus/assets/blocks/autotiles/metal-tiles-6-9.png
new file mode 100644
index 0000000..d76bf54
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-6-9.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-0.png b/mindus/assets/blocks/autotiles/metal-tiles-7-0.png
new file mode 100644
index 0000000..7ba2ee7
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-0.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-1.png b/mindus/assets/blocks/autotiles/metal-tiles-7-1.png
new file mode 100644
index 0000000..7630513
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-1.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-10.png b/mindus/assets/blocks/autotiles/metal-tiles-7-10.png
new file mode 100644
index 0000000..d83daa7
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-10.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-11.png b/mindus/assets/blocks/autotiles/metal-tiles-7-11.png
new file mode 100644
index 0000000..e008042
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-11.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-12.png b/mindus/assets/blocks/autotiles/metal-tiles-7-12.png
new file mode 100644
index 0000000..1db011b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-12.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-13.png b/mindus/assets/blocks/autotiles/metal-tiles-7-13.png
new file mode 100644
index 0000000..a62e783
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-13.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-14.png b/mindus/assets/blocks/autotiles/metal-tiles-7-14.png
new file mode 100644
index 0000000..9006361
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-14.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-15.png b/mindus/assets/blocks/autotiles/metal-tiles-7-15.png
new file mode 100644
index 0000000..74e7dc8
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-15.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-16.png b/mindus/assets/blocks/autotiles/metal-tiles-7-16.png
new file mode 100644
index 0000000..b1e540d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-16.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-17.png b/mindus/assets/blocks/autotiles/metal-tiles-7-17.png
new file mode 100644
index 0000000..26292ea
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-17.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-18.png b/mindus/assets/blocks/autotiles/metal-tiles-7-18.png
new file mode 100644
index 0000000..79e5eba
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-18.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-19.png b/mindus/assets/blocks/autotiles/metal-tiles-7-19.png
new file mode 100644
index 0000000..0e066e6
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-19.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-2.png b/mindus/assets/blocks/autotiles/metal-tiles-7-2.png
new file mode 100644
index 0000000..e7fa6c3
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-2.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-20.png b/mindus/assets/blocks/autotiles/metal-tiles-7-20.png
new file mode 100644
index 0000000..1f1755c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-20.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-21.png b/mindus/assets/blocks/autotiles/metal-tiles-7-21.png
new file mode 100644
index 0000000..c6115d2
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-21.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-22.png b/mindus/assets/blocks/autotiles/metal-tiles-7-22.png
new file mode 100644
index 0000000..bc8db04
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-22.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-23.png b/mindus/assets/blocks/autotiles/metal-tiles-7-23.png
new file mode 100644
index 0000000..6b4e32b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-23.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-24.png b/mindus/assets/blocks/autotiles/metal-tiles-7-24.png
new file mode 100644
index 0000000..0352e7a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-24.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-25.png b/mindus/assets/blocks/autotiles/metal-tiles-7-25.png
new file mode 100644
index 0000000..8368129
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-25.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-26.png b/mindus/assets/blocks/autotiles/metal-tiles-7-26.png
new file mode 100644
index 0000000..a8e5f4b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-26.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-27.png b/mindus/assets/blocks/autotiles/metal-tiles-7-27.png
new file mode 100644
index 0000000..7559e43
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-27.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-28.png b/mindus/assets/blocks/autotiles/metal-tiles-7-28.png
new file mode 100644
index 0000000..96acd2d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-28.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-29.png b/mindus/assets/blocks/autotiles/metal-tiles-7-29.png
new file mode 100644
index 0000000..36f0e81
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-29.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-3.png b/mindus/assets/blocks/autotiles/metal-tiles-7-3.png
new file mode 100644
index 0000000..388fd85
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-3.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-30.png b/mindus/assets/blocks/autotiles/metal-tiles-7-30.png
new file mode 100644
index 0000000..581bb1e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-30.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-31.png b/mindus/assets/blocks/autotiles/metal-tiles-7-31.png
new file mode 100644
index 0000000..e92efb0
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-31.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-32.png b/mindus/assets/blocks/autotiles/metal-tiles-7-32.png
new file mode 100644
index 0000000..36f3ff9
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-32.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-33.png b/mindus/assets/blocks/autotiles/metal-tiles-7-33.png
new file mode 100644
index 0000000..b66baf7
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-33.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-34.png b/mindus/assets/blocks/autotiles/metal-tiles-7-34.png
new file mode 100644
index 0000000..3c5c929
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-34.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-35.png b/mindus/assets/blocks/autotiles/metal-tiles-7-35.png
new file mode 100644
index 0000000..4e06511
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-35.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-36.png b/mindus/assets/blocks/autotiles/metal-tiles-7-36.png
new file mode 100644
index 0000000..1e7b97d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-36.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-37.png b/mindus/assets/blocks/autotiles/metal-tiles-7-37.png
new file mode 100644
index 0000000..54cd643
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-37.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-38.png b/mindus/assets/blocks/autotiles/metal-tiles-7-38.png
new file mode 100644
index 0000000..04940da
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-38.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-39.png b/mindus/assets/blocks/autotiles/metal-tiles-7-39.png
new file mode 100644
index 0000000..c5398c2
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-39.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-4.png b/mindus/assets/blocks/autotiles/metal-tiles-7-4.png
new file mode 100644
index 0000000..25211e9
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-4.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-40.png b/mindus/assets/blocks/autotiles/metal-tiles-7-40.png
new file mode 100644
index 0000000..63407a9
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-40.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-41.png b/mindus/assets/blocks/autotiles/metal-tiles-7-41.png
new file mode 100644
index 0000000..9d44b4b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-41.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-42.png b/mindus/assets/blocks/autotiles/metal-tiles-7-42.png
new file mode 100644
index 0000000..8bf50db
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-42.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-43.png b/mindus/assets/blocks/autotiles/metal-tiles-7-43.png
new file mode 100644
index 0000000..ab97444
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-43.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-44.png b/mindus/assets/blocks/autotiles/metal-tiles-7-44.png
new file mode 100644
index 0000000..33f4f60
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-44.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-45.png b/mindus/assets/blocks/autotiles/metal-tiles-7-45.png
new file mode 100644
index 0000000..4b115a6
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-45.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-46.png b/mindus/assets/blocks/autotiles/metal-tiles-7-46.png
new file mode 100644
index 0000000..9a3a890
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-46.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-5.png b/mindus/assets/blocks/autotiles/metal-tiles-7-5.png
new file mode 100644
index 0000000..51bf85b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-5.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-6.png b/mindus/assets/blocks/autotiles/metal-tiles-7-6.png
new file mode 100644
index 0000000..bfeb5cc
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-6.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-7.png b/mindus/assets/blocks/autotiles/metal-tiles-7-7.png
new file mode 100644
index 0000000..ee557d8
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-7.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-8.png b/mindus/assets/blocks/autotiles/metal-tiles-7-8.png
new file mode 100644
index 0000000..18aed09
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-8.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-7-9.png b/mindus/assets/blocks/autotiles/metal-tiles-7-9.png
new file mode 100644
index 0000000..b9b2494
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-7-9.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-0.png b/mindus/assets/blocks/autotiles/metal-tiles-8-0.png
new file mode 100644
index 0000000..5daca87
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-0.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-1.png b/mindus/assets/blocks/autotiles/metal-tiles-8-1.png
new file mode 100644
index 0000000..3222ca6
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-1.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-10.png b/mindus/assets/blocks/autotiles/metal-tiles-8-10.png
new file mode 100644
index 0000000..3d4f15a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-10.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-11.png b/mindus/assets/blocks/autotiles/metal-tiles-8-11.png
new file mode 100644
index 0000000..912ff0e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-11.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-12.png b/mindus/assets/blocks/autotiles/metal-tiles-8-12.png
new file mode 100644
index 0000000..72aee98
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-12.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-13.png b/mindus/assets/blocks/autotiles/metal-tiles-8-13.png
new file mode 100644
index 0000000..32fb643
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-13.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-14.png b/mindus/assets/blocks/autotiles/metal-tiles-8-14.png
new file mode 100644
index 0000000..da69402
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-14.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-15.png b/mindus/assets/blocks/autotiles/metal-tiles-8-15.png
new file mode 100644
index 0000000..76f44f5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-15.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-16.png b/mindus/assets/blocks/autotiles/metal-tiles-8-16.png
new file mode 100644
index 0000000..4121ab6
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-16.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-17.png b/mindus/assets/blocks/autotiles/metal-tiles-8-17.png
new file mode 100644
index 0000000..ca7efdc
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-17.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-18.png b/mindus/assets/blocks/autotiles/metal-tiles-8-18.png
new file mode 100644
index 0000000..f2ca665
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-18.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-19.png b/mindus/assets/blocks/autotiles/metal-tiles-8-19.png
new file mode 100644
index 0000000..eba78b2
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-19.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-2.png b/mindus/assets/blocks/autotiles/metal-tiles-8-2.png
new file mode 100644
index 0000000..2860522
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-2.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-20.png b/mindus/assets/blocks/autotiles/metal-tiles-8-20.png
new file mode 100644
index 0000000..18923e5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-20.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-21.png b/mindus/assets/blocks/autotiles/metal-tiles-8-21.png
new file mode 100644
index 0000000..e5d31bc
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-21.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-22.png b/mindus/assets/blocks/autotiles/metal-tiles-8-22.png
new file mode 100644
index 0000000..8ea22d4
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-22.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-23.png b/mindus/assets/blocks/autotiles/metal-tiles-8-23.png
new file mode 100644
index 0000000..f955a49
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-23.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-24.png b/mindus/assets/blocks/autotiles/metal-tiles-8-24.png
new file mode 100644
index 0000000..e0af7c8
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-24.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-25.png b/mindus/assets/blocks/autotiles/metal-tiles-8-25.png
new file mode 100644
index 0000000..29d1faa
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-25.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-26.png b/mindus/assets/blocks/autotiles/metal-tiles-8-26.png
new file mode 100644
index 0000000..466603a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-26.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-27.png b/mindus/assets/blocks/autotiles/metal-tiles-8-27.png
new file mode 100644
index 0000000..a81a289
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-27.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-28.png b/mindus/assets/blocks/autotiles/metal-tiles-8-28.png
new file mode 100644
index 0000000..4a6c8ba
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-28.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-29.png b/mindus/assets/blocks/autotiles/metal-tiles-8-29.png
new file mode 100644
index 0000000..825cdd9
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-29.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-3.png b/mindus/assets/blocks/autotiles/metal-tiles-8-3.png
new file mode 100644
index 0000000..7c37a25
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-3.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-30.png b/mindus/assets/blocks/autotiles/metal-tiles-8-30.png
new file mode 100644
index 0000000..6c54357
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-30.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-31.png b/mindus/assets/blocks/autotiles/metal-tiles-8-31.png
new file mode 100644
index 0000000..3070669
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-31.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-32.png b/mindus/assets/blocks/autotiles/metal-tiles-8-32.png
new file mode 100644
index 0000000..5e1de66
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-32.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-33.png b/mindus/assets/blocks/autotiles/metal-tiles-8-33.png
new file mode 100644
index 0000000..602f00e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-33.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-34.png b/mindus/assets/blocks/autotiles/metal-tiles-8-34.png
new file mode 100644
index 0000000..df9382a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-34.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-35.png b/mindus/assets/blocks/autotiles/metal-tiles-8-35.png
new file mode 100644
index 0000000..e3be791
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-35.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-36.png b/mindus/assets/blocks/autotiles/metal-tiles-8-36.png
new file mode 100644
index 0000000..e8c2913
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-36.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-37.png b/mindus/assets/blocks/autotiles/metal-tiles-8-37.png
new file mode 100644
index 0000000..88c2253
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-37.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-38.png b/mindus/assets/blocks/autotiles/metal-tiles-8-38.png
new file mode 100644
index 0000000..61eb19f
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-38.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-39.png b/mindus/assets/blocks/autotiles/metal-tiles-8-39.png
new file mode 100644
index 0000000..ddb8223
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-39.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-4.png b/mindus/assets/blocks/autotiles/metal-tiles-8-4.png
new file mode 100644
index 0000000..852bfed
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-4.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-40.png b/mindus/assets/blocks/autotiles/metal-tiles-8-40.png
new file mode 100644
index 0000000..71b9e6d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-40.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-41.png b/mindus/assets/blocks/autotiles/metal-tiles-8-41.png
new file mode 100644
index 0000000..a22f761
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-41.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-42.png b/mindus/assets/blocks/autotiles/metal-tiles-8-42.png
new file mode 100644
index 0000000..cc9c418
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-42.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-43.png b/mindus/assets/blocks/autotiles/metal-tiles-8-43.png
new file mode 100644
index 0000000..142d834
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-43.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-44.png b/mindus/assets/blocks/autotiles/metal-tiles-8-44.png
new file mode 100644
index 0000000..2f263ef
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-44.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-45.png b/mindus/assets/blocks/autotiles/metal-tiles-8-45.png
new file mode 100644
index 0000000..203bc62
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-45.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-46.png b/mindus/assets/blocks/autotiles/metal-tiles-8-46.png
new file mode 100644
index 0000000..d2fe08b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-46.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-5.png b/mindus/assets/blocks/autotiles/metal-tiles-8-5.png
new file mode 100644
index 0000000..7bdee26
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-5.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-6.png b/mindus/assets/blocks/autotiles/metal-tiles-8-6.png
new file mode 100644
index 0000000..1c564b6
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-6.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-7.png b/mindus/assets/blocks/autotiles/metal-tiles-8-7.png
new file mode 100644
index 0000000..9211d7e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-7.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-8.png b/mindus/assets/blocks/autotiles/metal-tiles-8-8.png
new file mode 100644
index 0000000..7c76914
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-8.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-8-9.png b/mindus/assets/blocks/autotiles/metal-tiles-8-9.png
new file mode 100644
index 0000000..0c45540
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-8-9.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-0.png b/mindus/assets/blocks/autotiles/metal-tiles-9-0.png
new file mode 100644
index 0000000..24ee982
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-0.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-1.png b/mindus/assets/blocks/autotiles/metal-tiles-9-1.png
new file mode 100644
index 0000000..68e0d16
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-1.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-10.png b/mindus/assets/blocks/autotiles/metal-tiles-9-10.png
new file mode 100644
index 0000000..85c444e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-10.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-11.png b/mindus/assets/blocks/autotiles/metal-tiles-9-11.png
new file mode 100644
index 0000000..7187e7a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-11.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-12.png b/mindus/assets/blocks/autotiles/metal-tiles-9-12.png
new file mode 100644
index 0000000..26287cf
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-12.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-13.png b/mindus/assets/blocks/autotiles/metal-tiles-9-13.png
new file mode 100644
index 0000000..0ae157d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-13.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-14.png b/mindus/assets/blocks/autotiles/metal-tiles-9-14.png
new file mode 100644
index 0000000..9c0fc7c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-14.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-15.png b/mindus/assets/blocks/autotiles/metal-tiles-9-15.png
new file mode 100644
index 0000000..e767068
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-15.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-16.png b/mindus/assets/blocks/autotiles/metal-tiles-9-16.png
new file mode 100644
index 0000000..90ae779
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-16.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-17.png b/mindus/assets/blocks/autotiles/metal-tiles-9-17.png
new file mode 100644
index 0000000..f6b7c5a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-17.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-18.png b/mindus/assets/blocks/autotiles/metal-tiles-9-18.png
new file mode 100644
index 0000000..854d6b8
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-18.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-19.png b/mindus/assets/blocks/autotiles/metal-tiles-9-19.png
new file mode 100644
index 0000000..89e0add
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-19.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-2.png b/mindus/assets/blocks/autotiles/metal-tiles-9-2.png
new file mode 100644
index 0000000..5860da6
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-2.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-20.png b/mindus/assets/blocks/autotiles/metal-tiles-9-20.png
new file mode 100644
index 0000000..35997e4
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-20.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-21.png b/mindus/assets/blocks/autotiles/metal-tiles-9-21.png
new file mode 100644
index 0000000..8de8ae8
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-21.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-22.png b/mindus/assets/blocks/autotiles/metal-tiles-9-22.png
new file mode 100644
index 0000000..92d6dc7
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-22.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-23.png b/mindus/assets/blocks/autotiles/metal-tiles-9-23.png
new file mode 100644
index 0000000..5b488d7
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-23.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-24.png b/mindus/assets/blocks/autotiles/metal-tiles-9-24.png
new file mode 100644
index 0000000..49591fb
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-24.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-25.png b/mindus/assets/blocks/autotiles/metal-tiles-9-25.png
new file mode 100644
index 0000000..2f7299c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-25.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-26.png b/mindus/assets/blocks/autotiles/metal-tiles-9-26.png
new file mode 100644
index 0000000..5983f77
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-26.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-27.png b/mindus/assets/blocks/autotiles/metal-tiles-9-27.png
new file mode 100644
index 0000000..e79bd60
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-27.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-28.png b/mindus/assets/blocks/autotiles/metal-tiles-9-28.png
new file mode 100644
index 0000000..99cdba3
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-28.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-29.png b/mindus/assets/blocks/autotiles/metal-tiles-9-29.png
new file mode 100644
index 0000000..220ea61
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-29.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-3.png b/mindus/assets/blocks/autotiles/metal-tiles-9-3.png
new file mode 100644
index 0000000..83235e5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-3.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-30.png b/mindus/assets/blocks/autotiles/metal-tiles-9-30.png
new file mode 100644
index 0000000..bd9f5ec
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-30.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-31.png b/mindus/assets/blocks/autotiles/metal-tiles-9-31.png
new file mode 100644
index 0000000..aaffc8c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-31.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-32.png b/mindus/assets/blocks/autotiles/metal-tiles-9-32.png
new file mode 100644
index 0000000..021965b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-32.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-33.png b/mindus/assets/blocks/autotiles/metal-tiles-9-33.png
new file mode 100644
index 0000000..334667d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-33.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-34.png b/mindus/assets/blocks/autotiles/metal-tiles-9-34.png
new file mode 100644
index 0000000..e4f3c9a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-34.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-35.png b/mindus/assets/blocks/autotiles/metal-tiles-9-35.png
new file mode 100644
index 0000000..89ec484
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-35.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-36.png b/mindus/assets/blocks/autotiles/metal-tiles-9-36.png
new file mode 100644
index 0000000..14d5ada
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-36.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-37.png b/mindus/assets/blocks/autotiles/metal-tiles-9-37.png
new file mode 100644
index 0000000..f33cf39
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-37.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-38.png b/mindus/assets/blocks/autotiles/metal-tiles-9-38.png
new file mode 100644
index 0000000..33f11e7
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-38.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-39.png b/mindus/assets/blocks/autotiles/metal-tiles-9-39.png
new file mode 100644
index 0000000..aa9a2bb
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-39.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-4.png b/mindus/assets/blocks/autotiles/metal-tiles-9-4.png
new file mode 100644
index 0000000..13a2232
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-4.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-40.png b/mindus/assets/blocks/autotiles/metal-tiles-9-40.png
new file mode 100644
index 0000000..3f7d666
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-40.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-41.png b/mindus/assets/blocks/autotiles/metal-tiles-9-41.png
new file mode 100644
index 0000000..b8b38e1
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-41.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-42.png b/mindus/assets/blocks/autotiles/metal-tiles-9-42.png
new file mode 100644
index 0000000..8a53630
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-42.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-43.png b/mindus/assets/blocks/autotiles/metal-tiles-9-43.png
new file mode 100644
index 0000000..8b06f92
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-43.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-44.png b/mindus/assets/blocks/autotiles/metal-tiles-9-44.png
new file mode 100644
index 0000000..5704e30
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-44.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-45.png b/mindus/assets/blocks/autotiles/metal-tiles-9-45.png
new file mode 100644
index 0000000..bccab8c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-45.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-46.png b/mindus/assets/blocks/autotiles/metal-tiles-9-46.png
new file mode 100644
index 0000000..47e1dfe
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-46.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-5.png b/mindus/assets/blocks/autotiles/metal-tiles-9-5.png
new file mode 100644
index 0000000..e3c1a9e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-5.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-6.png b/mindus/assets/blocks/autotiles/metal-tiles-9-6.png
new file mode 100644
index 0000000..e198733
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-6.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-7.png b/mindus/assets/blocks/autotiles/metal-tiles-9-7.png
new file mode 100644
index 0000000..470f4f2
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-7.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-8.png b/mindus/assets/blocks/autotiles/metal-tiles-9-8.png
new file mode 100644
index 0000000..fb2c08c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-8.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-tiles-9-9.png b/mindus/assets/blocks/autotiles/metal-tiles-9-9.png
new file mode 100644
index 0000000..caa3924
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-tiles-9-9.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-0.png b/mindus/assets/blocks/autotiles/metal-wall-1-0.png
new file mode 100644
index 0000000..640609b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-0.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-1.png b/mindus/assets/blocks/autotiles/metal-wall-1-1.png
new file mode 100644
index 0000000..a1e90f7
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-1.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-10.png b/mindus/assets/blocks/autotiles/metal-wall-1-10.png
new file mode 100644
index 0000000..52125b4
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-10.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-11.png b/mindus/assets/blocks/autotiles/metal-wall-1-11.png
new file mode 100644
index 0000000..e8b1d7e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-11.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-12.png b/mindus/assets/blocks/autotiles/metal-wall-1-12.png
new file mode 100644
index 0000000..0073c49
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-12.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-13.png b/mindus/assets/blocks/autotiles/metal-wall-1-13.png
new file mode 100644
index 0000000..d49c80a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-13.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-14.png b/mindus/assets/blocks/autotiles/metal-wall-1-14.png
new file mode 100644
index 0000000..d44aeb1
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-14.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-15.png b/mindus/assets/blocks/autotiles/metal-wall-1-15.png
new file mode 100644
index 0000000..e631fec
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-15.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-16.png b/mindus/assets/blocks/autotiles/metal-wall-1-16.png
new file mode 100644
index 0000000..3676779
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-16.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-17.png b/mindus/assets/blocks/autotiles/metal-wall-1-17.png
new file mode 100644
index 0000000..268b491
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-17.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-18.png b/mindus/assets/blocks/autotiles/metal-wall-1-18.png
new file mode 100644
index 0000000..5dfa25a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-18.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-19.png b/mindus/assets/blocks/autotiles/metal-wall-1-19.png
new file mode 100644
index 0000000..4b658c4
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-19.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-2.png b/mindus/assets/blocks/autotiles/metal-wall-1-2.png
new file mode 100644
index 0000000..b9df68f
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-2.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-20.png b/mindus/assets/blocks/autotiles/metal-wall-1-20.png
new file mode 100644
index 0000000..4522fa3
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-20.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-21.png b/mindus/assets/blocks/autotiles/metal-wall-1-21.png
new file mode 100644
index 0000000..d0f1a56
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-21.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-22.png b/mindus/assets/blocks/autotiles/metal-wall-1-22.png
new file mode 100644
index 0000000..edf89f4
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-22.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-23.png b/mindus/assets/blocks/autotiles/metal-wall-1-23.png
new file mode 100644
index 0000000..040824c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-23.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-24.png b/mindus/assets/blocks/autotiles/metal-wall-1-24.png
new file mode 100644
index 0000000..6d0a49e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-24.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-25.png b/mindus/assets/blocks/autotiles/metal-wall-1-25.png
new file mode 100644
index 0000000..221364f
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-25.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-26.png b/mindus/assets/blocks/autotiles/metal-wall-1-26.png
new file mode 100644
index 0000000..4928345
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-26.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-27.png b/mindus/assets/blocks/autotiles/metal-wall-1-27.png
new file mode 100644
index 0000000..eebb24b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-27.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-28.png b/mindus/assets/blocks/autotiles/metal-wall-1-28.png
new file mode 100644
index 0000000..e2fb598
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-28.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-29.png b/mindus/assets/blocks/autotiles/metal-wall-1-29.png
new file mode 100644
index 0000000..15a78d3
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-29.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-3.png b/mindus/assets/blocks/autotiles/metal-wall-1-3.png
new file mode 100644
index 0000000..41fab9c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-3.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-30.png b/mindus/assets/blocks/autotiles/metal-wall-1-30.png
new file mode 100644
index 0000000..0fba650
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-30.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-31.png b/mindus/assets/blocks/autotiles/metal-wall-1-31.png
new file mode 100644
index 0000000..98a9922
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-31.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-32.png b/mindus/assets/blocks/autotiles/metal-wall-1-32.png
new file mode 100644
index 0000000..5ab8034
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-32.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-33.png b/mindus/assets/blocks/autotiles/metal-wall-1-33.png
new file mode 100644
index 0000000..4749954
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-33.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-34.png b/mindus/assets/blocks/autotiles/metal-wall-1-34.png
new file mode 100644
index 0000000..d87fe4d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-34.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-35.png b/mindus/assets/blocks/autotiles/metal-wall-1-35.png
new file mode 100644
index 0000000..307ed89
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-35.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-36.png b/mindus/assets/blocks/autotiles/metal-wall-1-36.png
new file mode 100644
index 0000000..f834622
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-36.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-37.png b/mindus/assets/blocks/autotiles/metal-wall-1-37.png
new file mode 100644
index 0000000..8a26104
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-37.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-38.png b/mindus/assets/blocks/autotiles/metal-wall-1-38.png
new file mode 100644
index 0000000..a11902c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-38.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-39.png b/mindus/assets/blocks/autotiles/metal-wall-1-39.png
new file mode 100644
index 0000000..b28bd3f
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-39.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-4.png b/mindus/assets/blocks/autotiles/metal-wall-1-4.png
new file mode 100644
index 0000000..63d4abf
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-4.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-40.png b/mindus/assets/blocks/autotiles/metal-wall-1-40.png
new file mode 100644
index 0000000..ba00ff4
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-40.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-41.png b/mindus/assets/blocks/autotiles/metal-wall-1-41.png
new file mode 100644
index 0000000..eede726
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-41.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-42.png b/mindus/assets/blocks/autotiles/metal-wall-1-42.png
new file mode 100644
index 0000000..67ba1b8
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-42.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-43.png b/mindus/assets/blocks/autotiles/metal-wall-1-43.png
new file mode 100644
index 0000000..8f9ca02
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-43.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-44.png b/mindus/assets/blocks/autotiles/metal-wall-1-44.png
new file mode 100644
index 0000000..e12b71e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-44.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-45.png b/mindus/assets/blocks/autotiles/metal-wall-1-45.png
new file mode 100644
index 0000000..5400826
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-45.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-46.png b/mindus/assets/blocks/autotiles/metal-wall-1-46.png
new file mode 100644
index 0000000..ee1e6f6
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-46.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-5.png b/mindus/assets/blocks/autotiles/metal-wall-1-5.png
new file mode 100644
index 0000000..ca1d63e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-5.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-6.png b/mindus/assets/blocks/autotiles/metal-wall-1-6.png
new file mode 100644
index 0000000..70c5a91
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-6.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-7.png b/mindus/assets/blocks/autotiles/metal-wall-1-7.png
new file mode 100644
index 0000000..bab16a5
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-7.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-8.png b/mindus/assets/blocks/autotiles/metal-wall-1-8.png
new file mode 100644
index 0000000..cf967dc
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-8.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-1-9.png b/mindus/assets/blocks/autotiles/metal-wall-1-9.png
new file mode 100644
index 0000000..f84fa03
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-1-9.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-0.png b/mindus/assets/blocks/autotiles/metal-wall-2-0.png
new file mode 100644
index 0000000..04a0ae8
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-0.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-1.png b/mindus/assets/blocks/autotiles/metal-wall-2-1.png
new file mode 100644
index 0000000..a8acbc3
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-1.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-10.png b/mindus/assets/blocks/autotiles/metal-wall-2-10.png
new file mode 100644
index 0000000..48e51ba
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-10.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-11.png b/mindus/assets/blocks/autotiles/metal-wall-2-11.png
new file mode 100644
index 0000000..c15fa03
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-11.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-12.png b/mindus/assets/blocks/autotiles/metal-wall-2-12.png
new file mode 100644
index 0000000..33dc92e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-12.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-13.png b/mindus/assets/blocks/autotiles/metal-wall-2-13.png
new file mode 100644
index 0000000..4b78b5a
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-13.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-14.png b/mindus/assets/blocks/autotiles/metal-wall-2-14.png
new file mode 100644
index 0000000..c00cc7d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-14.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-15.png b/mindus/assets/blocks/autotiles/metal-wall-2-15.png
new file mode 100644
index 0000000..fe7cd06
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-15.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-16.png b/mindus/assets/blocks/autotiles/metal-wall-2-16.png
new file mode 100644
index 0000000..3f56550
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-16.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-17.png b/mindus/assets/blocks/autotiles/metal-wall-2-17.png
new file mode 100644
index 0000000..b80c98c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-17.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-18.png b/mindus/assets/blocks/autotiles/metal-wall-2-18.png
new file mode 100644
index 0000000..bc0c112
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-18.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-19.png b/mindus/assets/blocks/autotiles/metal-wall-2-19.png
new file mode 100644
index 0000000..951f456
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-19.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-2.png b/mindus/assets/blocks/autotiles/metal-wall-2-2.png
new file mode 100644
index 0000000..ce10177
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-2.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-20.png b/mindus/assets/blocks/autotiles/metal-wall-2-20.png
new file mode 100644
index 0000000..a3ed77f
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-20.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-21.png b/mindus/assets/blocks/autotiles/metal-wall-2-21.png
new file mode 100644
index 0000000..397bd21
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-21.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-22.png b/mindus/assets/blocks/autotiles/metal-wall-2-22.png
new file mode 100644
index 0000000..edfd93b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-22.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-23.png b/mindus/assets/blocks/autotiles/metal-wall-2-23.png
new file mode 100644
index 0000000..7c2b2a2
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-23.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-24.png b/mindus/assets/blocks/autotiles/metal-wall-2-24.png
new file mode 100644
index 0000000..2298d69
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-24.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-25.png b/mindus/assets/blocks/autotiles/metal-wall-2-25.png
new file mode 100644
index 0000000..a433744
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-25.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-26.png b/mindus/assets/blocks/autotiles/metal-wall-2-26.png
new file mode 100644
index 0000000..0f242fe
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-26.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-27.png b/mindus/assets/blocks/autotiles/metal-wall-2-27.png
new file mode 100644
index 0000000..f9130e7
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-27.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-28.png b/mindus/assets/blocks/autotiles/metal-wall-2-28.png
new file mode 100644
index 0000000..ae38e48
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-28.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-29.png b/mindus/assets/blocks/autotiles/metal-wall-2-29.png
new file mode 100644
index 0000000..7f9302d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-29.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-3.png b/mindus/assets/blocks/autotiles/metal-wall-2-3.png
new file mode 100644
index 0000000..7ef2049
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-3.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-30.png b/mindus/assets/blocks/autotiles/metal-wall-2-30.png
new file mode 100644
index 0000000..5846ddf
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-30.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-31.png b/mindus/assets/blocks/autotiles/metal-wall-2-31.png
new file mode 100644
index 0000000..ca9488e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-31.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-32.png b/mindus/assets/blocks/autotiles/metal-wall-2-32.png
new file mode 100644
index 0000000..d5d7088
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-32.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-33.png b/mindus/assets/blocks/autotiles/metal-wall-2-33.png
new file mode 100644
index 0000000..11122b1
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-33.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-34.png b/mindus/assets/blocks/autotiles/metal-wall-2-34.png
new file mode 100644
index 0000000..ece8ebb
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-34.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-35.png b/mindus/assets/blocks/autotiles/metal-wall-2-35.png
new file mode 100644
index 0000000..de8930f
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-35.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-36.png b/mindus/assets/blocks/autotiles/metal-wall-2-36.png
new file mode 100644
index 0000000..02c4bba
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-36.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-37.png b/mindus/assets/blocks/autotiles/metal-wall-2-37.png
new file mode 100644
index 0000000..adf0bfe
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-37.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-38.png b/mindus/assets/blocks/autotiles/metal-wall-2-38.png
new file mode 100644
index 0000000..4f72695
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-38.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-39.png b/mindus/assets/blocks/autotiles/metal-wall-2-39.png
new file mode 100644
index 0000000..a913a43
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-39.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-4.png b/mindus/assets/blocks/autotiles/metal-wall-2-4.png
new file mode 100644
index 0000000..68f933c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-4.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-40.png b/mindus/assets/blocks/autotiles/metal-wall-2-40.png
new file mode 100644
index 0000000..9174e84
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-40.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-41.png b/mindus/assets/blocks/autotiles/metal-wall-2-41.png
new file mode 100644
index 0000000..4118b39
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-41.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-42.png b/mindus/assets/blocks/autotiles/metal-wall-2-42.png
new file mode 100644
index 0000000..aad6bee
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-42.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-43.png b/mindus/assets/blocks/autotiles/metal-wall-2-43.png
new file mode 100644
index 0000000..da630ff
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-43.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-44.png b/mindus/assets/blocks/autotiles/metal-wall-2-44.png
new file mode 100644
index 0000000..a554111
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-44.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-45.png b/mindus/assets/blocks/autotiles/metal-wall-2-45.png
new file mode 100644
index 0000000..72ed549
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-45.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-46.png b/mindus/assets/blocks/autotiles/metal-wall-2-46.png
new file mode 100644
index 0000000..8f4ae93
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-46.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-5.png b/mindus/assets/blocks/autotiles/metal-wall-2-5.png
new file mode 100644
index 0000000..eada091
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-5.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-6.png b/mindus/assets/blocks/autotiles/metal-wall-2-6.png
new file mode 100644
index 0000000..afdfbfe
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-6.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-7.png b/mindus/assets/blocks/autotiles/metal-wall-2-7.png
new file mode 100644
index 0000000..7613a24
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-7.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-8.png b/mindus/assets/blocks/autotiles/metal-wall-2-8.png
new file mode 100644
index 0000000..162b264
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-8.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-2-9.png b/mindus/assets/blocks/autotiles/metal-wall-2-9.png
new file mode 100644
index 0000000..5062801
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-2-9.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-0.png b/mindus/assets/blocks/autotiles/metal-wall-3-0.png
new file mode 100644
index 0000000..3311205
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-0.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-1.png b/mindus/assets/blocks/autotiles/metal-wall-3-1.png
new file mode 100644
index 0000000..747d2cf
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-1.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-10.png b/mindus/assets/blocks/autotiles/metal-wall-3-10.png
new file mode 100644
index 0000000..dc5ce4e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-10.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-11.png b/mindus/assets/blocks/autotiles/metal-wall-3-11.png
new file mode 100644
index 0000000..f212f2d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-11.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-12.png b/mindus/assets/blocks/autotiles/metal-wall-3-12.png
new file mode 100644
index 0000000..ab7d94d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-12.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-13.png b/mindus/assets/blocks/autotiles/metal-wall-3-13.png
new file mode 100644
index 0000000..7cdeb16
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-13.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-14.png b/mindus/assets/blocks/autotiles/metal-wall-3-14.png
new file mode 100644
index 0000000..a04cb74
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-14.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-15.png b/mindus/assets/blocks/autotiles/metal-wall-3-15.png
new file mode 100644
index 0000000..d57a07e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-15.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-16.png b/mindus/assets/blocks/autotiles/metal-wall-3-16.png
new file mode 100644
index 0000000..0653d44
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-16.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-17.png b/mindus/assets/blocks/autotiles/metal-wall-3-17.png
new file mode 100644
index 0000000..c3e731d
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-17.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-18.png b/mindus/assets/blocks/autotiles/metal-wall-3-18.png
new file mode 100644
index 0000000..0726f83
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-18.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-19.png b/mindus/assets/blocks/autotiles/metal-wall-3-19.png
new file mode 100644
index 0000000..0c7b8c4
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-19.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-2.png b/mindus/assets/blocks/autotiles/metal-wall-3-2.png
new file mode 100644
index 0000000..6feccb1
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-2.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-20.png b/mindus/assets/blocks/autotiles/metal-wall-3-20.png
new file mode 100644
index 0000000..fc1548c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-20.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-21.png b/mindus/assets/blocks/autotiles/metal-wall-3-21.png
new file mode 100644
index 0000000..45725bf
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-21.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-22.png b/mindus/assets/blocks/autotiles/metal-wall-3-22.png
new file mode 100644
index 0000000..f781950
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-22.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-23.png b/mindus/assets/blocks/autotiles/metal-wall-3-23.png
new file mode 100644
index 0000000..1f7dabc
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-23.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-24.png b/mindus/assets/blocks/autotiles/metal-wall-3-24.png
new file mode 100644
index 0000000..45ec175
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-24.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-25.png b/mindus/assets/blocks/autotiles/metal-wall-3-25.png
new file mode 100644
index 0000000..acd70e7
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-25.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-26.png b/mindus/assets/blocks/autotiles/metal-wall-3-26.png
new file mode 100644
index 0000000..9a8fcde
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-26.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-27.png b/mindus/assets/blocks/autotiles/metal-wall-3-27.png
new file mode 100644
index 0000000..506eef3
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-27.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-28.png b/mindus/assets/blocks/autotiles/metal-wall-3-28.png
new file mode 100644
index 0000000..f1902d1
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-28.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-29.png b/mindus/assets/blocks/autotiles/metal-wall-3-29.png
new file mode 100644
index 0000000..5c21785
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-29.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-3.png b/mindus/assets/blocks/autotiles/metal-wall-3-3.png
new file mode 100644
index 0000000..c6a8e8e
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-3.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-30.png b/mindus/assets/blocks/autotiles/metal-wall-3-30.png
new file mode 100644
index 0000000..0bbb313
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-30.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-31.png b/mindus/assets/blocks/autotiles/metal-wall-3-31.png
new file mode 100644
index 0000000..36351ab
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-31.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-32.png b/mindus/assets/blocks/autotiles/metal-wall-3-32.png
new file mode 100644
index 0000000..e34b6ec
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-32.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-33.png b/mindus/assets/blocks/autotiles/metal-wall-3-33.png
new file mode 100644
index 0000000..0a3b85c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-33.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-34.png b/mindus/assets/blocks/autotiles/metal-wall-3-34.png
new file mode 100644
index 0000000..080c108
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-34.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-35.png b/mindus/assets/blocks/autotiles/metal-wall-3-35.png
new file mode 100644
index 0000000..72315a9
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-35.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-36.png b/mindus/assets/blocks/autotiles/metal-wall-3-36.png
new file mode 100644
index 0000000..099f81c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-36.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-37.png b/mindus/assets/blocks/autotiles/metal-wall-3-37.png
new file mode 100644
index 0000000..5801a27
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-37.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-38.png b/mindus/assets/blocks/autotiles/metal-wall-3-38.png
new file mode 100644
index 0000000..a07afb9
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-38.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-39.png b/mindus/assets/blocks/autotiles/metal-wall-3-39.png
new file mode 100644
index 0000000..703fcd9
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-39.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-4.png b/mindus/assets/blocks/autotiles/metal-wall-3-4.png
new file mode 100644
index 0000000..1409b76
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-4.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-40.png b/mindus/assets/blocks/autotiles/metal-wall-3-40.png
new file mode 100644
index 0000000..c77e1f2
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-40.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-41.png b/mindus/assets/blocks/autotiles/metal-wall-3-41.png
new file mode 100644
index 0000000..5261ec6
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-41.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-42.png b/mindus/assets/blocks/autotiles/metal-wall-3-42.png
new file mode 100644
index 0000000..2703bf2
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-42.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-43.png b/mindus/assets/blocks/autotiles/metal-wall-3-43.png
new file mode 100644
index 0000000..149b85c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-43.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-44.png b/mindus/assets/blocks/autotiles/metal-wall-3-44.png
new file mode 100644
index 0000000..92672ad
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-44.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-45.png b/mindus/assets/blocks/autotiles/metal-wall-3-45.png
new file mode 100644
index 0000000..94ccd2b
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-45.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-46.png b/mindus/assets/blocks/autotiles/metal-wall-3-46.png
new file mode 100644
index 0000000..29c6146
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-46.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-5.png b/mindus/assets/blocks/autotiles/metal-wall-3-5.png
new file mode 100644
index 0000000..57c6bb9
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-5.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-6.png b/mindus/assets/blocks/autotiles/metal-wall-3-6.png
new file mode 100644
index 0000000..726397c
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-6.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-7.png b/mindus/assets/blocks/autotiles/metal-wall-3-7.png
new file mode 100644
index 0000000..dc4d5db
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-7.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-8.png b/mindus/assets/blocks/autotiles/metal-wall-3-8.png
new file mode 100644
index 0000000..151dbed
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-8.png
Binary files differ
diff --git a/mindus/assets/blocks/autotiles/metal-wall-3-9.png b/mindus/assets/blocks/autotiles/metal-wall-3-9.png
new file mode 100644
index 0000000..9113075
--- /dev/null
+++ b/mindus/assets/blocks/autotiles/metal-wall-3-9.png
Binary files differ
diff --git a/mindus/assets/blocks/campaign/advanced-launch-pad.png b/mindus/assets/blocks/campaign/advanced-launch-pad.png
new file mode 100644
index 0000000..1ead655
--- /dev/null
+++ b/mindus/assets/blocks/campaign/advanced-launch-pad.png
Binary files differ
diff --git a/mindus/assets/blocks/campaign/interplanetary-accelerator.png b/mindus/assets/blocks/campaign/interplanetary-accelerator.png
new file mode 100644
index 0000000..7009ad1
--- /dev/null
+++ b/mindus/assets/blocks/campaign/interplanetary-accelerator.png
Binary files differ
diff --git a/mindus/assets/blocks/campaign/landing-pad-bg.png b/mindus/assets/blocks/campaign/landing-pad-bg.png
new file mode 100644
index 0000000..f02ccb8
--- /dev/null
+++ b/mindus/assets/blocks/campaign/landing-pad-bg.png
Binary files differ
diff --git a/mindus/assets/blocks/campaign/landing-pad.png b/mindus/assets/blocks/campaign/landing-pad.png
new file mode 100644
index 0000000..1978d09
--- /dev/null
+++ b/mindus/assets/blocks/campaign/landing-pad.png
Binary files differ
diff --git a/assets/blocks/campaign/launch-pad.png b/mindus/assets/blocks/campaign/launch-pad.png
index 3dcca24..3dcca24 100644
--- a/assets/blocks/campaign/launch-pad.png
+++ b/mindus/assets/blocks/campaign/launch-pad.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay0.png b/mindus/assets/blocks/characters/character-overlay0.png
new file mode 100644
index 0000000..ab31084
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay0.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay1.png b/mindus/assets/blocks/characters/character-overlay1.png
new file mode 100644
index 0000000..7b5b7bf
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay1.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay10.png b/mindus/assets/blocks/characters/character-overlay10.png
new file mode 100644
index 0000000..3bebe9f
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay10.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay11.png b/mindus/assets/blocks/characters/character-overlay11.png
new file mode 100644
index 0000000..8a360b8
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay11.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay12.png b/mindus/assets/blocks/characters/character-overlay12.png
new file mode 100644
index 0000000..2a57d8d
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay12.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay13.png b/mindus/assets/blocks/characters/character-overlay13.png
new file mode 100644
index 0000000..9c8d6de
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay13.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay14.png b/mindus/assets/blocks/characters/character-overlay14.png
new file mode 100644
index 0000000..6eaae36
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay14.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay15.png b/mindus/assets/blocks/characters/character-overlay15.png
new file mode 100644
index 0000000..d0db8a5
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay15.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay16.png b/mindus/assets/blocks/characters/character-overlay16.png
new file mode 100644
index 0000000..59f71c7
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay16.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay17.png b/mindus/assets/blocks/characters/character-overlay17.png
new file mode 100644
index 0000000..a61deb9
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay17.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay18.png b/mindus/assets/blocks/characters/character-overlay18.png
new file mode 100644
index 0000000..f9b1c9b
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay18.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay19.png b/mindus/assets/blocks/characters/character-overlay19.png
new file mode 100644
index 0000000..3b4b4af
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay19.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay2.png b/mindus/assets/blocks/characters/character-overlay2.png
new file mode 100644
index 0000000..d1fe91a
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay2.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay20.png b/mindus/assets/blocks/characters/character-overlay20.png
new file mode 100644
index 0000000..29e1154
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay20.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay21.png b/mindus/assets/blocks/characters/character-overlay21.png
new file mode 100644
index 0000000..796910f
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay21.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay22.png b/mindus/assets/blocks/characters/character-overlay22.png
new file mode 100644
index 0000000..092046c
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay22.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay23.png b/mindus/assets/blocks/characters/character-overlay23.png
new file mode 100644
index 0000000..3b83f8d
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay23.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay24.png b/mindus/assets/blocks/characters/character-overlay24.png
new file mode 100644
index 0000000..f33968c
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay24.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay25.png b/mindus/assets/blocks/characters/character-overlay25.png
new file mode 100644
index 0000000..3240b77
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay25.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay26.png b/mindus/assets/blocks/characters/character-overlay26.png
new file mode 100644
index 0000000..226386a
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay26.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay27.png b/mindus/assets/blocks/characters/character-overlay27.png
new file mode 100644
index 0000000..b5b478f
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay27.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay28.png b/mindus/assets/blocks/characters/character-overlay28.png
new file mode 100644
index 0000000..961b593
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay28.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay29.png b/mindus/assets/blocks/characters/character-overlay29.png
new file mode 100644
index 0000000..c8b9ecc
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay29.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay3.png b/mindus/assets/blocks/characters/character-overlay3.png
new file mode 100644
index 0000000..36e9a5f
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay3.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay30.png b/mindus/assets/blocks/characters/character-overlay30.png
new file mode 100644
index 0000000..31827bd
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay30.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay31.png b/mindus/assets/blocks/characters/character-overlay31.png
new file mode 100644
index 0000000..2dc061c
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay31.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay32.png b/mindus/assets/blocks/characters/character-overlay32.png
new file mode 100644
index 0000000..1b199c4
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay32.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay33.png b/mindus/assets/blocks/characters/character-overlay33.png
new file mode 100644
index 0000000..82dd71b
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay33.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay34.png b/mindus/assets/blocks/characters/character-overlay34.png
new file mode 100644
index 0000000..3d4d52a
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay34.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay35.png b/mindus/assets/blocks/characters/character-overlay35.png
new file mode 100644
index 0000000..e425182
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay35.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay36.png b/mindus/assets/blocks/characters/character-overlay36.png
new file mode 100644
index 0000000..dbfeea3
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay36.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay37.png b/mindus/assets/blocks/characters/character-overlay37.png
new file mode 100644
index 0000000..cd8e963
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay37.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay38.png b/mindus/assets/blocks/characters/character-overlay38.png
new file mode 100644
index 0000000..8c4b51e
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay38.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay39.png b/mindus/assets/blocks/characters/character-overlay39.png
new file mode 100644
index 0000000..a5539d8
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay39.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay4.png b/mindus/assets/blocks/characters/character-overlay4.png
new file mode 100644
index 0000000..6925c6b
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay4.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay40.png b/mindus/assets/blocks/characters/character-overlay40.png
new file mode 100644
index 0000000..6dbf897
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay40.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay41.png b/mindus/assets/blocks/characters/character-overlay41.png
new file mode 100644
index 0000000..1cd03b9
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay41.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay42.png b/mindus/assets/blocks/characters/character-overlay42.png
new file mode 100644
index 0000000..2a1e1aa
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay42.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay43.png b/mindus/assets/blocks/characters/character-overlay43.png
new file mode 100644
index 0000000..3d7f4a6
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay43.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay44.png b/mindus/assets/blocks/characters/character-overlay44.png
new file mode 100644
index 0000000..8d8a8a2
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay44.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay45.png b/mindus/assets/blocks/characters/character-overlay45.png
new file mode 100644
index 0000000..54260f0
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay45.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay46.png b/mindus/assets/blocks/characters/character-overlay46.png
new file mode 100644
index 0000000..63f1212
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay46.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay47.png b/mindus/assets/blocks/characters/character-overlay47.png
new file mode 100644
index 0000000..0888925
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay47.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay48.png b/mindus/assets/blocks/characters/character-overlay48.png
new file mode 100644
index 0000000..5284335
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay48.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay49.png b/mindus/assets/blocks/characters/character-overlay49.png
new file mode 100644
index 0000000..02ea7c7
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay49.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay5.png b/mindus/assets/blocks/characters/character-overlay5.png
new file mode 100644
index 0000000..abf33bc
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay5.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay50.png b/mindus/assets/blocks/characters/character-overlay50.png
new file mode 100644
index 0000000..eb59850
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay50.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay51.png b/mindus/assets/blocks/characters/character-overlay51.png
new file mode 100644
index 0000000..4dbe595
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay51.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay52.png b/mindus/assets/blocks/characters/character-overlay52.png
new file mode 100644
index 0000000..bee0c72
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay52.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay53.png b/mindus/assets/blocks/characters/character-overlay53.png
new file mode 100644
index 0000000..e167b56
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay53.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay54.png b/mindus/assets/blocks/characters/character-overlay54.png
new file mode 100644
index 0000000..81645eb
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay54.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay55.png b/mindus/assets/blocks/characters/character-overlay55.png
new file mode 100644
index 0000000..e297fff
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay55.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay56.png b/mindus/assets/blocks/characters/character-overlay56.png
new file mode 100644
index 0000000..3c49de4
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay56.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay57.png b/mindus/assets/blocks/characters/character-overlay57.png
new file mode 100644
index 0000000..b7ffe02
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay57.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay58.png b/mindus/assets/blocks/characters/character-overlay58.png
new file mode 100644
index 0000000..51f7496
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay58.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay59.png b/mindus/assets/blocks/characters/character-overlay59.png
new file mode 100644
index 0000000..ae66afc
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay59.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay6.png b/mindus/assets/blocks/characters/character-overlay6.png
new file mode 100644
index 0000000..4f4d924
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay6.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay60.png b/mindus/assets/blocks/characters/character-overlay60.png
new file mode 100644
index 0000000..2581705
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay60.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay61.png b/mindus/assets/blocks/characters/character-overlay61.png
new file mode 100644
index 0000000..c983753
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay61.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay62.png b/mindus/assets/blocks/characters/character-overlay62.png
new file mode 100644
index 0000000..e4e32ed
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay62.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay63.png b/mindus/assets/blocks/characters/character-overlay63.png
new file mode 100644
index 0000000..0194a9b
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay63.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay7.png b/mindus/assets/blocks/characters/character-overlay7.png
new file mode 100644
index 0000000..68c0c61
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay7.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay8.png b/mindus/assets/blocks/characters/character-overlay8.png
new file mode 100644
index 0000000..eff4986
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay8.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/character-overlay9.png b/mindus/assets/blocks/characters/character-overlay9.png
new file mode 100644
index 0000000..ce4c494
--- /dev/null
+++ b/mindus/assets/blocks/characters/character-overlay9.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux0.png b/mindus/assets/blocks/characters/rune-overlay-crux0.png
new file mode 100644
index 0000000..6d2f70d
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux0.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux1.png b/mindus/assets/blocks/characters/rune-overlay-crux1.png
new file mode 100644
index 0000000..b238f6f
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux1.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux10.png b/mindus/assets/blocks/characters/rune-overlay-crux10.png
new file mode 100644
index 0000000..3cbf48a
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux10.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux100.png b/mindus/assets/blocks/characters/rune-overlay-crux100.png
new file mode 100644
index 0000000..2ad0de1
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux100.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux101.png b/mindus/assets/blocks/characters/rune-overlay-crux101.png
new file mode 100644
index 0000000..1d8a7f5
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux101.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux102.png b/mindus/assets/blocks/characters/rune-overlay-crux102.png
new file mode 100644
index 0000000..964b9cb
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux102.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux103.png b/mindus/assets/blocks/characters/rune-overlay-crux103.png
new file mode 100644
index 0000000..841b5ab
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux103.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux104.png b/mindus/assets/blocks/characters/rune-overlay-crux104.png
new file mode 100644
index 0000000..e35b0af
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux104.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux105.png b/mindus/assets/blocks/characters/rune-overlay-crux105.png
new file mode 100644
index 0000000..67463a5
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux105.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux106.png b/mindus/assets/blocks/characters/rune-overlay-crux106.png
new file mode 100644
index 0000000..376d8d2
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux106.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux107.png b/mindus/assets/blocks/characters/rune-overlay-crux107.png
new file mode 100644
index 0000000..bded9ae
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux107.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux108.png b/mindus/assets/blocks/characters/rune-overlay-crux108.png
new file mode 100644
index 0000000..68a9335
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux108.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux11.png b/mindus/assets/blocks/characters/rune-overlay-crux11.png
new file mode 100644
index 0000000..98f3dee
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux11.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux12.png b/mindus/assets/blocks/characters/rune-overlay-crux12.png
new file mode 100644
index 0000000..5d79d97
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux12.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux13.png b/mindus/assets/blocks/characters/rune-overlay-crux13.png
new file mode 100644
index 0000000..8a18c13
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux13.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux14.png b/mindus/assets/blocks/characters/rune-overlay-crux14.png
new file mode 100644
index 0000000..a812a11
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux14.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux15.png b/mindus/assets/blocks/characters/rune-overlay-crux15.png
new file mode 100644
index 0000000..8933bca
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux15.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux16.png b/mindus/assets/blocks/characters/rune-overlay-crux16.png
new file mode 100644
index 0000000..006c9e7
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux16.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux17.png b/mindus/assets/blocks/characters/rune-overlay-crux17.png
new file mode 100644
index 0000000..abdf83c
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux17.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux18.png b/mindus/assets/blocks/characters/rune-overlay-crux18.png
new file mode 100644
index 0000000..c4ee9ca
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux18.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux19.png b/mindus/assets/blocks/characters/rune-overlay-crux19.png
new file mode 100644
index 0000000..38e89db
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux19.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux2.png b/mindus/assets/blocks/characters/rune-overlay-crux2.png
new file mode 100644
index 0000000..8df495a
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux2.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux20.png b/mindus/assets/blocks/characters/rune-overlay-crux20.png
new file mode 100644
index 0000000..cdcee3a
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux20.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux21.png b/mindus/assets/blocks/characters/rune-overlay-crux21.png
new file mode 100644
index 0000000..af42b3d
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux21.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux22.png b/mindus/assets/blocks/characters/rune-overlay-crux22.png
new file mode 100644
index 0000000..2c6b962
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux22.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux23.png b/mindus/assets/blocks/characters/rune-overlay-crux23.png
new file mode 100644
index 0000000..bc16215
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux23.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux24.png b/mindus/assets/blocks/characters/rune-overlay-crux24.png
new file mode 100644
index 0000000..8a08984
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux24.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux25.png b/mindus/assets/blocks/characters/rune-overlay-crux25.png
new file mode 100644
index 0000000..a9aa34e
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux25.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux26.png b/mindus/assets/blocks/characters/rune-overlay-crux26.png
new file mode 100644
index 0000000..77c447b
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux26.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux27.png b/mindus/assets/blocks/characters/rune-overlay-crux27.png
new file mode 100644
index 0000000..99645a5
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux27.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux28.png b/mindus/assets/blocks/characters/rune-overlay-crux28.png
new file mode 100644
index 0000000..50a45a7
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux28.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux29.png b/mindus/assets/blocks/characters/rune-overlay-crux29.png
new file mode 100644
index 0000000..3f3eb3e
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux29.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux3.png b/mindus/assets/blocks/characters/rune-overlay-crux3.png
new file mode 100644
index 0000000..54cd8b2
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux3.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux30.png b/mindus/assets/blocks/characters/rune-overlay-crux30.png
new file mode 100644
index 0000000..05c9b3e
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux30.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux31.png b/mindus/assets/blocks/characters/rune-overlay-crux31.png
new file mode 100644
index 0000000..542ff0c
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux31.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux32.png b/mindus/assets/blocks/characters/rune-overlay-crux32.png
new file mode 100644
index 0000000..30a8a5b
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux32.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux33.png b/mindus/assets/blocks/characters/rune-overlay-crux33.png
new file mode 100644
index 0000000..c273844
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux33.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux34.png b/mindus/assets/blocks/characters/rune-overlay-crux34.png
new file mode 100644
index 0000000..a945709
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux34.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux35.png b/mindus/assets/blocks/characters/rune-overlay-crux35.png
new file mode 100644
index 0000000..1ae586e
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux35.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux36.png b/mindus/assets/blocks/characters/rune-overlay-crux36.png
new file mode 100644
index 0000000..5d0fd51
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux36.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux37.png b/mindus/assets/blocks/characters/rune-overlay-crux37.png
new file mode 100644
index 0000000..0ea4d04
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux37.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux38.png b/mindus/assets/blocks/characters/rune-overlay-crux38.png
new file mode 100644
index 0000000..e9b8f33
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux38.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux39.png b/mindus/assets/blocks/characters/rune-overlay-crux39.png
new file mode 100644
index 0000000..2dd308a
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux39.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux4.png b/mindus/assets/blocks/characters/rune-overlay-crux4.png
new file mode 100644
index 0000000..7dc9fe6
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux4.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux40.png b/mindus/assets/blocks/characters/rune-overlay-crux40.png
new file mode 100644
index 0000000..60aa9b6
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux40.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux41.png b/mindus/assets/blocks/characters/rune-overlay-crux41.png
new file mode 100644
index 0000000..d8a077c
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux41.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux42.png b/mindus/assets/blocks/characters/rune-overlay-crux42.png
new file mode 100644
index 0000000..e6bc7d6
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux42.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux43.png b/mindus/assets/blocks/characters/rune-overlay-crux43.png
new file mode 100644
index 0000000..bc0fc4a
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux43.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux44.png b/mindus/assets/blocks/characters/rune-overlay-crux44.png
new file mode 100644
index 0000000..06a57c6
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux44.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux45.png b/mindus/assets/blocks/characters/rune-overlay-crux45.png
new file mode 100644
index 0000000..f262dcd
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux45.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux46.png b/mindus/assets/blocks/characters/rune-overlay-crux46.png
new file mode 100644
index 0000000..84505b7
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux46.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux47.png b/mindus/assets/blocks/characters/rune-overlay-crux47.png
new file mode 100644
index 0000000..8ebca6b
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux47.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux48.png b/mindus/assets/blocks/characters/rune-overlay-crux48.png
new file mode 100644
index 0000000..c483142
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux48.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux49.png b/mindus/assets/blocks/characters/rune-overlay-crux49.png
new file mode 100644
index 0000000..1cbbf74
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux49.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux5.png b/mindus/assets/blocks/characters/rune-overlay-crux5.png
new file mode 100644
index 0000000..2cc022b
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux5.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux50.png b/mindus/assets/blocks/characters/rune-overlay-crux50.png
new file mode 100644
index 0000000..d1e852d
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux50.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux51.png b/mindus/assets/blocks/characters/rune-overlay-crux51.png
new file mode 100644
index 0000000..0a013e9
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux51.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux52.png b/mindus/assets/blocks/characters/rune-overlay-crux52.png
new file mode 100644
index 0000000..4a9d262
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux52.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux53.png b/mindus/assets/blocks/characters/rune-overlay-crux53.png
new file mode 100644
index 0000000..1e0a7d6
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux53.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux54.png b/mindus/assets/blocks/characters/rune-overlay-crux54.png
new file mode 100644
index 0000000..672e194
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux54.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux55.png b/mindus/assets/blocks/characters/rune-overlay-crux55.png
new file mode 100644
index 0000000..b96b760
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux55.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux56.png b/mindus/assets/blocks/characters/rune-overlay-crux56.png
new file mode 100644
index 0000000..ef8ced4
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux56.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux57.png b/mindus/assets/blocks/characters/rune-overlay-crux57.png
new file mode 100644
index 0000000..ec49477
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux57.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux58.png b/mindus/assets/blocks/characters/rune-overlay-crux58.png
new file mode 100644
index 0000000..66404b1
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux58.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux59.png b/mindus/assets/blocks/characters/rune-overlay-crux59.png
new file mode 100644
index 0000000..0457f94
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux59.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux6.png b/mindus/assets/blocks/characters/rune-overlay-crux6.png
new file mode 100644
index 0000000..7b7ff04
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux6.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux60.png b/mindus/assets/blocks/characters/rune-overlay-crux60.png
new file mode 100644
index 0000000..b82a757
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux60.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux61.png b/mindus/assets/blocks/characters/rune-overlay-crux61.png
new file mode 100644
index 0000000..d208652
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux61.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux62.png b/mindus/assets/blocks/characters/rune-overlay-crux62.png
new file mode 100644
index 0000000..49d3ec2
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux62.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux63.png b/mindus/assets/blocks/characters/rune-overlay-crux63.png
new file mode 100644
index 0000000..1875a75
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux63.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux64.png b/mindus/assets/blocks/characters/rune-overlay-crux64.png
new file mode 100644
index 0000000..897c02c
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux64.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux65.png b/mindus/assets/blocks/characters/rune-overlay-crux65.png
new file mode 100644
index 0000000..d3889d7
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux65.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux66.png b/mindus/assets/blocks/characters/rune-overlay-crux66.png
new file mode 100644
index 0000000..c42fa4b
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux66.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux67.png b/mindus/assets/blocks/characters/rune-overlay-crux67.png
new file mode 100644
index 0000000..3cf7699
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux67.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux68.png b/mindus/assets/blocks/characters/rune-overlay-crux68.png
new file mode 100644
index 0000000..14f8025
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux68.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux69.png b/mindus/assets/blocks/characters/rune-overlay-crux69.png
new file mode 100644
index 0000000..7c6656a
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux69.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux7.png b/mindus/assets/blocks/characters/rune-overlay-crux7.png
new file mode 100644
index 0000000..53060a0
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux7.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux70.png b/mindus/assets/blocks/characters/rune-overlay-crux70.png
new file mode 100644
index 0000000..2456468
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux70.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux71.png b/mindus/assets/blocks/characters/rune-overlay-crux71.png
new file mode 100644
index 0000000..f7d1b12
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux71.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux72.png b/mindus/assets/blocks/characters/rune-overlay-crux72.png
new file mode 100644
index 0000000..e3c6db3
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux72.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux73.png b/mindus/assets/blocks/characters/rune-overlay-crux73.png
new file mode 100644
index 0000000..f63d4cc
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux73.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux74.png b/mindus/assets/blocks/characters/rune-overlay-crux74.png
new file mode 100644
index 0000000..6d6db43
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux74.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux75.png b/mindus/assets/blocks/characters/rune-overlay-crux75.png
new file mode 100644
index 0000000..0f39439
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux75.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux76.png b/mindus/assets/blocks/characters/rune-overlay-crux76.png
new file mode 100644
index 0000000..9e29658
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux76.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux77.png b/mindus/assets/blocks/characters/rune-overlay-crux77.png
new file mode 100644
index 0000000..82b4eaf
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux77.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux78.png b/mindus/assets/blocks/characters/rune-overlay-crux78.png
new file mode 100644
index 0000000..7e471b5
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux78.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux79.png b/mindus/assets/blocks/characters/rune-overlay-crux79.png
new file mode 100644
index 0000000..4b887af
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux79.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux8.png b/mindus/assets/blocks/characters/rune-overlay-crux8.png
new file mode 100644
index 0000000..bf6b5d5
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux8.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux80.png b/mindus/assets/blocks/characters/rune-overlay-crux80.png
new file mode 100644
index 0000000..5fa1728
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux80.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux81.png b/mindus/assets/blocks/characters/rune-overlay-crux81.png
new file mode 100644
index 0000000..3567d7f
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux81.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux82.png b/mindus/assets/blocks/characters/rune-overlay-crux82.png
new file mode 100644
index 0000000..7046d94
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux82.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux83.png b/mindus/assets/blocks/characters/rune-overlay-crux83.png
new file mode 100644
index 0000000..9bcab0e
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux83.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux84.png b/mindus/assets/blocks/characters/rune-overlay-crux84.png
new file mode 100644
index 0000000..0cdfdee
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux84.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux85.png b/mindus/assets/blocks/characters/rune-overlay-crux85.png
new file mode 100644
index 0000000..338575b
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux85.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux86.png b/mindus/assets/blocks/characters/rune-overlay-crux86.png
new file mode 100644
index 0000000..7ea4899
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux86.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux87.png b/mindus/assets/blocks/characters/rune-overlay-crux87.png
new file mode 100644
index 0000000..e801acd
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux87.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux88.png b/mindus/assets/blocks/characters/rune-overlay-crux88.png
new file mode 100644
index 0000000..cc76da4
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux88.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux89.png b/mindus/assets/blocks/characters/rune-overlay-crux89.png
new file mode 100644
index 0000000..7d1a220
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux89.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux9.png b/mindus/assets/blocks/characters/rune-overlay-crux9.png
new file mode 100644
index 0000000..9b1e288
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux9.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux90.png b/mindus/assets/blocks/characters/rune-overlay-crux90.png
new file mode 100644
index 0000000..a47a233
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux90.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux91.png b/mindus/assets/blocks/characters/rune-overlay-crux91.png
new file mode 100644
index 0000000..24d03e3
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux91.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux92.png b/mindus/assets/blocks/characters/rune-overlay-crux92.png
new file mode 100644
index 0000000..67f103c
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux92.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux93.png b/mindus/assets/blocks/characters/rune-overlay-crux93.png
new file mode 100644
index 0000000..25821bf
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux93.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux94.png b/mindus/assets/blocks/characters/rune-overlay-crux94.png
new file mode 100644
index 0000000..aa7c7d1
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux94.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux95.png b/mindus/assets/blocks/characters/rune-overlay-crux95.png
new file mode 100644
index 0000000..7a31bba
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux95.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux96.png b/mindus/assets/blocks/characters/rune-overlay-crux96.png
new file mode 100644
index 0000000..67111b6
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux96.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux97.png b/mindus/assets/blocks/characters/rune-overlay-crux97.png
new file mode 100644
index 0000000..c710323
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux97.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux98.png b/mindus/assets/blocks/characters/rune-overlay-crux98.png
new file mode 100644
index 0000000..e4d40e1
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux98.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay-crux99.png b/mindus/assets/blocks/characters/rune-overlay-crux99.png
new file mode 100644
index 0000000..e6fd0d0
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay-crux99.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay0.png b/mindus/assets/blocks/characters/rune-overlay0.png
new file mode 100644
index 0000000..50b167f
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay0.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay1.png b/mindus/assets/blocks/characters/rune-overlay1.png
new file mode 100644
index 0000000..59b547e
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay1.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay10.png b/mindus/assets/blocks/characters/rune-overlay10.png
new file mode 100644
index 0000000..6fb852f
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay10.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay100.png b/mindus/assets/blocks/characters/rune-overlay100.png
new file mode 100644
index 0000000..ad0c976
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay100.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay101.png b/mindus/assets/blocks/characters/rune-overlay101.png
new file mode 100644
index 0000000..12a6d9f
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay101.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay102.png b/mindus/assets/blocks/characters/rune-overlay102.png
new file mode 100644
index 0000000..6f0b1b7
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay102.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay103.png b/mindus/assets/blocks/characters/rune-overlay103.png
new file mode 100644
index 0000000..63274c2
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay103.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay104.png b/mindus/assets/blocks/characters/rune-overlay104.png
new file mode 100644
index 0000000..1cba8cc
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay104.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay105.png b/mindus/assets/blocks/characters/rune-overlay105.png
new file mode 100644
index 0000000..759fc03
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay105.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay106.png b/mindus/assets/blocks/characters/rune-overlay106.png
new file mode 100644
index 0000000..3a40e7b
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay106.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay107.png b/mindus/assets/blocks/characters/rune-overlay107.png
new file mode 100644
index 0000000..29e2e11
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay107.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay108.png b/mindus/assets/blocks/characters/rune-overlay108.png
new file mode 100644
index 0000000..7851e84
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay108.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay11.png b/mindus/assets/blocks/characters/rune-overlay11.png
new file mode 100644
index 0000000..89207d0
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay11.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay12.png b/mindus/assets/blocks/characters/rune-overlay12.png
new file mode 100644
index 0000000..18638a5
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay12.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay13.png b/mindus/assets/blocks/characters/rune-overlay13.png
new file mode 100644
index 0000000..14669c8
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay13.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay14.png b/mindus/assets/blocks/characters/rune-overlay14.png
new file mode 100644
index 0000000..1a1313e
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay14.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay15.png b/mindus/assets/blocks/characters/rune-overlay15.png
new file mode 100644
index 0000000..4c36143
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay15.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay16.png b/mindus/assets/blocks/characters/rune-overlay16.png
new file mode 100644
index 0000000..46959bb
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay16.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay17.png b/mindus/assets/blocks/characters/rune-overlay17.png
new file mode 100644
index 0000000..eaa6ef9
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay17.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay18.png b/mindus/assets/blocks/characters/rune-overlay18.png
new file mode 100644
index 0000000..a2b27f9
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay18.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay19.png b/mindus/assets/blocks/characters/rune-overlay19.png
new file mode 100644
index 0000000..4ae4801
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay19.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay2.png b/mindus/assets/blocks/characters/rune-overlay2.png
new file mode 100644
index 0000000..bc77232
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay2.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay20.png b/mindus/assets/blocks/characters/rune-overlay20.png
new file mode 100644
index 0000000..353cb26
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay20.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay21.png b/mindus/assets/blocks/characters/rune-overlay21.png
new file mode 100644
index 0000000..8d08e8e
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay21.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay22.png b/mindus/assets/blocks/characters/rune-overlay22.png
new file mode 100644
index 0000000..4e2453c
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay22.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay23.png b/mindus/assets/blocks/characters/rune-overlay23.png
new file mode 100644
index 0000000..f87ffd3
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay23.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay24.png b/mindus/assets/blocks/characters/rune-overlay24.png
new file mode 100644
index 0000000..49a28f8
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay24.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay25.png b/mindus/assets/blocks/characters/rune-overlay25.png
new file mode 100644
index 0000000..e9e1086
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay25.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay26.png b/mindus/assets/blocks/characters/rune-overlay26.png
new file mode 100644
index 0000000..6cab8e5
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay26.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay27.png b/mindus/assets/blocks/characters/rune-overlay27.png
new file mode 100644
index 0000000..d8801a3
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay27.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay28.png b/mindus/assets/blocks/characters/rune-overlay28.png
new file mode 100644
index 0000000..814312e
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay28.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay29.png b/mindus/assets/blocks/characters/rune-overlay29.png
new file mode 100644
index 0000000..91209b5
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay29.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay3.png b/mindus/assets/blocks/characters/rune-overlay3.png
new file mode 100644
index 0000000..012ecca
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay3.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay30.png b/mindus/assets/blocks/characters/rune-overlay30.png
new file mode 100644
index 0000000..db6fe7a
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay30.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay31.png b/mindus/assets/blocks/characters/rune-overlay31.png
new file mode 100644
index 0000000..d2b089f
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay31.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay32.png b/mindus/assets/blocks/characters/rune-overlay32.png
new file mode 100644
index 0000000..6b444fe
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay32.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay33.png b/mindus/assets/blocks/characters/rune-overlay33.png
new file mode 100644
index 0000000..b4cd89f
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay33.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay34.png b/mindus/assets/blocks/characters/rune-overlay34.png
new file mode 100644
index 0000000..86de197
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay34.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay35.png b/mindus/assets/blocks/characters/rune-overlay35.png
new file mode 100644
index 0000000..e4f0237
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay35.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay36.png b/mindus/assets/blocks/characters/rune-overlay36.png
new file mode 100644
index 0000000..ba69315
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay36.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay37.png b/mindus/assets/blocks/characters/rune-overlay37.png
new file mode 100644
index 0000000..f576b68
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay37.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay38.png b/mindus/assets/blocks/characters/rune-overlay38.png
new file mode 100644
index 0000000..553937c
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay38.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay39.png b/mindus/assets/blocks/characters/rune-overlay39.png
new file mode 100644
index 0000000..77f60b7
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay39.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay4.png b/mindus/assets/blocks/characters/rune-overlay4.png
new file mode 100644
index 0000000..ee6c317
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay4.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay40.png b/mindus/assets/blocks/characters/rune-overlay40.png
new file mode 100644
index 0000000..bf56c74
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay40.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay41.png b/mindus/assets/blocks/characters/rune-overlay41.png
new file mode 100644
index 0000000..47fba77
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay41.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay42.png b/mindus/assets/blocks/characters/rune-overlay42.png
new file mode 100644
index 0000000..e231ca3
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay42.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay43.png b/mindus/assets/blocks/characters/rune-overlay43.png
new file mode 100644
index 0000000..0b78d57
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay43.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay44.png b/mindus/assets/blocks/characters/rune-overlay44.png
new file mode 100644
index 0000000..5f247e0
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay44.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay45.png b/mindus/assets/blocks/characters/rune-overlay45.png
new file mode 100644
index 0000000..1e3bbd3
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay45.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay46.png b/mindus/assets/blocks/characters/rune-overlay46.png
new file mode 100644
index 0000000..d569595
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay46.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay47.png b/mindus/assets/blocks/characters/rune-overlay47.png
new file mode 100644
index 0000000..7068249
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay47.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay48.png b/mindus/assets/blocks/characters/rune-overlay48.png
new file mode 100644
index 0000000..478dc04
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay48.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay49.png b/mindus/assets/blocks/characters/rune-overlay49.png
new file mode 100644
index 0000000..4de1595
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay49.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay5.png b/mindus/assets/blocks/characters/rune-overlay5.png
new file mode 100644
index 0000000..3f9ca5d
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay5.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay50.png b/mindus/assets/blocks/characters/rune-overlay50.png
new file mode 100644
index 0000000..fc1d6ee
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay50.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay51.png b/mindus/assets/blocks/characters/rune-overlay51.png
new file mode 100644
index 0000000..5a6fd41
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay51.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay52.png b/mindus/assets/blocks/characters/rune-overlay52.png
new file mode 100644
index 0000000..7afee30
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay52.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay53.png b/mindus/assets/blocks/characters/rune-overlay53.png
new file mode 100644
index 0000000..4dba710
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay53.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay54.png b/mindus/assets/blocks/characters/rune-overlay54.png
new file mode 100644
index 0000000..b6e7ed9
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay54.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay55.png b/mindus/assets/blocks/characters/rune-overlay55.png
new file mode 100644
index 0000000..c1b5041
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay55.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay56.png b/mindus/assets/blocks/characters/rune-overlay56.png
new file mode 100644
index 0000000..c6b6cc8
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay56.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay57.png b/mindus/assets/blocks/characters/rune-overlay57.png
new file mode 100644
index 0000000..05a1ee9
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay57.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay58.png b/mindus/assets/blocks/characters/rune-overlay58.png
new file mode 100644
index 0000000..d49ad16
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay58.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay59.png b/mindus/assets/blocks/characters/rune-overlay59.png
new file mode 100644
index 0000000..83b38b1
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay59.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay6.png b/mindus/assets/blocks/characters/rune-overlay6.png
new file mode 100644
index 0000000..d21ba0e
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay6.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay60.png b/mindus/assets/blocks/characters/rune-overlay60.png
new file mode 100644
index 0000000..50fd227
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay60.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay61.png b/mindus/assets/blocks/characters/rune-overlay61.png
new file mode 100644
index 0000000..e85ae24
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay61.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay62.png b/mindus/assets/blocks/characters/rune-overlay62.png
new file mode 100644
index 0000000..3588ba2
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay62.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay63.png b/mindus/assets/blocks/characters/rune-overlay63.png
new file mode 100644
index 0000000..5e8b9eb
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay63.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay64.png b/mindus/assets/blocks/characters/rune-overlay64.png
new file mode 100644
index 0000000..c0dae86
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay64.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay65.png b/mindus/assets/blocks/characters/rune-overlay65.png
new file mode 100644
index 0000000..a3665ab
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay65.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay66.png b/mindus/assets/blocks/characters/rune-overlay66.png
new file mode 100644
index 0000000..43f7aeb
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay66.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay67.png b/mindus/assets/blocks/characters/rune-overlay67.png
new file mode 100644
index 0000000..baa6d33
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay67.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay68.png b/mindus/assets/blocks/characters/rune-overlay68.png
new file mode 100644
index 0000000..ba53de2
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay68.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay69.png b/mindus/assets/blocks/characters/rune-overlay69.png
new file mode 100644
index 0000000..1242827
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay69.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay7.png b/mindus/assets/blocks/characters/rune-overlay7.png
new file mode 100644
index 0000000..23bac5d
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay7.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay70.png b/mindus/assets/blocks/characters/rune-overlay70.png
new file mode 100644
index 0000000..45e8a86
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay70.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay71.png b/mindus/assets/blocks/characters/rune-overlay71.png
new file mode 100644
index 0000000..d95cfe2
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay71.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay72.png b/mindus/assets/blocks/characters/rune-overlay72.png
new file mode 100644
index 0000000..2ddde55
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay72.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay73.png b/mindus/assets/blocks/characters/rune-overlay73.png
new file mode 100644
index 0000000..76e1d13
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay73.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay74.png b/mindus/assets/blocks/characters/rune-overlay74.png
new file mode 100644
index 0000000..f577cde
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay74.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay75.png b/mindus/assets/blocks/characters/rune-overlay75.png
new file mode 100644
index 0000000..df89b7e
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay75.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay76.png b/mindus/assets/blocks/characters/rune-overlay76.png
new file mode 100644
index 0000000..4180b2c
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay76.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay77.png b/mindus/assets/blocks/characters/rune-overlay77.png
new file mode 100644
index 0000000..d66113b
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay77.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay78.png b/mindus/assets/blocks/characters/rune-overlay78.png
new file mode 100644
index 0000000..458b52f
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay78.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay79.png b/mindus/assets/blocks/characters/rune-overlay79.png
new file mode 100644
index 0000000..c423c4c
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay79.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay8.png b/mindus/assets/blocks/characters/rune-overlay8.png
new file mode 100644
index 0000000..5318fab
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay8.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay80.png b/mindus/assets/blocks/characters/rune-overlay80.png
new file mode 100644
index 0000000..158f09e
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay80.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay81.png b/mindus/assets/blocks/characters/rune-overlay81.png
new file mode 100644
index 0000000..106eb5e
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay81.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay82.png b/mindus/assets/blocks/characters/rune-overlay82.png
new file mode 100644
index 0000000..1735b2c
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay82.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay83.png b/mindus/assets/blocks/characters/rune-overlay83.png
new file mode 100644
index 0000000..17a2693
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay83.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay84.png b/mindus/assets/blocks/characters/rune-overlay84.png
new file mode 100644
index 0000000..39bf525
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay84.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay85.png b/mindus/assets/blocks/characters/rune-overlay85.png
new file mode 100644
index 0000000..04c8228
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay85.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay86.png b/mindus/assets/blocks/characters/rune-overlay86.png
new file mode 100644
index 0000000..1c75129
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay86.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay87.png b/mindus/assets/blocks/characters/rune-overlay87.png
new file mode 100644
index 0000000..f3137e2
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay87.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay88.png b/mindus/assets/blocks/characters/rune-overlay88.png
new file mode 100644
index 0000000..9f58b32
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay88.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay89.png b/mindus/assets/blocks/characters/rune-overlay89.png
new file mode 100644
index 0000000..87e13e0
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay89.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay9.png b/mindus/assets/blocks/characters/rune-overlay9.png
new file mode 100644
index 0000000..2148e25
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay9.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay90.png b/mindus/assets/blocks/characters/rune-overlay90.png
new file mode 100644
index 0000000..3624c48
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay90.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay91.png b/mindus/assets/blocks/characters/rune-overlay91.png
new file mode 100644
index 0000000..b1b9739
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay91.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay92.png b/mindus/assets/blocks/characters/rune-overlay92.png
new file mode 100644
index 0000000..e703928
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay92.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay93.png b/mindus/assets/blocks/characters/rune-overlay93.png
new file mode 100644
index 0000000..d15e35e
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay93.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay94.png b/mindus/assets/blocks/characters/rune-overlay94.png
new file mode 100644
index 0000000..0d5f8f1
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay94.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay95.png b/mindus/assets/blocks/characters/rune-overlay95.png
new file mode 100644
index 0000000..b1b168c
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay95.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay96.png b/mindus/assets/blocks/characters/rune-overlay96.png
new file mode 100644
index 0000000..3972fbc
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay96.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay97.png b/mindus/assets/blocks/characters/rune-overlay97.png
new file mode 100644
index 0000000..e8d044a
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay97.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay98.png b/mindus/assets/blocks/characters/rune-overlay98.png
new file mode 100644
index 0000000..d8c7bee
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay98.png
Binary files differ
diff --git a/mindus/assets/blocks/characters/rune-overlay99.png b/mindus/assets/blocks/characters/rune-overlay99.png
new file mode 100644
index 0000000..1e3dc3c
--- /dev/null
+++ b/mindus/assets/blocks/characters/rune-overlay99.png
Binary files differ
diff --git a/mindus/assets/blocks/defense/build-tower.png b/mindus/assets/blocks/defense/build-tower.png
new file mode 100644
index 0000000..44f6219
--- /dev/null
+++ b/mindus/assets/blocks/defense/build-tower.png
Binary files differ
diff --git a/assets/blocks/defense/force-projector-team.png b/mindus/assets/blocks/defense/force-projector-team.png
index 86614cb..86614cb 100644
--- a/assets/blocks/defense/force-projector-team.png
+++ b/mindus/assets/blocks/defense/force-projector-team.png
Binary files differ
diff --git a/mindus/assets/blocks/defense/force-projector.png b/mindus/assets/blocks/defense/force-projector.png
new file mode 100644
index 0000000..69ef992
--- /dev/null
+++ b/mindus/assets/blocks/defense/force-projector.png
Binary files differ
diff --git a/mindus/assets/blocks/defense/large-shield-projector-team.png b/mindus/assets/blocks/defense/large-shield-projector-team.png
new file mode 100644
index 0000000..d369c30
--- /dev/null
+++ b/mindus/assets/blocks/defense/large-shield-projector-team.png
Binary files differ
diff --git a/mindus/assets/blocks/defense/large-shield-projector.png b/mindus/assets/blocks/defense/large-shield-projector.png
new file mode 100644
index 0000000..7c2c862
--- /dev/null
+++ b/mindus/assets/blocks/defense/large-shield-projector.png
Binary files differ
diff --git a/mindus/assets/blocks/defense/mend-projector.png b/mindus/assets/blocks/defense/mend-projector.png
new file mode 100644
index 0000000..6fbdedc
--- /dev/null
+++ b/mindus/assets/blocks/defense/mend-projector.png
Binary files differ
diff --git a/mindus/assets/blocks/defense/mender.png b/mindus/assets/blocks/defense/mender.png
new file mode 100644
index 0000000..019d224
--- /dev/null
+++ b/mindus/assets/blocks/defense/mender.png
Binary files differ
diff --git a/mindus/assets/blocks/defense/overdrive-dome.png b/mindus/assets/blocks/defense/overdrive-dome.png
new file mode 100644
index 0000000..a27f18b
--- /dev/null
+++ b/mindus/assets/blocks/defense/overdrive-dome.png
Binary files differ
diff --git a/mindus/assets/blocks/defense/overdrive-projector.png b/mindus/assets/blocks/defense/overdrive-projector.png
new file mode 100644
index 0000000..0e91627
--- /dev/null
+++ b/mindus/assets/blocks/defense/overdrive-projector.png
Binary files differ
diff --git a/assets/blocks/defense/radar.png b/mindus/assets/blocks/defense/radar.png
index 701beac..701beac 100644
--- a/assets/blocks/defense/radar.png
+++ b/mindus/assets/blocks/defense/radar.png
Binary files differ
diff --git a/mindus/assets/blocks/defense/regen-projector.png b/mindus/assets/blocks/defense/regen-projector.png
new file mode 100644
index 0000000..c246600
--- /dev/null
+++ b/mindus/assets/blocks/defense/regen-projector.png
Binary files differ
diff --git a/assets/blocks/defense/shield-projector-team.png b/mindus/assets/blocks/defense/shield-projector-team.png
index fdc00a2..fdc00a2 100644
--- a/assets/blocks/defense/shield-projector-team.png
+++ b/mindus/assets/blocks/defense/shield-projector-team.png
Binary files differ
diff --git a/mindus/assets/blocks/defense/shield-projector.png b/mindus/assets/blocks/defense/shield-projector.png
new file mode 100644
index 0000000..df7374e
--- /dev/null
+++ b/mindus/assets/blocks/defense/shield-projector.png
Binary files differ
diff --git a/mindus/assets/blocks/defense/shock-mine-team-top.png b/mindus/assets/blocks/defense/shock-mine-team-top.png
new file mode 100644
index 0000000..aa16dc3
--- /dev/null
+++ b/mindus/assets/blocks/defense/shock-mine-team-top.png
Binary files differ
diff --git a/assets/blocks/defense/shock-mine.png b/mindus/assets/blocks/defense/shock-mine.png
index 2f18055..2f18055 100644
--- a/assets/blocks/defense/shock-mine.png
+++ b/mindus/assets/blocks/defense/shock-mine.png
Binary files differ
diff --git a/mindus/assets/blocks/defense/shockwave-tower.png b/mindus/assets/blocks/defense/shockwave-tower.png
new file mode 100644
index 0000000..25a1f24
--- /dev/null
+++ b/mindus/assets/blocks/defense/shockwave-tower.png
Binary files differ
diff --git a/mindus/assets/blocks/defense/target-dummy.png b/mindus/assets/blocks/defense/target-dummy.png
new file mode 100644
index 0000000..f3d06d7
--- /dev/null
+++ b/mindus/assets/blocks/defense/target-dummy.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/bridge-arrow.png b/mindus/assets/blocks/distribution/bridge-arrow.png
new file mode 100644
index 0000000..ea708c8
--- /dev/null
+++ b/mindus/assets/blocks/distribution/bridge-arrow.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/bridge-conveyor-arrow.png b/mindus/assets/blocks/distribution/bridge-conveyor-arrow.png
new file mode 100644
index 0000000..2740e90
--- /dev/null
+++ b/mindus/assets/blocks/distribution/bridge-conveyor-arrow.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/bridge-conveyor-bridge.png b/mindus/assets/blocks/distribution/bridge-conveyor-bridge.png
new file mode 100644
index 0000000..c7b09d9
--- /dev/null
+++ b/mindus/assets/blocks/distribution/bridge-conveyor-bridge.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/bridge-conveyor-end.png b/mindus/assets/blocks/distribution/bridge-conveyor-end.png
new file mode 100644
index 0000000..25ccdde
--- /dev/null
+++ b/mindus/assets/blocks/distribution/bridge-conveyor-end.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/bridge-conveyor.png b/mindus/assets/blocks/distribution/bridge-conveyor.png
new file mode 100644
index 0000000..b1a53c6
--- /dev/null
+++ b/mindus/assets/blocks/distribution/bridge-conveyor.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/center.png b/mindus/assets/blocks/distribution/center.png
new file mode 100644
index 0000000..7579691
--- /dev/null
+++ b/mindus/assets/blocks/distribution/center.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-0-0.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-0-0.png
new file mode 100644
index 0000000..ddc867d
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-0-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-0-1.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-0-1.png
new file mode 100644
index 0000000..03595e1
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-0-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-0-2.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-0-2.png
new file mode 100644
index 0000000..5043934
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-0-2.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-0-3.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-0-3.png
new file mode 100644
index 0000000..d209c5b
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-0-3.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-0-h.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-0-h.png
new file mode 100644
index 0000000..8c27096
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-0.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-0.png
new file mode 100644
index 0000000..e90c44d
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-1-h.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-1-h.png
new file mode 100644
index 0000000..571a0d8
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-1-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-1-v.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-1-v.png
new file mode 100644
index 0000000..48dd10e
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-1-v.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-1.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-1.png
new file mode 100644
index 0000000..ed13d44
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-2-h.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-2-h.png
new file mode 100644
index 0000000..df0bddb
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-2-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-2.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-2.png
new file mode 100644
index 0000000..ffa04ec
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-2.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-3.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-3.png
new file mode 100644
index 0000000..b15a6d6
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-1-3.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-0-h.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-0-h.png
new file mode 100644
index 0000000..eb76bd3
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-0-v.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-0-v.png
new file mode 100644
index 0000000..0bb92f4
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-0-v.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-0.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-0.png
new file mode 100644
index 0000000..be686e7
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-1-h.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-1-h.png
new file mode 100644
index 0000000..9dd21ed
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-1-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-1.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-1.png
new file mode 100644
index 0000000..22a56fe
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-2.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-2.png
new file mode 100644
index 0000000..21ebc71
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-2.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-3-h.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-3-h.png
new file mode 100644
index 0000000..aee031c
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-3-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-3.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-3.png
new file mode 100644
index 0000000..304675d
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-2-3.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-3-0-h.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-3-0-h.png
new file mode 100644
index 0000000..ab40269
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-3-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-3-0.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-3-0.png
new file mode 100644
index 0000000..8055767
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-3-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-3-1.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-3-1.png
new file mode 100644
index 0000000..c8bafb4
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-3-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-3-3.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-3-3.png
new file mode 100644
index 0000000..1c3e100
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-3-3.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-4-0.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-4-0.png
new file mode 100644
index 0000000..f05cccc
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-4-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-4-1.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-4-1.png
new file mode 100644
index 0000000..386c9c0
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-4-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/armored-conveyor-4-3.png b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-4-3.png
new file mode 100644
index 0000000..bfa7c8c
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/armored-conveyor-4-3.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-0-0.png b/mindus/assets/blocks/distribution/conveyors/conveyor-0-0.png
new file mode 100644
index 0000000..5183db1
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-0-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-0-1.png b/mindus/assets/blocks/distribution/conveyors/conveyor-0-1.png
new file mode 100644
index 0000000..7389c94
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-0-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-0-2.png b/mindus/assets/blocks/distribution/conveyors/conveyor-0-2.png
new file mode 100644
index 0000000..0030870
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-0-2.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-0-3.png b/mindus/assets/blocks/distribution/conveyors/conveyor-0-3.png
new file mode 100644
index 0000000..9580d6e
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-0-3.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-1-0-h.png b/mindus/assets/blocks/distribution/conveyors/conveyor-1-0-h.png
new file mode 100644
index 0000000..7928ed9
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-1-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-1-0.png b/mindus/assets/blocks/distribution/conveyors/conveyor-1-0.png
new file mode 100644
index 0000000..08b63fa
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-1-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-1-1-h.png b/mindus/assets/blocks/distribution/conveyors/conveyor-1-1-h.png
new file mode 100644
index 0000000..2d8ba7d
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-1-1-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-1-1-v.png b/mindus/assets/blocks/distribution/conveyors/conveyor-1-1-v.png
new file mode 100644
index 0000000..93dbcfa
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-1-1-v.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-1-1.png b/mindus/assets/blocks/distribution/conveyors/conveyor-1-1.png
new file mode 100644
index 0000000..9611e68
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-1-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-1-2-h.png b/mindus/assets/blocks/distribution/conveyors/conveyor-1-2-h.png
new file mode 100644
index 0000000..cd37f16
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-1-2-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-1-2.png b/mindus/assets/blocks/distribution/conveyors/conveyor-1-2.png
new file mode 100644
index 0000000..d9be4bf
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-1-2.png
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-1-3.png b/mindus/assets/blocks/distribution/conveyors/conveyor-1-3.png
index 2905d1a..2905d1a 100644
--- a/assets/blocks/distribution/conveyors/conveyor-1-3.png
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-1-3.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-2-0-h.png b/mindus/assets/blocks/distribution/conveyors/conveyor-2-0-h.png
new file mode 100644
index 0000000..eea615a
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-2-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-2-0-v.png b/mindus/assets/blocks/distribution/conveyors/conveyor-2-0-v.png
new file mode 100644
index 0000000..16dacf3
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-2-0-v.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-2-0.png b/mindus/assets/blocks/distribution/conveyors/conveyor-2-0.png
new file mode 100644
index 0000000..721cb2b
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-2-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-2-1-h.png b/mindus/assets/blocks/distribution/conveyors/conveyor-2-1-h.png
new file mode 100644
index 0000000..96e0b30
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-2-1-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-2-1.png b/mindus/assets/blocks/distribution/conveyors/conveyor-2-1.png
new file mode 100644
index 0000000..e66aaf6
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-2-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-2-2.png b/mindus/assets/blocks/distribution/conveyors/conveyor-2-2.png
new file mode 100644
index 0000000..3681c62
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-2-2.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-2-3-h.png b/mindus/assets/blocks/distribution/conveyors/conveyor-2-3-h.png
new file mode 100644
index 0000000..1817c05
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-2-3-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-2-3.png b/mindus/assets/blocks/distribution/conveyors/conveyor-2-3.png
new file mode 100644
index 0000000..385528a
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-2-3.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-3-0-h.png b/mindus/assets/blocks/distribution/conveyors/conveyor-3-0-h.png
new file mode 100644
index 0000000..3c2d6ed
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-3-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-3-0.png b/mindus/assets/blocks/distribution/conveyors/conveyor-3-0.png
new file mode 100644
index 0000000..5734a72
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-3-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-3-1.png b/mindus/assets/blocks/distribution/conveyors/conveyor-3-1.png
new file mode 100644
index 0000000..743e834
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-3-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-3-3.png b/mindus/assets/blocks/distribution/conveyors/conveyor-3-3.png
new file mode 100644
index 0000000..54008b5
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-3-3.png
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/conveyor-4-0.png b/mindus/assets/blocks/distribution/conveyors/conveyor-4-0.png
index b788db9..b788db9 100644
--- a/assets/blocks/distribution/conveyors/conveyor-4-0.png
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-4-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-4-1.png b/mindus/assets/blocks/distribution/conveyors/conveyor-4-1.png
new file mode 100644
index 0000000..c2c31d5
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-4-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/conveyor-4-3.png b/mindus/assets/blocks/distribution/conveyors/conveyor-4-3.png
new file mode 100644
index 0000000..4573bda
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/conveyor-4-3.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-0-0.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-0-0.png
new file mode 100644
index 0000000..0f1aecb
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-0-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-0-1.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-0-1.png
new file mode 100644
index 0000000..9ec7ec7
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-0-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-0-2.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-0-2.png
new file mode 100644
index 0000000..dcdd5ae
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-0-2.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-0-3.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-0-3.png
new file mode 100644
index 0000000..ed690ac
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-0-3.png
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-1-0-h.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-0-h.png
index 99602c3..99602c3 100644
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-1-0-h.png
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-0.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-0.png
new file mode 100644
index 0000000..21fd562
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-0.png
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-1-1-h.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-1-h.png
index e02adb4..e02adb4 100644
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-1-1-h.png
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-1-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-1-v.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-1-v.png
new file mode 100644
index 0000000..e370aa6
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-1-v.png
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-1-1.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-1.png
index b50f7cf..b50f7cf 100644
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-1-1.png
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-2-h.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-2-h.png
new file mode 100644
index 0000000..3888ce7
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-2-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-2.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-2.png
new file mode 100644
index 0000000..a47b05a
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-2.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-3.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-3.png
new file mode 100644
index 0000000..6cba533
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-1-3.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-0-h.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-0-h.png
new file mode 100644
index 0000000..7a10cdf
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-0-v.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-0-v.png
new file mode 100644
index 0000000..a3aa7a3
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-0-v.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-0.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-0.png
new file mode 100644
index 0000000..6f4629f
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-0.png
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-2-1-h.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-1-h.png
index 0ba3653..0ba3653 100644
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-2-1-h.png
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-1-h.png
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-2-1.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-1.png
index 4f5b154..4f5b154 100644
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-2-1.png
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-2.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-2.png
new file mode 100644
index 0000000..2125244
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-2.png
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-2-3-h.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-3-h.png
index 3bd7270..3bd7270 100644
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-2-3-h.png
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-3-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-3.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-3.png
new file mode 100644
index 0000000..50d8b09
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-2-3.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-3-0-h.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-3-0-h.png
new file mode 100644
index 0000000..1506859
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-3-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-3-0.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-3-0.png
new file mode 100644
index 0000000..0746226
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-3-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-3-1.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-3-1.png
new file mode 100644
index 0000000..4af1e1c
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-3-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-3-3.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-3-3.png
new file mode 100644
index 0000000..840a63e
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-3-3.png
Binary files differ
diff --git a/assets/blocks/distribution/conveyors/titanium-conveyor-4-0.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-4-0.png
index 079d383..079d383 100644
--- a/assets/blocks/distribution/conveyors/titanium-conveyor-4-0.png
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-4-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-4-1.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-4-1.png
new file mode 100644
index 0000000..4f24d2a
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-4-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-4-3.png b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-4-3.png
new file mode 100644
index 0000000..0a92002
--- /dev/null
+++ b/mindus/assets/blocks/distribution/conveyors/titanium-conveyor-4-3.png
Binary files differ
diff --git a/assets/blocks/distribution/distributor.png b/mindus/assets/blocks/distribution/distributor.png
index e4445dd..e4445dd 100644
--- a/assets/blocks/distribution/distributor.png
+++ b/mindus/assets/blocks/distribution/distributor.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-0-0.png b/mindus/assets/blocks/distribution/ducts/armored-duct-0-0.png
new file mode 100644
index 0000000..ccd7a06
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-0-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-0-1.png b/mindus/assets/blocks/distribution/ducts/armored-duct-0-1.png
new file mode 100644
index 0000000..8a75a73
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-0-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-0-2.png b/mindus/assets/blocks/distribution/ducts/armored-duct-0-2.png
new file mode 100644
index 0000000..d89d76e
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-0-2.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-0-3.png b/mindus/assets/blocks/distribution/ducts/armored-duct-0-3.png
new file mode 100644
index 0000000..ad204f3
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-0-3.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-1-0-h.png b/mindus/assets/blocks/distribution/ducts/armored-duct-1-0-h.png
new file mode 100644
index 0000000..b9d6bce
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-1-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-1-0.png b/mindus/assets/blocks/distribution/ducts/armored-duct-1-0.png
new file mode 100644
index 0000000..63a6c48
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-1-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-1-1-h.png b/mindus/assets/blocks/distribution/ducts/armored-duct-1-1-h.png
new file mode 100644
index 0000000..2104e28
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-1-1-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-1-1-v.png b/mindus/assets/blocks/distribution/ducts/armored-duct-1-1-v.png
new file mode 100644
index 0000000..4a22d5b
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-1-1-v.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-1-1.png b/mindus/assets/blocks/distribution/ducts/armored-duct-1-1.png
new file mode 100644
index 0000000..29b47b0
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-1-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-1-2-h.png b/mindus/assets/blocks/distribution/ducts/armored-duct-1-2-h.png
new file mode 100644
index 0000000..c6c3cbf
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-1-2-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-1-2.png b/mindus/assets/blocks/distribution/ducts/armored-duct-1-2.png
new file mode 100644
index 0000000..819cb63
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-1-2.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-1-3.png b/mindus/assets/blocks/distribution/ducts/armored-duct-1-3.png
new file mode 100644
index 0000000..ef7d864
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-1-3.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-2-0-h.png b/mindus/assets/blocks/distribution/ducts/armored-duct-2-0-h.png
new file mode 100644
index 0000000..2937ad7
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-2-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-2-0-v.png b/mindus/assets/blocks/distribution/ducts/armored-duct-2-0-v.png
new file mode 100644
index 0000000..dd5c2d1
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-2-0-v.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-2-0.png b/mindus/assets/blocks/distribution/ducts/armored-duct-2-0.png
new file mode 100644
index 0000000..e6df835
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-2-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-2-1-h.png b/mindus/assets/blocks/distribution/ducts/armored-duct-2-1-h.png
new file mode 100644
index 0000000..077c9b9
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-2-1-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-2-1.png b/mindus/assets/blocks/distribution/ducts/armored-duct-2-1.png
new file mode 100644
index 0000000..9086194
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-2-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-2-2.png b/mindus/assets/blocks/distribution/ducts/armored-duct-2-2.png
new file mode 100644
index 0000000..aae911e
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-2-2.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-2-3-h.png b/mindus/assets/blocks/distribution/ducts/armored-duct-2-3-h.png
new file mode 100644
index 0000000..5587009
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-2-3-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-2-3.png b/mindus/assets/blocks/distribution/ducts/armored-duct-2-3.png
new file mode 100644
index 0000000..14ce864
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-2-3.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-3-0-h.png b/mindus/assets/blocks/distribution/ducts/armored-duct-3-0-h.png
new file mode 100644
index 0000000..1ba0792
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-3-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-3-0.png b/mindus/assets/blocks/distribution/ducts/armored-duct-3-0.png
new file mode 100644
index 0000000..e760e24
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-3-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-3-1.png b/mindus/assets/blocks/distribution/ducts/armored-duct-3-1.png
new file mode 100644
index 0000000..78402ae
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-3-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-3-3.png b/mindus/assets/blocks/distribution/ducts/armored-duct-3-3.png
new file mode 100644
index 0000000..b7ae486
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-3-3.png
Binary files differ
diff --git a/assets/blocks/distribution/ducts/armored-duct-4-0.png b/mindus/assets/blocks/distribution/ducts/armored-duct-4-0.png
index 985626c..985626c 100644
--- a/assets/blocks/distribution/ducts/armored-duct-4-0.png
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-4-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-4-1.png b/mindus/assets/blocks/distribution/ducts/armored-duct-4-1.png
new file mode 100644
index 0000000..dc1c0c1
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-4-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/armored-duct-4-3.png b/mindus/assets/blocks/distribution/ducts/armored-duct-4-3.png
new file mode 100644
index 0000000..efac19e
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/armored-duct-4-3.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-0-0.png b/mindus/assets/blocks/distribution/ducts/duct-0-0.png
new file mode 100644
index 0000000..6f3b636
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-0-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-0-1.png b/mindus/assets/blocks/distribution/ducts/duct-0-1.png
new file mode 100644
index 0000000..8b24d1f
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-0-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-0-2.png b/mindus/assets/blocks/distribution/ducts/duct-0-2.png
new file mode 100644
index 0000000..5b61fdd
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-0-2.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-0-3.png b/mindus/assets/blocks/distribution/ducts/duct-0-3.png
new file mode 100644
index 0000000..372e0af
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-0-3.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-1-0-h.png b/mindus/assets/blocks/distribution/ducts/duct-1-0-h.png
new file mode 100644
index 0000000..2db6afd
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-1-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-1-0.png b/mindus/assets/blocks/distribution/ducts/duct-1-0.png
new file mode 100644
index 0000000..8b2723a
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-1-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-1-1-h.png b/mindus/assets/blocks/distribution/ducts/duct-1-1-h.png
new file mode 100644
index 0000000..845d114
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-1-1-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-1-1-v.png b/mindus/assets/blocks/distribution/ducts/duct-1-1-v.png
new file mode 100644
index 0000000..cb9b2af
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-1-1-v.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-1-1.png b/mindus/assets/blocks/distribution/ducts/duct-1-1.png
new file mode 100644
index 0000000..cf8eebf
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-1-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-1-2-h.png b/mindus/assets/blocks/distribution/ducts/duct-1-2-h.png
new file mode 100644
index 0000000..872b989
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-1-2-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-1-2.png b/mindus/assets/blocks/distribution/ducts/duct-1-2.png
new file mode 100644
index 0000000..c67a087
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-1-2.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-1-3.png b/mindus/assets/blocks/distribution/ducts/duct-1-3.png
new file mode 100644
index 0000000..77951fd
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-1-3.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-2-0-h.png b/mindus/assets/blocks/distribution/ducts/duct-2-0-h.png
new file mode 100644
index 0000000..92b36be
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-2-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-2-0-v.png b/mindus/assets/blocks/distribution/ducts/duct-2-0-v.png
new file mode 100644
index 0000000..ebc4aad
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-2-0-v.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-2-0.png b/mindus/assets/blocks/distribution/ducts/duct-2-0.png
new file mode 100644
index 0000000..8963650
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-2-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-2-1-h.png b/mindus/assets/blocks/distribution/ducts/duct-2-1-h.png
new file mode 100644
index 0000000..dde07de
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-2-1-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-2-1.png b/mindus/assets/blocks/distribution/ducts/duct-2-1.png
new file mode 100644
index 0000000..7ae058a
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-2-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-2-2.png b/mindus/assets/blocks/distribution/ducts/duct-2-2.png
new file mode 100644
index 0000000..a7ff8fe
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-2-2.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-2-3-h.png b/mindus/assets/blocks/distribution/ducts/duct-2-3-h.png
new file mode 100644
index 0000000..7f838f3
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-2-3-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-2-3.png b/mindus/assets/blocks/distribution/ducts/duct-2-3.png
new file mode 100644
index 0000000..09fe070
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-2-3.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-3-0-h.png b/mindus/assets/blocks/distribution/ducts/duct-3-0-h.png
new file mode 100644
index 0000000..771dba4
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-3-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-3-0.png b/mindus/assets/blocks/distribution/ducts/duct-3-0.png
new file mode 100644
index 0000000..c89b476
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-3-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-3-1.png b/mindus/assets/blocks/distribution/ducts/duct-3-1.png
new file mode 100644
index 0000000..2a4c902
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-3-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-3-3.png b/mindus/assets/blocks/distribution/ducts/duct-3-3.png
new file mode 100644
index 0000000..1cd719b
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-3-3.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-4-0.png b/mindus/assets/blocks/distribution/ducts/duct-4-0.png
new file mode 100644
index 0000000..8f07d03
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-4-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-4-1.png b/mindus/assets/blocks/distribution/ducts/duct-4-1.png
new file mode 100644
index 0000000..584da12
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-4-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-4-3.png b/mindus/assets/blocks/distribution/ducts/duct-4-3.png
new file mode 100644
index 0000000..db314a6
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-4-3.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-base.png b/mindus/assets/blocks/distribution/ducts/duct-base.png
new file mode 100644
index 0000000..58d266d
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-base.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-bridge-arrow.png b/mindus/assets/blocks/distribution/ducts/duct-bridge-arrow.png
new file mode 100644
index 0000000..78bb451
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-bridge-arrow.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-bridge-bridge-bottom.png b/mindus/assets/blocks/distribution/ducts/duct-bridge-bridge-bottom.png
new file mode 100644
index 0000000..15da706
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-bridge-bridge-bottom.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-bridge-bridge.png b/mindus/assets/blocks/distribution/ducts/duct-bridge-bridge.png
new file mode 100644
index 0000000..62b944a
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-bridge-bridge.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-bridge-dir.png b/mindus/assets/blocks/distribution/ducts/duct-bridge-dir.png
new file mode 100644
index 0000000..bdc7975
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-bridge-dir.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-bridge.png b/mindus/assets/blocks/distribution/ducts/duct-bridge.png
new file mode 100644
index 0000000..29cf409
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-bridge.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-router.png b/mindus/assets/blocks/distribution/ducts/duct-router.png
new file mode 100644
index 0000000..29cf409
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-router.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-unloader-arrows.png b/mindus/assets/blocks/distribution/ducts/duct-unloader-arrows.png
new file mode 100644
index 0000000..9af78ca
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-unloader-arrows.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-unloader-top.png b/mindus/assets/blocks/distribution/ducts/duct-unloader-top.png
new file mode 100644
index 0000000..8e78864
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-unloader-top.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-unloader.png b/mindus/assets/blocks/distribution/ducts/duct-unloader.png
new file mode 100644
index 0000000..71e5674
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/duct-unloader.png
Binary files differ
diff --git a/assets/blocks/distribution/ducts/overflow-duct.png b/mindus/assets/blocks/distribution/ducts/overflow-duct.png
index 6b3e6d0..6b3e6d0 100644
--- a/assets/blocks/distribution/ducts/overflow-duct.png
+++ b/mindus/assets/blocks/distribution/ducts/overflow-duct.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/surge-router.png b/mindus/assets/blocks/distribution/ducts/surge-router.png
new file mode 100644
index 0000000..0d61b11
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/surge-router.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/top.png b/mindus/assets/blocks/distribution/ducts/top.png
new file mode 100644
index 0000000..d0315ef
--- /dev/null
+++ b/mindus/assets/blocks/distribution/ducts/top.png
Binary files differ
diff --git a/assets/blocks/distribution/ducts/underflow-duct.png b/mindus/assets/blocks/distribution/ducts/underflow-duct.png
index f36bc41..f36bc41 100644
--- a/assets/blocks/distribution/ducts/underflow-duct.png
+++ b/mindus/assets/blocks/distribution/ducts/underflow-duct.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/inverted-sorter.png b/mindus/assets/blocks/distribution/inverted-sorter.png
new file mode 100644
index 0000000..9cdc258
--- /dev/null
+++ b/mindus/assets/blocks/distribution/inverted-sorter.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/item-source.png b/mindus/assets/blocks/distribution/item-source.png
new file mode 100644
index 0000000..f0a8b3f
--- /dev/null
+++ b/mindus/assets/blocks/distribution/item-source.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/item-void.png b/mindus/assets/blocks/distribution/item-void.png
new file mode 100644
index 0000000..30b0834
--- /dev/null
+++ b/mindus/assets/blocks/distribution/item-void.png
Binary files differ
diff --git a/assets/blocks/distribution/junction.png b/mindus/assets/blocks/distribution/junction.png
index 0cdb020..0cdb020 100644
--- a/assets/blocks/distribution/junction.png
+++ b/mindus/assets/blocks/distribution/junction.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/mass-driver-base.png b/mindus/assets/blocks/distribution/mass-driver-base.png
new file mode 100644
index 0000000..4f263c9
--- /dev/null
+++ b/mindus/assets/blocks/distribution/mass-driver-base.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/mass-driver.png b/mindus/assets/blocks/distribution/mass-driver.png
new file mode 100644
index 0000000..9c0e632
--- /dev/null
+++ b/mindus/assets/blocks/distribution/mass-driver.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/overflow-gate.png b/mindus/assets/blocks/distribution/overflow-gate.png
new file mode 100644
index 0000000..3e626c0
--- /dev/null
+++ b/mindus/assets/blocks/distribution/overflow-gate.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/phase-conveyor-arrow.png b/mindus/assets/blocks/distribution/phase-conveyor-arrow.png
new file mode 100644
index 0000000..ec3654c
--- /dev/null
+++ b/mindus/assets/blocks/distribution/phase-conveyor-arrow.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/phase-conveyor-bridge.png b/mindus/assets/blocks/distribution/phase-conveyor-bridge.png
new file mode 100644
index 0000000..9c51a42
--- /dev/null
+++ b/mindus/assets/blocks/distribution/phase-conveyor-bridge.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/phase-conveyor-end.png b/mindus/assets/blocks/distribution/phase-conveyor-end.png
new file mode 100644
index 0000000..3692778
--- /dev/null
+++ b/mindus/assets/blocks/distribution/phase-conveyor-end.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/phase-conveyor.png b/mindus/assets/blocks/distribution/phase-conveyor.png
new file mode 100644
index 0000000..415b83d
--- /dev/null
+++ b/mindus/assets/blocks/distribution/phase-conveyor.png
Binary files differ
diff --git a/assets/blocks/distribution/router.png b/mindus/assets/blocks/distribution/router.png
index c45605f..c45605f 100644
--- a/assets/blocks/distribution/router.png
+++ b/mindus/assets/blocks/distribution/router.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/sorter.png b/mindus/assets/blocks/distribution/sorter.png
new file mode 100644
index 0000000..a0c2321
--- /dev/null
+++ b/mindus/assets/blocks/distribution/sorter.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-0.png b/mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-0.png
new file mode 100644
index 0000000..b597da7
--- /dev/null
+++ b/mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-1.png b/mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-1.png
new file mode 100644
index 0000000..7aeacc7
--- /dev/null
+++ b/mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-2.png b/mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-2.png
new file mode 100644
index 0000000..0c8c484
--- /dev/null
+++ b/mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-2.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-0.png b/mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-0.png
new file mode 100644
index 0000000..f98e3c9
--- /dev/null
+++ b/mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-1.png b/mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-1.png
new file mode 100644
index 0000000..7fc91a5
--- /dev/null
+++ b/mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-2.png b/mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-2.png
new file mode 100644
index 0000000..2d1e2a7
--- /dev/null
+++ b/mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-2.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-3.png b/mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-3.png
new file mode 100644
index 0000000..febbed5
--- /dev/null
+++ b/mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-edge-3.png
Binary files differ
diff --git a/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-stack.png b/mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-stack.png
index a0e5afe..dd3cd77 100644
--- a/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-stack.png
+++ b/mindus/assets/blocks/distribution/stack-conveyors/plastanium-conveyor-stack.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-0.png b/mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-0.png
new file mode 100644
index 0000000..8f63f2a
--- /dev/null
+++ b/mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-1.png b/mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-1.png
new file mode 100644
index 0000000..ec328ab
--- /dev/null
+++ b/mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-0.png b/mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-0.png
new file mode 100644
index 0000000..ec10480
--- /dev/null
+++ b/mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-0.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-1.png b/mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-1.png
new file mode 100644
index 0000000..f12784a
--- /dev/null
+++ b/mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-1.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-2.png b/mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-2.png
new file mode 100644
index 0000000..983da52
--- /dev/null
+++ b/mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-2.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-3.png b/mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-3.png
new file mode 100644
index 0000000..767a05f
--- /dev/null
+++ b/mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-edge-3.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-stack.png b/mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-stack.png
new file mode 100644
index 0000000..6cdcac9
--- /dev/null
+++ b/mindus/assets/blocks/distribution/stack-conveyors/surge-conveyor-stack.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/underflow-gate.png b/mindus/assets/blocks/distribution/underflow-gate.png
new file mode 100644
index 0000000..c875229
--- /dev/null
+++ b/mindus/assets/blocks/distribution/underflow-gate.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/unit-cargo-unload-point-top.png b/mindus/assets/blocks/distribution/unit-cargo-unload-point-top.png
new file mode 100644
index 0000000..a960f5d
--- /dev/null
+++ b/mindus/assets/blocks/distribution/unit-cargo-unload-point-top.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/unit-cargo-unload-point.png b/mindus/assets/blocks/distribution/unit-cargo-unload-point.png
new file mode 100644
index 0000000..a870a8d
--- /dev/null
+++ b/mindus/assets/blocks/distribution/unit-cargo-unload-point.png
Binary files differ
diff --git a/mindus/assets/blocks/drills/blast-drill.png b/mindus/assets/blocks/drills/blast-drill.png
new file mode 100644
index 0000000..0867bce
--- /dev/null
+++ b/mindus/assets/blocks/drills/blast-drill.png
Binary files differ
diff --git a/mindus/assets/blocks/drills/cliff-crusher-rotator.png b/mindus/assets/blocks/drills/cliff-crusher-rotator.png
new file mode 100644
index 0000000..40c4077
--- /dev/null
+++ b/mindus/assets/blocks/drills/cliff-crusher-rotator.png
Binary files differ
diff --git a/assets/blocks/drills/cliff-crusher-top.png b/mindus/assets/blocks/drills/cliff-crusher-top.png
index d883816..d883816 100644
--- a/assets/blocks/drills/cliff-crusher-top.png
+++ b/mindus/assets/blocks/drills/cliff-crusher-top.png
Binary files differ
diff --git a/mindus/assets/blocks/drills/cliff-crusher.png b/mindus/assets/blocks/drills/cliff-crusher.png
new file mode 100644
index 0000000..f6c8c1a
--- /dev/null
+++ b/mindus/assets/blocks/drills/cliff-crusher.png
Binary files differ
diff --git a/mindus/assets/blocks/drills/eruption-drill.png b/mindus/assets/blocks/drills/eruption-drill.png
new file mode 100644
index 0000000..24c3ab3
--- /dev/null
+++ b/mindus/assets/blocks/drills/eruption-drill.png
Binary files differ
diff --git a/mindus/assets/blocks/drills/impact-drill.png b/mindus/assets/blocks/drills/impact-drill.png
new file mode 100644
index 0000000..40ad1b6
--- /dev/null
+++ b/mindus/assets/blocks/drills/impact-drill.png
Binary files differ
diff --git a/mindus/assets/blocks/drills/large-cliff-crusher-top.png b/mindus/assets/blocks/drills/large-cliff-crusher-top.png
new file mode 100644
index 0000000..ac0a2a3
--- /dev/null
+++ b/mindus/assets/blocks/drills/large-cliff-crusher-top.png
Binary files differ
diff --git a/mindus/assets/blocks/drills/large-cliff-crusher.png b/mindus/assets/blocks/drills/large-cliff-crusher.png
new file mode 100644
index 0000000..c475da0
--- /dev/null
+++ b/mindus/assets/blocks/drills/large-cliff-crusher.png
Binary files differ
diff --git a/mindus/assets/blocks/drills/large-plasma-bore-top.png b/mindus/assets/blocks/drills/large-plasma-bore-top.png
new file mode 100644
index 0000000..7eb8a48
--- /dev/null
+++ b/mindus/assets/blocks/drills/large-plasma-bore-top.png
Binary files differ
diff --git a/mindus/assets/blocks/drills/large-plasma-bore.png b/mindus/assets/blocks/drills/large-plasma-bore.png
new file mode 100644
index 0000000..1dffdd6
--- /dev/null
+++ b/mindus/assets/blocks/drills/large-plasma-bore.png
Binary files differ
diff --git a/mindus/assets/blocks/drills/laser-drill.png b/mindus/assets/blocks/drills/laser-drill.png
new file mode 100644
index 0000000..25180d0
--- /dev/null
+++ b/mindus/assets/blocks/drills/laser-drill.png
Binary files differ
diff --git a/mindus/assets/blocks/drills/mechanical-drill.png b/mindus/assets/blocks/drills/mechanical-drill.png
new file mode 100644
index 0000000..3df3745
--- /dev/null
+++ b/mindus/assets/blocks/drills/mechanical-drill.png
Binary files differ
diff --git a/mindus/assets/blocks/drills/oil-extractor.png b/mindus/assets/blocks/drills/oil-extractor.png
new file mode 100644
index 0000000..bb31a49
--- /dev/null
+++ b/mindus/assets/blocks/drills/oil-extractor.png
Binary files differ
diff --git a/mindus/assets/blocks/drills/plasma-bore-top.png b/mindus/assets/blocks/drills/plasma-bore-top.png
new file mode 100644
index 0000000..3aa417c
--- /dev/null
+++ b/mindus/assets/blocks/drills/plasma-bore-top.png
Binary files differ
diff --git a/mindus/assets/blocks/drills/plasma-bore.png b/mindus/assets/blocks/drills/plasma-bore.png
new file mode 100644
index 0000000..223986f
--- /dev/null
+++ b/mindus/assets/blocks/drills/plasma-bore.png
Binary files differ
diff --git a/mindus/assets/blocks/drills/pneumatic-drill.png b/mindus/assets/blocks/drills/pneumatic-drill.png
new file mode 100644
index 0000000..dbd2cc0
--- /dev/null
+++ b/mindus/assets/blocks/drills/pneumatic-drill.png
Binary files differ
diff --git a/mindus/assets/blocks/drills/vent-condenser.png b/mindus/assets/blocks/drills/vent-condenser.png
new file mode 100644
index 0000000..fcadd48
--- /dev/null
+++ b/mindus/assets/blocks/drills/vent-condenser.png
Binary files differ
diff --git a/mindus/assets/blocks/drills/water-extractor.png b/mindus/assets/blocks/drills/water-extractor.png
new file mode 100644
index 0000000..42b28f6
--- /dev/null
+++ b/mindus/assets/blocks/drills/water-extractor.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/arkycite-floor.png b/mindus/assets/blocks/environment/arkycite-floor.png
new file mode 100644
index 0000000..e0d5732
--- /dev/null
+++ b/mindus/assets/blocks/environment/arkycite-floor.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/arkyic-boulder1.png b/mindus/assets/blocks/environment/arkyic-boulder1.png
new file mode 100644
index 0000000..f31b289
--- /dev/null
+++ b/mindus/assets/blocks/environment/arkyic-boulder1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/arkyic-boulder2.png b/mindus/assets/blocks/environment/arkyic-boulder2.png
new file mode 100644
index 0000000..22e6ccd
--- /dev/null
+++ b/mindus/assets/blocks/environment/arkyic-boulder2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/arkyic-boulder3.png b/mindus/assets/blocks/environment/arkyic-boulder3.png
new file mode 100644
index 0000000..fda485e
--- /dev/null
+++ b/mindus/assets/blocks/environment/arkyic-boulder3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/arkyic-stone1.png b/mindus/assets/blocks/environment/arkyic-stone1.png
new file mode 100644
index 0000000..e25f347
--- /dev/null
+++ b/mindus/assets/blocks/environment/arkyic-stone1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/arkyic-stone2.png b/mindus/assets/blocks/environment/arkyic-stone2.png
new file mode 100644
index 0000000..5ed8b4c
--- /dev/null
+++ b/mindus/assets/blocks/environment/arkyic-stone2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/arkyic-stone3.png b/mindus/assets/blocks/environment/arkyic-stone3.png
new file mode 100644
index 0000000..a16a58a
--- /dev/null
+++ b/mindus/assets/blocks/environment/arkyic-stone3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/arkyic-vent1.png b/mindus/assets/blocks/environment/arkyic-vent1.png
new file mode 100644
index 0000000..5f6a480
--- /dev/null
+++ b/mindus/assets/blocks/environment/arkyic-vent1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/arkyic-vent2.png b/mindus/assets/blocks/environment/arkyic-vent2.png
new file mode 100644
index 0000000..10ec406
--- /dev/null
+++ b/mindus/assets/blocks/environment/arkyic-vent2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/arkyic-wall-large.png b/mindus/assets/blocks/environment/arkyic-wall-large.png
new file mode 100644
index 0000000..55dc3ae
--- /dev/null
+++ b/mindus/assets/blocks/environment/arkyic-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/arkyic-wall1.png b/mindus/assets/blocks/environment/arkyic-wall1.png
new file mode 100644
index 0000000..83dceed
--- /dev/null
+++ b/mindus/assets/blocks/environment/arkyic-wall1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/arkyic-wall2.png b/mindus/assets/blocks/environment/arkyic-wall2.png
new file mode 100644
index 0000000..0abd6ae
--- /dev/null
+++ b/mindus/assets/blocks/environment/arkyic-wall2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/arkyic-wall3.png b/mindus/assets/blocks/environment/arkyic-wall3.png
new file mode 100644
index 0000000..23a66e9
--- /dev/null
+++ b/mindus/assets/blocks/environment/arkyic-wall3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/basalt-boulder1.png b/mindus/assets/blocks/environment/basalt-boulder1.png
new file mode 100644
index 0000000..dc52a70
--- /dev/null
+++ b/mindus/assets/blocks/environment/basalt-boulder1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/basalt-boulder2.png b/mindus/assets/blocks/environment/basalt-boulder2.png
new file mode 100644
index 0000000..dfee5c7
--- /dev/null
+++ b/mindus/assets/blocks/environment/basalt-boulder2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/basalt-vent1.png b/mindus/assets/blocks/environment/basalt-vent1.png
new file mode 100644
index 0000000..416a2fd
--- /dev/null
+++ b/mindus/assets/blocks/environment/basalt-vent1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/basalt1.png b/mindus/assets/blocks/environment/basalt1.png
new file mode 100644
index 0000000..cf15a4e
--- /dev/null
+++ b/mindus/assets/blocks/environment/basalt1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/basalt2.png b/mindus/assets/blocks/environment/basalt2.png
new file mode 100644
index 0000000..db27743
--- /dev/null
+++ b/mindus/assets/blocks/environment/basalt2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/basalt3.png b/mindus/assets/blocks/environment/basalt3.png
new file mode 100644
index 0000000..26ea402
--- /dev/null
+++ b/mindus/assets/blocks/environment/basalt3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/beryllic-boulder1.png b/mindus/assets/blocks/environment/beryllic-boulder1.png
new file mode 100644
index 0000000..b9eaa44
--- /dev/null
+++ b/mindus/assets/blocks/environment/beryllic-boulder1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/beryllic-boulder2.png b/mindus/assets/blocks/environment/beryllic-boulder2.png
new file mode 100644
index 0000000..ff5a723
--- /dev/null
+++ b/mindus/assets/blocks/environment/beryllic-boulder2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/beryllic-stone-wall-large.png b/mindus/assets/blocks/environment/beryllic-stone-wall-large.png
new file mode 100644
index 0000000..e660522
--- /dev/null
+++ b/mindus/assets/blocks/environment/beryllic-stone-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/beryllic-stone-wall1.png b/mindus/assets/blocks/environment/beryllic-stone-wall1.png
new file mode 100644
index 0000000..5203226
--- /dev/null
+++ b/mindus/assets/blocks/environment/beryllic-stone-wall1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/beryllic-stone-wall2.png b/mindus/assets/blocks/environment/beryllic-stone-wall2.png
new file mode 100644
index 0000000..e936059
--- /dev/null
+++ b/mindus/assets/blocks/environment/beryllic-stone-wall2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/beryllic-stone1.png b/mindus/assets/blocks/environment/beryllic-stone1.png
new file mode 100644
index 0000000..31da580
--- /dev/null
+++ b/mindus/assets/blocks/environment/beryllic-stone1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/beryllic-stone2.png b/mindus/assets/blocks/environment/beryllic-stone2.png
new file mode 100644
index 0000000..e5c57ce
--- /dev/null
+++ b/mindus/assets/blocks/environment/beryllic-stone2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/beryllic-stone3.png b/mindus/assets/blocks/environment/beryllic-stone3.png
new file mode 100644
index 0000000..e41a051
--- /dev/null
+++ b/mindus/assets/blocks/environment/beryllic-stone3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/beryllic-stone4.png b/mindus/assets/blocks/environment/beryllic-stone4.png
new file mode 100644
index 0000000..9c67991
--- /dev/null
+++ b/mindus/assets/blocks/environment/beryllic-stone4.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/bluemat1.png b/mindus/assets/blocks/environment/bluemat1.png
new file mode 100644
index 0000000..f53787d
--- /dev/null
+++ b/mindus/assets/blocks/environment/bluemat1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/bluemat2.png b/mindus/assets/blocks/environment/bluemat2.png
new file mode 100644
index 0000000..d493309
--- /dev/null
+++ b/mindus/assets/blocks/environment/bluemat2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/bluemat3.png b/mindus/assets/blocks/environment/bluemat3.png
new file mode 100644
index 0000000..a4e955f
--- /dev/null
+++ b/mindus/assets/blocks/environment/bluemat3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/boulder1.png b/mindus/assets/blocks/environment/boulder1.png
new file mode 100644
index 0000000..22d4929
--- /dev/null
+++ b/mindus/assets/blocks/environment/boulder1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/boulder2.png b/mindus/assets/blocks/environment/boulder2.png
new file mode 100644
index 0000000..8379417
--- /dev/null
+++ b/mindus/assets/blocks/environment/boulder2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/carbon-boulder1.png b/mindus/assets/blocks/environment/carbon-boulder1.png
new file mode 100644
index 0000000..d48f298
--- /dev/null
+++ b/mindus/assets/blocks/environment/carbon-boulder1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/carbon-boulder2.png b/mindus/assets/blocks/environment/carbon-boulder2.png
new file mode 100644
index 0000000..a3ae84b
--- /dev/null
+++ b/mindus/assets/blocks/environment/carbon-boulder2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/carbon-stone1.png b/mindus/assets/blocks/environment/carbon-stone1.png
new file mode 100644
index 0000000..241cc18
--- /dev/null
+++ b/mindus/assets/blocks/environment/carbon-stone1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/carbon-stone2.png b/mindus/assets/blocks/environment/carbon-stone2.png
new file mode 100644
index 0000000..90c80b1
--- /dev/null
+++ b/mindus/assets/blocks/environment/carbon-stone2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/carbon-stone3.png b/mindus/assets/blocks/environment/carbon-stone3.png
new file mode 100644
index 0000000..dc56e9c
--- /dev/null
+++ b/mindus/assets/blocks/environment/carbon-stone3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/carbon-stone4.png b/mindus/assets/blocks/environment/carbon-stone4.png
new file mode 100644
index 0000000..9a2a163
--- /dev/null
+++ b/mindus/assets/blocks/environment/carbon-stone4.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/carbon-vent.png b/mindus/assets/blocks/environment/carbon-vent.png
new file mode 100644
index 0000000..583fe20
--- /dev/null
+++ b/mindus/assets/blocks/environment/carbon-vent.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/carbon-vent1.png b/mindus/assets/blocks/environment/carbon-vent1.png
new file mode 100644
index 0000000..ccbf2f7
--- /dev/null
+++ b/mindus/assets/blocks/environment/carbon-vent1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/carbon-vent2.png b/mindus/assets/blocks/environment/carbon-vent2.png
new file mode 100644
index 0000000..a87225c
--- /dev/null
+++ b/mindus/assets/blocks/environment/carbon-vent2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/carbon-wall-large.png b/mindus/assets/blocks/environment/carbon-wall-large.png
new file mode 100644
index 0000000..8367461
--- /dev/null
+++ b/mindus/assets/blocks/environment/carbon-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/carbon-wall1.png b/mindus/assets/blocks/environment/carbon-wall1.png
new file mode 100644
index 0000000..9558777
--- /dev/null
+++ b/mindus/assets/blocks/environment/carbon-wall1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/carbon-wall2.png b/mindus/assets/blocks/environment/carbon-wall2.png
new file mode 100644
index 0000000..98a5334
--- /dev/null
+++ b/mindus/assets/blocks/environment/carbon-wall2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/char1.png b/mindus/assets/blocks/environment/char1.png
new file mode 100644
index 0000000..94ce8df
--- /dev/null
+++ b/mindus/assets/blocks/environment/char1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/char2.png b/mindus/assets/blocks/environment/char2.png
new file mode 100644
index 0000000..47db29c
--- /dev/null
+++ b/mindus/assets/blocks/environment/char2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/char3.png b/mindus/assets/blocks/environment/char3.png
new file mode 100644
index 0000000..be117bb
--- /dev/null
+++ b/mindus/assets/blocks/environment/char3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/core-zone.png b/mindus/assets/blocks/environment/core-zone.png
new file mode 100644
index 0000000..8b3e389
--- /dev/null
+++ b/mindus/assets/blocks/environment/core-zone.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crater-stone1.png b/mindus/assets/blocks/environment/crater-stone1.png
new file mode 100644
index 0000000..0cd39f7
--- /dev/null
+++ b/mindus/assets/blocks/environment/crater-stone1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crater-stone2.png b/mindus/assets/blocks/environment/crater-stone2.png
new file mode 100644
index 0000000..48c8560
--- /dev/null
+++ b/mindus/assets/blocks/environment/crater-stone2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crater-stone3.png b/mindus/assets/blocks/environment/crater-stone3.png
new file mode 100644
index 0000000..a5246a5
--- /dev/null
+++ b/mindus/assets/blocks/environment/crater-stone3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crater-stone4.png b/mindus/assets/blocks/environment/crater-stone4.png
new file mode 100644
index 0000000..24ccffa
--- /dev/null
+++ b/mindus/assets/blocks/environment/crater-stone4.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crater-stone5.png b/mindus/assets/blocks/environment/crater-stone5.png
new file mode 100644
index 0000000..f9407bb
--- /dev/null
+++ b/mindus/assets/blocks/environment/crater-stone5.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crater-stone6.png b/mindus/assets/blocks/environment/crater-stone6.png
new file mode 100644
index 0000000..632d3ef
--- /dev/null
+++ b/mindus/assets/blocks/environment/crater-stone6.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystal-blocks1.png b/mindus/assets/blocks/environment/crystal-blocks1.png
new file mode 100644
index 0000000..a65944b
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystal-blocks1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystal-blocks2.png b/mindus/assets/blocks/environment/crystal-blocks2.png
new file mode 100644
index 0000000..0ccf6f7
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystal-blocks2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystal-blocks3.png b/mindus/assets/blocks/environment/crystal-blocks3.png
new file mode 100644
index 0000000..e90907b
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystal-blocks3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystal-cluster1.png b/mindus/assets/blocks/environment/crystal-cluster1.png
new file mode 100644
index 0000000..946cbdc
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystal-cluster1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystal-cluster2.png b/mindus/assets/blocks/environment/crystal-cluster2.png
new file mode 100644
index 0000000..2e1e8ef
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystal-cluster2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystal-cluster3.png b/mindus/assets/blocks/environment/crystal-cluster3.png
new file mode 100644
index 0000000..b1a6f40
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystal-cluster3.png
Binary files differ
diff --git a/assets/blocks/environment/crystal-floor.png b/mindus/assets/blocks/environment/crystal-floor1.png
index 4ff6b86..4ff6b86 100644
--- a/assets/blocks/environment/crystal-floor.png
+++ b/mindus/assets/blocks/environment/crystal-floor1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystal-floor2.png b/mindus/assets/blocks/environment/crystal-floor2.png
new file mode 100644
index 0000000..545c355
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystal-floor2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystal-floor3.png b/mindus/assets/blocks/environment/crystal-floor3.png
new file mode 100644
index 0000000..824898f
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystal-floor3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystal-floor4.png b/mindus/assets/blocks/environment/crystal-floor4.png
new file mode 100644
index 0000000..3ed7a8b
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystal-floor4.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystal-orbs1.png b/mindus/assets/blocks/environment/crystal-orbs1.png
new file mode 100644
index 0000000..945acb3
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystal-orbs1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystal-orbs2.png b/mindus/assets/blocks/environment/crystal-orbs2.png
new file mode 100644
index 0000000..fb91877
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystal-orbs2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystal-orbs3.png b/mindus/assets/blocks/environment/crystal-orbs3.png
new file mode 100644
index 0000000..f66e334
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystal-orbs3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystalline-boulder1.png b/mindus/assets/blocks/environment/crystalline-boulder1.png
new file mode 100644
index 0000000..3625fcf
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystalline-boulder1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystalline-boulder2.png b/mindus/assets/blocks/environment/crystalline-boulder2.png
new file mode 100644
index 0000000..621efab
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystalline-boulder2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystalline-stone-wall-large.png b/mindus/assets/blocks/environment/crystalline-stone-wall-large.png
new file mode 100644
index 0000000..9d146ea
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystalline-stone-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystalline-stone-wall1.png b/mindus/assets/blocks/environment/crystalline-stone-wall1.png
new file mode 100644
index 0000000..a2c90a5
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystalline-stone-wall1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystalline-stone-wall2.png b/mindus/assets/blocks/environment/crystalline-stone-wall2.png
new file mode 100644
index 0000000..565eee9
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystalline-stone-wall2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystalline-stone-wall3.png b/mindus/assets/blocks/environment/crystalline-stone-wall3.png
new file mode 100644
index 0000000..20e4299
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystalline-stone-wall3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystalline-stone-wall4.png b/mindus/assets/blocks/environment/crystalline-stone-wall4.png
new file mode 100644
index 0000000..4d9b5d8
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystalline-stone-wall4.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystalline-stone1.png b/mindus/assets/blocks/environment/crystalline-stone1.png
new file mode 100644
index 0000000..578de4b
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystalline-stone1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystalline-stone2.png b/mindus/assets/blocks/environment/crystalline-stone2.png
new file mode 100644
index 0000000..d4bba9b
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystalline-stone2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystalline-stone3.png b/mindus/assets/blocks/environment/crystalline-stone3.png
new file mode 100644
index 0000000..5e53179
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystalline-stone3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystalline-stone4.png b/mindus/assets/blocks/environment/crystalline-stone4.png
new file mode 100644
index 0000000..22ce7a7
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystalline-stone4.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystalline-stone5.png b/mindus/assets/blocks/environment/crystalline-stone5.png
new file mode 100644
index 0000000..3963dbc
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystalline-stone5.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystalline-vent.png b/mindus/assets/blocks/environment/crystalline-vent.png
new file mode 100644
index 0000000..a974831
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystalline-vent.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystalline-vent1.png b/mindus/assets/blocks/environment/crystalline-vent1.png
new file mode 100644
index 0000000..1df332b
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystalline-vent1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/crystalline-vent2.png b/mindus/assets/blocks/environment/crystalline-vent2.png
new file mode 100644
index 0000000..97f35eb
--- /dev/null
+++ b/mindus/assets/blocks/environment/crystalline-vent2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dacite-boulder1.png b/mindus/assets/blocks/environment/dacite-boulder1.png
new file mode 100644
index 0000000..6d87dcd
--- /dev/null
+++ b/mindus/assets/blocks/environment/dacite-boulder1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dacite-boulder2.png b/mindus/assets/blocks/environment/dacite-boulder2.png
new file mode 100644
index 0000000..6704524
--- /dev/null
+++ b/mindus/assets/blocks/environment/dacite-boulder2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dacite-wall-large.png b/mindus/assets/blocks/environment/dacite-wall-large.png
new file mode 100644
index 0000000..12be810
--- /dev/null
+++ b/mindus/assets/blocks/environment/dacite-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dacite-wall1.png b/mindus/assets/blocks/environment/dacite-wall1.png
new file mode 100644
index 0000000..40c36d0
--- /dev/null
+++ b/mindus/assets/blocks/environment/dacite-wall1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dacite-wall2.png b/mindus/assets/blocks/environment/dacite-wall2.png
new file mode 100644
index 0000000..a4bae3e
--- /dev/null
+++ b/mindus/assets/blocks/environment/dacite-wall2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dacite1.png b/mindus/assets/blocks/environment/dacite1.png
new file mode 100644
index 0000000..ef65267
--- /dev/null
+++ b/mindus/assets/blocks/environment/dacite1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dacite2.png b/mindus/assets/blocks/environment/dacite2.png
new file mode 100644
index 0000000..f9d9115
--- /dev/null
+++ b/mindus/assets/blocks/environment/dacite2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dacite3.png b/mindus/assets/blocks/environment/dacite3.png
new file mode 100644
index 0000000..8a1621d
--- /dev/null
+++ b/mindus/assets/blocks/environment/dacite3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dark-metal-large.png b/mindus/assets/blocks/environment/dark-metal-large.png
new file mode 100644
index 0000000..a1efe07
--- /dev/null
+++ b/mindus/assets/blocks/environment/dark-metal-large.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dark-metal1.png b/mindus/assets/blocks/environment/dark-metal1.png
new file mode 100644
index 0000000..c284e63
--- /dev/null
+++ b/mindus/assets/blocks/environment/dark-metal1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dark-metal2.png b/mindus/assets/blocks/environment/dark-metal2.png
new file mode 100644
index 0000000..207575a
--- /dev/null
+++ b/mindus/assets/blocks/environment/dark-metal2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dark-panel-1.png b/mindus/assets/blocks/environment/dark-panel-1.png
new file mode 100644
index 0000000..fe2683a
--- /dev/null
+++ b/mindus/assets/blocks/environment/dark-panel-1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dark-panel-2.png b/mindus/assets/blocks/environment/dark-panel-2.png
new file mode 100644
index 0000000..e45e817
--- /dev/null
+++ b/mindus/assets/blocks/environment/dark-panel-2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dark-panel-3.png b/mindus/assets/blocks/environment/dark-panel-3.png
new file mode 100644
index 0000000..8734637
--- /dev/null
+++ b/mindus/assets/blocks/environment/dark-panel-3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dark-panel-4.png b/mindus/assets/blocks/environment/dark-panel-4.png
new file mode 100644
index 0000000..cb277a0
--- /dev/null
+++ b/mindus/assets/blocks/environment/dark-panel-4.png
Binary files differ
diff --git a/assets/blocks/environment/dark-panel-5.png b/mindus/assets/blocks/environment/dark-panel-5.png
index c956695..c956695 100644
--- a/assets/blocks/environment/dark-panel-5.png
+++ b/mindus/assets/blocks/environment/dark-panel-5.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dark-panel-6.png b/mindus/assets/blocks/environment/dark-panel-6.png
new file mode 100644
index 0000000..d3b9251
--- /dev/null
+++ b/mindus/assets/blocks/environment/dark-panel-6.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/darksand-tainted-water.png b/mindus/assets/blocks/environment/darksand-tainted-water.png
new file mode 100644
index 0000000..a687787
--- /dev/null
+++ b/mindus/assets/blocks/environment/darksand-tainted-water.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/darksand-water.png b/mindus/assets/blocks/environment/darksand-water.png
new file mode 100644
index 0000000..f2e6968
--- /dev/null
+++ b/mindus/assets/blocks/environment/darksand-water.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/darksand1.png b/mindus/assets/blocks/environment/darksand1.png
new file mode 100644
index 0000000..91866e5
--- /dev/null
+++ b/mindus/assets/blocks/environment/darksand1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/darksand2.png b/mindus/assets/blocks/environment/darksand2.png
new file mode 100644
index 0000000..c8eb59e
--- /dev/null
+++ b/mindus/assets/blocks/environment/darksand2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/darksand3.png b/mindus/assets/blocks/environment/darksand3.png
new file mode 100644
index 0000000..c8ece42
--- /dev/null
+++ b/mindus/assets/blocks/environment/darksand3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/deep-tainted-water.png b/mindus/assets/blocks/environment/deep-tainted-water.png
new file mode 100644
index 0000000..f1f8a47
--- /dev/null
+++ b/mindus/assets/blocks/environment/deep-tainted-water.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/deep-water.png b/mindus/assets/blocks/environment/deep-water.png
new file mode 100644
index 0000000..a0d0e10
--- /dev/null
+++ b/mindus/assets/blocks/environment/deep-water.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dense-red-stone1.png b/mindus/assets/blocks/environment/dense-red-stone1.png
new file mode 100644
index 0000000..05a3455
--- /dev/null
+++ b/mindus/assets/blocks/environment/dense-red-stone1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dense-red-stone2.png b/mindus/assets/blocks/environment/dense-red-stone2.png
new file mode 100644
index 0000000..6fe1899
--- /dev/null
+++ b/mindus/assets/blocks/environment/dense-red-stone2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dense-red-stone3.png b/mindus/assets/blocks/environment/dense-red-stone3.png
new file mode 100644
index 0000000..a484201
--- /dev/null
+++ b/mindus/assets/blocks/environment/dense-red-stone3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dense-red-stone4.png b/mindus/assets/blocks/environment/dense-red-stone4.png
new file mode 100644
index 0000000..dfa2ef8
--- /dev/null
+++ b/mindus/assets/blocks/environment/dense-red-stone4.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dirt-wall-large.png b/mindus/assets/blocks/environment/dirt-wall-large.png
new file mode 100644
index 0000000..db43337
--- /dev/null
+++ b/mindus/assets/blocks/environment/dirt-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dirt-wall1.png b/mindus/assets/blocks/environment/dirt-wall1.png
new file mode 100644
index 0000000..6eb65e0
--- /dev/null
+++ b/mindus/assets/blocks/environment/dirt-wall1.png
Binary files differ
diff --git a/assets/blocks/environment/dirt-wall.png b/mindus/assets/blocks/environment/dirt-wall2.png
index f76d30d..f76d30d 100644
--- a/assets/blocks/environment/dirt-wall.png
+++ b/mindus/assets/blocks/environment/dirt-wall2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dirt1.png b/mindus/assets/blocks/environment/dirt1.png
new file mode 100644
index 0000000..38f11e7
--- /dev/null
+++ b/mindus/assets/blocks/environment/dirt1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dirt2.png b/mindus/assets/blocks/environment/dirt2.png
new file mode 100644
index 0000000..e4aa286
--- /dev/null
+++ b/mindus/assets/blocks/environment/dirt2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dirt3.png b/mindus/assets/blocks/environment/dirt3.png
new file mode 100644
index 0000000..ff65a1f
--- /dev/null
+++ b/mindus/assets/blocks/environment/dirt3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dune-wall-large.png b/mindus/assets/blocks/environment/dune-wall-large.png
new file mode 100644
index 0000000..d2a69ea
--- /dev/null
+++ b/mindus/assets/blocks/environment/dune-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dune-wall1.png b/mindus/assets/blocks/environment/dune-wall1.png
new file mode 100644
index 0000000..5b4462f
--- /dev/null
+++ b/mindus/assets/blocks/environment/dune-wall1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/dune-wall2.png b/mindus/assets/blocks/environment/dune-wall2.png
new file mode 100644
index 0000000..f849893
--- /dev/null
+++ b/mindus/assets/blocks/environment/dune-wall2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/edge-stencil.png b/mindus/assets/blocks/environment/edge-stencil.png
new file mode 100644
index 0000000..0bd0cb7
--- /dev/null
+++ b/mindus/assets/blocks/environment/edge-stencil.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/edge.png b/mindus/assets/blocks/environment/edge.png
new file mode 100644
index 0000000..12c3b44
--- /dev/null
+++ b/mindus/assets/blocks/environment/edge.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/env-error.png b/mindus/assets/blocks/environment/env-error.png
new file mode 100644
index 0000000..d851d7f
--- /dev/null
+++ b/mindus/assets/blocks/environment/env-error.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ferric-boulder1.png b/mindus/assets/blocks/environment/ferric-boulder1.png
new file mode 100644
index 0000000..56bcb4b
--- /dev/null
+++ b/mindus/assets/blocks/environment/ferric-boulder1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ferric-boulder2.png b/mindus/assets/blocks/environment/ferric-boulder2.png
new file mode 100644
index 0000000..acba7d4
--- /dev/null
+++ b/mindus/assets/blocks/environment/ferric-boulder2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ferric-craters1.png b/mindus/assets/blocks/environment/ferric-craters1.png
new file mode 100644
index 0000000..3249fe9
--- /dev/null
+++ b/mindus/assets/blocks/environment/ferric-craters1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ferric-craters2.png b/mindus/assets/blocks/environment/ferric-craters2.png
new file mode 100644
index 0000000..91586af
--- /dev/null
+++ b/mindus/assets/blocks/environment/ferric-craters2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ferric-craters3.png b/mindus/assets/blocks/environment/ferric-craters3.png
new file mode 100644
index 0000000..8b25404
--- /dev/null
+++ b/mindus/assets/blocks/environment/ferric-craters3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ferric-stone-wall-large.png b/mindus/assets/blocks/environment/ferric-stone-wall-large.png
new file mode 100644
index 0000000..399cf4f
--- /dev/null
+++ b/mindus/assets/blocks/environment/ferric-stone-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ferric-stone-wall1.png b/mindus/assets/blocks/environment/ferric-stone-wall1.png
new file mode 100644
index 0000000..580ef7d
--- /dev/null
+++ b/mindus/assets/blocks/environment/ferric-stone-wall1.png
Binary files differ
diff --git a/assets/blocks/environment/ferric-stone-wall.png b/mindus/assets/blocks/environment/ferric-stone-wall2.png
index fac2fcc..fac2fcc 100644
--- a/assets/blocks/environment/ferric-stone-wall.png
+++ b/mindus/assets/blocks/environment/ferric-stone-wall2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ferric-stone1.png b/mindus/assets/blocks/environment/ferric-stone1.png
new file mode 100644
index 0000000..4a1a0bc
--- /dev/null
+++ b/mindus/assets/blocks/environment/ferric-stone1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ferric-stone2.png b/mindus/assets/blocks/environment/ferric-stone2.png
new file mode 100644
index 0000000..f4e9af5
--- /dev/null
+++ b/mindus/assets/blocks/environment/ferric-stone2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ferric-stone3.png b/mindus/assets/blocks/environment/ferric-stone3.png
new file mode 100644
index 0000000..1bc4111
--- /dev/null
+++ b/mindus/assets/blocks/environment/ferric-stone3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ferric-stone4.png b/mindus/assets/blocks/environment/ferric-stone4.png
new file mode 100644
index 0000000..17ed876
--- /dev/null
+++ b/mindus/assets/blocks/environment/ferric-stone4.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/graphitic-wall-large.png b/mindus/assets/blocks/environment/graphitic-wall-large.png
new file mode 100644
index 0000000..476879a
--- /dev/null
+++ b/mindus/assets/blocks/environment/graphitic-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/graphitic-wall1.png b/mindus/assets/blocks/environment/graphitic-wall1.png
new file mode 100644
index 0000000..21454de
--- /dev/null
+++ b/mindus/assets/blocks/environment/graphitic-wall1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/graphitic-wall2.png b/mindus/assets/blocks/environment/graphitic-wall2.png
new file mode 100644
index 0000000..aa78bd8
--- /dev/null
+++ b/mindus/assets/blocks/environment/graphitic-wall2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/graphitic-wall3.png b/mindus/assets/blocks/environment/graphitic-wall3.png
new file mode 100644
index 0000000..8419091
--- /dev/null
+++ b/mindus/assets/blocks/environment/graphitic-wall3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/grass1.png b/mindus/assets/blocks/environment/grass1.png
new file mode 100644
index 0000000..9b4c556
--- /dev/null
+++ b/mindus/assets/blocks/environment/grass1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/grass2.png b/mindus/assets/blocks/environment/grass2.png
new file mode 100644
index 0000000..d858821
--- /dev/null
+++ b/mindus/assets/blocks/environment/grass2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/grass3.png b/mindus/assets/blocks/environment/grass3.png
new file mode 100644
index 0000000..9e1aca0
--- /dev/null
+++ b/mindus/assets/blocks/environment/grass3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/hotrock1.png b/mindus/assets/blocks/environment/hotrock1.png
new file mode 100644
index 0000000..9b1f60d
--- /dev/null
+++ b/mindus/assets/blocks/environment/hotrock1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/hotrock2.png b/mindus/assets/blocks/environment/hotrock2.png
new file mode 100644
index 0000000..04435af
--- /dev/null
+++ b/mindus/assets/blocks/environment/hotrock2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/hotrock3.png b/mindus/assets/blocks/environment/hotrock3.png
new file mode 100644
index 0000000..87beeef
--- /dev/null
+++ b/mindus/assets/blocks/environment/hotrock3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ice-snow1.png b/mindus/assets/blocks/environment/ice-snow1.png
new file mode 100644
index 0000000..05fa939
--- /dev/null
+++ b/mindus/assets/blocks/environment/ice-snow1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ice-snow2.png b/mindus/assets/blocks/environment/ice-snow2.png
new file mode 100644
index 0000000..71c7b59
--- /dev/null
+++ b/mindus/assets/blocks/environment/ice-snow2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ice-snow3.png b/mindus/assets/blocks/environment/ice-snow3.png
new file mode 100644
index 0000000..946bad2
--- /dev/null
+++ b/mindus/assets/blocks/environment/ice-snow3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ice-wall-large.png b/mindus/assets/blocks/environment/ice-wall-large.png
new file mode 100644
index 0000000..4ef7e53
--- /dev/null
+++ b/mindus/assets/blocks/environment/ice-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ice-wall1.png b/mindus/assets/blocks/environment/ice-wall1.png
new file mode 100644
index 0000000..56f647f
--- /dev/null
+++ b/mindus/assets/blocks/environment/ice-wall1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ice-wall2.png b/mindus/assets/blocks/environment/ice-wall2.png
new file mode 100644
index 0000000..99674f6
--- /dev/null
+++ b/mindus/assets/blocks/environment/ice-wall2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ice1.png b/mindus/assets/blocks/environment/ice1.png
new file mode 100644
index 0000000..355ed2d
--- /dev/null
+++ b/mindus/assets/blocks/environment/ice1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ice2.png b/mindus/assets/blocks/environment/ice2.png
new file mode 100644
index 0000000..eb53e77
--- /dev/null
+++ b/mindus/assets/blocks/environment/ice2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ice3.png b/mindus/assets/blocks/environment/ice3.png
new file mode 100644
index 0000000..6b1b8b0
--- /dev/null
+++ b/mindus/assets/blocks/environment/ice3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/magmarock1.png b/mindus/assets/blocks/environment/magmarock1.png
new file mode 100644
index 0000000..7218a6f
--- /dev/null
+++ b/mindus/assets/blocks/environment/magmarock1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/magmarock2.png b/mindus/assets/blocks/environment/magmarock2.png
new file mode 100644
index 0000000..6a3330c
--- /dev/null
+++ b/mindus/assets/blocks/environment/magmarock2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/magmarock3.png b/mindus/assets/blocks/environment/magmarock3.png
new file mode 100644
index 0000000..2921b1a
--- /dev/null
+++ b/mindus/assets/blocks/environment/magmarock3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/metal-floor-2.png b/mindus/assets/blocks/environment/metal-floor-2.png
new file mode 100644
index 0000000..26ddfa3
--- /dev/null
+++ b/mindus/assets/blocks/environment/metal-floor-2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/metal-floor-3.png b/mindus/assets/blocks/environment/metal-floor-3.png
new file mode 100644
index 0000000..e5f1b58
--- /dev/null
+++ b/mindus/assets/blocks/environment/metal-floor-3.png
Binary files differ
diff --git a/assets/blocks/environment/metal-floor-4.png b/mindus/assets/blocks/environment/metal-floor-4.png
index 6c17203..6c17203 100644
--- a/assets/blocks/environment/metal-floor-4.png
+++ b/mindus/assets/blocks/environment/metal-floor-4.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/metal-floor-5.png b/mindus/assets/blocks/environment/metal-floor-5.png
new file mode 100644
index 0000000..7b7cf40
--- /dev/null
+++ b/mindus/assets/blocks/environment/metal-floor-5.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/metal-floor-damaged1.png b/mindus/assets/blocks/environment/metal-floor-damaged1.png
new file mode 100644
index 0000000..500d2a1
--- /dev/null
+++ b/mindus/assets/blocks/environment/metal-floor-damaged1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/metal-floor-damaged2.png b/mindus/assets/blocks/environment/metal-floor-damaged2.png
new file mode 100644
index 0000000..0346965
--- /dev/null
+++ b/mindus/assets/blocks/environment/metal-floor-damaged2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/metal-floor-damaged3.png b/mindus/assets/blocks/environment/metal-floor-damaged3.png
new file mode 100644
index 0000000..59dad1b
--- /dev/null
+++ b/mindus/assets/blocks/environment/metal-floor-damaged3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/metal-floor.png b/mindus/assets/blocks/environment/metal-floor.png
new file mode 100644
index 0000000..ca564d0
--- /dev/null
+++ b/mindus/assets/blocks/environment/metal-floor.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/molten-slag1.png b/mindus/assets/blocks/environment/molten-slag1.png
new file mode 100644
index 0000000..07db3b0
--- /dev/null
+++ b/mindus/assets/blocks/environment/molten-slag1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/moss1.png b/mindus/assets/blocks/environment/moss1.png
new file mode 100644
index 0000000..69d8abd
--- /dev/null
+++ b/mindus/assets/blocks/environment/moss1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/moss2.png b/mindus/assets/blocks/environment/moss2.png
new file mode 100644
index 0000000..181c54a
--- /dev/null
+++ b/mindus/assets/blocks/environment/moss2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/moss3.png b/mindus/assets/blocks/environment/moss3.png
new file mode 100644
index 0000000..f9b0b7b
--- /dev/null
+++ b/mindus/assets/blocks/environment/moss3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/mud1.png b/mindus/assets/blocks/environment/mud1.png
new file mode 100644
index 0000000..b3bde63
--- /dev/null
+++ b/mindus/assets/blocks/environment/mud1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/mud2.png b/mindus/assets/blocks/environment/mud2.png
new file mode 100644
index 0000000..12a52d6
--- /dev/null
+++ b/mindus/assets/blocks/environment/mud2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/mud3.png b/mindus/assets/blocks/environment/mud3.png
new file mode 100644
index 0000000..325eaf4
--- /dev/null
+++ b/mindus/assets/blocks/environment/mud3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-beryllium1.png b/mindus/assets/blocks/environment/ore-beryllium1.png
new file mode 100644
index 0000000..4d682b8
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-beryllium1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-beryllium2.png b/mindus/assets/blocks/environment/ore-beryllium2.png
new file mode 100644
index 0000000..baa2364
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-beryllium2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-beryllium3.png b/mindus/assets/blocks/environment/ore-beryllium3.png
new file mode 100644
index 0000000..05a9465
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-beryllium3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-coal1.png b/mindus/assets/blocks/environment/ore-coal1.png
new file mode 100644
index 0000000..6b5a5ee
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-coal1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-coal2.png b/mindus/assets/blocks/environment/ore-coal2.png
new file mode 100644
index 0000000..4e6f721
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-coal2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-coal3.png b/mindus/assets/blocks/environment/ore-coal3.png
new file mode 100644
index 0000000..4e8fb4e
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-coal3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-copper1.png b/mindus/assets/blocks/environment/ore-copper1.png
new file mode 100644
index 0000000..578b5b4
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-copper1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-copper2.png b/mindus/assets/blocks/environment/ore-copper2.png
new file mode 100644
index 0000000..3afab6a
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-copper2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-copper3.png b/mindus/assets/blocks/environment/ore-copper3.png
new file mode 100644
index 0000000..561d14c
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-copper3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-crystal-thorium1.png b/mindus/assets/blocks/environment/ore-crystal-thorium1.png
new file mode 100644
index 0000000..9ba038e
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-crystal-thorium1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-crystal-thorium2.png b/mindus/assets/blocks/environment/ore-crystal-thorium2.png
new file mode 100644
index 0000000..219adc2
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-crystal-thorium2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-crystal-thorium3.png b/mindus/assets/blocks/environment/ore-crystal-thorium3.png
new file mode 100644
index 0000000..daa6ace
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-crystal-thorium3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-lead1.png b/mindus/assets/blocks/environment/ore-lead1.png
new file mode 100644
index 0000000..94eed99
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-lead1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-lead2.png b/mindus/assets/blocks/environment/ore-lead2.png
new file mode 100644
index 0000000..c86de92
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-lead2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-lead3.png b/mindus/assets/blocks/environment/ore-lead3.png
new file mode 100644
index 0000000..c99376f
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-lead3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-scrap1.png b/mindus/assets/blocks/environment/ore-scrap1.png
new file mode 100644
index 0000000..8973fe2
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-scrap1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-scrap2.png b/mindus/assets/blocks/environment/ore-scrap2.png
new file mode 100644
index 0000000..9a196d1
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-scrap2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-scrap3.png b/mindus/assets/blocks/environment/ore-scrap3.png
new file mode 100644
index 0000000..e5e88a2
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-scrap3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-thorium1.png b/mindus/assets/blocks/environment/ore-thorium1.png
new file mode 100644
index 0000000..f07faf6
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-thorium1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-thorium2.png b/mindus/assets/blocks/environment/ore-thorium2.png
new file mode 100644
index 0000000..41787f4
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-thorium2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-thorium3.png b/mindus/assets/blocks/environment/ore-thorium3.png
new file mode 100644
index 0000000..d2604e0
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-thorium3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-titanium1.png b/mindus/assets/blocks/environment/ore-titanium1.png
new file mode 100644
index 0000000..95e95ed
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-titanium1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-titanium2.png b/mindus/assets/blocks/environment/ore-titanium2.png
new file mode 100644
index 0000000..d4e5327
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-titanium2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-titanium3.png b/mindus/assets/blocks/environment/ore-titanium3.png
new file mode 100644
index 0000000..6bfae17
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-titanium3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-tungsten1.png b/mindus/assets/blocks/environment/ore-tungsten1.png
new file mode 100644
index 0000000..094ef3e
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-tungsten1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-tungsten2.png b/mindus/assets/blocks/environment/ore-tungsten2.png
new file mode 100644
index 0000000..4b6b9e2
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-tungsten2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-tungsten3.png b/mindus/assets/blocks/environment/ore-tungsten3.png
new file mode 100644
index 0000000..c379d30
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-tungsten3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-wall-beryllium1.png b/mindus/assets/blocks/environment/ore-wall-beryllium1.png
new file mode 100644
index 0000000..e9a3cc3
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-wall-beryllium1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-wall-beryllium2.png b/mindus/assets/blocks/environment/ore-wall-beryllium2.png
new file mode 100644
index 0000000..0904e0d
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-wall-beryllium2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-wall-beryllium3.png b/mindus/assets/blocks/environment/ore-wall-beryllium3.png
new file mode 100644
index 0000000..5c9b8c7
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-wall-beryllium3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-wall-graphite1.png b/mindus/assets/blocks/environment/ore-wall-graphite1.png
new file mode 100644
index 0000000..12b7df9
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-wall-graphite1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-wall-graphite2.png b/mindus/assets/blocks/environment/ore-wall-graphite2.png
new file mode 100644
index 0000000..5132f76
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-wall-graphite2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-wall-graphite3.png b/mindus/assets/blocks/environment/ore-wall-graphite3.png
new file mode 100644
index 0000000..5369276
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-wall-graphite3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-wall-thorium1.png b/mindus/assets/blocks/environment/ore-wall-thorium1.png
new file mode 100644
index 0000000..05342af
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-wall-thorium1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-wall-thorium2.png b/mindus/assets/blocks/environment/ore-wall-thorium2.png
new file mode 100644
index 0000000..ed21d0d
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-wall-thorium2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-wall-thorium3.png b/mindus/assets/blocks/environment/ore-wall-thorium3.png
new file mode 100644
index 0000000..5a58f15
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-wall-thorium3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-wall-tungsten1.png b/mindus/assets/blocks/environment/ore-wall-tungsten1.png
new file mode 100644
index 0000000..81e61e1
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-wall-tungsten1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-wall-tungsten2.png b/mindus/assets/blocks/environment/ore-wall-tungsten2.png
new file mode 100644
index 0000000..6ed7eba
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-wall-tungsten2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/ore-wall-tungsten3.png b/mindus/assets/blocks/environment/ore-wall-tungsten3.png
new file mode 100644
index 0000000..d1e7993
--- /dev/null
+++ b/mindus/assets/blocks/environment/ore-wall-tungsten3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/pebbles1.png b/mindus/assets/blocks/environment/pebbles1.png
new file mode 100644
index 0000000..8c8cf52
--- /dev/null
+++ b/mindus/assets/blocks/environment/pebbles1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/pebbles2.png b/mindus/assets/blocks/environment/pebbles2.png
new file mode 100644
index 0000000..4360626
--- /dev/null
+++ b/mindus/assets/blocks/environment/pebbles2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/pebbles3.png b/mindus/assets/blocks/environment/pebbles3.png
new file mode 100644
index 0000000..a542a96
--- /dev/null
+++ b/mindus/assets/blocks/environment/pebbles3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/pine.png b/mindus/assets/blocks/environment/pine.png
new file mode 100644
index 0000000..9f746c3
--- /dev/null
+++ b/mindus/assets/blocks/environment/pine.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/pooled-cryofluid.png b/mindus/assets/blocks/environment/pooled-cryofluid.png
new file mode 100644
index 0000000..3dac992
--- /dev/null
+++ b/mindus/assets/blocks/environment/pooled-cryofluid.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/pur-bush.png b/mindus/assets/blocks/environment/pur-bush.png
new file mode 100644
index 0000000..32c7201
--- /dev/null
+++ b/mindus/assets/blocks/environment/pur-bush.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-diamond-wall1.png b/mindus/assets/blocks/environment/red-diamond-wall1.png
new file mode 100644
index 0000000..8eb8d9b
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-diamond-wall1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-diamond-wall2.png b/mindus/assets/blocks/environment/red-diamond-wall2.png
new file mode 100644
index 0000000..1901166
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-diamond-wall2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-diamond-wall3.png b/mindus/assets/blocks/environment/red-diamond-wall3.png
new file mode 100644
index 0000000..a2c5220
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-diamond-wall3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-ice-boulder1.png b/mindus/assets/blocks/environment/red-ice-boulder1.png
new file mode 100644
index 0000000..2c49e57
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-ice-boulder1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-ice-boulder2.png b/mindus/assets/blocks/environment/red-ice-boulder2.png
new file mode 100644
index 0000000..b6935e1
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-ice-boulder2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-ice-boulder3.png b/mindus/assets/blocks/environment/red-ice-boulder3.png
new file mode 100644
index 0000000..1e1b542
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-ice-boulder3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-ice-wall-large.png b/mindus/assets/blocks/environment/red-ice-wall-large.png
new file mode 100644
index 0000000..0d09b3b
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-ice-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-ice-wall1.png b/mindus/assets/blocks/environment/red-ice-wall1.png
new file mode 100644
index 0000000..2ed857c
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-ice-wall1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-ice-wall2.png b/mindus/assets/blocks/environment/red-ice-wall2.png
new file mode 100644
index 0000000..931929e
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-ice-wall2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-ice1.png b/mindus/assets/blocks/environment/red-ice1.png
new file mode 100644
index 0000000..c03c486
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-ice1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-ice2.png b/mindus/assets/blocks/environment/red-ice2.png
new file mode 100644
index 0000000..e3e309f
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-ice2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-ice3.png b/mindus/assets/blocks/environment/red-ice3.png
new file mode 100644
index 0000000..f33ec98
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-ice3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-stone-boulder1.png b/mindus/assets/blocks/environment/red-stone-boulder1.png
new file mode 100644
index 0000000..c7df230
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-stone-boulder1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-stone-boulder2.png b/mindus/assets/blocks/environment/red-stone-boulder2.png
new file mode 100644
index 0000000..2fe2ad2
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-stone-boulder2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-stone-boulder3.png b/mindus/assets/blocks/environment/red-stone-boulder3.png
new file mode 100644
index 0000000..62e2616
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-stone-boulder3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-stone-boulder4.png b/mindus/assets/blocks/environment/red-stone-boulder4.png
new file mode 100644
index 0000000..2d3d0c3
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-stone-boulder4.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-stone-vent1.png b/mindus/assets/blocks/environment/red-stone-vent1.png
new file mode 100644
index 0000000..09d370f
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-stone-vent1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-stone-vent2.png b/mindus/assets/blocks/environment/red-stone-vent2.png
new file mode 100644
index 0000000..a454baa
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-stone-vent2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-stone-wall-large.png b/mindus/assets/blocks/environment/red-stone-wall-large.png
new file mode 100644
index 0000000..a0c4a5c
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-stone-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-stone-wall1.png b/mindus/assets/blocks/environment/red-stone-wall1.png
new file mode 100644
index 0000000..a14f6f7
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-stone-wall1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-stone-wall2.png b/mindus/assets/blocks/environment/red-stone-wall2.png
new file mode 100644
index 0000000..18b79ea
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-stone-wall2.png
Binary files differ
diff --git a/assets/blocks/environment/red-stone-wall.png b/mindus/assets/blocks/environment/red-stone-wall3.png
index 9c9182c..9c9182c 100644
--- a/assets/blocks/environment/red-stone-wall.png
+++ b/mindus/assets/blocks/environment/red-stone-wall3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-stone1.png b/mindus/assets/blocks/environment/red-stone1.png
new file mode 100644
index 0000000..bcad408
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-stone1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-stone2.png b/mindus/assets/blocks/environment/red-stone2.png
new file mode 100644
index 0000000..b857043
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-stone2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-stone3.png b/mindus/assets/blocks/environment/red-stone3.png
new file mode 100644
index 0000000..5fae657
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-stone3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/red-stone4.png b/mindus/assets/blocks/environment/red-stone4.png
new file mode 100644
index 0000000..b1931ec
--- /dev/null
+++ b/mindus/assets/blocks/environment/red-stone4.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/redmat1.png b/mindus/assets/blocks/environment/redmat1.png
new file mode 100644
index 0000000..daa3995
--- /dev/null
+++ b/mindus/assets/blocks/environment/redmat1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/redmat2.png b/mindus/assets/blocks/environment/redmat2.png
new file mode 100644
index 0000000..b5fca70
--- /dev/null
+++ b/mindus/assets/blocks/environment/redmat2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/redmat3.png b/mindus/assets/blocks/environment/redmat3.png
new file mode 100644
index 0000000..88e06a4
--- /dev/null
+++ b/mindus/assets/blocks/environment/redmat3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/redweed1.png b/mindus/assets/blocks/environment/redweed1.png
new file mode 100644
index 0000000..a981a01
--- /dev/null
+++ b/mindus/assets/blocks/environment/redweed1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/redweed2.png b/mindus/assets/blocks/environment/redweed2.png
new file mode 100644
index 0000000..d1d0b4b
--- /dev/null
+++ b/mindus/assets/blocks/environment/redweed2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/redweed3.png b/mindus/assets/blocks/environment/redweed3.png
new file mode 100644
index 0000000..b9fd3a8
--- /dev/null
+++ b/mindus/assets/blocks/environment/redweed3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/regolith-wall-large.png b/mindus/assets/blocks/environment/regolith-wall-large.png
new file mode 100644
index 0000000..1721a2a
--- /dev/null
+++ b/mindus/assets/blocks/environment/regolith-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/regolith-wall1.png b/mindus/assets/blocks/environment/regolith-wall1.png
new file mode 100644
index 0000000..7b46145
--- /dev/null
+++ b/mindus/assets/blocks/environment/regolith-wall1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/regolith-wall2.png b/mindus/assets/blocks/environment/regolith-wall2.png
new file mode 100644
index 0000000..41ae883
--- /dev/null
+++ b/mindus/assets/blocks/environment/regolith-wall2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/regolith1.png b/mindus/assets/blocks/environment/regolith1.png
new file mode 100644
index 0000000..dad9752
--- /dev/null
+++ b/mindus/assets/blocks/environment/regolith1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/regolith2.png b/mindus/assets/blocks/environment/regolith2.png
new file mode 100644
index 0000000..a700e03
--- /dev/null
+++ b/mindus/assets/blocks/environment/regolith2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/regolith3.png b/mindus/assets/blocks/environment/regolith3.png
new file mode 100644
index 0000000..91ad120
--- /dev/null
+++ b/mindus/assets/blocks/environment/regolith3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/rhyolite-boulder1.png b/mindus/assets/blocks/environment/rhyolite-boulder1.png
new file mode 100644
index 0000000..47cb5ef
--- /dev/null
+++ b/mindus/assets/blocks/environment/rhyolite-boulder1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/rhyolite-boulder2.png b/mindus/assets/blocks/environment/rhyolite-boulder2.png
new file mode 100644
index 0000000..de1c76b
--- /dev/null
+++ b/mindus/assets/blocks/environment/rhyolite-boulder2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/rhyolite-boulder3.png b/mindus/assets/blocks/environment/rhyolite-boulder3.png
new file mode 100644
index 0000000..331a2b7
--- /dev/null
+++ b/mindus/assets/blocks/environment/rhyolite-boulder3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/rhyolite-crater1.png b/mindus/assets/blocks/environment/rhyolite-crater1.png
new file mode 100644
index 0000000..0174a41
--- /dev/null
+++ b/mindus/assets/blocks/environment/rhyolite-crater1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/rhyolite-crater2.png b/mindus/assets/blocks/environment/rhyolite-crater2.png
new file mode 100644
index 0000000..6cddef9
--- /dev/null
+++ b/mindus/assets/blocks/environment/rhyolite-crater2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/rhyolite-crater3.png b/mindus/assets/blocks/environment/rhyolite-crater3.png
new file mode 100644
index 0000000..0bd8f0e
--- /dev/null
+++ b/mindus/assets/blocks/environment/rhyolite-crater3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/rhyolite-vent.png b/mindus/assets/blocks/environment/rhyolite-vent.png
new file mode 100644
index 0000000..c1a5c99
--- /dev/null
+++ b/mindus/assets/blocks/environment/rhyolite-vent.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/rhyolite-vent1.png b/mindus/assets/blocks/environment/rhyolite-vent1.png
new file mode 100644
index 0000000..6ec1110
--- /dev/null
+++ b/mindus/assets/blocks/environment/rhyolite-vent1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/rhyolite-vent2.png b/mindus/assets/blocks/environment/rhyolite-vent2.png
new file mode 100644
index 0000000..0ffaf96
--- /dev/null
+++ b/mindus/assets/blocks/environment/rhyolite-vent2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/rhyolite-wall-large.png b/mindus/assets/blocks/environment/rhyolite-wall-large.png
new file mode 100644
index 0000000..c88a15e
--- /dev/null
+++ b/mindus/assets/blocks/environment/rhyolite-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/rhyolite-wall1.png b/mindus/assets/blocks/environment/rhyolite-wall1.png
new file mode 100644
index 0000000..6ea6923
--- /dev/null
+++ b/mindus/assets/blocks/environment/rhyolite-wall1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/rhyolite-wall2.png b/mindus/assets/blocks/environment/rhyolite-wall2.png
new file mode 100644
index 0000000..2e83246
--- /dev/null
+++ b/mindus/assets/blocks/environment/rhyolite-wall2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/rhyolite1.png b/mindus/assets/blocks/environment/rhyolite1.png
new file mode 100644
index 0000000..c55fd56
--- /dev/null
+++ b/mindus/assets/blocks/environment/rhyolite1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/rhyolite2.png b/mindus/assets/blocks/environment/rhyolite2.png
new file mode 100644
index 0000000..37b482f
--- /dev/null
+++ b/mindus/assets/blocks/environment/rhyolite2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/rhyolite3.png b/mindus/assets/blocks/environment/rhyolite3.png
new file mode 100644
index 0000000..8fdb670
--- /dev/null
+++ b/mindus/assets/blocks/environment/rhyolite3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/rough-rhyolite1.png b/mindus/assets/blocks/environment/rough-rhyolite1.png
new file mode 100644
index 0000000..1917ede
--- /dev/null
+++ b/mindus/assets/blocks/environment/rough-rhyolite1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/rough-rhyolite2.png b/mindus/assets/blocks/environment/rough-rhyolite2.png
new file mode 100644
index 0000000..c3a4d2d
--- /dev/null
+++ b/mindus/assets/blocks/environment/rough-rhyolite2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/rough-rhyolite3.png b/mindus/assets/blocks/environment/rough-rhyolite3.png
new file mode 100644
index 0000000..9cb78eb
--- /dev/null
+++ b/mindus/assets/blocks/environment/rough-rhyolite3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/rough-rhyolite4.png b/mindus/assets/blocks/environment/rough-rhyolite4.png
new file mode 100644
index 0000000..71c6f8d
--- /dev/null
+++ b/mindus/assets/blocks/environment/rough-rhyolite4.png
Binary files differ
diff --git a/assets/blocks/environment/salt-wall-large.png b/mindus/assets/blocks/environment/salt-wall-large.png
index 48aa491..48aa491 100644
--- a/assets/blocks/environment/salt-wall-large.png
+++ b/mindus/assets/blocks/environment/salt-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/salt-wall1.png b/mindus/assets/blocks/environment/salt-wall1.png
new file mode 100644
index 0000000..63bb165
--- /dev/null
+++ b/mindus/assets/blocks/environment/salt-wall1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/salt-wall2.png b/mindus/assets/blocks/environment/salt-wall2.png
new file mode 100644
index 0000000..ae324d3
--- /dev/null
+++ b/mindus/assets/blocks/environment/salt-wall2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/salt1.png b/mindus/assets/blocks/environment/salt1.png
new file mode 100644
index 0000000..285babf
--- /dev/null
+++ b/mindus/assets/blocks/environment/salt1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/sand-boulder1.png b/mindus/assets/blocks/environment/sand-boulder1.png
new file mode 100644
index 0000000..573469b
--- /dev/null
+++ b/mindus/assets/blocks/environment/sand-boulder1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/sand-boulder2.png b/mindus/assets/blocks/environment/sand-boulder2.png
new file mode 100644
index 0000000..667529f
--- /dev/null
+++ b/mindus/assets/blocks/environment/sand-boulder2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/sand-floor1.png b/mindus/assets/blocks/environment/sand-floor1.png
new file mode 100644
index 0000000..40d4916
--- /dev/null
+++ b/mindus/assets/blocks/environment/sand-floor1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/sand-floor2.png b/mindus/assets/blocks/environment/sand-floor2.png
new file mode 100644
index 0000000..1a22960
--- /dev/null
+++ b/mindus/assets/blocks/environment/sand-floor2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/sand-floor3.png b/mindus/assets/blocks/environment/sand-floor3.png
new file mode 100644
index 0000000..71e6f7b
--- /dev/null
+++ b/mindus/assets/blocks/environment/sand-floor3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/sand-wall-large.png b/mindus/assets/blocks/environment/sand-wall-large.png
new file mode 100644
index 0000000..dd8b463
--- /dev/null
+++ b/mindus/assets/blocks/environment/sand-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/sand-wall1.png b/mindus/assets/blocks/environment/sand-wall1.png
new file mode 100644
index 0000000..ee4e4bd
--- /dev/null
+++ b/mindus/assets/blocks/environment/sand-wall1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/sand-wall2.png b/mindus/assets/blocks/environment/sand-wall2.png
new file mode 100644
index 0000000..62c70f4
--- /dev/null
+++ b/mindus/assets/blocks/environment/sand-wall2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/sand-water.png b/mindus/assets/blocks/environment/sand-water.png
new file mode 100644
index 0000000..a4683d3
--- /dev/null
+++ b/mindus/assets/blocks/environment/sand-water.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/shale-boulder1.png b/mindus/assets/blocks/environment/shale-boulder1.png
new file mode 100644
index 0000000..199c6c0
--- /dev/null
+++ b/mindus/assets/blocks/environment/shale-boulder1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/shale-boulder2.png b/mindus/assets/blocks/environment/shale-boulder2.png
new file mode 100644
index 0000000..3cee755
--- /dev/null
+++ b/mindus/assets/blocks/environment/shale-boulder2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/shale-wall-large.png b/mindus/assets/blocks/environment/shale-wall-large.png
new file mode 100644
index 0000000..9ce1dcd
--- /dev/null
+++ b/mindus/assets/blocks/environment/shale-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/shale-wall1.png b/mindus/assets/blocks/environment/shale-wall1.png
new file mode 100644
index 0000000..b983bc6
--- /dev/null
+++ b/mindus/assets/blocks/environment/shale-wall1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/shale-wall2.png b/mindus/assets/blocks/environment/shale-wall2.png
new file mode 100644
index 0000000..f89fed6
--- /dev/null
+++ b/mindus/assets/blocks/environment/shale-wall2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/shale1.png b/mindus/assets/blocks/environment/shale1.png
new file mode 100644
index 0000000..328e286
--- /dev/null
+++ b/mindus/assets/blocks/environment/shale1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/shale2.png b/mindus/assets/blocks/environment/shale2.png
new file mode 100644
index 0000000..e2cda57
--- /dev/null
+++ b/mindus/assets/blocks/environment/shale2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/shale3.png b/mindus/assets/blocks/environment/shale3.png
new file mode 100644
index 0000000..fde0c72
--- /dev/null
+++ b/mindus/assets/blocks/environment/shale3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/shallow-water.png b/mindus/assets/blocks/environment/shallow-water.png
new file mode 100644
index 0000000..21e323f
--- /dev/null
+++ b/mindus/assets/blocks/environment/shallow-water.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/shrubs-large.png b/mindus/assets/blocks/environment/shrubs-large.png
new file mode 100644
index 0000000..e2fe1ab
--- /dev/null
+++ b/mindus/assets/blocks/environment/shrubs-large.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/shrubs1.png b/mindus/assets/blocks/environment/shrubs1.png
new file mode 100644
index 0000000..d9596f7
--- /dev/null
+++ b/mindus/assets/blocks/environment/shrubs1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/shrubs2.png b/mindus/assets/blocks/environment/shrubs2.png
new file mode 100644
index 0000000..8758541
--- /dev/null
+++ b/mindus/assets/blocks/environment/shrubs2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/single/colored-floor.png b/mindus/assets/blocks/environment/single/colored-floor.png
new file mode 120000
index 0000000..a20bf5a
--- /dev/null
+++ b/mindus/assets/blocks/environment/single/colored-floor.png
@@ -0,0 +1 @@
+../../autotiles/colored-floor-39.png \ No newline at end of file
diff --git a/mindus/assets/blocks/environment/single/colored-wall.png b/mindus/assets/blocks/environment/single/colored-wall.png
new file mode 120000
index 0000000..7afe834
--- /dev/null
+++ b/mindus/assets/blocks/environment/single/colored-wall.png
@@ -0,0 +1 @@
+../../autotiles/colored-wall-39.png \ No newline at end of file
diff --git a/mindus/assets/blocks/environment/single/metal-tiles-1.png b/mindus/assets/blocks/environment/single/metal-tiles-1.png
new file mode 120000
index 0000000..fb2babd
--- /dev/null
+++ b/mindus/assets/blocks/environment/single/metal-tiles-1.png
@@ -0,0 +1 @@
+../../autotiles/metal-tiles-1-39.png \ No newline at end of file
diff --git a/mindus/assets/blocks/environment/single/metal-tiles-10.png b/mindus/assets/blocks/environment/single/metal-tiles-10.png
new file mode 120000
index 0000000..17482a9
--- /dev/null
+++ b/mindus/assets/blocks/environment/single/metal-tiles-10.png
@@ -0,0 +1 @@
+../../autotiles/metal-tiles-10-39.png \ No newline at end of file
diff --git a/mindus/assets/blocks/environment/single/metal-tiles-11.png b/mindus/assets/blocks/environment/single/metal-tiles-11.png
new file mode 120000
index 0000000..7f60b5a
--- /dev/null
+++ b/mindus/assets/blocks/environment/single/metal-tiles-11.png
@@ -0,0 +1 @@
+../../autotiles/metal-tiles-11-39.png \ No newline at end of file
diff --git a/mindus/assets/blocks/environment/single/metal-tiles-12.png b/mindus/assets/blocks/environment/single/metal-tiles-12.png
new file mode 120000
index 0000000..2f3a9a2
--- /dev/null
+++ b/mindus/assets/blocks/environment/single/metal-tiles-12.png
@@ -0,0 +1 @@
+../../autotiles/metal-tiles-12-39.png \ No newline at end of file
diff --git a/mindus/assets/blocks/environment/single/metal-tiles-2.png b/mindus/assets/blocks/environment/single/metal-tiles-2.png
new file mode 120000
index 0000000..5169a49
--- /dev/null
+++ b/mindus/assets/blocks/environment/single/metal-tiles-2.png
@@ -0,0 +1 @@
+../../autotiles/metal-tiles-2-39.png \ No newline at end of file
diff --git a/mindus/assets/blocks/environment/single/metal-tiles-3.png b/mindus/assets/blocks/environment/single/metal-tiles-3.png
new file mode 120000
index 0000000..dfb955e
--- /dev/null
+++ b/mindus/assets/blocks/environment/single/metal-tiles-3.png
@@ -0,0 +1 @@
+../../autotiles/metal-tiles-3-39.png \ No newline at end of file
diff --git a/mindus/assets/blocks/environment/single/metal-tiles-4.png b/mindus/assets/blocks/environment/single/metal-tiles-4.png
new file mode 120000
index 0000000..e72949a
--- /dev/null
+++ b/mindus/assets/blocks/environment/single/metal-tiles-4.png
@@ -0,0 +1 @@
+../../autotiles/metal-tiles-4-39.png \ No newline at end of file
diff --git a/mindus/assets/blocks/environment/single/metal-tiles-5.png b/mindus/assets/blocks/environment/single/metal-tiles-5.png
new file mode 120000
index 0000000..2d26ff4
--- /dev/null
+++ b/mindus/assets/blocks/environment/single/metal-tiles-5.png
@@ -0,0 +1 @@
+../../autotiles/metal-tiles-5-39.png \ No newline at end of file
diff --git a/mindus/assets/blocks/environment/single/metal-tiles-6.png b/mindus/assets/blocks/environment/single/metal-tiles-6.png
new file mode 120000
index 0000000..53cee72
--- /dev/null
+++ b/mindus/assets/blocks/environment/single/metal-tiles-6.png
@@ -0,0 +1 @@
+../../autotiles/metal-tiles-6-39.png \ No newline at end of file
diff --git a/mindus/assets/blocks/environment/single/metal-tiles-7.png b/mindus/assets/blocks/environment/single/metal-tiles-7.png
new file mode 120000
index 0000000..79c26ee
--- /dev/null
+++ b/mindus/assets/blocks/environment/single/metal-tiles-7.png
@@ -0,0 +1 @@
+../../autotiles/metal-tiles-7-39.png \ No newline at end of file
diff --git a/mindus/assets/blocks/environment/single/metal-tiles-8.png b/mindus/assets/blocks/environment/single/metal-tiles-8.png
new file mode 120000
index 0000000..7e3bd9b
--- /dev/null
+++ b/mindus/assets/blocks/environment/single/metal-tiles-8.png
@@ -0,0 +1 @@
+../../autotiles/metal-tiles-8-39.png \ No newline at end of file
diff --git a/mindus/assets/blocks/environment/single/metal-tiles-9.png b/mindus/assets/blocks/environment/single/metal-tiles-9.png
new file mode 120000
index 0000000..ecaf110
--- /dev/null
+++ b/mindus/assets/blocks/environment/single/metal-tiles-9.png
@@ -0,0 +1 @@
+../../autotiles/metal-tiles-9-39.png \ No newline at end of file
diff --git a/mindus/assets/blocks/environment/single/metal-wall-1.png b/mindus/assets/blocks/environment/single/metal-wall-1.png
new file mode 100644
index 0000000..1a7fadb
--- /dev/null
+++ b/mindus/assets/blocks/environment/single/metal-wall-1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/single/metal-wall-2.png b/mindus/assets/blocks/environment/single/metal-wall-2.png
new file mode 100644
index 0000000..a913a43
--- /dev/null
+++ b/mindus/assets/blocks/environment/single/metal-wall-2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/single/metal-wall-3.png b/mindus/assets/blocks/environment/single/metal-wall-3.png
new file mode 100644
index 0000000..703fcd9
--- /dev/null
+++ b/mindus/assets/blocks/environment/single/metal-wall-3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/snow-boulder1.png b/mindus/assets/blocks/environment/snow-boulder1.png
new file mode 100644
index 0000000..8e8e6f9
--- /dev/null
+++ b/mindus/assets/blocks/environment/snow-boulder1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/snow-boulder2.png b/mindus/assets/blocks/environment/snow-boulder2.png
new file mode 100644
index 0000000..5f530c0
--- /dev/null
+++ b/mindus/assets/blocks/environment/snow-boulder2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/snow-pine.png b/mindus/assets/blocks/environment/snow-pine.png
new file mode 100644
index 0000000..036c20c
--- /dev/null
+++ b/mindus/assets/blocks/environment/snow-pine.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/snow-wall-large.png b/mindus/assets/blocks/environment/snow-wall-large.png
new file mode 100644
index 0000000..b7ff809
--- /dev/null
+++ b/mindus/assets/blocks/environment/snow-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/snow-wall1.png b/mindus/assets/blocks/environment/snow-wall1.png
new file mode 100644
index 0000000..6655c37
--- /dev/null
+++ b/mindus/assets/blocks/environment/snow-wall1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/snow-wall2.png b/mindus/assets/blocks/environment/snow-wall2.png
new file mode 100644
index 0000000..40ba359
--- /dev/null
+++ b/mindus/assets/blocks/environment/snow-wall2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/snow1.png b/mindus/assets/blocks/environment/snow1.png
new file mode 100644
index 0000000..3387f23
--- /dev/null
+++ b/mindus/assets/blocks/environment/snow1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/snow2.png b/mindus/assets/blocks/environment/snow2.png
new file mode 100644
index 0000000..013c458
--- /dev/null
+++ b/mindus/assets/blocks/environment/snow2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/snow3.png b/mindus/assets/blocks/environment/snow3.png
new file mode 100644
index 0000000..baa63ec
--- /dev/null
+++ b/mindus/assets/blocks/environment/snow3.png
Binary files differ
diff --git a/assets/blocks/environment/space.png b/mindus/assets/blocks/environment/space.png
index bccf464..bccf464 100644
--- a/assets/blocks/environment/space.png
+++ b/mindus/assets/blocks/environment/space.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/spawn.png b/mindus/assets/blocks/environment/spawn.png
new file mode 100644
index 0000000..d8b2859
--- /dev/null
+++ b/mindus/assets/blocks/environment/spawn.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/spore-cluster1.png b/mindus/assets/blocks/environment/spore-cluster1.png
new file mode 100644
index 0000000..c28dc43
--- /dev/null
+++ b/mindus/assets/blocks/environment/spore-cluster1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/spore-cluster2.png b/mindus/assets/blocks/environment/spore-cluster2.png
new file mode 100644
index 0000000..725f1b9
--- /dev/null
+++ b/mindus/assets/blocks/environment/spore-cluster2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/spore-cluster3.png b/mindus/assets/blocks/environment/spore-cluster3.png
new file mode 100644
index 0000000..7b5e93e
--- /dev/null
+++ b/mindus/assets/blocks/environment/spore-cluster3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/spore-moss1.png b/mindus/assets/blocks/environment/spore-moss1.png
new file mode 100644
index 0000000..dacdf4c
--- /dev/null
+++ b/mindus/assets/blocks/environment/spore-moss1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/spore-moss2.png b/mindus/assets/blocks/environment/spore-moss2.png
new file mode 100644
index 0000000..475e877
--- /dev/null
+++ b/mindus/assets/blocks/environment/spore-moss2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/spore-moss3.png b/mindus/assets/blocks/environment/spore-moss3.png
new file mode 100644
index 0000000..69e7656
--- /dev/null
+++ b/mindus/assets/blocks/environment/spore-moss3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/spore-pine.png b/mindus/assets/blocks/environment/spore-pine.png
new file mode 100644
index 0000000..bdb2f9c
--- /dev/null
+++ b/mindus/assets/blocks/environment/spore-pine.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/spore-wall-large.png b/mindus/assets/blocks/environment/spore-wall-large.png
new file mode 100644
index 0000000..1f1fec5
--- /dev/null
+++ b/mindus/assets/blocks/environment/spore-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/spore-wall1.png b/mindus/assets/blocks/environment/spore-wall1.png
new file mode 100644
index 0000000..c0ee3ef
--- /dev/null
+++ b/mindus/assets/blocks/environment/spore-wall1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/spore-wall2.png b/mindus/assets/blocks/environment/spore-wall2.png
new file mode 100644
index 0000000..0a83a69
--- /dev/null
+++ b/mindus/assets/blocks/environment/spore-wall2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/stone-vent.png b/mindus/assets/blocks/environment/stone-vent.png
new file mode 100644
index 0000000..c8dd9e4
--- /dev/null
+++ b/mindus/assets/blocks/environment/stone-vent.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/stone-wall-large.png b/mindus/assets/blocks/environment/stone-wall-large.png
new file mode 100644
index 0000000..76d3ca3
--- /dev/null
+++ b/mindus/assets/blocks/environment/stone-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/stone-wall1.png b/mindus/assets/blocks/environment/stone-wall1.png
new file mode 100644
index 0000000..358e36e
--- /dev/null
+++ b/mindus/assets/blocks/environment/stone-wall1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/stone-wall2.png b/mindus/assets/blocks/environment/stone-wall2.png
new file mode 100644
index 0000000..326d88f
--- /dev/null
+++ b/mindus/assets/blocks/environment/stone-wall2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/stone1.png b/mindus/assets/blocks/environment/stone1.png
new file mode 100644
index 0000000..73d29a1
--- /dev/null
+++ b/mindus/assets/blocks/environment/stone1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/stone2.png b/mindus/assets/blocks/environment/stone2.png
new file mode 100644
index 0000000..c0b9dc6
--- /dev/null
+++ b/mindus/assets/blocks/environment/stone2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/stone3.png b/mindus/assets/blocks/environment/stone3.png
new file mode 100644
index 0000000..df94fbd
--- /dev/null
+++ b/mindus/assets/blocks/environment/stone3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/tainted-water.png b/mindus/assets/blocks/environment/tainted-water.png
new file mode 100644
index 0000000..7a46957
--- /dev/null
+++ b/mindus/assets/blocks/environment/tainted-water.png
Binary files differ
diff --git a/assets/blocks/environment/tar.png b/mindus/assets/blocks/environment/tar.png
index a9bafc3..a9bafc3 100644
--- a/assets/blocks/environment/tar.png
+++ b/mindus/assets/blocks/environment/tar.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/tendrils1.png b/mindus/assets/blocks/environment/tendrils1.png
new file mode 100644
index 0000000..c9f8aa8
--- /dev/null
+++ b/mindus/assets/blocks/environment/tendrils1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/tendrils2.png b/mindus/assets/blocks/environment/tendrils2.png
new file mode 100644
index 0000000..dc55153
--- /dev/null
+++ b/mindus/assets/blocks/environment/tendrils2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/tendrils3.png b/mindus/assets/blocks/environment/tendrils3.png
new file mode 100644
index 0000000..5a95f59
--- /dev/null
+++ b/mindus/assets/blocks/environment/tendrils3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/vibrant-crystal-cluster1.png b/mindus/assets/blocks/environment/vibrant-crystal-cluster1.png
new file mode 100644
index 0000000..0b9946b
--- /dev/null
+++ b/mindus/assets/blocks/environment/vibrant-crystal-cluster1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/vibrant-crystal-cluster2.png b/mindus/assets/blocks/environment/vibrant-crystal-cluster2.png
new file mode 100644
index 0000000..db826af
--- /dev/null
+++ b/mindus/assets/blocks/environment/vibrant-crystal-cluster2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/vibrant-crystal-cluster3.png b/mindus/assets/blocks/environment/vibrant-crystal-cluster3.png
new file mode 100644
index 0000000..380e598
--- /dev/null
+++ b/mindus/assets/blocks/environment/vibrant-crystal-cluster3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/white-tree-dead.png b/mindus/assets/blocks/environment/white-tree-dead.png
new file mode 100644
index 0000000..1f25959
--- /dev/null
+++ b/mindus/assets/blocks/environment/white-tree-dead.png
Binary files differ
diff --git a/assets/blocks/environment/white-tree.png b/mindus/assets/blocks/environment/white-tree.png
index 7e6b30e..7daea26 100644
--- a/assets/blocks/environment/white-tree.png
+++ b/mindus/assets/blocks/environment/white-tree.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/yellow-stone-boulder1.png b/mindus/assets/blocks/environment/yellow-stone-boulder1.png
new file mode 100644
index 0000000..3045f0a
--- /dev/null
+++ b/mindus/assets/blocks/environment/yellow-stone-boulder1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/yellow-stone-boulder2.png b/mindus/assets/blocks/environment/yellow-stone-boulder2.png
new file mode 100644
index 0000000..2b8e408
--- /dev/null
+++ b/mindus/assets/blocks/environment/yellow-stone-boulder2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/yellow-stone-plates1.png b/mindus/assets/blocks/environment/yellow-stone-plates1.png
new file mode 100644
index 0000000..e4e4728
--- /dev/null
+++ b/mindus/assets/blocks/environment/yellow-stone-plates1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/yellow-stone-plates2.png b/mindus/assets/blocks/environment/yellow-stone-plates2.png
new file mode 100644
index 0000000..29364f9
--- /dev/null
+++ b/mindus/assets/blocks/environment/yellow-stone-plates2.png
Binary files differ
diff --git a/assets/blocks/environment/yellow-stone-plates.png b/mindus/assets/blocks/environment/yellow-stone-plates3.png
index 9f8a04b..9f8a04b 100644
--- a/assets/blocks/environment/yellow-stone-plates.png
+++ b/mindus/assets/blocks/environment/yellow-stone-plates3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/yellow-stone-vent1.png b/mindus/assets/blocks/environment/yellow-stone-vent1.png
new file mode 100644
index 0000000..cc4f172
--- /dev/null
+++ b/mindus/assets/blocks/environment/yellow-stone-vent1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/yellow-stone-vent2.png b/mindus/assets/blocks/environment/yellow-stone-vent2.png
new file mode 100644
index 0000000..1125d80
--- /dev/null
+++ b/mindus/assets/blocks/environment/yellow-stone-vent2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/yellow-stone-wall-large.png b/mindus/assets/blocks/environment/yellow-stone-wall-large.png
new file mode 100644
index 0000000..e8eafea
--- /dev/null
+++ b/mindus/assets/blocks/environment/yellow-stone-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/yellow-stone-wall1.png b/mindus/assets/blocks/environment/yellow-stone-wall1.png
new file mode 100644
index 0000000..7f8a7e5
--- /dev/null
+++ b/mindus/assets/blocks/environment/yellow-stone-wall1.png
Binary files differ
diff --git a/assets/blocks/environment/yellow-stone-wall.png b/mindus/assets/blocks/environment/yellow-stone-wall2.png
index dc91f82..dc91f82 100644
--- a/assets/blocks/environment/yellow-stone-wall.png
+++ b/mindus/assets/blocks/environment/yellow-stone-wall2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/yellow-stone1.png b/mindus/assets/blocks/environment/yellow-stone1.png
new file mode 100644
index 0000000..9b5b23c
--- /dev/null
+++ b/mindus/assets/blocks/environment/yellow-stone1.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/yellow-stone2.png b/mindus/assets/blocks/environment/yellow-stone2.png
new file mode 100644
index 0000000..6837526
--- /dev/null
+++ b/mindus/assets/blocks/environment/yellow-stone2.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/yellow-stone3.png b/mindus/assets/blocks/environment/yellow-stone3.png
new file mode 100644
index 0000000..2a73445
--- /dev/null
+++ b/mindus/assets/blocks/environment/yellow-stone3.png
Binary files differ
diff --git a/mindus/assets/blocks/environment/yellowcoral.png b/mindus/assets/blocks/environment/yellowcoral.png
new file mode 100644
index 0000000..bbc76b4
--- /dev/null
+++ b/mindus/assets/blocks/environment/yellowcoral.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/bridge-conduit-arrow.png b/mindus/assets/blocks/liquid/bridge-conduit-arrow.png
new file mode 100644
index 0000000..2740e90
--- /dev/null
+++ b/mindus/assets/blocks/liquid/bridge-conduit-arrow.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/bridge-conduit-bridge.png b/mindus/assets/blocks/liquid/bridge-conduit-bridge.png
new file mode 100644
index 0000000..6d31c10
--- /dev/null
+++ b/mindus/assets/blocks/liquid/bridge-conduit-bridge.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/bridge-conduit-end.png b/mindus/assets/blocks/liquid/bridge-conduit-end.png
new file mode 100644
index 0000000..940184b
--- /dev/null
+++ b/mindus/assets/blocks/liquid/bridge-conduit-end.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/bridge-conduit.png b/mindus/assets/blocks/liquid/bridge-conduit.png
new file mode 100644
index 0000000..f630f96
--- /dev/null
+++ b/mindus/assets/blocks/liquid/bridge-conduit.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-0-0.png b/mindus/assets/blocks/liquid/conduits/conduit-0-0.png
new file mode 100644
index 0000000..15ba9bb
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-0-0.png
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-0-1.png b/mindus/assets/blocks/liquid/conduits/conduit-0-1.png
index 163d8c1..163d8c1 100644
--- a/assets/blocks/liquid/conduits/conduit-0-1.png
+++ b/mindus/assets/blocks/liquid/conduits/conduit-0-1.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-0-2.png b/mindus/assets/blocks/liquid/conduits/conduit-0-2.png
new file mode 100644
index 0000000..13dad3b
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-0-2.png
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-0-3.png b/mindus/assets/blocks/liquid/conduits/conduit-0-3.png
index 02eaeb8..02eaeb8 100644
--- a/assets/blocks/liquid/conduits/conduit-0-3.png
+++ b/mindus/assets/blocks/liquid/conduits/conduit-0-3.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-1-0-h.png b/mindus/assets/blocks/liquid/conduits/conduit-1-0-h.png
new file mode 100644
index 0000000..61ee4e8
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-1-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-1-0.png b/mindus/assets/blocks/liquid/conduits/conduit-1-0.png
new file mode 100644
index 0000000..215a33a
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-1-0.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-1-1-h.png b/mindus/assets/blocks/liquid/conduits/conduit-1-1-h.png
new file mode 100644
index 0000000..e6dd640
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-1-1-h.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-1-1-v.png b/mindus/assets/blocks/liquid/conduits/conduit-1-1-v.png
new file mode 100644
index 0000000..f3457cd
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-1-1-v.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-1-1.png b/mindus/assets/blocks/liquid/conduits/conduit-1-1.png
new file mode 100644
index 0000000..1379f29
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-1-1.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-1-2-h.png b/mindus/assets/blocks/liquid/conduits/conduit-1-2-h.png
new file mode 100644
index 0000000..8e844b9
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-1-2-h.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-1-2.png b/mindus/assets/blocks/liquid/conduits/conduit-1-2.png
new file mode 100644
index 0000000..e6dd640
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-1-2.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-1-3.png b/mindus/assets/blocks/liquid/conduits/conduit-1-3.png
new file mode 100644
index 0000000..61ee4e8
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-1-3.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-2-0-h.png b/mindus/assets/blocks/liquid/conduits/conduit-2-0-h.png
new file mode 100644
index 0000000..20316a5
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-2-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-2-0-v.png b/mindus/assets/blocks/liquid/conduits/conduit-2-0-v.png
new file mode 100644
index 0000000..89f0046
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-2-0-v.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-2-0.png b/mindus/assets/blocks/liquid/conduits/conduit-2-0.png
new file mode 100644
index 0000000..defe522
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-2-0.png
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-2-1-h.png b/mindus/assets/blocks/liquid/conduits/conduit-2-1-h.png
index 8122549..8122549 100644
--- a/assets/blocks/liquid/conduits/conduit-2-1-h.png
+++ b/mindus/assets/blocks/liquid/conduits/conduit-2-1-h.png
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-2-1.png b/mindus/assets/blocks/liquid/conduits/conduit-2-1.png
index 92f8b2a..92f8b2a 100644
--- a/assets/blocks/liquid/conduits/conduit-2-1.png
+++ b/mindus/assets/blocks/liquid/conduits/conduit-2-1.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-2-2.png b/mindus/assets/blocks/liquid/conduits/conduit-2-2.png
new file mode 100644
index 0000000..4d70997
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-2-2.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-2-3-h.png b/mindus/assets/blocks/liquid/conduits/conduit-2-3-h.png
new file mode 100644
index 0000000..6d01066
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-2-3-h.png
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-2-3.png b/mindus/assets/blocks/liquid/conduits/conduit-2-3.png
index 9759bb9..9759bb9 100644
--- a/assets/blocks/liquid/conduits/conduit-2-3.png
+++ b/mindus/assets/blocks/liquid/conduits/conduit-2-3.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-3-0-h.png b/mindus/assets/blocks/liquid/conduits/conduit-3-0-h.png
new file mode 100644
index 0000000..b61158e
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-3-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-3-0.png b/mindus/assets/blocks/liquid/conduits/conduit-3-0.png
new file mode 100644
index 0000000..9683ba0
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-3-0.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-3-1.png b/mindus/assets/blocks/liquid/conduits/conduit-3-1.png
new file mode 100644
index 0000000..1e5d060
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-3-1.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-3-3.png b/mindus/assets/blocks/liquid/conduits/conduit-3-3.png
new file mode 100644
index 0000000..48a748d
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-3-3.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-4-0.png b/mindus/assets/blocks/liquid/conduits/conduit-4-0.png
new file mode 100644
index 0000000..558b75d
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-4-0.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-4-1.png b/mindus/assets/blocks/liquid/conduits/conduit-4-1.png
new file mode 100644
index 0000000..0c03820
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-4-1.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-4-3.png b/mindus/assets/blocks/liquid/conduits/conduit-4-3.png
new file mode 100644
index 0000000..b20c51d
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-4-3.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-bottom-0.png b/mindus/assets/blocks/liquid/conduits/conduit-bottom-0.png
new file mode 100644
index 0000000..a794853
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-bottom-0.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-bottom-1.png b/mindus/assets/blocks/liquid/conduits/conduit-bottom-1.png
new file mode 100644
index 0000000..aeeef59
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-bottom-1.png
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-bottom-3.png b/mindus/assets/blocks/liquid/conduits/conduit-bottom-2.png
index 0d9e7e3..0d9e7e3 100644
--- a/assets/blocks/liquid/conduits/conduit-bottom-3.png
+++ b/mindus/assets/blocks/liquid/conduits/conduit-bottom-2.png
Binary files differ
diff --git a/assets/blocks/liquid/conduits/conduit-bottom-4.png b/mindus/assets/blocks/liquid/conduits/conduit-bottom-3.png
index 0d9e7e3..0d9e7e3 100644
--- a/assets/blocks/liquid/conduits/conduit-bottom-4.png
+++ b/mindus/assets/blocks/liquid/conduits/conduit-bottom-3.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/conduit-bottom-4.png b/mindus/assets/blocks/liquid/conduits/conduit-bottom-4.png
new file mode 100644
index 0000000..0d9e7e3
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/conduit-bottom-4.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-0-0.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-0-0.png
new file mode 100644
index 0000000..4cade4e
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-0-0.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-0-1.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-0-1.png
new file mode 100644
index 0000000..4a2c98d
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-0-1.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-0-2.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-0-2.png
new file mode 100644
index 0000000..8a7262a
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-0-2.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-0-3.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-0-3.png
new file mode 100644
index 0000000..80afc01
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-0-3.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-1-0-h.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-1-0-h.png
new file mode 100644
index 0000000..109ede5
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-1-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-1-0.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-1-0.png
new file mode 100644
index 0000000..94f689f
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-1-0.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-1-1-h.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-1-1-h.png
new file mode 100644
index 0000000..fe8ad2b
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-1-1-h.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-1-1-v.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-1-1-v.png
new file mode 100644
index 0000000..6312882
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-1-1-v.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-1-1.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-1-1.png
new file mode 100644
index 0000000..8fb1ea5
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-1-1.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-1-2-h.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-1-2-h.png
new file mode 100644
index 0000000..6443295
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-1-2-h.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-1-2.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-1-2.png
new file mode 100644
index 0000000..fe8ad2b
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-1-2.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-1-3.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-1-3.png
new file mode 100644
index 0000000..109ede5
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-1-3.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-2-0-h.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-2-0-h.png
new file mode 100644
index 0000000..19660c2
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-2-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-2-0-v.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-2-0-v.png
new file mode 100644
index 0000000..29008a8
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-2-0-v.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-2-0.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-2-0.png
new file mode 100644
index 0000000..7bd7dae
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-2-0.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-2-1-h.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-2-1-h.png
new file mode 100644
index 0000000..bbdee9c
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-2-1-h.png
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-2-1.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-2-1.png
index 8130059..8130059 100644
--- a/assets/blocks/liquid/conduits/plated-conduit-2-1.png
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-2-1.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-2-2.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-2-2.png
new file mode 100644
index 0000000..0bbda2b
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-2-2.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-2-3-h.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-2-3-h.png
new file mode 100644
index 0000000..a97100e
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-2-3-h.png
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-2-3.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-2-3.png
index acd19b0..acd19b0 100644
--- a/assets/blocks/liquid/conduits/plated-conduit-2-3.png
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-2-3.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-3-0-h.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-3-0-h.png
new file mode 100644
index 0000000..d9cab71
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-3-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-3-0.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-3-0.png
new file mode 100644
index 0000000..946a7a9
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-3-0.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-3-1.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-3-1.png
new file mode 100644
index 0000000..df12caa
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-3-1.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-3-3.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-3-3.png
new file mode 100644
index 0000000..51a2fcb
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-3-3.png
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-4-0.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-4-0.png
index 5fd7ae2..5fd7ae2 100644
--- a/assets/blocks/liquid/conduits/plated-conduit-4-0.png
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-4-0.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-4-1.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-4-1.png
new file mode 100644
index 0000000..b617458
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-4-1.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/plated-conduit-4-3.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-4-3.png
new file mode 100644
index 0000000..bd19694
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-4-3.png
Binary files differ
diff --git a/assets/blocks/liquid/conduits/plated-conduit-cap.png b/mindus/assets/blocks/liquid/conduits/plated-conduit-cap.png
index 6a9f67d..6a9f67d 100644
--- a/assets/blocks/liquid/conduits/plated-conduit-cap.png
+++ b/mindus/assets/blocks/liquid/conduits/plated-conduit-cap.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-0-0.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-0-0.png
new file mode 100644
index 0000000..e97c0e1
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-0-0.png
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-0-1.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-0-1.png
index 36053a8..36053a8 100644
--- a/assets/blocks/liquid/conduits/pulse-conduit-0-1.png
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-0-1.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-0-2.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-0-2.png
new file mode 100644
index 0000000..73c32ac
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-0-2.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-0-3.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-0-3.png
new file mode 100644
index 0000000..5d104a8
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-0-3.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-0-h.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-0-h.png
new file mode 100644
index 0000000..1f5af36
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-0.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-0.png
new file mode 100644
index 0000000..b967435
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-0.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-1-h.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-1-h.png
new file mode 100644
index 0000000..5b1e4e3
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-1-h.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-1-v.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-1-v.png
new file mode 100644
index 0000000..b6b1328
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-1-v.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-1.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-1.png
new file mode 100644
index 0000000..5bf489a
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-1.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-2-h.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-2-h.png
new file mode 100644
index 0000000..0907c3e
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-2-h.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-2.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-2.png
new file mode 100644
index 0000000..5b1e4e3
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-2.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-3.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-3.png
new file mode 100644
index 0000000..1f5af36
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-1-3.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-2-0-h.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-2-0-h.png
new file mode 100644
index 0000000..90fdd36
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-2-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-2-0-v.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-2-0-v.png
new file mode 100644
index 0000000..3b205bf
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-2-0-v.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-2-0.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-2-0.png
new file mode 100644
index 0000000..ae563da
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-2-0.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-2-1-h.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-2-1-h.png
new file mode 100644
index 0000000..0adfb39
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-2-1-h.png
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-2-1.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-2-1.png
index 31d5bed..31d5bed 100644
--- a/assets/blocks/liquid/conduits/pulse-conduit-2-1.png
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-2-1.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-2-2.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-2-2.png
new file mode 100644
index 0000000..7bbddb5
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-2-2.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-2-3-h.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-2-3-h.png
new file mode 100644
index 0000000..fd38269
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-2-3-h.png
Binary files differ
diff --git a/assets/blocks/liquid/conduits/pulse-conduit-2-3.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-2-3.png
index 82de4d3..82de4d3 100644
--- a/assets/blocks/liquid/conduits/pulse-conduit-2-3.png
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-2-3.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-3-0-h.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-3-0-h.png
new file mode 100644
index 0000000..96c3a73
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-3-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-3-0.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-3-0.png
new file mode 100644
index 0000000..0b49250
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-3-0.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-3-1.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-3-1.png
new file mode 100644
index 0000000..074c17a
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-3-1.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-3-3.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-3-3.png
new file mode 100644
index 0000000..a874674
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-3-3.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-4-0.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-4-0.png
new file mode 100644
index 0000000..d807f19
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-4-0.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-4-1.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-4-1.png
new file mode 100644
index 0000000..2053317
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-4-1.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/pulse-conduit-4-3.png b/mindus/assets/blocks/liquid/conduits/pulse-conduit-4-3.png
new file mode 100644
index 0000000..660170e
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/pulse-conduit-4-3.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-0-0.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-0-0.png
new file mode 100644
index 0000000..448d07a
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-0-0.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-0-1.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-0-1.png
new file mode 100644
index 0000000..b15f447
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-0-1.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-0-2.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-0-2.png
new file mode 100644
index 0000000..5aec990
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-0-2.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-0-3.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-0-3.png
new file mode 100644
index 0000000..e61572d
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-0-3.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-0-h.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-0-h.png
new file mode 100644
index 0000000..7964512
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-0.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-0.png
new file mode 100644
index 0000000..fdb649c
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-0.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-1-h.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-1-h.png
new file mode 100644
index 0000000..4671ac4
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-1-h.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-1-v.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-1-v.png
new file mode 100644
index 0000000..6cf4efd
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-1-v.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-1.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-1.png
new file mode 100644
index 0000000..523f009
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-1.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-2-h.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-2-h.png
new file mode 100644
index 0000000..ababa67
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-2-h.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-2.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-2.png
new file mode 100644
index 0000000..cb7f02f
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-2.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-3.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-3.png
new file mode 100644
index 0000000..1a482f7
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-1-3.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-0-h.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-0-h.png
new file mode 100644
index 0000000..48ded48
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-0-v.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-0-v.png
new file mode 100644
index 0000000..4e6a10e
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-0-v.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-0.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-0.png
new file mode 100644
index 0000000..cc3b39c
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-0.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-1-h.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-1-h.png
new file mode 100644
index 0000000..2059f05
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-1-h.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-1.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-1.png
new file mode 100644
index 0000000..38611a0
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-1.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-2.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-2.png
new file mode 100644
index 0000000..0bb24ba
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-2.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-3-h.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-3-h.png
new file mode 100644
index 0000000..2e3ee2f
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-3-h.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-3.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-3.png
new file mode 100644
index 0000000..9f854fb
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-2-3.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-3-0-h.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-3-0-h.png
new file mode 100644
index 0000000..0ed0aef
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-3-0-h.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-3-0.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-3-0.png
new file mode 100644
index 0000000..615f6ef
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-3-0.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-3-1.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-3-1.png
new file mode 100644
index 0000000..42de74b
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-3-1.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-3-3.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-3-3.png
new file mode 100644
index 0000000..22b1555
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-3-3.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-4-0.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-4-0.png
new file mode 100644
index 0000000..197dfc0
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-4-0.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-4-1.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-4-1.png
new file mode 100644
index 0000000..5610b46
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-4-1.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/conduits/reinforced-conduit-4-3.png b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-4-3.png
new file mode 100644
index 0000000..932f914
--- /dev/null
+++ b/mindus/assets/blocks/liquid/conduits/reinforced-conduit-4-3.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/impulse-pump-liquid.png b/mindus/assets/blocks/liquid/impulse-pump-liquid.png
new file mode 100644
index 0000000..f2d696c
--- /dev/null
+++ b/mindus/assets/blocks/liquid/impulse-pump-liquid.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/impulse-pump.png b/mindus/assets/blocks/liquid/impulse-pump.png
new file mode 100644
index 0000000..bf73079
--- /dev/null
+++ b/mindus/assets/blocks/liquid/impulse-pump.png
Binary files differ
diff --git a/assets/blocks/liquid/liquid-container-bottom.png b/mindus/assets/blocks/liquid/liquid-container-bottom.png
index 46f2081..46f2081 100644
--- a/assets/blocks/liquid/liquid-container-bottom.png
+++ b/mindus/assets/blocks/liquid/liquid-container-bottom.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/liquid-container.png b/mindus/assets/blocks/liquid/liquid-container.png
new file mode 100644
index 0000000..19bc701
--- /dev/null
+++ b/mindus/assets/blocks/liquid/liquid-container.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/liquid-junction.png b/mindus/assets/blocks/liquid/liquid-junction.png
new file mode 100644
index 0000000..1f34b73
--- /dev/null
+++ b/mindus/assets/blocks/liquid/liquid-junction.png
Binary files differ
diff --git a/assets/blocks/liquid/liquid-router-bottom.png b/mindus/assets/blocks/liquid/liquid-router-bottom.png
index 977f5d8..977f5d8 100644
--- a/assets/blocks/liquid/liquid-router-bottom.png
+++ b/mindus/assets/blocks/liquid/liquid-router-bottom.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/liquid-router.png b/mindus/assets/blocks/liquid/liquid-router.png
new file mode 100644
index 0000000..5621822
--- /dev/null
+++ b/mindus/assets/blocks/liquid/liquid-router.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/liquid-source.png b/mindus/assets/blocks/liquid/liquid-source.png
new file mode 100644
index 0000000..c6f65ac
--- /dev/null
+++ b/mindus/assets/blocks/liquid/liquid-source.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/liquid-tank-bottom.png b/mindus/assets/blocks/liquid/liquid-tank-bottom.png
new file mode 100644
index 0000000..440f475
--- /dev/null
+++ b/mindus/assets/blocks/liquid/liquid-tank-bottom.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/liquid-tank.png b/mindus/assets/blocks/liquid/liquid-tank.png
new file mode 100644
index 0000000..b9dc52a
--- /dev/null
+++ b/mindus/assets/blocks/liquid/liquid-tank.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/liquid-void.png b/mindus/assets/blocks/liquid/liquid-void.png
new file mode 100644
index 0000000..956cfe8
--- /dev/null
+++ b/mindus/assets/blocks/liquid/liquid-void.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/mechanical-pump-liquid.png b/mindus/assets/blocks/liquid/mechanical-pump-liquid.png
new file mode 100644
index 0000000..f2d696c
--- /dev/null
+++ b/mindus/assets/blocks/liquid/mechanical-pump-liquid.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/mechanical-pump.png b/mindus/assets/blocks/liquid/mechanical-pump.png
new file mode 100644
index 0000000..9ffc837
--- /dev/null
+++ b/mindus/assets/blocks/liquid/mechanical-pump.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/phase-conduit-arrow.png b/mindus/assets/blocks/liquid/phase-conduit-arrow.png
new file mode 100644
index 0000000..9bd3c6c
--- /dev/null
+++ b/mindus/assets/blocks/liquid/phase-conduit-arrow.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/phase-conduit-bridge.png b/mindus/assets/blocks/liquid/phase-conduit-bridge.png
new file mode 100644
index 0000000..6eab161
--- /dev/null
+++ b/mindus/assets/blocks/liquid/phase-conduit-bridge.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/phase-conduit-end.png b/mindus/assets/blocks/liquid/phase-conduit-end.png
new file mode 100644
index 0000000..d8b3f61
--- /dev/null
+++ b/mindus/assets/blocks/liquid/phase-conduit-end.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/phase-conduit.png b/mindus/assets/blocks/liquid/phase-conduit.png
new file mode 100644
index 0000000..2f7b8cd
--- /dev/null
+++ b/mindus/assets/blocks/liquid/phase-conduit.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/reinforced-bridge-conduit-arrow.png b/mindus/assets/blocks/liquid/reinforced-bridge-conduit-arrow.png
new file mode 100644
index 0000000..d7c908d
--- /dev/null
+++ b/mindus/assets/blocks/liquid/reinforced-bridge-conduit-arrow.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/reinforced-bridge-conduit-bridge-liquid.png b/mindus/assets/blocks/liquid/reinforced-bridge-conduit-bridge-liquid.png
new file mode 100644
index 0000000..f5b99bf
--- /dev/null
+++ b/mindus/assets/blocks/liquid/reinforced-bridge-conduit-bridge-liquid.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/reinforced-bridge-conduit-bridge.png b/mindus/assets/blocks/liquid/reinforced-bridge-conduit-bridge.png
new file mode 100644
index 0000000..c4d4321
--- /dev/null
+++ b/mindus/assets/blocks/liquid/reinforced-bridge-conduit-bridge.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/reinforced-bridge-conduit-dir.png b/mindus/assets/blocks/liquid/reinforced-bridge-conduit-dir.png
new file mode 100644
index 0000000..e1028a7
--- /dev/null
+++ b/mindus/assets/blocks/liquid/reinforced-bridge-conduit-dir.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/reinforced-bridge-conduit-liquid.png b/mindus/assets/blocks/liquid/reinforced-bridge-conduit-liquid.png
new file mode 100644
index 0000000..5a6d0a5
--- /dev/null
+++ b/mindus/assets/blocks/liquid/reinforced-bridge-conduit-liquid.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/reinforced-bridge-conduit.png b/mindus/assets/blocks/liquid/reinforced-bridge-conduit.png
new file mode 100644
index 0000000..7af3870
--- /dev/null
+++ b/mindus/assets/blocks/liquid/reinforced-bridge-conduit.png
Binary files differ
diff --git a/assets/blocks/liquid/reinforced-liquid-container-bottom.png b/mindus/assets/blocks/liquid/reinforced-liquid-container-bottom.png
index 85194f9..85194f9 100644
--- a/assets/blocks/liquid/reinforced-liquid-container-bottom.png
+++ b/mindus/assets/blocks/liquid/reinforced-liquid-container-bottom.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/reinforced-liquid-container.png b/mindus/assets/blocks/liquid/reinforced-liquid-container.png
new file mode 100644
index 0000000..434b1ac
--- /dev/null
+++ b/mindus/assets/blocks/liquid/reinforced-liquid-container.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/reinforced-liquid-junction.png b/mindus/assets/blocks/liquid/reinforced-liquid-junction.png
new file mode 100644
index 0000000..bfb52e9
--- /dev/null
+++ b/mindus/assets/blocks/liquid/reinforced-liquid-junction.png
Binary files differ
diff --git a/assets/blocks/liquid/reinforced-liquid-router-bottom.png b/mindus/assets/blocks/liquid/reinforced-liquid-router-bottom.png
index 3b2c81c..3b2c81c 100644
--- a/assets/blocks/liquid/reinforced-liquid-router-bottom.png
+++ b/mindus/assets/blocks/liquid/reinforced-liquid-router-bottom.png
Binary files differ
diff --git a/assets/blocks/liquid/reinforced-liquid-router.png b/mindus/assets/blocks/liquid/reinforced-liquid-router.png
index 0fdb7ba..0fdb7ba 100644
--- a/assets/blocks/liquid/reinforced-liquid-router.png
+++ b/mindus/assets/blocks/liquid/reinforced-liquid-router.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/reinforced-liquid-tank-bottom.png b/mindus/assets/blocks/liquid/reinforced-liquid-tank-bottom.png
new file mode 100644
index 0000000..2b69b7b
--- /dev/null
+++ b/mindus/assets/blocks/liquid/reinforced-liquid-tank-bottom.png
Binary files differ
diff --git a/assets/blocks/liquid/reinforced-liquid-tank.png b/mindus/assets/blocks/liquid/reinforced-liquid-tank.png
index 94cbfe1..94cbfe1 100644
--- a/assets/blocks/liquid/reinforced-liquid-tank.png
+++ b/mindus/assets/blocks/liquid/reinforced-liquid-tank.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/reinforced-pump-liquid.png b/mindus/assets/blocks/liquid/reinforced-pump-liquid.png
new file mode 100644
index 0000000..04173af
--- /dev/null
+++ b/mindus/assets/blocks/liquid/reinforced-pump-liquid.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/reinforced-pump.png b/mindus/assets/blocks/liquid/reinforced-pump.png
new file mode 100644
index 0000000..51f06ca
--- /dev/null
+++ b/mindus/assets/blocks/liquid/reinforced-pump.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/rotary-pump-liquid.png b/mindus/assets/blocks/liquid/rotary-pump-liquid.png
new file mode 100644
index 0000000..f2d696c
--- /dev/null
+++ b/mindus/assets/blocks/liquid/rotary-pump-liquid.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/rotary-pump.png b/mindus/assets/blocks/liquid/rotary-pump.png
new file mode 100644
index 0000000..5c82434
--- /dev/null
+++ b/mindus/assets/blocks/liquid/rotary-pump.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/canvas.png b/mindus/assets/blocks/logic/canvas.png
new file mode 100644
index 0000000..a70c306
--- /dev/null
+++ b/mindus/assets/blocks/logic/canvas.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/hyper-processor.png b/mindus/assets/blocks/logic/hyper-processor.png
new file mode 100644
index 0000000..1915cd9
--- /dev/null
+++ b/mindus/assets/blocks/logic/hyper-processor.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/large-canvas.png b/mindus/assets/blocks/logic/large-canvas.png
new file mode 100644
index 0000000..36c0312
--- /dev/null
+++ b/mindus/assets/blocks/logic/large-canvas.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/large-logic-display.png b/mindus/assets/blocks/logic/large-logic-display.png
new file mode 100644
index 0000000..bf64634
--- /dev/null
+++ b/mindus/assets/blocks/logic/large-logic-display.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/logic-display.png b/mindus/assets/blocks/logic/logic-display.png
new file mode 100644
index 0000000..bd2fc32
--- /dev/null
+++ b/mindus/assets/blocks/logic/logic-display.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/logic-processor.png b/mindus/assets/blocks/logic/logic-processor.png
new file mode 100644
index 0000000..af50383
--- /dev/null
+++ b/mindus/assets/blocks/logic/logic-processor.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/memory-bank.png b/mindus/assets/blocks/logic/memory-bank.png
new file mode 100644
index 0000000..5ea0e6c
--- /dev/null
+++ b/mindus/assets/blocks/logic/memory-bank.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/memory-cell.png b/mindus/assets/blocks/logic/memory-cell.png
new file mode 100644
index 0000000..34a8c2c
--- /dev/null
+++ b/mindus/assets/blocks/logic/memory-cell.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/message.png b/mindus/assets/blocks/logic/message.png
new file mode 100644
index 0000000..48aedde
--- /dev/null
+++ b/mindus/assets/blocks/logic/message.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/micro-processor.png b/mindus/assets/blocks/logic/micro-processor.png
new file mode 100644
index 0000000..76f4885
--- /dev/null
+++ b/mindus/assets/blocks/logic/micro-processor.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/reinforced-message.png b/mindus/assets/blocks/logic/reinforced-message.png
new file mode 100644
index 0000000..37df68d
--- /dev/null
+++ b/mindus/assets/blocks/logic/reinforced-message.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/switch-on.png b/mindus/assets/blocks/logic/switch-on.png
new file mode 100644
index 0000000..68e1d2d
--- /dev/null
+++ b/mindus/assets/blocks/logic/switch-on.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/switch.png b/mindus/assets/blocks/logic/switch.png
new file mode 100644
index 0000000..5dcd363
--- /dev/null
+++ b/mindus/assets/blocks/logic/switch.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tile-logic-display.png b/mindus/assets/blocks/logic/tile-logic-display.png
new file mode 100644
index 0000000..977f5d8
--- /dev/null
+++ b/mindus/assets/blocks/logic/tile-logic-display.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-0.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-0.png
new file mode 100644
index 0000000..9be4484
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-0.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-1.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-1.png
new file mode 100644
index 0000000..f76df94
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-1.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-10.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-10.png
new file mode 100644
index 0000000..760d3b4
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-10.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-11.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-11.png
new file mode 100644
index 0000000..f8f0009
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-11.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-12.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-12.png
new file mode 100644
index 0000000..bc3ef87
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-12.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-13.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-13.png
new file mode 100644
index 0000000..3917ed0
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-13.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-14.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-14.png
new file mode 100644
index 0000000..9be8d2d
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-14.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-15.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-15.png
new file mode 100644
index 0000000..24cbf45
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-15.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-16.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-16.png
new file mode 100644
index 0000000..030c04d
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-16.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-17.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-17.png
new file mode 100644
index 0000000..2e10d7a
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-17.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-18.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-18.png
new file mode 100644
index 0000000..32e6748
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-18.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-19.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-19.png
new file mode 100644
index 0000000..e319f4d
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-19.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-2.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-2.png
new file mode 100644
index 0000000..a9aee0b
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-2.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-20.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-20.png
new file mode 100644
index 0000000..d9e5150
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-20.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-21.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-21.png
new file mode 100644
index 0000000..8e2c760
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-21.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-22.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-22.png
new file mode 100644
index 0000000..4195407
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-22.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-23.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-23.png
new file mode 100644
index 0000000..a588cd0
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-23.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-24.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-24.png
new file mode 100644
index 0000000..f516680
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-24.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-25.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-25.png
new file mode 100644
index 0000000..2b59262
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-25.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-26.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-26.png
new file mode 100644
index 0000000..35af5d4
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-26.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-27.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-27.png
new file mode 100644
index 0000000..3941118
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-27.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-28.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-28.png
new file mode 100644
index 0000000..3517bec
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-28.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-29.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-29.png
new file mode 100644
index 0000000..cd705e7
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-29.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-3.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-3.png
new file mode 100644
index 0000000..028cf04
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-3.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-30.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-30.png
new file mode 100644
index 0000000..f6a711b
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-30.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-31.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-31.png
new file mode 100644
index 0000000..68aebb4
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-31.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-32.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-32.png
new file mode 100644
index 0000000..883257c
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-32.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-33.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-33.png
new file mode 100644
index 0000000..f3fb63a
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-33.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-34.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-34.png
new file mode 100644
index 0000000..537303f
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-34.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-35.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-35.png
new file mode 100644
index 0000000..932e934
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-35.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-36.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-36.png
new file mode 100644
index 0000000..50237ac
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-36.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-37.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-37.png
new file mode 100644
index 0000000..7ff182b
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-37.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-38.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-38.png
new file mode 100644
index 0000000..e4d823c
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-38.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-39.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-39.png
new file mode 100644
index 0000000..b037e0d
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-39.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-4.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-4.png
new file mode 100644
index 0000000..cdc2ed9
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-4.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-40.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-40.png
new file mode 100644
index 0000000..5bf94a0
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-40.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-41.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-41.png
new file mode 100644
index 0000000..9086970
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-41.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-42.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-42.png
new file mode 100644
index 0000000..653c075
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-42.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-43.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-43.png
new file mode 100644
index 0000000..03b8c5a
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-43.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-44.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-44.png
new file mode 100644
index 0000000..fcad3bb
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-44.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-45.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-45.png
new file mode 100644
index 0000000..c25438f
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-45.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-46.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-46.png
new file mode 100644
index 0000000..aa1d559
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-46.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-5.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-5.png
new file mode 100644
index 0000000..bb8dfda
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-5.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-6.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-6.png
new file mode 100644
index 0000000..a389f86
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-6.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-7.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-7.png
new file mode 100644
index 0000000..5fa02ec
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-7.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-8.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-8.png
new file mode 100644
index 0000000..4d4a5dc
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-8.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-9.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-9.png
new file mode 100644
index 0000000..0ac5dd1
--- /dev/null
+++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-9.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/world-cell.png b/mindus/assets/blocks/logic/world-cell.png
new file mode 100644
index 0000000..cfc5d87
--- /dev/null
+++ b/mindus/assets/blocks/logic/world-cell.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/world-message.png b/mindus/assets/blocks/logic/world-message.png
new file mode 100644
index 0000000..a94bb57
--- /dev/null
+++ b/mindus/assets/blocks/logic/world-message.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/world-processor.png b/mindus/assets/blocks/logic/world-processor.png
new file mode 100644
index 0000000..01e1a0c
--- /dev/null
+++ b/mindus/assets/blocks/logic/world-processor.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/world-switch-on.png b/mindus/assets/blocks/logic/world-switch-on.png
new file mode 100644
index 0000000..47d19d9
--- /dev/null
+++ b/mindus/assets/blocks/logic/world-switch-on.png
Binary files differ
diff --git a/mindus/assets/blocks/logic/world-switch.png b/mindus/assets/blocks/logic/world-switch.png
new file mode 100644
index 0000000..8afcf14
--- /dev/null
+++ b/mindus/assets/blocks/logic/world-switch.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/constructor-top.png b/mindus/assets/blocks/payload/constructor-top.png
new file mode 100644
index 0000000..7db4670
--- /dev/null
+++ b/mindus/assets/blocks/payload/constructor-top.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/constructor.png b/mindus/assets/blocks/payload/constructor.png
new file mode 100644
index 0000000..8740a1b
--- /dev/null
+++ b/mindus/assets/blocks/payload/constructor.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/deconstructor-top.png b/mindus/assets/blocks/payload/deconstructor-top.png
new file mode 100644
index 0000000..8cee26d
--- /dev/null
+++ b/mindus/assets/blocks/payload/deconstructor-top.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/deconstructor.png b/mindus/assets/blocks/payload/deconstructor.png
new file mode 100644
index 0000000..1dc96a1
--- /dev/null
+++ b/mindus/assets/blocks/payload/deconstructor.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/factory-in-3-dark.png b/mindus/assets/blocks/payload/factory-in-3-dark.png
new file mode 100644
index 0000000..21f3c72
--- /dev/null
+++ b/mindus/assets/blocks/payload/factory-in-3-dark.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/factory-in-3.png b/mindus/assets/blocks/payload/factory-in-3.png
new file mode 100644
index 0000000..47c8a1c
--- /dev/null
+++ b/mindus/assets/blocks/payload/factory-in-3.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/factory-in-5-dark.png b/mindus/assets/blocks/payload/factory-in-5-dark.png
new file mode 100644
index 0000000..49b528b
--- /dev/null
+++ b/mindus/assets/blocks/payload/factory-in-5-dark.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/factory-in-5.png b/mindus/assets/blocks/payload/factory-in-5.png
new file mode 100644
index 0000000..969d1b7
--- /dev/null
+++ b/mindus/assets/blocks/payload/factory-in-5.png
Binary files differ
diff --git a/assets/blocks/payload/factory-in-7.png b/mindus/assets/blocks/payload/factory-in-7.png
index e7f4f07..d67986a 100644
--- a/assets/blocks/payload/factory-in-7.png
+++ b/mindus/assets/blocks/payload/factory-in-7.png
Binary files differ
diff --git a/assets/blocks/payload/factory-in-9.png b/mindus/assets/blocks/payload/factory-in-9.png
index 75638ba..6f7dc51 100644
--- a/assets/blocks/payload/factory-in-9.png
+++ b/mindus/assets/blocks/payload/factory-in-9.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/factory-out-3-dark.png b/mindus/assets/blocks/payload/factory-out-3-dark.png
new file mode 100644
index 0000000..c9e11fa
--- /dev/null
+++ b/mindus/assets/blocks/payload/factory-out-3-dark.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/factory-out-3.png b/mindus/assets/blocks/payload/factory-out-3.png
new file mode 100644
index 0000000..4d84664
--- /dev/null
+++ b/mindus/assets/blocks/payload/factory-out-3.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/factory-out-5-dark.png b/mindus/assets/blocks/payload/factory-out-5-dark.png
new file mode 100644
index 0000000..87f5a34
--- /dev/null
+++ b/mindus/assets/blocks/payload/factory-out-5-dark.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/factory-out-5.png b/mindus/assets/blocks/payload/factory-out-5.png
new file mode 100644
index 0000000..713f5fe
--- /dev/null
+++ b/mindus/assets/blocks/payload/factory-out-5.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/factory-out-7.png b/mindus/assets/blocks/payload/factory-out-7.png
new file mode 100644
index 0000000..d2946b3
--- /dev/null
+++ b/mindus/assets/blocks/payload/factory-out-7.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/factory-out-9.png b/mindus/assets/blocks/payload/factory-out-9.png
new file mode 100644
index 0000000..840ca36
--- /dev/null
+++ b/mindus/assets/blocks/payload/factory-out-9.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/factory-top-3.png b/mindus/assets/blocks/payload/factory-top-3.png
new file mode 100644
index 0000000..ff972ca
--- /dev/null
+++ b/mindus/assets/blocks/payload/factory-top-3.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/large-constructor-top.png b/mindus/assets/blocks/payload/large-constructor-top.png
new file mode 100644
index 0000000..b664c4c
--- /dev/null
+++ b/mindus/assets/blocks/payload/large-constructor-top.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/large-constructor.png b/mindus/assets/blocks/payload/large-constructor.png
new file mode 100644
index 0000000..ec19fb3
--- /dev/null
+++ b/mindus/assets/blocks/payload/large-constructor.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/large-payload-mass-driver.png b/mindus/assets/blocks/payload/large-payload-mass-driver.png
new file mode 100644
index 0000000..f5745e1
--- /dev/null
+++ b/mindus/assets/blocks/payload/large-payload-mass-driver.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/payload-conveyor.png b/mindus/assets/blocks/payload/payload-conveyor.png
new file mode 100644
index 0000000..6909b63
--- /dev/null
+++ b/mindus/assets/blocks/payload/payload-conveyor.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/payload-loader-top.png b/mindus/assets/blocks/payload/payload-loader-top.png
new file mode 100644
index 0000000..97296ba
--- /dev/null
+++ b/mindus/assets/blocks/payload/payload-loader-top.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/payload-loader.png b/mindus/assets/blocks/payload/payload-loader.png
new file mode 100644
index 0000000..b950f6d
--- /dev/null
+++ b/mindus/assets/blocks/payload/payload-loader.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/payload-mass-driver.png b/mindus/assets/blocks/payload/payload-mass-driver.png
new file mode 100644
index 0000000..24875c1
--- /dev/null
+++ b/mindus/assets/blocks/payload/payload-mass-driver.png
Binary files differ
diff --git a/assets/blocks/payload/payload-router-over.png b/mindus/assets/blocks/payload/payload-router-over.png
index 5166951..5166951 100644
--- a/assets/blocks/payload/payload-router-over.png
+++ b/mindus/assets/blocks/payload/payload-router-over.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/payload-router.png b/mindus/assets/blocks/payload/payload-router.png
new file mode 100644
index 0000000..8cb68e4
--- /dev/null
+++ b/mindus/assets/blocks/payload/payload-router.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/payload-source-top.png b/mindus/assets/blocks/payload/payload-source-top.png
new file mode 100644
index 0000000..31136c7
--- /dev/null
+++ b/mindus/assets/blocks/payload/payload-source-top.png
Binary files differ
diff --git a/assets/blocks/payload/payload-source.png b/mindus/assets/blocks/payload/payload-source.png
index 1c4585b..cf0844c 100644
--- a/assets/blocks/payload/payload-source.png
+++ b/mindus/assets/blocks/payload/payload-source.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/payload-unloader-top.png b/mindus/assets/blocks/payload/payload-unloader-top.png
new file mode 100644
index 0000000..bd4c21e
--- /dev/null
+++ b/mindus/assets/blocks/payload/payload-unloader-top.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/payload-unloader.png b/mindus/assets/blocks/payload/payload-unloader.png
new file mode 100644
index 0000000..d62f642
--- /dev/null
+++ b/mindus/assets/blocks/payload/payload-unloader.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/payload-void-top.png b/mindus/assets/blocks/payload/payload-void-top.png
new file mode 100644
index 0000000..48a8592
--- /dev/null
+++ b/mindus/assets/blocks/payload/payload-void-top.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/payload-void.png b/mindus/assets/blocks/payload/payload-void.png
new file mode 100644
index 0000000..b1fac7d
--- /dev/null
+++ b/mindus/assets/blocks/payload/payload-void.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/reinforced-payload-conveyor.png b/mindus/assets/blocks/payload/reinforced-payload-conveyor.png
new file mode 100644
index 0000000..deaa4ed
--- /dev/null
+++ b/mindus/assets/blocks/payload/reinforced-payload-conveyor.png
Binary files differ
diff --git a/assets/blocks/payload/reinforced-payload-router-over.png b/mindus/assets/blocks/payload/reinforced-payload-router-over.png
index 14dda8a..14dda8a 100644
--- a/assets/blocks/payload/reinforced-payload-router-over.png
+++ b/mindus/assets/blocks/payload/reinforced-payload-router-over.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/reinforced-payload-router.png b/mindus/assets/blocks/payload/reinforced-payload-router.png
new file mode 100644
index 0000000..c4be5da
--- /dev/null
+++ b/mindus/assets/blocks/payload/reinforced-payload-router.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/small-deconstructor-top.png b/mindus/assets/blocks/payload/small-deconstructor-top.png
new file mode 100644
index 0000000..316b304
--- /dev/null
+++ b/mindus/assets/blocks/payload/small-deconstructor-top.png
Binary files differ
diff --git a/mindus/assets/blocks/payload/small-deconstructor.png b/mindus/assets/blocks/payload/small-deconstructor.png
new file mode 100644
index 0000000..2b3337e
--- /dev/null
+++ b/mindus/assets/blocks/payload/small-deconstructor.png
Binary files differ
diff --git a/mindus/assets/blocks/power/battery-large.png b/mindus/assets/blocks/power/battery-large.png
new file mode 100644
index 0000000..7513fe5
--- /dev/null
+++ b/mindus/assets/blocks/power/battery-large.png
Binary files differ
diff --git a/mindus/assets/blocks/power/battery.png b/mindus/assets/blocks/power/battery.png
new file mode 100644
index 0000000..4282103
--- /dev/null
+++ b/mindus/assets/blocks/power/battery.png
Binary files differ
diff --git a/mindus/assets/blocks/power/beam-link.png b/mindus/assets/blocks/power/beam-link.png
new file mode 100644
index 0000000..a4ebbb9
--- /dev/null
+++ b/mindus/assets/blocks/power/beam-link.png
Binary files differ
diff --git a/mindus/assets/blocks/power/beam-node.png b/mindus/assets/blocks/power/beam-node.png
new file mode 100644
index 0000000..ba86cc0
--- /dev/null
+++ b/mindus/assets/blocks/power/beam-node.png
Binary files differ
diff --git a/mindus/assets/blocks/power/beam-tower.png b/mindus/assets/blocks/power/beam-tower.png
new file mode 100644
index 0000000..17da542
--- /dev/null
+++ b/mindus/assets/blocks/power/beam-tower.png
Binary files differ
diff --git a/mindus/assets/blocks/power/chemical-combustion-chamber.png b/mindus/assets/blocks/power/chemical-combustion-chamber.png
new file mode 100644
index 0000000..26770b5
--- /dev/null
+++ b/mindus/assets/blocks/power/chemical-combustion-chamber.png
Binary files differ
diff --git a/mindus/assets/blocks/power/combustion-generator.png b/mindus/assets/blocks/power/combustion-generator.png
new file mode 100644
index 0000000..ee7caae
--- /dev/null
+++ b/mindus/assets/blocks/power/combustion-generator.png
Binary files differ
diff --git a/mindus/assets/blocks/power/differential-generator-liquid.png b/mindus/assets/blocks/power/differential-generator-liquid.png
new file mode 100644
index 0000000..081edf7
--- /dev/null
+++ b/mindus/assets/blocks/power/differential-generator-liquid.png
Binary files differ
diff --git a/mindus/assets/blocks/power/differential-generator.png b/mindus/assets/blocks/power/differential-generator.png
new file mode 100644
index 0000000..42f1fbf
--- /dev/null
+++ b/mindus/assets/blocks/power/differential-generator.png
Binary files differ
diff --git a/mindus/assets/blocks/power/diode-arrow.png b/mindus/assets/blocks/power/diode-arrow.png
new file mode 100644
index 0000000..a34dd68
--- /dev/null
+++ b/mindus/assets/blocks/power/diode-arrow.png
Binary files differ
diff --git a/mindus/assets/blocks/power/diode.png b/mindus/assets/blocks/power/diode.png
new file mode 100644
index 0000000..19f3990
--- /dev/null
+++ b/mindus/assets/blocks/power/diode.png
Binary files differ
diff --git a/mindus/assets/blocks/power/flux-reactor-bottom.png b/mindus/assets/blocks/power/flux-reactor-bottom.png
new file mode 100644
index 0000000..2c2d987
--- /dev/null
+++ b/mindus/assets/blocks/power/flux-reactor-bottom.png
Binary files differ
diff --git a/mindus/assets/blocks/power/flux-reactor-mid.png b/mindus/assets/blocks/power/flux-reactor-mid.png
new file mode 100644
index 0000000..5f3b0df
--- /dev/null
+++ b/mindus/assets/blocks/power/flux-reactor-mid.png
Binary files differ
diff --git a/mindus/assets/blocks/power/flux-reactor.png b/mindus/assets/blocks/power/flux-reactor.png
new file mode 100644
index 0000000..55d3d2b
--- /dev/null
+++ b/mindus/assets/blocks/power/flux-reactor.png
Binary files differ
diff --git a/mindus/assets/blocks/power/illuminator.png b/mindus/assets/blocks/power/illuminator.png
new file mode 100644
index 0000000..5ec0f18
--- /dev/null
+++ b/mindus/assets/blocks/power/illuminator.png
Binary files differ
diff --git a/mindus/assets/blocks/power/impact-reactor-bottom.png b/mindus/assets/blocks/power/impact-reactor-bottom.png
new file mode 100644
index 0000000..0ac351d
--- /dev/null
+++ b/mindus/assets/blocks/power/impact-reactor-bottom.png
Binary files differ
diff --git a/mindus/assets/blocks/power/impact-reactor.png b/mindus/assets/blocks/power/impact-reactor.png
new file mode 100644
index 0000000..4ea795a
--- /dev/null
+++ b/mindus/assets/blocks/power/impact-reactor.png
Binary files differ
diff --git a/mindus/assets/blocks/power/neoplasia-reactor-bottom.png b/mindus/assets/blocks/power/neoplasia-reactor-bottom.png
new file mode 100644
index 0000000..8c106dc
--- /dev/null
+++ b/mindus/assets/blocks/power/neoplasia-reactor-bottom.png
Binary files differ
diff --git a/mindus/assets/blocks/power/neoplasia-reactor-center.png b/mindus/assets/blocks/power/neoplasia-reactor-center.png
new file mode 100644
index 0000000..30e3a57
--- /dev/null
+++ b/mindus/assets/blocks/power/neoplasia-reactor-center.png
Binary files differ
diff --git a/assets/blocks/power/neoplasia-reactor-top1.png b/mindus/assets/blocks/power/neoplasia-reactor-top1.png
index 73ecc4d..73ecc4d 100644
--- a/assets/blocks/power/neoplasia-reactor-top1.png
+++ b/mindus/assets/blocks/power/neoplasia-reactor-top1.png
Binary files differ
diff --git a/assets/blocks/power/neoplasia-reactor-top2.png b/mindus/assets/blocks/power/neoplasia-reactor-top2.png
index 08a24c4..08a24c4 100644
--- a/assets/blocks/power/neoplasia-reactor-top2.png
+++ b/mindus/assets/blocks/power/neoplasia-reactor-top2.png
Binary files differ
diff --git a/mindus/assets/blocks/power/neoplasia-reactor.png b/mindus/assets/blocks/power/neoplasia-reactor.png
new file mode 100644
index 0000000..445f340
--- /dev/null
+++ b/mindus/assets/blocks/power/neoplasia-reactor.png
Binary files differ
diff --git a/mindus/assets/blocks/power/power-node-large.png b/mindus/assets/blocks/power/power-node-large.png
new file mode 100644
index 0000000..495de11
--- /dev/null
+++ b/mindus/assets/blocks/power/power-node-large.png
Binary files differ
diff --git a/mindus/assets/blocks/power/power-node.png b/mindus/assets/blocks/power/power-node.png
new file mode 100644
index 0000000..22af588
--- /dev/null
+++ b/mindus/assets/blocks/power/power-node.png
Binary files differ
diff --git a/mindus/assets/blocks/power/power-source.png b/mindus/assets/blocks/power/power-source.png
new file mode 100644
index 0000000..c7210da
--- /dev/null
+++ b/mindus/assets/blocks/power/power-source.png
Binary files differ
diff --git a/mindus/assets/blocks/power/power-void.png b/mindus/assets/blocks/power/power-void.png
new file mode 100644
index 0000000..92354a9
--- /dev/null
+++ b/mindus/assets/blocks/power/power-void.png
Binary files differ
diff --git a/mindus/assets/blocks/power/pyrolysis-generator.png b/mindus/assets/blocks/power/pyrolysis-generator.png
new file mode 100644
index 0000000..890ac4e
--- /dev/null
+++ b/mindus/assets/blocks/power/pyrolysis-generator.png
Binary files differ
diff --git a/mindus/assets/blocks/power/rtg-generator.png b/mindus/assets/blocks/power/rtg-generator.png
new file mode 100644
index 0000000..aefdc12
--- /dev/null
+++ b/mindus/assets/blocks/power/rtg-generator.png
Binary files differ
diff --git a/mindus/assets/blocks/power/solar-panel-large.png b/mindus/assets/blocks/power/solar-panel-large.png
new file mode 100644
index 0000000..e292111
--- /dev/null
+++ b/mindus/assets/blocks/power/solar-panel-large.png
Binary files differ
diff --git a/mindus/assets/blocks/power/solar-panel.png b/mindus/assets/blocks/power/solar-panel.png
new file mode 100644
index 0000000..61ef3f0
--- /dev/null
+++ b/mindus/assets/blocks/power/solar-panel.png
Binary files differ
diff --git a/mindus/assets/blocks/power/steam-generator-liquid.png b/mindus/assets/blocks/power/steam-generator-liquid.png
new file mode 100644
index 0000000..91db8f2
--- /dev/null
+++ b/mindus/assets/blocks/power/steam-generator-liquid.png
Binary files differ
diff --git a/mindus/assets/blocks/power/steam-generator.png b/mindus/assets/blocks/power/steam-generator.png
new file mode 100644
index 0000000..2bdb951
--- /dev/null
+++ b/mindus/assets/blocks/power/steam-generator.png
Binary files differ
diff --git a/assets/blocks/power/surge-tower.png b/mindus/assets/blocks/power/surge-tower.png
index abf3ce1..abf3ce1 100644
--- a/assets/blocks/power/surge-tower.png
+++ b/mindus/assets/blocks/power/surge-tower.png
Binary files differ
diff --git a/mindus/assets/blocks/power/thermal-generator.png b/mindus/assets/blocks/power/thermal-generator.png
new file mode 100644
index 0000000..f5e9dba
--- /dev/null
+++ b/mindus/assets/blocks/power/thermal-generator.png
Binary files differ
diff --git a/mindus/assets/blocks/power/thorium-reactor.png b/mindus/assets/blocks/power/thorium-reactor.png
new file mode 100644
index 0000000..f6a7994
--- /dev/null
+++ b/mindus/assets/blocks/power/thorium-reactor.png
Binary files differ
diff --git a/mindus/assets/blocks/power/turbine-condenser.png b/mindus/assets/blocks/power/turbine-condenser.png
new file mode 100644
index 0000000..bc7f761
--- /dev/null
+++ b/mindus/assets/blocks/power/turbine-condenser.png
Binary files differ
diff --git a/mindus/assets/blocks/production/atmospheric-concentrator-bottom.png b/mindus/assets/blocks/production/atmospheric-concentrator-bottom.png
new file mode 100644
index 0000000..4082ee1
--- /dev/null
+++ b/mindus/assets/blocks/production/atmospheric-concentrator-bottom.png
Binary files differ
diff --git a/mindus/assets/blocks/production/atmospheric-concentrator.png b/mindus/assets/blocks/production/atmospheric-concentrator.png
new file mode 100644
index 0000000..ad5690f
--- /dev/null
+++ b/mindus/assets/blocks/production/atmospheric-concentrator.png
Binary files differ
diff --git a/mindus/assets/blocks/production/blast-mixer.png b/mindus/assets/blocks/production/blast-mixer.png
new file mode 100644
index 0000000..b2e0adb
--- /dev/null
+++ b/mindus/assets/blocks/production/blast-mixer.png
Binary files differ
diff --git a/mindus/assets/blocks/production/carbide-crucible-bottom.png b/mindus/assets/blocks/production/carbide-crucible-bottom.png
new file mode 100644
index 0000000..22ae9dc
--- /dev/null
+++ b/mindus/assets/blocks/production/carbide-crucible-bottom.png
Binary files differ
diff --git a/mindus/assets/blocks/production/carbide-crucible.png b/mindus/assets/blocks/production/carbide-crucible.png
new file mode 100644
index 0000000..bb1ebf4
--- /dev/null
+++ b/mindus/assets/blocks/production/carbide-crucible.png
Binary files differ
diff --git a/mindus/assets/blocks/production/coal-centrifuge.png b/mindus/assets/blocks/production/coal-centrifuge.png
new file mode 100644
index 0000000..44a9e66
--- /dev/null
+++ b/mindus/assets/blocks/production/coal-centrifuge.png
Binary files differ
diff --git a/assets/blocks/production/cryofluid-mixer-bottom.png b/mindus/assets/blocks/production/cryofluid-mixer-bottom.png
index 6e5ed2c..6e5ed2c 100644
--- a/assets/blocks/production/cryofluid-mixer-bottom.png
+++ b/mindus/assets/blocks/production/cryofluid-mixer-bottom.png
Binary files differ
diff --git a/mindus/assets/blocks/production/cryofluid-mixer.png b/mindus/assets/blocks/production/cryofluid-mixer.png
new file mode 100644
index 0000000..43ed388
--- /dev/null
+++ b/mindus/assets/blocks/production/cryofluid-mixer.png
Binary files differ
diff --git a/mindus/assets/blocks/production/cultivator.png b/mindus/assets/blocks/production/cultivator.png
new file mode 100644
index 0000000..805253c
--- /dev/null
+++ b/mindus/assets/blocks/production/cultivator.png
Binary files differ
diff --git a/mindus/assets/blocks/production/cyanogen-synthesizer-bottom.png b/mindus/assets/blocks/production/cyanogen-synthesizer-bottom.png
new file mode 100644
index 0000000..91824e3
--- /dev/null
+++ b/mindus/assets/blocks/production/cyanogen-synthesizer-bottom.png
Binary files differ
diff --git a/mindus/assets/blocks/production/cyanogen-synthesizer.png b/mindus/assets/blocks/production/cyanogen-synthesizer.png
new file mode 100644
index 0000000..3cae436
--- /dev/null
+++ b/mindus/assets/blocks/production/cyanogen-synthesizer.png
Binary files differ
diff --git a/mindus/assets/blocks/production/disassembler-bottom.png b/mindus/assets/blocks/production/disassembler-bottom.png
new file mode 100644
index 0000000..e12a0c6
--- /dev/null
+++ b/mindus/assets/blocks/production/disassembler-bottom.png
Binary files differ
diff --git a/mindus/assets/blocks/production/disassembler.png b/mindus/assets/blocks/production/disassembler.png
new file mode 100644
index 0000000..5a432bf
--- /dev/null
+++ b/mindus/assets/blocks/production/disassembler.png
Binary files differ
diff --git a/mindus/assets/blocks/production/electric-heater-top1.png b/mindus/assets/blocks/production/electric-heater-top1.png
new file mode 100644
index 0000000..12cf9db
--- /dev/null
+++ b/mindus/assets/blocks/production/electric-heater-top1.png
Binary files differ
diff --git a/mindus/assets/blocks/production/electric-heater-top2.png b/mindus/assets/blocks/production/electric-heater-top2.png
new file mode 100644
index 0000000..f4f84ab
--- /dev/null
+++ b/mindus/assets/blocks/production/electric-heater-top2.png
Binary files differ
diff --git a/mindus/assets/blocks/production/electric-heater.png b/mindus/assets/blocks/production/electric-heater.png
new file mode 100644
index 0000000..70637d7
--- /dev/null
+++ b/mindus/assets/blocks/production/electric-heater.png
Binary files differ
diff --git a/mindus/assets/blocks/production/electrolyzer-bottom.png b/mindus/assets/blocks/production/electrolyzer-bottom.png
new file mode 100644
index 0000000..e133e4e
--- /dev/null
+++ b/mindus/assets/blocks/production/electrolyzer-bottom.png
Binary files differ
diff --git a/assets/blocks/production/electrolyzer-hydrogen-output1.png b/mindus/assets/blocks/production/electrolyzer-hydrogen-output1.png
index defb12c..defb12c 100644
--- a/assets/blocks/production/electrolyzer-hydrogen-output1.png
+++ b/mindus/assets/blocks/production/electrolyzer-hydrogen-output1.png
Binary files differ
diff --git a/assets/blocks/production/electrolyzer-hydrogen-output2.png b/mindus/assets/blocks/production/electrolyzer-hydrogen-output2.png
index b62e50c..b62e50c 100644
--- a/assets/blocks/production/electrolyzer-hydrogen-output2.png
+++ b/mindus/assets/blocks/production/electrolyzer-hydrogen-output2.png
Binary files differ
diff --git a/assets/blocks/production/electrolyzer-ozone-output1.png b/mindus/assets/blocks/production/electrolyzer-ozone-output1.png
index 6601210..6601210 100644
--- a/assets/blocks/production/electrolyzer-ozone-output1.png
+++ b/mindus/assets/blocks/production/electrolyzer-ozone-output1.png
Binary files differ
diff --git a/assets/blocks/production/electrolyzer-ozone-output2.png b/mindus/assets/blocks/production/electrolyzer-ozone-output2.png
index f8a5a9b..f8a5a9b 100644
--- a/assets/blocks/production/electrolyzer-ozone-output2.png
+++ b/mindus/assets/blocks/production/electrolyzer-ozone-output2.png
Binary files differ
diff --git a/mindus/assets/blocks/production/electrolyzer.png b/mindus/assets/blocks/production/electrolyzer.png
new file mode 100644
index 0000000..272184f
--- /dev/null
+++ b/mindus/assets/blocks/production/electrolyzer.png
Binary files differ
diff --git a/assets/blocks/production/graphite-press.png b/mindus/assets/blocks/production/graphite-press.png
index a356104..6f965a0 100644
--- a/assets/blocks/production/graphite-press.png
+++ b/mindus/assets/blocks/production/graphite-press.png
Binary files differ
diff --git a/mindus/assets/blocks/production/heat-reactor-top1.png b/mindus/assets/blocks/production/heat-reactor-top1.png
new file mode 100644
index 0000000..b9648a8
--- /dev/null
+++ b/mindus/assets/blocks/production/heat-reactor-top1.png
Binary files differ
diff --git a/mindus/assets/blocks/production/heat-reactor-top2.png b/mindus/assets/blocks/production/heat-reactor-top2.png
new file mode 100644
index 0000000..f0415fd
--- /dev/null
+++ b/mindus/assets/blocks/production/heat-reactor-top2.png
Binary files differ
diff --git a/mindus/assets/blocks/production/heat-reactor.png b/mindus/assets/blocks/production/heat-reactor.png
new file mode 100644
index 0000000..4f5c72d
--- /dev/null
+++ b/mindus/assets/blocks/production/heat-reactor.png
Binary files differ
diff --git a/assets/blocks/production/heat-redirector-top1.png b/mindus/assets/blocks/production/heat-redirector-top1.png
index b0610a9..70fd7f6 100644
--- a/assets/blocks/production/heat-redirector-top1.png
+++ b/mindus/assets/blocks/production/heat-redirector-top1.png
Binary files differ
diff --git a/mindus/assets/blocks/production/heat-redirector-top2.png b/mindus/assets/blocks/production/heat-redirector-top2.png
new file mode 100644
index 0000000..8f554e8
--- /dev/null
+++ b/mindus/assets/blocks/production/heat-redirector-top2.png
Binary files differ
diff --git a/mindus/assets/blocks/production/heat-redirector.png b/mindus/assets/blocks/production/heat-redirector.png
new file mode 100644
index 0000000..65ea982
--- /dev/null
+++ b/mindus/assets/blocks/production/heat-redirector.png
Binary files differ
diff --git a/mindus/assets/blocks/production/heat-router-top1.png b/mindus/assets/blocks/production/heat-router-top1.png
new file mode 100644
index 0000000..27bf1ca
--- /dev/null
+++ b/mindus/assets/blocks/production/heat-router-top1.png
Binary files differ
diff --git a/assets/blocks/production/heat-router-top2.png b/mindus/assets/blocks/production/heat-router-top2.png
index c592618..c592618 100644
--- a/assets/blocks/production/heat-router-top2.png
+++ b/mindus/assets/blocks/production/heat-router-top2.png
Binary files differ
diff --git a/mindus/assets/blocks/production/heat-router.png b/mindus/assets/blocks/production/heat-router.png
new file mode 100644
index 0000000..bd22dfe
--- /dev/null
+++ b/mindus/assets/blocks/production/heat-router.png
Binary files differ
diff --git a/assets/blocks/production/heat-source-top1.png b/mindus/assets/blocks/production/heat-source-top1.png
index 3f53d54..3f53d54 100644
--- a/assets/blocks/production/heat-source-top1.png
+++ b/mindus/assets/blocks/production/heat-source-top1.png
Binary files differ
diff --git a/assets/blocks/production/heat-source-top2.png b/mindus/assets/blocks/production/heat-source-top2.png
index 523d20f..523d20f 100644
--- a/assets/blocks/production/heat-source-top2.png
+++ b/mindus/assets/blocks/production/heat-source-top2.png
Binary files differ
diff --git a/mindus/assets/blocks/production/heat-source.png b/mindus/assets/blocks/production/heat-source.png
new file mode 100644
index 0000000..facde20
--- /dev/null
+++ b/mindus/assets/blocks/production/heat-source.png
Binary files differ
diff --git a/mindus/assets/blocks/production/incinerator.png b/mindus/assets/blocks/production/incinerator.png
new file mode 100644
index 0000000..7251cc1
--- /dev/null
+++ b/mindus/assets/blocks/production/incinerator.png
Binary files differ
diff --git a/mindus/assets/blocks/production/kiln.png b/mindus/assets/blocks/production/kiln.png
new file mode 100644
index 0000000..7fb4dcb
--- /dev/null
+++ b/mindus/assets/blocks/production/kiln.png
Binary files differ
diff --git a/assets/blocks/production/melter-bottom.png b/mindus/assets/blocks/production/melter-bottom.png
index 380776f..380776f 100644
--- a/assets/blocks/production/melter-bottom.png
+++ b/mindus/assets/blocks/production/melter-bottom.png
Binary files differ
diff --git a/mindus/assets/blocks/production/melter.png b/mindus/assets/blocks/production/melter.png
new file mode 100644
index 0000000..3ff8633
--- /dev/null
+++ b/mindus/assets/blocks/production/melter.png
Binary files differ
diff --git a/mindus/assets/blocks/production/multi-press.png b/mindus/assets/blocks/production/multi-press.png
new file mode 100644
index 0000000..46d7ac8
--- /dev/null
+++ b/mindus/assets/blocks/production/multi-press.png
Binary files differ
diff --git a/assets/blocks/production/oxidation-chamber-liquid.png b/mindus/assets/blocks/production/oxidation-chamber-liquid.png
index 84098de..84098de 100644
--- a/assets/blocks/production/oxidation-chamber-liquid.png
+++ b/mindus/assets/blocks/production/oxidation-chamber-liquid.png
Binary files differ
diff --git a/mindus/assets/blocks/production/oxidation-chamber-top1.png b/mindus/assets/blocks/production/oxidation-chamber-top1.png
new file mode 100644
index 0000000..c4fbf98
--- /dev/null
+++ b/mindus/assets/blocks/production/oxidation-chamber-top1.png
Binary files differ
diff --git a/mindus/assets/blocks/production/oxidation-chamber-top2.png b/mindus/assets/blocks/production/oxidation-chamber-top2.png
new file mode 100644
index 0000000..281930b
--- /dev/null
+++ b/mindus/assets/blocks/production/oxidation-chamber-top2.png
Binary files differ
diff --git a/mindus/assets/blocks/production/oxidation-chamber.png b/mindus/assets/blocks/production/oxidation-chamber.png
new file mode 100644
index 0000000..9c58748
--- /dev/null
+++ b/mindus/assets/blocks/production/oxidation-chamber.png
Binary files differ
diff --git a/mindus/assets/blocks/production/phase-heater-top1.png b/mindus/assets/blocks/production/phase-heater-top1.png
new file mode 100644
index 0000000..c0f2131
--- /dev/null
+++ b/mindus/assets/blocks/production/phase-heater-top1.png
Binary files differ
diff --git a/mindus/assets/blocks/production/phase-heater-top2.png b/mindus/assets/blocks/production/phase-heater-top2.png
new file mode 100644
index 0000000..f03df8d
--- /dev/null
+++ b/mindus/assets/blocks/production/phase-heater-top2.png
Binary files differ
diff --git a/mindus/assets/blocks/production/phase-heater.png b/mindus/assets/blocks/production/phase-heater.png
new file mode 100644
index 0000000..4b3a398
--- /dev/null
+++ b/mindus/assets/blocks/production/phase-heater.png
Binary files differ
diff --git a/mindus/assets/blocks/production/phase-synthesizer.png b/mindus/assets/blocks/production/phase-synthesizer.png
new file mode 100644
index 0000000..c69129e
--- /dev/null
+++ b/mindus/assets/blocks/production/phase-synthesizer.png
Binary files differ
diff --git a/mindus/assets/blocks/production/phase-weaver.png b/mindus/assets/blocks/production/phase-weaver.png
new file mode 100644
index 0000000..8d76b9a
--- /dev/null
+++ b/mindus/assets/blocks/production/phase-weaver.png
Binary files differ
diff --git a/mindus/assets/blocks/production/plastanium-compressor.png b/mindus/assets/blocks/production/plastanium-compressor.png
new file mode 100644
index 0000000..eebc615
--- /dev/null
+++ b/mindus/assets/blocks/production/plastanium-compressor.png
Binary files differ
diff --git a/mindus/assets/blocks/production/pulverizer.png b/mindus/assets/blocks/production/pulverizer.png
new file mode 100644
index 0000000..b2ef8b6
--- /dev/null
+++ b/mindus/assets/blocks/production/pulverizer.png
Binary files differ
diff --git a/mindus/assets/blocks/production/pyratite-mixer.png b/mindus/assets/blocks/production/pyratite-mixer.png
new file mode 100644
index 0000000..0f74418
--- /dev/null
+++ b/mindus/assets/blocks/production/pyratite-mixer.png
Binary files differ
diff --git a/mindus/assets/blocks/production/separator.png b/mindus/assets/blocks/production/separator.png
new file mode 100644
index 0000000..d7de549
--- /dev/null
+++ b/mindus/assets/blocks/production/separator.png
Binary files differ
diff --git a/mindus/assets/blocks/production/silicon-arc-furnace.png b/mindus/assets/blocks/production/silicon-arc-furnace.png
new file mode 100644
index 0000000..e3debd7
--- /dev/null
+++ b/mindus/assets/blocks/production/silicon-arc-furnace.png
Binary files differ
diff --git a/mindus/assets/blocks/production/silicon-crucible.png b/mindus/assets/blocks/production/silicon-crucible.png
new file mode 100644
index 0000000..80f11bb
--- /dev/null
+++ b/mindus/assets/blocks/production/silicon-crucible.png
Binary files differ
diff --git a/mindus/assets/blocks/production/silicon-smelter.png b/mindus/assets/blocks/production/silicon-smelter.png
new file mode 100644
index 0000000..915d206
--- /dev/null
+++ b/mindus/assets/blocks/production/silicon-smelter.png
Binary files differ
diff --git a/mindus/assets/blocks/production/slag-centrifuge.png b/mindus/assets/blocks/production/slag-centrifuge.png
new file mode 100644
index 0000000..80c5220
--- /dev/null
+++ b/mindus/assets/blocks/production/slag-centrifuge.png
Binary files differ
diff --git a/mindus/assets/blocks/production/slag-heater-bottom.png b/mindus/assets/blocks/production/slag-heater-bottom.png
new file mode 100644
index 0000000..5966a6c
--- /dev/null
+++ b/mindus/assets/blocks/production/slag-heater-bottom.png
Binary files differ
diff --git a/assets/blocks/production/slag-heater-top1.png b/mindus/assets/blocks/production/slag-heater-top1.png
index 72ab2df..72ab2df 100644
--- a/assets/blocks/production/slag-heater-top1.png
+++ b/mindus/assets/blocks/production/slag-heater-top1.png
Binary files differ
diff --git a/assets/blocks/production/slag-heater-top2.png b/mindus/assets/blocks/production/slag-heater-top2.png
index 4d21c9e..4d21c9e 100644
--- a/assets/blocks/production/slag-heater-top2.png
+++ b/mindus/assets/blocks/production/slag-heater-top2.png
Binary files differ
diff --git a/mindus/assets/blocks/production/slag-heater.png b/mindus/assets/blocks/production/slag-heater.png
new file mode 100644
index 0000000..7f997f9
--- /dev/null
+++ b/mindus/assets/blocks/production/slag-heater.png
Binary files differ
diff --git a/mindus/assets/blocks/production/slag-incinerator-liquid.png b/mindus/assets/blocks/production/slag-incinerator-liquid.png
new file mode 100644
index 0000000..3f4b8d4
--- /dev/null
+++ b/mindus/assets/blocks/production/slag-incinerator-liquid.png
Binary files differ
diff --git a/mindus/assets/blocks/production/slag-incinerator.png b/mindus/assets/blocks/production/slag-incinerator.png
new file mode 100644
index 0000000..ffa2be3
--- /dev/null
+++ b/mindus/assets/blocks/production/slag-incinerator.png
Binary files differ
diff --git a/mindus/assets/blocks/production/small-heat-redirector-top1.png b/mindus/assets/blocks/production/small-heat-redirector-top1.png
new file mode 100644
index 0000000..51da879
--- /dev/null
+++ b/mindus/assets/blocks/production/small-heat-redirector-top1.png
Binary files differ
diff --git a/mindus/assets/blocks/production/small-heat-redirector-top2.png b/mindus/assets/blocks/production/small-heat-redirector-top2.png
new file mode 100644
index 0000000..775fac4
--- /dev/null
+++ b/mindus/assets/blocks/production/small-heat-redirector-top2.png
Binary files differ
diff --git a/mindus/assets/blocks/production/small-heat-redirector.png b/mindus/assets/blocks/production/small-heat-redirector.png
new file mode 100644
index 0000000..9b98756
--- /dev/null
+++ b/mindus/assets/blocks/production/small-heat-redirector.png
Binary files differ
diff --git a/mindus/assets/blocks/production/spore-press.png b/mindus/assets/blocks/production/spore-press.png
new file mode 100644
index 0000000..2fdfa23
--- /dev/null
+++ b/mindus/assets/blocks/production/spore-press.png
Binary files differ
diff --git a/mindus/assets/blocks/production/surge-crucible-bottom.png b/mindus/assets/blocks/production/surge-crucible-bottom.png
new file mode 100644
index 0000000..4c1b11c
--- /dev/null
+++ b/mindus/assets/blocks/production/surge-crucible-bottom.png
Binary files differ
diff --git a/mindus/assets/blocks/production/surge-crucible-liquid.png b/mindus/assets/blocks/production/surge-crucible-liquid.png
new file mode 100644
index 0000000..7579101
--- /dev/null
+++ b/mindus/assets/blocks/production/surge-crucible-liquid.png
Binary files differ
diff --git a/mindus/assets/blocks/production/surge-crucible.png b/mindus/assets/blocks/production/surge-crucible.png
new file mode 100644
index 0000000..5479202
--- /dev/null
+++ b/mindus/assets/blocks/production/surge-crucible.png
Binary files differ
diff --git a/mindus/assets/blocks/production/surge-smelter.png b/mindus/assets/blocks/production/surge-smelter.png
new file mode 100644
index 0000000..9188278
--- /dev/null
+++ b/mindus/assets/blocks/production/surge-smelter.png
Binary files differ
diff --git a/assets/blocks/storage/container-team.png b/mindus/assets/blocks/storage/container-team.png
index 3aa6105..3aa6105 100644
--- a/assets/blocks/storage/container-team.png
+++ b/mindus/assets/blocks/storage/container-team.png
Binary files differ
diff --git a/assets/blocks/storage/container.png b/mindus/assets/blocks/storage/container.png
index ff346df..ff346df 100644
--- a/assets/blocks/storage/container.png
+++ b/mindus/assets/blocks/storage/container.png
Binary files differ
diff --git a/mindus/assets/blocks/storage/core-acropolis-team.png b/mindus/assets/blocks/storage/core-acropolis-team.png
new file mode 100644
index 0000000..63b3e38
--- /dev/null
+++ b/mindus/assets/blocks/storage/core-acropolis-team.png
Binary files differ
diff --git a/mindus/assets/blocks/storage/core-acropolis.png b/mindus/assets/blocks/storage/core-acropolis.png
new file mode 100644
index 0000000..24cfcb1
--- /dev/null
+++ b/mindus/assets/blocks/storage/core-acropolis.png
Binary files differ
diff --git a/mindus/assets/blocks/storage/core-bastion-team.png b/mindus/assets/blocks/storage/core-bastion-team.png
new file mode 100644
index 0000000..5ff4f59
--- /dev/null
+++ b/mindus/assets/blocks/storage/core-bastion-team.png
Binary files differ
diff --git a/mindus/assets/blocks/storage/core-bastion.png b/mindus/assets/blocks/storage/core-bastion.png
new file mode 100644
index 0000000..91a45f6
--- /dev/null
+++ b/mindus/assets/blocks/storage/core-bastion.png
Binary files differ
diff --git a/mindus/assets/blocks/storage/core-citadel-team.png b/mindus/assets/blocks/storage/core-citadel-team.png
new file mode 100644
index 0000000..0115133
--- /dev/null
+++ b/mindus/assets/blocks/storage/core-citadel-team.png
Binary files differ
diff --git a/mindus/assets/blocks/storage/core-citadel.png b/mindus/assets/blocks/storage/core-citadel.png
new file mode 100644
index 0000000..e525927
--- /dev/null
+++ b/mindus/assets/blocks/storage/core-citadel.png
Binary files differ
diff --git a/mindus/assets/blocks/storage/core-foundation-team.png b/mindus/assets/blocks/storage/core-foundation-team.png
new file mode 100644
index 0000000..f4b33c6
--- /dev/null
+++ b/mindus/assets/blocks/storage/core-foundation-team.png
Binary files differ
diff --git a/mindus/assets/blocks/storage/core-foundation.png b/mindus/assets/blocks/storage/core-foundation.png
new file mode 100644
index 0000000..05fc9ed
--- /dev/null
+++ b/mindus/assets/blocks/storage/core-foundation.png
Binary files differ
diff --git a/mindus/assets/blocks/storage/core-nucleus-team.png b/mindus/assets/blocks/storage/core-nucleus-team.png
new file mode 100644
index 0000000..89d975b
--- /dev/null
+++ b/mindus/assets/blocks/storage/core-nucleus-team.png
Binary files differ
diff --git a/assets/blocks/storage/core-nucleus.png b/mindus/assets/blocks/storage/core-nucleus.png
index 59394e4..59394e4 100644
--- a/assets/blocks/storage/core-nucleus.png
+++ b/mindus/assets/blocks/storage/core-nucleus.png
Binary files differ
diff --git a/mindus/assets/blocks/storage/core-shard-team.png b/mindus/assets/blocks/storage/core-shard-team.png
new file mode 100644
index 0000000..f2ffa19
--- /dev/null
+++ b/mindus/assets/blocks/storage/core-shard-team.png
Binary files differ
diff --git a/mindus/assets/blocks/storage/core-shard.png b/mindus/assets/blocks/storage/core-shard.png
new file mode 100644
index 0000000..81ee21d
--- /dev/null
+++ b/mindus/assets/blocks/storage/core-shard.png
Binary files differ
diff --git a/mindus/assets/blocks/storage/reinforced-container-team.png b/mindus/assets/blocks/storage/reinforced-container-team.png
new file mode 100644
index 0000000..032d615
--- /dev/null
+++ b/mindus/assets/blocks/storage/reinforced-container-team.png
Binary files differ
diff --git a/mindus/assets/blocks/storage/reinforced-container.png b/mindus/assets/blocks/storage/reinforced-container.png
new file mode 100644
index 0000000..c7933ef
--- /dev/null
+++ b/mindus/assets/blocks/storage/reinforced-container.png
Binary files differ
diff --git a/assets/blocks/storage/reinforced-vault-team.png b/mindus/assets/blocks/storage/reinforced-vault-team.png
index 429e1e3..429e1e3 100644
--- a/assets/blocks/storage/reinforced-vault-team.png
+++ b/mindus/assets/blocks/storage/reinforced-vault-team.png
Binary files differ
diff --git a/mindus/assets/blocks/storage/reinforced-vault.png b/mindus/assets/blocks/storage/reinforced-vault.png
new file mode 100644
index 0000000..108cd16
--- /dev/null
+++ b/mindus/assets/blocks/storage/reinforced-vault.png
Binary files differ
diff --git a/mindus/assets/blocks/storage/unloader-center.png b/mindus/assets/blocks/storage/unloader-center.png
new file mode 100644
index 0000000..3a8220b
--- /dev/null
+++ b/mindus/assets/blocks/storage/unloader-center.png
Binary files differ
diff --git a/mindus/assets/blocks/storage/unloader.png b/mindus/assets/blocks/storage/unloader.png
new file mode 100644
index 0000000..6020a6f
--- /dev/null
+++ b/mindus/assets/blocks/storage/unloader.png
Binary files differ
diff --git a/mindus/assets/blocks/storage/vault-team.png b/mindus/assets/blocks/storage/vault-team.png
new file mode 100644
index 0000000..e6a76aa
--- /dev/null
+++ b/mindus/assets/blocks/storage/vault-team.png
Binary files differ
diff --git a/assets/blocks/storage/vault.png b/mindus/assets/blocks/storage/vault.png
index 43eda41..43eda41 100644
--- a/assets/blocks/storage/vault.png
+++ b/mindus/assets/blocks/storage/vault.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/afflict.png b/mindus/assets/blocks/turrets/afflict.png
new file mode 100644
index 0000000..36a7b05
--- /dev/null
+++ b/mindus/assets/blocks/turrets/afflict.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/arc.png b/mindus/assets/blocks/turrets/arc.png
new file mode 100644
index 0000000..ae233bb
--- /dev/null
+++ b/mindus/assets/blocks/turrets/arc.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/breach.png b/mindus/assets/blocks/turrets/breach.png
new file mode 100644
index 0000000..2db1e45
--- /dev/null
+++ b/mindus/assets/blocks/turrets/breach.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/cyclone.png b/mindus/assets/blocks/turrets/cyclone.png
new file mode 100644
index 0000000..1681eb2
--- /dev/null
+++ b/mindus/assets/blocks/turrets/cyclone.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/diffuse.png b/mindus/assets/blocks/turrets/diffuse.png
new file mode 100644
index 0000000..41d1eab
--- /dev/null
+++ b/mindus/assets/blocks/turrets/diffuse.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/disperse.png b/mindus/assets/blocks/turrets/disperse.png
new file mode 100644
index 0000000..45b7073
--- /dev/null
+++ b/mindus/assets/blocks/turrets/disperse.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/duo.png b/mindus/assets/blocks/turrets/duo.png
new file mode 100644
index 0000000..22dbab0
--- /dev/null
+++ b/mindus/assets/blocks/turrets/duo.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/foreshadow.png b/mindus/assets/blocks/turrets/foreshadow.png
new file mode 100644
index 0000000..e7b4a7d
--- /dev/null
+++ b/mindus/assets/blocks/turrets/foreshadow.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/fuse.png b/mindus/assets/blocks/turrets/fuse.png
new file mode 100644
index 0000000..8091476
--- /dev/null
+++ b/mindus/assets/blocks/turrets/fuse.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/hail.png b/mindus/assets/blocks/turrets/hail.png
new file mode 100644
index 0000000..7e6cff8
--- /dev/null
+++ b/mindus/assets/blocks/turrets/hail.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/lancer.png b/mindus/assets/blocks/turrets/lancer.png
new file mode 100644
index 0000000..872e9b1
--- /dev/null
+++ b/mindus/assets/blocks/turrets/lancer.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/lustre.png b/mindus/assets/blocks/turrets/lustre.png
new file mode 100644
index 0000000..680f4bc
--- /dev/null
+++ b/mindus/assets/blocks/turrets/lustre.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/malign.png b/mindus/assets/blocks/turrets/malign.png
new file mode 100644
index 0000000..267729b
--- /dev/null
+++ b/mindus/assets/blocks/turrets/malign.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/meltdown.png b/mindus/assets/blocks/turrets/meltdown.png
new file mode 100644
index 0000000..f60d55f
--- /dev/null
+++ b/mindus/assets/blocks/turrets/meltdown.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/parallax.png b/mindus/assets/blocks/turrets/parallax.png
new file mode 100644
index 0000000..5616f34
--- /dev/null
+++ b/mindus/assets/blocks/turrets/parallax.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/ripple.png b/mindus/assets/blocks/turrets/ripple.png
new file mode 100644
index 0000000..cd86d4b
--- /dev/null
+++ b/mindus/assets/blocks/turrets/ripple.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/salvo.png b/mindus/assets/blocks/turrets/salvo.png
new file mode 100644
index 0000000..3efea07
--- /dev/null
+++ b/mindus/assets/blocks/turrets/salvo.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/scathe.png b/mindus/assets/blocks/turrets/scathe.png
new file mode 100644
index 0000000..aafddc4
--- /dev/null
+++ b/mindus/assets/blocks/turrets/scathe.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/scatter.png b/mindus/assets/blocks/turrets/scatter.png
new file mode 100644
index 0000000..95d411f
--- /dev/null
+++ b/mindus/assets/blocks/turrets/scatter.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/scorch.png b/mindus/assets/blocks/turrets/scorch.png
new file mode 100644
index 0000000..8629eb8
--- /dev/null
+++ b/mindus/assets/blocks/turrets/scorch.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/segment.png b/mindus/assets/blocks/turrets/segment.png
new file mode 100644
index 0000000..1d83425
--- /dev/null
+++ b/mindus/assets/blocks/turrets/segment.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/smite.png b/mindus/assets/blocks/turrets/smite.png
new file mode 100644
index 0000000..4f5164f
--- /dev/null
+++ b/mindus/assets/blocks/turrets/smite.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/spectre.png b/mindus/assets/blocks/turrets/spectre.png
new file mode 100644
index 0000000..e8de5dc
--- /dev/null
+++ b/mindus/assets/blocks/turrets/spectre.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/sublimate.png b/mindus/assets/blocks/turrets/sublimate.png
new file mode 100644
index 0000000..8765018
--- /dev/null
+++ b/mindus/assets/blocks/turrets/sublimate.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/swarmer.png b/mindus/assets/blocks/turrets/swarmer.png
new file mode 100644
index 0000000..3408f0a
--- /dev/null
+++ b/mindus/assets/blocks/turrets/swarmer.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/titan.png b/mindus/assets/blocks/turrets/titan.png
new file mode 100644
index 0000000..5649f91
--- /dev/null
+++ b/mindus/assets/blocks/turrets/titan.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/tsunami.png b/mindus/assets/blocks/turrets/tsunami.png
new file mode 100644
index 0000000..eea1b10
--- /dev/null
+++ b/mindus/assets/blocks/turrets/tsunami.png
Binary files differ
diff --git a/mindus/assets/blocks/turrets/wave.png b/mindus/assets/blocks/turrets/wave.png
new file mode 100644
index 0000000..ac6aa6f
--- /dev/null
+++ b/mindus/assets/blocks/turrets/wave.png
Binary files differ
diff --git a/mindus/assets/blocks/units/additive-reconstructor-top.png b/mindus/assets/blocks/units/additive-reconstructor-top.png
new file mode 100644
index 0000000..4bebb1f
--- /dev/null
+++ b/mindus/assets/blocks/units/additive-reconstructor-top.png
Binary files differ
diff --git a/mindus/assets/blocks/units/additive-reconstructor.png b/mindus/assets/blocks/units/additive-reconstructor.png
new file mode 100644
index 0000000..7adf765
--- /dev/null
+++ b/mindus/assets/blocks/units/additive-reconstructor.png
Binary files differ
diff --git a/mindus/assets/blocks/units/air-factory.png b/mindus/assets/blocks/units/air-factory.png
new file mode 100644
index 0000000..457c7b7
--- /dev/null
+++ b/mindus/assets/blocks/units/air-factory.png
Binary files differ
diff --git a/mindus/assets/blocks/units/basic-assembler-module-side1.png b/mindus/assets/blocks/units/basic-assembler-module-side1.png
new file mode 100644
index 0000000..ec16f60
--- /dev/null
+++ b/mindus/assets/blocks/units/basic-assembler-module-side1.png
Binary files differ
diff --git a/mindus/assets/blocks/units/basic-assembler-module-side2.png b/mindus/assets/blocks/units/basic-assembler-module-side2.png
new file mode 100644
index 0000000..fec9314
--- /dev/null
+++ b/mindus/assets/blocks/units/basic-assembler-module-side2.png
Binary files differ
diff --git a/mindus/assets/blocks/units/basic-assembler-module.png b/mindus/assets/blocks/units/basic-assembler-module.png
new file mode 100644
index 0000000..cf6d2a7
--- /dev/null
+++ b/mindus/assets/blocks/units/basic-assembler-module.png
Binary files differ
diff --git a/mindus/assets/blocks/units/exponential-reconstructor-top.png b/mindus/assets/blocks/units/exponential-reconstructor-top.png
new file mode 100644
index 0000000..4b8429d
--- /dev/null
+++ b/mindus/assets/blocks/units/exponential-reconstructor-top.png
Binary files differ
diff --git a/mindus/assets/blocks/units/exponential-reconstructor.png b/mindus/assets/blocks/units/exponential-reconstructor.png
new file mode 100644
index 0000000..45fc0ed
--- /dev/null
+++ b/mindus/assets/blocks/units/exponential-reconstructor.png
Binary files differ
diff --git a/mindus/assets/blocks/units/ground-factory.png b/mindus/assets/blocks/units/ground-factory.png
new file mode 100644
index 0000000..17c34c1
--- /dev/null
+++ b/mindus/assets/blocks/units/ground-factory.png
Binary files differ
diff --git a/mindus/assets/blocks/units/mech-assembler-side1.png b/mindus/assets/blocks/units/mech-assembler-side1.png
new file mode 100644
index 0000000..670ea14
--- /dev/null
+++ b/mindus/assets/blocks/units/mech-assembler-side1.png
Binary files differ
diff --git a/mindus/assets/blocks/units/mech-assembler-side2.png b/mindus/assets/blocks/units/mech-assembler-side2.png
new file mode 100644
index 0000000..9aa22ee
--- /dev/null
+++ b/mindus/assets/blocks/units/mech-assembler-side2.png
Binary files differ
diff --git a/mindus/assets/blocks/units/mech-assembler-top.png b/mindus/assets/blocks/units/mech-assembler-top.png
new file mode 100644
index 0000000..a24db54
--- /dev/null
+++ b/mindus/assets/blocks/units/mech-assembler-top.png
Binary files differ
diff --git a/mindus/assets/blocks/units/mech-assembler.png b/mindus/assets/blocks/units/mech-assembler.png
new file mode 100644
index 0000000..523a036
--- /dev/null
+++ b/mindus/assets/blocks/units/mech-assembler.png
Binary files differ
diff --git a/mindus/assets/blocks/units/mech-fabricator-top.png b/mindus/assets/blocks/units/mech-fabricator-top.png
new file mode 100644
index 0000000..38608fd
--- /dev/null
+++ b/mindus/assets/blocks/units/mech-fabricator-top.png
Binary files differ
diff --git a/mindus/assets/blocks/units/mech-fabricator.png b/mindus/assets/blocks/units/mech-fabricator.png
new file mode 100644
index 0000000..5095ced
--- /dev/null
+++ b/mindus/assets/blocks/units/mech-fabricator.png
Binary files differ
diff --git a/mindus/assets/blocks/units/mech-refabricator-top.png b/mindus/assets/blocks/units/mech-refabricator-top.png
new file mode 100644
index 0000000..96ed2d6
--- /dev/null
+++ b/mindus/assets/blocks/units/mech-refabricator-top.png
Binary files differ
diff --git a/mindus/assets/blocks/units/mech-refabricator.png b/mindus/assets/blocks/units/mech-refabricator.png
new file mode 100644
index 0000000..919d506
--- /dev/null
+++ b/mindus/assets/blocks/units/mech-refabricator.png
Binary files differ
diff --git a/mindus/assets/blocks/units/multiplicative-reconstructor-top.png b/mindus/assets/blocks/units/multiplicative-reconstructor-top.png
new file mode 100644
index 0000000..fafb3d1
--- /dev/null
+++ b/mindus/assets/blocks/units/multiplicative-reconstructor-top.png
Binary files differ
diff --git a/mindus/assets/blocks/units/multiplicative-reconstructor.png b/mindus/assets/blocks/units/multiplicative-reconstructor.png
new file mode 100644
index 0000000..01325bb
--- /dev/null
+++ b/mindus/assets/blocks/units/multiplicative-reconstructor.png
Binary files differ
diff --git a/mindus/assets/blocks/units/naval-factory.png b/mindus/assets/blocks/units/naval-factory.png
new file mode 100644
index 0000000..1d28a1c
--- /dev/null
+++ b/mindus/assets/blocks/units/naval-factory.png
Binary files differ
diff --git a/mindus/assets/blocks/units/prime-refabricator-top.png b/mindus/assets/blocks/units/prime-refabricator-top.png
new file mode 100644
index 0000000..96e98f5
--- /dev/null
+++ b/mindus/assets/blocks/units/prime-refabricator-top.png
Binary files differ
diff --git a/mindus/assets/blocks/units/prime-refabricator.png b/mindus/assets/blocks/units/prime-refabricator.png
new file mode 100644
index 0000000..3211f45
--- /dev/null
+++ b/mindus/assets/blocks/units/prime-refabricator.png
Binary files differ
diff --git a/mindus/assets/blocks/units/repair-point.png b/mindus/assets/blocks/units/repair-point.png
new file mode 100644
index 0000000..30f82c6
--- /dev/null
+++ b/mindus/assets/blocks/units/repair-point.png
Binary files differ
diff --git a/mindus/assets/blocks/units/repair-turret.png b/mindus/assets/blocks/units/repair-turret.png
new file mode 100644
index 0000000..2ff7843
--- /dev/null
+++ b/mindus/assets/blocks/units/repair-turret.png
Binary files differ
diff --git a/mindus/assets/blocks/units/ship-assembler-side1.png b/mindus/assets/blocks/units/ship-assembler-side1.png
new file mode 100644
index 0000000..7ae1060
--- /dev/null
+++ b/mindus/assets/blocks/units/ship-assembler-side1.png
Binary files differ
diff --git a/mindus/assets/blocks/units/ship-assembler-side2.png b/mindus/assets/blocks/units/ship-assembler-side2.png
new file mode 100644
index 0000000..5391be4
--- /dev/null
+++ b/mindus/assets/blocks/units/ship-assembler-side2.png
Binary files differ
diff --git a/mindus/assets/blocks/units/ship-assembler-top.png b/mindus/assets/blocks/units/ship-assembler-top.png
new file mode 100644
index 0000000..7949283
--- /dev/null
+++ b/mindus/assets/blocks/units/ship-assembler-top.png
Binary files differ
diff --git a/mindus/assets/blocks/units/ship-assembler.png b/mindus/assets/blocks/units/ship-assembler.png
new file mode 100644
index 0000000..5fef2a0
--- /dev/null
+++ b/mindus/assets/blocks/units/ship-assembler.png
Binary files differ
diff --git a/mindus/assets/blocks/units/ship-fabricator-top.png b/mindus/assets/blocks/units/ship-fabricator-top.png
new file mode 100644
index 0000000..20ae525
--- /dev/null
+++ b/mindus/assets/blocks/units/ship-fabricator-top.png
Binary files differ
diff --git a/mindus/assets/blocks/units/ship-fabricator.png b/mindus/assets/blocks/units/ship-fabricator.png
new file mode 100644
index 0000000..3d88ae1
--- /dev/null
+++ b/mindus/assets/blocks/units/ship-fabricator.png
Binary files differ
diff --git a/mindus/assets/blocks/units/ship-refabricator-top.png b/mindus/assets/blocks/units/ship-refabricator-top.png
new file mode 100644
index 0000000..08bfb7d
--- /dev/null
+++ b/mindus/assets/blocks/units/ship-refabricator-top.png
Binary files differ
diff --git a/mindus/assets/blocks/units/ship-refabricator.png b/mindus/assets/blocks/units/ship-refabricator.png
new file mode 100644
index 0000000..bc8e7b1
--- /dev/null
+++ b/mindus/assets/blocks/units/ship-refabricator.png
Binary files differ
diff --git a/mindus/assets/blocks/units/tank-assembler-side1.png b/mindus/assets/blocks/units/tank-assembler-side1.png
new file mode 100644
index 0000000..ac67f7b
--- /dev/null
+++ b/mindus/assets/blocks/units/tank-assembler-side1.png
Binary files differ
diff --git a/mindus/assets/blocks/units/tank-assembler-side2.png b/mindus/assets/blocks/units/tank-assembler-side2.png
new file mode 100644
index 0000000..56df93f
--- /dev/null
+++ b/mindus/assets/blocks/units/tank-assembler-side2.png
Binary files differ
diff --git a/mindus/assets/blocks/units/tank-assembler-top.png b/mindus/assets/blocks/units/tank-assembler-top.png
new file mode 100644
index 0000000..8301360
--- /dev/null
+++ b/mindus/assets/blocks/units/tank-assembler-top.png
Binary files differ
diff --git a/mindus/assets/blocks/units/tank-assembler.png b/mindus/assets/blocks/units/tank-assembler.png
new file mode 100644
index 0000000..0fdcd4f
--- /dev/null
+++ b/mindus/assets/blocks/units/tank-assembler.png
Binary files differ
diff --git a/mindus/assets/blocks/units/tank-fabricator-top.png b/mindus/assets/blocks/units/tank-fabricator-top.png
new file mode 100644
index 0000000..73984a1
--- /dev/null
+++ b/mindus/assets/blocks/units/tank-fabricator-top.png
Binary files differ
diff --git a/mindus/assets/blocks/units/tank-fabricator.png b/mindus/assets/blocks/units/tank-fabricator.png
new file mode 100644
index 0000000..ee0ce46
--- /dev/null
+++ b/mindus/assets/blocks/units/tank-fabricator.png
Binary files differ
diff --git a/mindus/assets/blocks/units/tank-refabricator-top.png b/mindus/assets/blocks/units/tank-refabricator-top.png
new file mode 100644
index 0000000..2206ae2
--- /dev/null
+++ b/mindus/assets/blocks/units/tank-refabricator-top.png
Binary files differ
diff --git a/mindus/assets/blocks/units/tank-refabricator.png b/mindus/assets/blocks/units/tank-refabricator.png
new file mode 100644
index 0000000..ef43609
--- /dev/null
+++ b/mindus/assets/blocks/units/tank-refabricator.png
Binary files differ
diff --git a/mindus/assets/blocks/units/tetrative-reconstructor-top.png b/mindus/assets/blocks/units/tetrative-reconstructor-top.png
new file mode 100644
index 0000000..5675ecc
--- /dev/null
+++ b/mindus/assets/blocks/units/tetrative-reconstructor-top.png
Binary files differ
diff --git a/mindus/assets/blocks/units/tetrative-reconstructor.png b/mindus/assets/blocks/units/tetrative-reconstructor.png
new file mode 100644
index 0000000..40e1f56
--- /dev/null
+++ b/mindus/assets/blocks/units/tetrative-reconstructor.png
Binary files differ
diff --git a/mindus/assets/blocks/units/unit-cargo-loader.png b/mindus/assets/blocks/units/unit-cargo-loader.png
new file mode 100644
index 0000000..883973e
--- /dev/null
+++ b/mindus/assets/blocks/units/unit-cargo-loader.png
Binary files differ
diff --git a/mindus/assets/blocks/units/unit-repair-tower.png b/mindus/assets/blocks/units/unit-repair-tower.png
new file mode 100644
index 0000000..87abdaa
--- /dev/null
+++ b/mindus/assets/blocks/units/unit-repair-tower.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/beryllium-wall-large.png b/mindus/assets/blocks/walls/beryllium-wall-large.png
new file mode 100644
index 0000000..c067d99
--- /dev/null
+++ b/mindus/assets/blocks/walls/beryllium-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/beryllium-wall.png b/mindus/assets/blocks/walls/beryllium-wall.png
new file mode 100644
index 0000000..3fbe9ea
--- /dev/null
+++ b/mindus/assets/blocks/walls/beryllium-wall.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/blast-door-open.png b/mindus/assets/blocks/walls/blast-door-open.png
new file mode 100644
index 0000000..4b7f59b
--- /dev/null
+++ b/mindus/assets/blocks/walls/blast-door-open.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/blast-door.png b/mindus/assets/blocks/walls/blast-door.png
new file mode 100644
index 0000000..5f6ac3f
--- /dev/null
+++ b/mindus/assets/blocks/walls/blast-door.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/carbide-wall-large.png b/mindus/assets/blocks/walls/carbide-wall-large.png
new file mode 100644
index 0000000..a6e21ce
--- /dev/null
+++ b/mindus/assets/blocks/walls/carbide-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/carbide-wall.png b/mindus/assets/blocks/walls/carbide-wall.png
new file mode 100644
index 0000000..ee23407
--- /dev/null
+++ b/mindus/assets/blocks/walls/carbide-wall.png
Binary files differ
diff --git a/assets/blocks/walls/copper-wall-large.png b/mindus/assets/blocks/walls/copper-wall-large.png
index 3d4286e..3d4286e 100644
--- a/assets/blocks/walls/copper-wall-large.png
+++ b/mindus/assets/blocks/walls/copper-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/copper-wall.png b/mindus/assets/blocks/walls/copper-wall.png
new file mode 100644
index 0000000..a9ed4f6
--- /dev/null
+++ b/mindus/assets/blocks/walls/copper-wall.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/door-large-open.png b/mindus/assets/blocks/walls/door-large-open.png
new file mode 100644
index 0000000..cfd8cf3
--- /dev/null
+++ b/mindus/assets/blocks/walls/door-large-open.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/door-large.png b/mindus/assets/blocks/walls/door-large.png
new file mode 100644
index 0000000..aaaf2c7
--- /dev/null
+++ b/mindus/assets/blocks/walls/door-large.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/door-open.png b/mindus/assets/blocks/walls/door-open.png
new file mode 100644
index 0000000..f07b341
--- /dev/null
+++ b/mindus/assets/blocks/walls/door-open.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/door.png b/mindus/assets/blocks/walls/door.png
new file mode 100644
index 0000000..e80493c
--- /dev/null
+++ b/mindus/assets/blocks/walls/door.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/phase-wall-large.png b/mindus/assets/blocks/walls/phase-wall-large.png
new file mode 100644
index 0000000..ced55cf
--- /dev/null
+++ b/mindus/assets/blocks/walls/phase-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/phase-wall.png b/mindus/assets/blocks/walls/phase-wall.png
new file mode 100644
index 0000000..2cc4580
--- /dev/null
+++ b/mindus/assets/blocks/walls/phase-wall.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/plastanium-wall-large.png b/mindus/assets/blocks/walls/plastanium-wall-large.png
new file mode 100644
index 0000000..bcd7e44
--- /dev/null
+++ b/mindus/assets/blocks/walls/plastanium-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/plastanium-wall.png b/mindus/assets/blocks/walls/plastanium-wall.png
new file mode 100644
index 0000000..11038ff
--- /dev/null
+++ b/mindus/assets/blocks/walls/plastanium-wall.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/reinforced-surge-wall-large.png b/mindus/assets/blocks/walls/reinforced-surge-wall-large.png
new file mode 100644
index 0000000..9a8c943
--- /dev/null
+++ b/mindus/assets/blocks/walls/reinforced-surge-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/reinforced-surge-wall.png b/mindus/assets/blocks/walls/reinforced-surge-wall.png
new file mode 100644
index 0000000..1777cbb
--- /dev/null
+++ b/mindus/assets/blocks/walls/reinforced-surge-wall.png
Binary files differ
diff --git a/assets/blocks/walls/scrap-wall-gigantic.png b/mindus/assets/blocks/walls/scrap-wall-gigantic.png
index c503468..c503468 100644
--- a/assets/blocks/walls/scrap-wall-gigantic.png
+++ b/mindus/assets/blocks/walls/scrap-wall-gigantic.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/scrap-wall-huge.png b/mindus/assets/blocks/walls/scrap-wall-huge.png
new file mode 100644
index 0000000..a22f775
--- /dev/null
+++ b/mindus/assets/blocks/walls/scrap-wall-huge.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/scrap-wall-large.png b/mindus/assets/blocks/walls/scrap-wall-large.png
new file mode 100644
index 0000000..f755c40
--- /dev/null
+++ b/mindus/assets/blocks/walls/scrap-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/scrap-wall.png b/mindus/assets/blocks/walls/scrap-wall.png
new file mode 100644
index 0000000..84ad269
--- /dev/null
+++ b/mindus/assets/blocks/walls/scrap-wall.png
Binary files differ
diff --git a/assets/blocks/walls/shielded-wall.png b/mindus/assets/blocks/walls/shielded-wall.png
index 1c6f453..1c6f453 100644
--- a/assets/blocks/walls/shielded-wall.png
+++ b/mindus/assets/blocks/walls/shielded-wall.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/surge-wall-large.png b/mindus/assets/blocks/walls/surge-wall-large.png
new file mode 100644
index 0000000..b83ffce
--- /dev/null
+++ b/mindus/assets/blocks/walls/surge-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/surge-wall.png b/mindus/assets/blocks/walls/surge-wall.png
new file mode 100644
index 0000000..c9f7b1e
--- /dev/null
+++ b/mindus/assets/blocks/walls/surge-wall.png
Binary files differ
diff --git a/assets/blocks/walls/thorium-wall-large.png b/mindus/assets/blocks/walls/thorium-wall-large.png
index 551f775..551f775 100644
--- a/assets/blocks/walls/thorium-wall-large.png
+++ b/mindus/assets/blocks/walls/thorium-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/thorium-wall.png b/mindus/assets/blocks/walls/thorium-wall.png
new file mode 100644
index 0000000..0167e34
--- /dev/null
+++ b/mindus/assets/blocks/walls/thorium-wall.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/thruster-top.png b/mindus/assets/blocks/walls/thruster-top.png
new file mode 100644
index 0000000..8cbce9b
--- /dev/null
+++ b/mindus/assets/blocks/walls/thruster-top.png
Binary files differ
diff --git a/assets/blocks/walls/thruster.png b/mindus/assets/blocks/walls/thruster.png
index ec800a0..ec800a0 100644
--- a/assets/blocks/walls/thruster.png
+++ b/mindus/assets/blocks/walls/thruster.png
Binary files differ
diff --git a/assets/blocks/walls/titanium-wall-large.png b/mindus/assets/blocks/walls/titanium-wall-large.png
index 6573133..6573133 100644
--- a/assets/blocks/walls/titanium-wall-large.png
+++ b/mindus/assets/blocks/walls/titanium-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/titanium-wall.png b/mindus/assets/blocks/walls/titanium-wall.png
new file mode 100644
index 0000000..e26c955
--- /dev/null
+++ b/mindus/assets/blocks/walls/titanium-wall.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/tungsten-wall-large.png b/mindus/assets/blocks/walls/tungsten-wall-large.png
new file mode 100644
index 0000000..97cc952
--- /dev/null
+++ b/mindus/assets/blocks/walls/tungsten-wall-large.png
Binary files differ
diff --git a/mindus/assets/blocks/walls/tungsten-wall.png b/mindus/assets/blocks/walls/tungsten-wall.png
new file mode 100644
index 0000000..774f819
--- /dev/null
+++ b/mindus/assets/blocks/walls/tungsten-wall.png
Binary files differ
diff --git a/mindus/assets/units/aegires.png b/mindus/assets/units/aegires.png
new file mode 100644
index 0000000..0b7baf9
--- /dev/null
+++ b/mindus/assets/units/aegires.png
Binary files differ
diff --git a/mindus/assets/units/alpha.png b/mindus/assets/units/alpha.png
new file mode 100644
index 0000000..868df0d
--- /dev/null
+++ b/mindus/assets/units/alpha.png
Binary files differ
diff --git a/mindus/assets/units/anthicus-missile.png b/mindus/assets/units/anthicus-missile.png
new file mode 100644
index 0000000..406dc4b
--- /dev/null
+++ b/mindus/assets/units/anthicus-missile.png
Binary files differ
diff --git a/mindus/assets/units/anthicus.png b/mindus/assets/units/anthicus.png
new file mode 100644
index 0000000..96e6674
--- /dev/null
+++ b/mindus/assets/units/anthicus.png
Binary files differ
diff --git a/mindus/assets/units/antumbra.png b/mindus/assets/units/antumbra.png
new file mode 100644
index 0000000..ae10200
--- /dev/null
+++ b/mindus/assets/units/antumbra.png
Binary files differ
diff --git a/mindus/assets/units/arkyid.png b/mindus/assets/units/arkyid.png
new file mode 100644
index 0000000..39ec11e
--- /dev/null
+++ b/mindus/assets/units/arkyid.png
Binary files differ
diff --git a/mindus/assets/units/assembly-drone.png b/mindus/assets/units/assembly-drone.png
new file mode 100644
index 0000000..bb9104b
--- /dev/null
+++ b/mindus/assets/units/assembly-drone.png
Binary files differ
diff --git a/mindus/assets/units/atrax.png b/mindus/assets/units/atrax.png
new file mode 100644
index 0000000..5de4da8
--- /dev/null
+++ b/mindus/assets/units/atrax.png
Binary files differ
diff --git a/mindus/assets/units/avert.png b/mindus/assets/units/avert.png
new file mode 100644
index 0000000..451e5ee
--- /dev/null
+++ b/mindus/assets/units/avert.png
Binary files differ
diff --git a/mindus/assets/units/beta.png b/mindus/assets/units/beta.png
new file mode 100644
index 0000000..4739bb8
--- /dev/null
+++ b/mindus/assets/units/beta.png
Binary files differ
diff --git a/mindus/assets/units/bryde.png b/mindus/assets/units/bryde.png
new file mode 100644
index 0000000..2b95dc1
--- /dev/null
+++ b/mindus/assets/units/bryde.png
Binary files differ
diff --git a/mindus/assets/units/cleroi.png b/mindus/assets/units/cleroi.png
new file mode 100644
index 0000000..8d90617
--- /dev/null
+++ b/mindus/assets/units/cleroi.png
Binary files differ
diff --git a/mindus/assets/units/collaris.png b/mindus/assets/units/collaris.png
new file mode 100644
index 0000000..5858a88
--- /dev/null
+++ b/mindus/assets/units/collaris.png
Binary files differ
diff --git a/mindus/assets/units/conquer.png b/mindus/assets/units/conquer.png
new file mode 100644
index 0000000..d1d73b6
--- /dev/null
+++ b/mindus/assets/units/conquer.png
Binary files differ
diff --git a/mindus/assets/units/corvus.png b/mindus/assets/units/corvus.png
new file mode 100644
index 0000000..84a4c18
--- /dev/null
+++ b/mindus/assets/units/corvus.png
Binary files differ
diff --git a/mindus/assets/units/crawler.png b/mindus/assets/units/crawler.png
new file mode 100644
index 0000000..df0b6b0
--- /dev/null
+++ b/mindus/assets/units/crawler.png
Binary files differ
diff --git a/mindus/assets/units/cyerce.png b/mindus/assets/units/cyerce.png
new file mode 100644
index 0000000..903fbe3
--- /dev/null
+++ b/mindus/assets/units/cyerce.png
Binary files differ
diff --git a/mindus/assets/units/dagger.png b/mindus/assets/units/dagger.png
new file mode 100644
index 0000000..609f158
--- /dev/null
+++ b/mindus/assets/units/dagger.png
Binary files differ
diff --git a/mindus/assets/units/disrupt-missile.png b/mindus/assets/units/disrupt-missile.png
new file mode 100644
index 0000000..6d0ad76
--- /dev/null
+++ b/mindus/assets/units/disrupt-missile.png
Binary files differ
diff --git a/mindus/assets/units/disrupt.png b/mindus/assets/units/disrupt.png
new file mode 100644
index 0000000..f25c032
--- /dev/null
+++ b/mindus/assets/units/disrupt.png
Binary files differ
diff --git a/mindus/assets/units/eclipse.png b/mindus/assets/units/eclipse.png
new file mode 100644
index 0000000..ca644ca
--- /dev/null
+++ b/mindus/assets/units/eclipse.png
Binary files differ
diff --git a/mindus/assets/units/elude.png b/mindus/assets/units/elude.png
new file mode 100644
index 0000000..09e0de0
--- /dev/null
+++ b/mindus/assets/units/elude.png
Binary files differ
diff --git a/mindus/assets/units/emanate.png b/mindus/assets/units/emanate.png
new file mode 100644
index 0000000..e4109fc
--- /dev/null
+++ b/mindus/assets/units/emanate.png
Binary files differ
diff --git a/mindus/assets/units/evoke.png b/mindus/assets/units/evoke.png
new file mode 100644
index 0000000..891ff30
--- /dev/null
+++ b/mindus/assets/units/evoke.png
Binary files differ
diff --git a/mindus/assets/units/flare.png b/mindus/assets/units/flare.png
new file mode 100644
index 0000000..6000f66
--- /dev/null
+++ b/mindus/assets/units/flare.png
Binary files differ
diff --git a/mindus/assets/units/fortress.png b/mindus/assets/units/fortress.png
new file mode 100644
index 0000000..bbdf6e1
--- /dev/null
+++ b/mindus/assets/units/fortress.png
Binary files differ
diff --git a/mindus/assets/units/gamma.png b/mindus/assets/units/gamma.png
new file mode 100644
index 0000000..bcb08df
--- /dev/null
+++ b/mindus/assets/units/gamma.png
Binary files differ
diff --git a/mindus/assets/units/horizon.png b/mindus/assets/units/horizon.png
new file mode 100644
index 0000000..11d2739
--- /dev/null
+++ b/mindus/assets/units/horizon.png
Binary files differ
diff --git a/mindus/assets/units/incite.png b/mindus/assets/units/incite.png
new file mode 100644
index 0000000..34131f3
--- /dev/null
+++ b/mindus/assets/units/incite.png
Binary files differ
diff --git a/mindus/assets/units/latum.png b/mindus/assets/units/latum.png
new file mode 100644
index 0000000..ecba602
--- /dev/null
+++ b/mindus/assets/units/latum.png
Binary files differ
diff --git a/mindus/assets/units/locus.png b/mindus/assets/units/locus.png
new file mode 100644
index 0000000..1cb66bf
--- /dev/null
+++ b/mindus/assets/units/locus.png
Binary files differ
diff --git a/mindus/assets/units/mace.png b/mindus/assets/units/mace.png
new file mode 100644
index 0000000..0b4a6a2
--- /dev/null
+++ b/mindus/assets/units/mace.png
Binary files differ
diff --git a/mindus/assets/units/manifold.png b/mindus/assets/units/manifold.png
new file mode 100644
index 0000000..d42d391
--- /dev/null
+++ b/mindus/assets/units/manifold.png
Binary files differ
diff --git a/mindus/assets/units/mega.png b/mindus/assets/units/mega.png
new file mode 100644
index 0000000..7f58fab
--- /dev/null
+++ b/mindus/assets/units/mega.png
Binary files differ
diff --git a/mindus/assets/units/merui.png b/mindus/assets/units/merui.png
new file mode 100644
index 0000000..a28422c
--- /dev/null
+++ b/mindus/assets/units/merui.png
Binary files differ
diff --git a/mindus/assets/units/minke.png b/mindus/assets/units/minke.png
new file mode 100644
index 0000000..0cc85e7
--- /dev/null
+++ b/mindus/assets/units/minke.png
Binary files differ
diff --git a/mindus/assets/units/mono.png b/mindus/assets/units/mono.png
new file mode 100644
index 0000000..533a3ed
--- /dev/null
+++ b/mindus/assets/units/mono.png
Binary files differ
diff --git a/mindus/assets/units/navanax.png b/mindus/assets/units/navanax.png
new file mode 100644
index 0000000..da64343
--- /dev/null
+++ b/mindus/assets/units/navanax.png
Binary files differ
diff --git a/mindus/assets/units/nova.png b/mindus/assets/units/nova.png
new file mode 100644
index 0000000..7ab100d
--- /dev/null
+++ b/mindus/assets/units/nova.png
Binary files differ
diff --git a/mindus/assets/units/obviate.png b/mindus/assets/units/obviate.png
new file mode 100644
index 0000000..a836265
--- /dev/null
+++ b/mindus/assets/units/obviate.png
Binary files differ
diff --git a/mindus/assets/units/oct.png b/mindus/assets/units/oct.png
new file mode 100644
index 0000000..8c18198
--- /dev/null
+++ b/mindus/assets/units/oct.png
Binary files differ
diff --git a/mindus/assets/units/omura.png b/mindus/assets/units/omura.png
new file mode 100644
index 0000000..be703c6
--- /dev/null
+++ b/mindus/assets/units/omura.png
Binary files differ
diff --git a/mindus/assets/units/oxynoe.png b/mindus/assets/units/oxynoe.png
new file mode 100644
index 0000000..87fc11a
--- /dev/null
+++ b/mindus/assets/units/oxynoe.png
Binary files differ
diff --git a/mindus/assets/units/poly.png b/mindus/assets/units/poly.png
new file mode 100644
index 0000000..e792d5e
--- /dev/null
+++ b/mindus/assets/units/poly.png
Binary files differ
diff --git a/mindus/assets/units/precept.png b/mindus/assets/units/precept.png
new file mode 100644
index 0000000..32fe877
--- /dev/null
+++ b/mindus/assets/units/precept.png
Binary files differ
diff --git a/mindus/assets/units/pulsar.png b/mindus/assets/units/pulsar.png
new file mode 100644
index 0000000..152c365
--- /dev/null
+++ b/mindus/assets/units/pulsar.png
Binary files differ
diff --git a/mindus/assets/units/quad.png b/mindus/assets/units/quad.png
new file mode 100644
index 0000000..09986db
--- /dev/null
+++ b/mindus/assets/units/quad.png
Binary files differ
diff --git a/mindus/assets/units/quasar.png b/mindus/assets/units/quasar.png
new file mode 100644
index 0000000..cc9ac31
--- /dev/null
+++ b/mindus/assets/units/quasar.png
Binary files differ
diff --git a/mindus/assets/units/quell-missile.png b/mindus/assets/units/quell-missile.png
new file mode 100644
index 0000000..dd05d06
--- /dev/null
+++ b/mindus/assets/units/quell-missile.png
Binary files differ
diff --git a/mindus/assets/units/quell.png b/mindus/assets/units/quell.png
new file mode 100644
index 0000000..f724c4e
--- /dev/null
+++ b/mindus/assets/units/quell.png
Binary files differ
diff --git a/mindus/assets/units/reign.png b/mindus/assets/units/reign.png
new file mode 100644
index 0000000..55701e6
--- /dev/null
+++ b/mindus/assets/units/reign.png
Binary files differ
diff --git a/mindus/assets/units/renale.png b/mindus/assets/units/renale.png
new file mode 100644
index 0000000..d4283d4
--- /dev/null
+++ b/mindus/assets/units/renale.png
Binary files differ
diff --git a/mindus/assets/units/retusa.png b/mindus/assets/units/retusa.png
new file mode 100644
index 0000000..3e7ebbd
--- /dev/null
+++ b/mindus/assets/units/retusa.png
Binary files differ
diff --git a/mindus/assets/units/risso.png b/mindus/assets/units/risso.png
new file mode 100644
index 0000000..97d9d2f
--- /dev/null
+++ b/mindus/assets/units/risso.png
Binary files differ
diff --git a/mindus/assets/units/scathe-missile.png b/mindus/assets/units/scathe-missile.png
new file mode 100644
index 0000000..1138357
--- /dev/null
+++ b/mindus/assets/units/scathe-missile.png
Binary files differ
diff --git a/mindus/assets/units/scepter.png b/mindus/assets/units/scepter.png
new file mode 100644
index 0000000..61b87a6
--- /dev/null
+++ b/mindus/assets/units/scepter.png
Binary files differ
diff --git a/mindus/assets/units/sei.png b/mindus/assets/units/sei.png
new file mode 100644
index 0000000..695824e
--- /dev/null
+++ b/mindus/assets/units/sei.png
Binary files differ
diff --git a/mindus/assets/units/spiroct.png b/mindus/assets/units/spiroct.png
new file mode 100644
index 0000000..2670acc
--- /dev/null
+++ b/mindus/assets/units/spiroct.png
Binary files differ
diff --git a/mindus/assets/units/stell.png b/mindus/assets/units/stell.png
new file mode 100644
index 0000000..0d06858
--- /dev/null
+++ b/mindus/assets/units/stell.png
Binary files differ
diff --git a/mindus/assets/units/tecta.png b/mindus/assets/units/tecta.png
new file mode 100644
index 0000000..66f473c
--- /dev/null
+++ b/mindus/assets/units/tecta.png
Binary files differ
diff --git a/mindus/assets/units/toxopid.png b/mindus/assets/units/toxopid.png
new file mode 100644
index 0000000..04349f5
--- /dev/null
+++ b/mindus/assets/units/toxopid.png
Binary files differ
diff --git a/mindus/assets/units/vanquish.png b/mindus/assets/units/vanquish.png
new file mode 100644
index 0000000..09b8c51
--- /dev/null
+++ b/mindus/assets/units/vanquish.png
Binary files differ
diff --git a/mindus/assets/units/vela.png b/mindus/assets/units/vela.png
new file mode 100644
index 0000000..a76ec93
--- /dev/null
+++ b/mindus/assets/units/vela.png
Binary files differ
diff --git a/mindus/assets/units/zenith.png b/mindus/assets/units/zenith.png
new file mode 100644
index 0000000..a015009
--- /dev/null
+++ b/mindus/assets/units/zenith.png
Binary files differ
diff --git a/mindus/build.rs b/mindus/build.rs
new file mode 100644
index 0000000..2edc445
--- /dev/null
+++ b/mindus/build.rs
@@ -0,0 +1,187 @@
+use fimg::DynImage;
+use rand::RngExt;
+use std::fs::File;
+use std::io::Write as _;
+use std::iter::Iterator;
+use std::path::Path;
+use walkdir::WalkDir;
+
+macro_rules! wr {
+ ($dst:expr => $($arg:tt)*) => { writeln!($dst, $($arg)*).unwrap() };
+}
+
+fn kebab2bigsnek(kebab: &str) -> String {
+ let mut n = String::new();
+ n.reserve(kebab.len());
+ for c in kebab.chars() {
+ if c == '-' {
+ n.push('_');
+ } else {
+ n.push(c.to_ascii_uppercase());
+ }
+ }
+ n
+}
+
+fn main() {
+ let _ = std::fs::remove_dir_all("target/out");
+ let walkdir = WalkDir::new("assets");
+ println!("cargo:rerun-if-changed=assets/");
+ println!("cargo:rerun-if-changed=build.rs");
+ let o = std::env::var("OUT_DIR").unwrap();
+ let o = Path::new(&o);
+ let mut full = File::create(o.join("full.rs")).unwrap();
+ // let mut half = File::create(o.join("half.rs")).unwrap();
+ let mut quar = File::create(o.join("quar.rs")).unwrap();
+ let mut eigh = File::create(o.join("eigh.rs")).unwrap();
+
+ let mut n = 22usize;
+
+ wr!(full => "pub mod full {{");
+ wr!(full => "pub static EMPTY4: Image<&[u8], 4> = Image::make::<32, 32>();");
+ wr!(full => "pub static EMPTY: Image<&[u8], 3> = Image::make::<32, 32>();");
+
+ wr!(quar => "pub mod quar {{");
+ // forced to do this because try_into isnt const
+ wr!(quar => "pub static EMPTY4: Image<&[u8], 4> = Image::make::<8, 8>();");
+ wr!(quar => "pub static EMPTY: Image<&[u8], 3> = Image::make::<8, 8>();");
+
+ wr!(eigh => "pub mod eigh {{");
+ wr!(eigh => "pub static EMPTY4: Image<&[u8], 4> = Image::make::<4, 4>();");
+ wr!(eigh => "pub static EMPTY: Image<&[u8], 3> = Image::make::<4, 4>();");
+
+ for mut file in [&full, &quar, &eigh] {
+ wr!(file => "use crate::utils::Image;");
+ wr!(file => "pub static CLIFF: Image<&[u8], 4> = EMPTY4.copy();");
+ for i in 1..=16 {
+ wr!(file => "pub static BUILD{}: Image<&[u8], 4> = EMPTY4.copy();", i);
+ }
+ }
+ for e in walkdir.into_iter().filter_map(Result::ok) {
+ let path = e.path();
+ if path.is_file()
+ && let Some(e) = path.extension()
+ && e == "png"
+ {
+ let mut p = DynImage::open(path);
+ let rgb = p.clone().to_rgba().chunked().all(|x| x[3] == 255);
+ if path
+ .file_name()
+ .unwrap()
+ .to_str()
+ .unwrap()
+ .contains("-liquid.png")
+ {
+ continue;
+ }
+ let f = path.file_name().unwrap().to_str().unwrap();
+ if f.contains("bottom")
+ || f.contains("-team")
+ || f.contains("-end")
+ || f.contains("stack")
+ {
+ continue;
+ }
+ // let rgb = path.components().any(|c| c.as_os_str() == "floors");
+ let env = path.components().any(|c| c.as_os_str() == "environment");
+ let path = kebab2bigsnek(
+ path.with_extension("")
+ .file_name()
+ .unwrap()
+ .to_str()
+ .unwrap(),
+ );
+ if matches!(
+ path.as_str(),
+ "CLIFF_CRUSHER_ROTATOR"
+ | "NEOPLASIA_REACTOR_CENTER"
+ | "FLUX_REACTOR_MID"
+ | "EDGE"
+ // | "PHASE_CONVEYOR_BRIDGE"
+ | "BRIDGE_ARROW"
+ // | "DUCT_BRIDGE_BRIDGE"
+ // | "DUCT_BRIDGE_ARROW"
+ | "LAUNCHPOD"
+ // | "BRIDGE_CONVEYOR_BRIDGE"
+ // | "BRIDGE_CONVEYOR_ARROW"
+ // | "PHASE_CONVEYOR_ARROW"
+ // | "REINFORCED_BRIDGE_CONDUIT_ARROW"
+ // | "REINFORCED_BRIDGE_CONDUIT_BRIDGE"
+ // | "PHASE_CONDUIT_BRIDGE"
+ // | "BRIDGE_CONDUIT_ARROW"
+ // | "PHASE_CONDUIT_ARROW"
+ // | "BRIDGE_CONDUIT_BRIDGE"
+ | "PLATED_CONDUIT_CAP"
+ ) {
+ continue;
+ }
+ println!("do {path}");
+
+ macro_rules! writ {
+ ($ext:ident / $scale:literal) => {
+ let mut buf = File::create(o.join(n.to_string() + "-" + stringify!($ext))).unwrap();
+ let out_path = format!("{}/{n}-{}", o.display(), stringify!($ext));
+ // boulders
+ let (mx, my) = if env && p.width() + p.height() == 48+48 {
+ (32, 32)
+ // vents (dont match VENT_CONDENSER, do match (RHYOLITE_VENT)
+ } else if path.contains("_VENT")
+ // talls
+ || matches!(path.as_str(), "YELLOWCORAL" | "WHITE_TREE" | "WHITE_TREE_DEAD" | "REDWEED" | "SPORE_CLUSTER" | "CRYSTAL_BLOCKS" | "CRYSTAL_CLUSTER" | "VIBRANT_CRYSTAL_CLUSTER" | "CRYSTAL_ORBS") {
+ (32, 32)
+ } else {
+ (p.height(), p.height())
+ };
+ let new = if $scale == 1 {
+ p.clone()
+ } else {
+ p.scale::<fimg::scale::Nearest>(mx / $scale, my / $scale)
+ };
+ let rgb = env && rgb;
+ let x = new.width();
+ let y = new.height();
+ if rgb {
+ buf.write_all(&new.to_rgb().bytes()).unwrap();
+ wr!($ext => r#"pub(crate) static {path}: Image<&[u8], 3> = unsafe {{ Image::new(std::num::NonZeroU32::new({x}).unwrap(), std::num::NonZeroU32::new({y}).unwrap(), include_bytes!(r"{out_path}")) }};"#);
+ } else {
+ buf.write_all(&new.to_rgba().bytes()).unwrap();
+ wr!($ext => r#"pub(crate) static {path}: Image<&[u8], 4> = unsafe {{ Image::new(std::num::NonZeroU32::new({x}).unwrap(), std::num::NonZeroU32::new({y}).unwrap(), include_bytes!(r"{out_path}")) }};"#);
+ }
+ };
+ }
+ writ!(full / 1);
+ // writ!(half + 0.5);
+ writ!(quar / 4);
+ writ!(eigh / 8);
+ n += 1;
+ }
+ }
+ for f in std::fs::read_dir("assets/blocks/environment")
+ .unwrap()
+ .filter_map(Result::ok)
+ .filter_map(|x| x.file_name().to_str().map(String::from))
+ .filter(|x| x.contains("1"))
+ .filter(|x| !x.contains("dark-panel"))
+ {
+ dbg!(&f);
+ let f = &f[..f.len() - 5];
+ let count = WalkDir::new("assets/blocks/environment")
+ .into_iter()
+ .filter_map(Result::ok)
+ .filter_map(|x| x.file_name().to_str().map(String::from))
+ .filter(|x| &x[..x.len() - 5] == f)
+ .count();
+ let f = kebab2bigsnek(f);
+ for n in count + 1..=8 {
+ let r = rand::rng().random_range(1..=count);
+ wr!(full => r#"pub(crate) static {f}{n}: Image<&[u8], {{{f}1.channels()}}> = {f}{r}.copy();"#);
+ wr!(quar => r#"pub(crate) static {f}{n}: Image<&[u8], {{{f}1.channels()}}> = {f}{r}.copy();"#);
+ wr!(eigh => r#"pub(crate) static {f}{n}: Image<&[u8], {{{f}1.channels()}}> = {f}{r}.copy();"#);
+ }
+ println!("{count} {f}");
+ }
+ // panic!();
+ for mut f in [full, eigh, quar] {
+ f.write_all(b"}").unwrap();
+ }
+}
diff --git a/items.py b/mindus/items.py
index 922cc30..922cc30 100644
--- a/items.py
+++ b/mindus/items.py
diff --git a/res/team_names.txt b/mindus/res/team_names.txt
index 37adee8..37adee8 100644
--- a/res/team_names.txt
+++ b/mindus/res/team_names.txt
diff --git a/mindus/src/block/campaign.rs b/mindus/src/block/campaign.rs
new file mode 100644
index 0000000..8b0e52e
--- /dev/null
+++ b/mindus/src/block/campaign.rs
@@ -0,0 +1,90 @@
+use fimg::Overlay;
+
+use crate::{
+ block::{
+ BlockLogic, DataConvertError, DeserializeError, SerializeError, State,
+ all::{ItemConvertError, ItemDeserializeError},
+ impl_block,
+ simple::{BuildCost, state_impl},
+ },
+ content,
+ data::{
+ GridPos,
+ dynamic::{DynData, DynType},
+ },
+ item::Type as Item,
+ load,
+ utils::{ImageHolder, ImageUtils},
+};
+
+pub struct LandingPadBlock {
+ size: u8,
+ symmetric: bool,
+ build_cost: BuildCost,
+}
+
+impl LandingPadBlock {
+ #[must_use]
+ pub const fn new(size: u8, symmetric: bool, build_cost: BuildCost) -> LandingPadBlock {
+ assert!(size != 0, "invalid size");
+
+ Self {
+ size,
+ symmetric,
+ build_cost,
+ }
+ }
+
+ state_impl!(pub Option<Item>);
+}
+
+impl BlockLogic for LandingPadBlock {
+ impl_block!();
+
+ fn data_from_i32(&self, config: i32, _: GridPos) -> Result<DynData, DataConvertError> {
+ if config < 0 || config > i32::from(u16::MAX) {
+ return Err(DataConvertError::Custom(Box::new(ItemConvertError(config))));
+ }
+ Ok(DynData::Content(content::Type::Item, config as u16))
+ }
+
+ fn deserialize_state(&self, data: DynData) -> Result<Option<State>, DeserializeError> {
+ match data {
+ DynData::Empty => Ok(Some(Self::create_state(None))),
+ DynData::Content(content::Type::Item, id) => Ok(Some(Self::create_state(Some(
+ ItemDeserializeError::forward(Item::try_from(id))?,
+ )))),
+ DynData::Content(have, ..) => Err(DeserializeError::Custom(Box::new(
+ ItemDeserializeError::ContentType(have),
+ ))),
+ _ => Err(DeserializeError::InvalidType {
+ have: data.get_type(),
+ expect: DynType::Content,
+ }),
+ }
+ }
+ fn serialize_state(&self, state: &State) -> Result<DynData, SerializeError> {
+ Ok(Self::get_state(state).map_or(DynData::Empty, |item| {
+ DynData::Content(content::Type::Item, item.into())
+ }))
+ }
+ fn draw(
+ &self,
+ _: &str,
+ state: Option<&State>,
+ _: Option<&crate::data::autotile::RenderingContext>,
+ _: super::Rotation,
+ scale: crate::data::renderer::Scale,
+ ) -> crate::utils::ImageHolder<4> {
+ let mut i: ImageHolder<4> = load!("landing-pad", scale);
+
+ match state.map(Self::get_state) {
+ Some(Some(item)) => {
+ let mut x = load!("landing-pad-bg", scale);
+ unsafe { i.overlay(x.tint(item.color())) };
+ }
+ _ => {}
+ }
+ i
+ }
+}
diff --git a/mindus/src/block/content.rs b/mindus/src/block/content.rs
new file mode 100644
index 0000000..afec25a
--- /dev/null
+++ b/mindus/src/block/content.rs
@@ -0,0 +1,455 @@
+//! everything
+use crate::content::content_enum;
+
+content_enum! {
+ pub enum Type / Block for u16 | TryFromU16Error
+ {
+ "air",
+ "spawn",
+ "remove-wall",
+ "remove-ore",
+ "cliff",
+ "build1",
+ "build2",
+ "build3",
+ "build4",
+ "build5",
+ "build6",
+ "build7",
+ "build8",
+ "build9",
+ "build10",
+ "build11",
+ "build12",
+ "build13",
+ "build14",
+ "build15",
+ "build16",
+ "deep-water",
+ "shallow-water",
+ "tainted-water",
+ "deep-tainted-water",
+ "darksand-tainted-water",
+ "sand-water",
+ "darksand-water",
+ "tar",
+ "pooled-cryofluid",
+ "molten-slag",
+ "space",
+ "empty",
+ "stone",
+ "crater-stone",
+ "char",
+ "basalt",
+ "hotrock",
+ "magmarock",
+ "sand-floor",
+ "darksand",
+ "dirt",
+ "mud",
+ "dacite",
+ "rhyolite",
+ "rhyolite-crater",
+ "rough-rhyolite",
+ "regolith",
+ "yellow-stone",
+ "carbon-stone",
+ "ferric-stone",
+ "ferric-craters",
+ "beryllic-stone",
+ "crystalline-stone",
+ "crystal-floor",
+ "yellow-stone-plates",
+ "red-stone",
+ "dense-red-stone",
+ "red-ice",
+ "arkycite-floor",
+ "arkyic-stone",
+ "rhyolite-vent",
+ "carbon-vent",
+ "arkyic-vent",
+ "yellow-stone-vent",
+ "red-stone-vent",
+ "crystalline-vent",
+ "stone-vent",
+ "basalt-vent",
+ "redmat",
+ "bluemat",
+ "grass",
+ "salt",
+ "snow",
+ "ice",
+ "ice-snow",
+ "shale",
+ "moss",
+ "core-zone",
+ "spore-moss",
+ "stone-wall",
+ "spore-wall",
+ "dirt-wall",
+ "dacite-wall",
+ "ice-wall",
+ "snow-wall",
+ "dune-wall",
+ "regolith-wall",
+ "yellow-stone-wall",
+ "rhyolite-wall",
+ "carbon-wall",
+ "ferric-stone-wall",
+ "beryllic-stone-wall",
+ "arkyic-wall",
+ "crystalline-stone-wall",
+ "red-ice-wall",
+ "red-stone-wall",
+ "red-diamond-wall",
+ "sand-wall",
+ "salt-wall",
+ "shrubs",
+ "shale-wall",
+ "spore-pine",
+ "snow-pine",
+ "pine",
+ "white-tree-dead",
+ "white-tree",
+ "spore-cluster",
+ "redweed",
+ "pur-bush",
+ "yellowcoral",
+ "boulder",
+ "snow-boulder",
+ "shale-boulder",
+ "sand-boulder",
+ "dacite-boulder",
+ "basalt-boulder",
+ "carbon-boulder",
+ "ferric-boulder",
+ "beryllic-boulder",
+ "yellow-stone-boulder",
+ "arkyic-boulder",
+ "crystal-cluster",
+ "vibrant-crystal-cluster",
+ "crystal-blocks",
+ "crystal-orbs",
+ "crystalline-boulder",
+ "red-ice-boulder",
+ "rhyolite-boulder",
+ "red-stone-boulder",
+ "metal-floor",
+ "metal-floor-damaged",
+ "metal-floor-2",
+ "metal-floor-3",
+ "metal-floor-4",
+ "metal-floor-5",
+ "dark-panel-1",
+ "dark-panel-2",
+ "dark-panel-3",
+ "dark-panel-4",
+ "dark-panel-5",
+ "dark-panel-6",
+ "dark-metal",
+ "metal-tiles-1",
+ "metal-tiles-2",
+ "metal-tiles-3",
+ "metal-tiles-4",
+ "metal-tiles-5",
+ "metal-tiles-6",
+ "metal-tiles-7",
+ "metal-tiles-8",
+ "metal-tiles-9",
+ "metal-tiles-10",
+ "metal-tiles-11",
+ "metal-tiles-12",
+ "metal-tiles-13",
+ "metal-wall-1",
+ "metal-wall-2",
+ "metal-wall-3",
+ "rune-overlay-crux",
+ "rune-overlay",
+ "colored-floor",
+ "colored-wall",
+ "character-overlay",
+ "character-overlay-white",
+ "pebbles",
+ "tendrils",
+ "ore-copper",
+ "ore-lead",
+ "ore-scrap",
+ "ore-coal",
+ "ore-titanium",
+ "ore-thorium",
+ "ore-beryllium",
+ "ore-tungsten",
+ "ore-crystal-thorium",
+ "ore-wall-thorium",
+ "ore-wall-beryllium",
+ "ore-wall-graphite",
+ "graphitic-wall",
+ "ore-wall-tungsten",
+ "graphite-press",
+ "multi-press",
+ "silicon-smelter",
+ "silicon-crucible",
+ "kiln",
+ "plastanium-compressor",
+ "phase-weaver",
+ "surge-smelter",
+ "cryofluid-mixer",
+ "pyratite-mixer",
+ "blast-mixer",
+ "melter",
+ "separator",
+ "disassembler",
+ "spore-press",
+ "pulverizer",
+ "coal-centrifuge",
+ "incinerator",
+ "silicon-arc-furnace",
+ "electrolyzer",
+ "atmospheric-concentrator",
+ "oxidation-chamber",
+ "electric-heater",
+ "slag-heater",
+ "phase-heater",
+ "heat-redirector",
+ "small-heat-redirector",
+ "heat-router",
+ "slag-incinerator",
+ "carbide-crucible",
+ "slag-centrifuge",
+ "surge-crucible",
+ "cyanogen-synthesizer",
+ "phase-synthesizer",
+ "heat-reactor",
+ "copper-wall",
+ "copper-wall-large",
+ "titanium-wall",
+ "titanium-wall-large",
+ "plastanium-wall",
+ "plastanium-wall-large",
+ "thorium-wall",
+ "thorium-wall-large",
+ "phase-wall",
+ "phase-wall-large",
+ "surge-wall",
+ "surge-wall-large",
+ "door",
+ "door-large",
+ "scrap-wall",
+ "scrap-wall-large",
+ "scrap-wall-huge",
+ "scrap-wall-gigantic",
+ "thruster",
+ "beryllium-wall",
+ "beryllium-wall-large",
+ "tungsten-wall",
+ "tungsten-wall-large",
+ "blast-door",
+ "reinforced-surge-wall",
+ "reinforced-surge-wall-large",
+ "carbide-wall",
+ "carbide-wall-large",
+ "shielded-wall",
+ "mender",
+ "mend-projector",
+ "overdrive-projector",
+ "overdrive-dome",
+ "force-projector",
+ "shock-mine",
+ "radar",
+ "build-tower",
+ "regen-projector",
+ "shockwave-tower",
+ "shield-projector",
+ "large-shield-projector",
+ "conveyor",
+ "titanium-conveyor",
+ "plastanium-conveyor",
+ "armored-conveyor",
+ "junction",
+ "bridge-conveyor",
+ "phase-conveyor",
+ "sorter",
+ "inverted-sorter",
+ "router",
+ "distributor",
+ "overflow-gate",
+ "underflow-gate",
+ "mass-driver",
+ "duct",
+ "armored-duct",
+ "duct-router",
+ "overflow-duct",
+ "underflow-duct",
+ "duct-bridge",
+ "duct-unloader",
+ "surge-conveyor",
+ "surge-router",
+ "unit-cargo-loader",
+ "unit-cargo-unload-point",
+ "mechanical-pump",
+ "rotary-pump",
+ "impulse-pump",
+ "conduit",
+ "pulse-conduit",
+ "plated-conduit",
+ "liquid-router",
+ "liquid-container",
+ "liquid-tank",
+ "liquid-junction",
+ "bridge-conduit",
+ "phase-conduit",
+ "reinforced-pump",
+ "reinforced-conduit",
+ "reinforced-liquid-junction",
+ "reinforced-bridge-conduit",
+ "reinforced-liquid-router",
+ "reinforced-liquid-container",
+ "reinforced-liquid-tank",
+ "power-node",
+ "power-node-large",
+ "surge-tower",
+ "diode",
+ "battery",
+ "battery-large",
+ "combustion-generator",
+ "thermal-generator",
+ "steam-generator",
+ "differential-generator",
+ "rtg-generator",
+ "solar-panel",
+ "solar-panel-large",
+ "thorium-reactor",
+ "impact-reactor",
+ "beam-node",
+ "beam-tower",
+ "beam-link",
+ "turbine-condenser",
+ "chemical-combustion-chamber",
+ "pyrolysis-generator",
+ "flux-reactor",
+ "neoplasia-reactor",
+ "mechanical-drill",
+ "pneumatic-drill",
+ "laser-drill",
+ "blast-drill",
+ "water-extractor",
+ "cultivator",
+ "oil-extractor",
+ "vent-condenser",
+ "cliff-crusher",
+ "large-cliff-crusher",
+ "plasma-bore",
+ "large-plasma-bore",
+ "impact-drill",
+ "eruption-drill",
+ "core-shard",
+ "core-foundation",
+ "core-nucleus",
+ "core-bastion",
+ "core-citadel",
+ "core-acropolis",
+ "container",
+ "vault",
+ "unloader",
+ "reinforced-container",
+ "reinforced-vault",
+ "duo",
+ "scatter",
+ "scorch",
+ "hail",
+ "wave",
+ "lancer",
+ "arc",
+ "parallax",
+ "swarmer",
+ "salvo",
+ "segment",
+ "tsunami",
+ "fuse",
+ "ripple",
+ "cyclone",
+ "foreshadow",
+ "spectre",
+ "meltdown",
+ "breach",
+ "diffuse",
+ "sublimate",
+ "titan",
+ "disperse",
+ "afflict",
+ "lustre",
+ "scathe",
+ "smite",
+ "malign",
+ "ground-factory",
+ "air-factory",
+ "naval-factory",
+ "additive-reconstructor",
+ "multiplicative-reconstructor",
+ "exponential-reconstructor",
+ "tetrative-reconstructor",
+ "repair-point",
+ "repair-turret",
+ "tank-fabricator",
+ "ship-fabricator",
+ "mech-fabricator",
+ "tank-refabricator",
+ "ship-refabricator",
+ "mech-refabricator",
+ "prime-refabricator",
+ "tank-assembler",
+ "ship-assembler",
+ "mech-assembler",
+ "basic-assembler-module",
+ "unit-repair-tower",
+ "payload-conveyor",
+ "payload-router",
+ "reinforced-payload-conveyor",
+ "reinforced-payload-router",
+ "payload-mass-driver",
+ "large-payload-mass-driver",
+ "small-deconstructor",
+ "deconstructor",
+ "constructor",
+ "large-constructor",
+ "payload-loader",
+ "payload-unloader",
+ "power-source",
+ "power-void",
+ "item-source",
+ "item-void",
+ "liquid-source",
+ "liquid-void",
+ "payload-source",
+ "payload-void",
+ "heat-source",
+ "illuminator",
+ "legacy-mech-pad",
+ "legacy-unit-factory",
+ "legacy-unit-factory-air",
+ "legacy-unit-factory-ground",
+ "command-center",
+ "launch-pad",
+ "advanced-launch-pad",
+ "landing-pad",
+ "interplanetary-accelerator",
+ "message",
+ "switch",
+ "micro-processor",
+ "logic-processor",
+ "hyper-processor",
+ "memory-cell",
+ "memory-bank",
+ "logic-display",
+ "large-logic-display",
+ "tile-logic-display",
+ "canvas",
+ "reinforced-message",
+ "world-processor",
+ "world-cell",
+ "world-message",
+ "world-switch",
+ "large-canvas",
+ "target-dummy",
+ }
+}
diff --git a/mindus/src/block/defense.rs b/mindus/src/block/defense.rs
new file mode 100644
index 0000000..3a1a4d4
--- /dev/null
+++ b/mindus/src/block/defense.rs
@@ -0,0 +1,20 @@
+//! defense
+use crate::block::simple::*;
+use crate::block::*;
+make_simple!(HeatedBlock => |_, buff: &mut DataRead| read_heated(buff));
+make_simple!(RadarBlock => |_, buff: &mut DataRead| buff.skip(4));
+make_simple!(ShieldBlock => |_, buff: &mut DataRead| read_shield(buff));
+
+/// format:
+/// - heat: [`f32`]
+/// - phase heat: [`f32`]
+fn read_heated(buff: &mut DataRead) -> Result<(), DataReadError> {
+ buff.skip(8)
+}
+
+/// format:
+/// - smoothing: [`f32`]
+/// - broken: [`bool`]
+fn read_shield(buff: &mut DataRead) -> Result<(), DataReadError> {
+ buff.skip(5)
+}
diff --git a/src/block/distribution.rs b/mindus/src/block/distribution.rs
index e185d3a..bf3b77e 100644
--- a/src/block/distribution.rs
+++ b/mindus/src/block/distribution.rs
@@ -9,7 +9,7 @@ use crate::item;
make_simple!(
ConveyorBlock,
|_, name, _, ctx: Option<&RenderingContext>, rot, s| tile(ctx.unwrap(), name, rot, s),
- |_, _, _, buff: &mut DataRead| {
+ |_, buff: &mut DataRead| {
// format:
// - amount: `i32`
// - iterate amount:
@@ -28,23 +28,21 @@ make_simple!(
make_simple!(
DuctBlock,
|_, name, _, ctx: Option<&RenderingContext>, rot, s| tile(ctx.unwrap(), name, rot, s),
- |_, _, _, buff: &mut DataRead| {
+ |_, buff: &mut DataRead| {
// format:
// - rec_dir: `i8`
buff.skip(1)
}
);
-make_simple!(JunctionBlock => |_, _, _, buff| { read_directional_item_buffer(buff) });
+make_simple!(JunctionBlock => |_, buff| { read_directional_item_buffer(buff) });
make_simple!(SimpleDuctBlock, |_, name, _, _, rot: Rotation, s| {
let mut base = load!("duct-base", s);
let mut top = load!(from name which is ["overflow-duct" "underflow-duct"], s);
- unsafe {
- // SAFETY: any load() is square
- top.rotate(rot.rotated(false).count());
- // SAFETY: same size
- base.overlay(&top);
- }
+ // SAFETY: any load!() is square
+ unsafe { top.rotate(rot.rotated(false).count()) };
+ // SAFETY: same size
+ unsafe { base.overlay(&top) };
base
});
@@ -80,7 +78,7 @@ fn draw_stack(
1 => load!(concat 1 => name which is ["surge-conveyor" | "plastanium-conveyor"], s),
_ => load!("plastanium-conveyor-2", s),
};
- let empty = ctx.cross[rot.count() as usize].map_or(true, |(v, _)| v.name != name);
+ let empty = ctx.cross[rot.count() as usize].map_or(true, |(v, _)| v.name.get_name() != name);
// mindustry says fuck this and just draws the arrow convs in schems but im better than that
if rot.mirrored(true, true).mask() == mask && empty && name != "surge-conveyor" {
// end
@@ -118,47 +116,21 @@ make_simple!(
// format:
// - link: `i32`
// - cooldown: `f32`
- |_, _, _, buff: &mut DataRead| buff.skip(8)
+ |_, buff: &mut DataRead| buff.skip(8)
+);
+make_simple!(
+ SurgeRouter,
+ |_, _, _, _, r: Rotation, s| {
+ let mut base = load!("surge-router", s);
+ let mut top = load!("top", s);
+ unsafe { top.rotate(r.rotated(false).count()) };
+ unsafe { base.overlay(&top) };
+ base
+ },
+ |_, buff: &mut DataRead| buff.skip(2)
);
-make_simple!(SurgeRouter, |_, _, _, _, r: Rotation, s| {
- let mut base = load!("surge-router", s);
- unsafe { base.overlay(load!("top", s).rotate(r.rotated(false).count())) };
- base
-});
// format: id: [`i32`]
-make_simple!(UnitCargoLoader => |_, _, _, buff: &mut DataRead| buff.skip(4));
-
-make_register! {
- "conveyor" => ConveyorBlock::new(1, false, cost!(Copper: 1));
- "titanium-conveyor" => ConveyorBlock::new(1, false, cost!(Copper: 1, Lead: 1, Titanium: 1));
- "plastanium-conveyor" => StackConveyor::new(1, false, cost!(Graphite: 1, Silicon: 1, Plastanium: 1));
- "armored-conveyor" => ConveyorBlock::new(1, false, cost!(Metaglass: 1, Thorium: 1, Plastanium: 1));
- "junction" -> JunctionBlock::new(1, true, cost!(Copper: 2));
- "bridge-conveyor" -> BridgeBlock::new(1, false, cost!(Copper: 6, Lead: 6), 4, true);
- "phase-conveyor" -> BridgeBlock::new(1, false, cost!(Lead: 10, Graphite: 10, Silicon: 7, PhaseFabric: 5), 12, true);
- "sorter" => ItemBlock::new(1, true, cost!(Copper: 2, Lead: 2));
- "inverted-sorter" => ItemBlock::new(1, true, cost!(Copper: 2, Lead: 2));
- "unloader" -> ItemBlock::new(1, true, cost!(Titanium: 25, Silicon: 30));
- "router" -> BasicBlock::new(1, true, cost!(Copper: 3));
- "distributor" -> BasicBlock::new(2, true, cost!(Copper: 4, Lead: 4));
- "overflow-gate" -> BasicBlock::new(1, true, cost!(Copper: 4, Lead: 2));
- "underflow-gate" -> BasicBlock::new(1, true, cost!(Copper: 4, Lead: 2));
- "mass-driver" => BridgeBlock::new(3, true, cost!(Lead: 125, Titanium: 125, Thorium: 50, Silicon: 75), 55, false);
- "duct" => DuctBlock::new(1, false, cost!(Beryllium: 1));
- "armored-duct" => DuctBlock::new(1, false, cost!(Beryllium: 2, Tungsten: 1));
- "duct-router" => ItemBlock::new(1, true, cost!(Beryllium: 10));
- "overflow-duct" => SimpleDuctBlock::new(1, true, cost!(Graphite: 8, Beryllium: 8));
- "underflow-duct" => SimpleDuctBlock::new(1, true, cost!(Graphite: 8, Beryllium: 8));
- "duct-bridge" => BridgeBlock::new(1, true, cost!(Beryllium: 20), 3, true);
- "duct-unloader" => ItemBlock::new(1, true, cost!(Graphite: 20, Silicon: 20, Tungsten: 10));
- "surge-conveyor" => StackConveyor::new(1, false, cost!(SurgeAlloy: 1, Tungsten: 1));
- "surge-router" => SurgeRouter::new(1, false, cost!(SurgeAlloy: 5, Tungsten: 1)); // not symmetric
- "unit-cargo-loader" -> BasicBlock::new(3, true, cost!(Silicon: 80, SurgeAlloy: 50, Oxide: 20));
- "unit-cargo-unload-point" => ItemBlock::new(2, true, cost!(Silicon: 60, Tungsten: 60));
- // sandbox only
- "item-source" -> ItemBlock::new(1, true, &[]);
- "item-void" -> BasicBlock::new(1, true, &[]);
-}
+make_simple!(UnitCargoLoader => |_, buff: &mut DataRead| buff.skip(4));
pub struct ItemBlock {
size: u8,
@@ -225,26 +197,31 @@ impl BlockLogic for ItemBlock {
s: Scale,
) -> ImageHolder<4> {
let mut p = load!(from name which is ["sorter" | "inverted-sorter" | "duct-router" | "duct-unloader" | "unit-cargo-unload-point" | "unloader" | "item-source"], s);
- if let Some(state) = state && let Some(item) = Self::get_state(state) {
+ if let Some(state) = state
+ && let Some(item) = Self::get_state(state)
+ {
let mut top = load!(s -> match name {
"unit-cargo-unload-point" => "unit-cargo-unload-point-top",
"unloader" => "unloader-center",
_ => "center",
});
unsafe { p.overlay(top.tint(item.color())) };
- return p;
- }
- match name {
- "duct-router" => {
- unsafe { p.overlay(&load!("top", s).rotate(rot.rotated(false).count())) };
- }
- "duct-unloader" => {
+ if name == "duct-unloader" {
unsafe {
- p.overlay(&load!("duct-unloader-top", s).rotate(rot.rotated(false).count()))
- };
+ let mut x = load!("duct-unloader-arrows", s);
+ p.overlay(&*x.rotate(rot.rotated(false).count()));
+ }
}
- _ => {}
- };
+ return p;
+ }
+ if matches!(name, "duct-router" | "duct-unloader") {
+ let mut top = load!(s -> match name {
+ "duct-router" => "top",
+ "duct-unloader" => "duct-unloader-top",
+ });
+ unsafe { top.rotate(rot.rotated(false).count()) };
+ unsafe { p.overlay(&top) };
+ }
p
}
@@ -258,13 +235,7 @@ impl BlockLogic for ItemBlock {
/// (unit-cargo-unload-point)
/// - item: `u16` as item
/// - stale: `bool`
- fn read(
- &self,
- b: &mut Build,
- _: &BlockRegistry,
- _: &EntityMapping,
- buff: &mut DataRead,
- ) -> Result<(), DataReadError> {
+ fn read(&self, b: &mut Build, buff: &mut DataRead) -> Result<(), DataReadError> {
match b.block.name() {
"duct-unloader" => {
let n = buff.read_i16()?;
@@ -410,7 +381,7 @@ impl BlockLogic for BridgeBlock {
fn serialize_state(&self, state: &State) -> Result<DynData, SerializeError> {
match Self::get_state(state) {
- None => Ok(DynData::Empty),
+ None => Ok(DynData::Point2(-1, -1)),
Some((dx, dy)) => Ok(DynData::Point2(*dx, *dy)),
}
}
@@ -436,8 +407,6 @@ impl BlockLogic for BridgeBlock {
fn read(
&self,
t: &mut Build,
- r: &super::BlockRegistry,
- e: &crate::data::map::EntityMapping,
buff: &mut crate::data::DataRead,
) -> Result<(), crate::data::ReadError> {
match t.block.name() {
@@ -445,7 +414,7 @@ impl BlockLogic for BridgeBlock {
"phase-conveyor" | "phase-conduit" | "bridge-conduit" => read_item_bridge(buff)?,
"mass-driver" => buff.skip(9)?,
"payload-mass-driver" | "large-payload-mass-driver" => {
- crate::block::payload::read_payload_block(r, e, buff)?;
+ crate::block::payload::read_payload_block(buff)?;
buff.skip(19)?;
}
// no state?
@@ -478,10 +447,8 @@ impl BlockLogic for BridgeBlock {
_ => "reinforced-bridge-conduit-dir",
}
);
- unsafe {
- arrow.rotate(r.rotated(false).count());
- base.overlay(&arrow)
- };
+ unsafe { arrow.rotate(r.rotated(false).count()) };
+ unsafe { base.overlay(&arrow) };
base
}
// "bridge-conveyor" | "phase-conveyor" | "bridge-conduit" | "phase-conduit" | "payload-mass-driver" | "large-payload-mass-driver"
@@ -500,9 +467,10 @@ pub struct BridgeConvertError {
/// format;
/// - call [`read_item_bridge`]
/// - become [`read_item_buffer`]
-fn read_buffered_item_bridge(buff: &mut DataRead) -> Result<(), DataReadError> {
- read_item_bridge(buff)?;
- read_item_buffer(buff)
+fn read_buffered_item_bridge(_buff: &mut DataRead) -> Result<(), DataReadError> {
+ // read_item_bridge(buff)?;
+ // read_item_buffer(buff)
+ Ok(())
}
/// format:
@@ -523,8 +491,10 @@ fn read_item_buffer(buff: &mut DataRead) -> Result<(), DataReadError> {
/// - moved: `bool`
fn read_item_bridge(buff: &mut DataRead) -> Result<(), DataReadError> {
buff.skip(8)?;
- let n = buff.read_u8()? as usize;
- buff.skip((n * 4) + 1)
+ let _n = buff.read_i8()?;
+ // buff.skip((n as usize * 4) + 1)
+ // bug?
+ Ok(())
}
/// format:
diff --git a/mindus/src/block/drills.rs b/mindus/src/block/drills.rs
new file mode 100644
index 0000000..50a3d6a
--- /dev/null
+++ b/mindus/src/block/drills.rs
@@ -0,0 +1,31 @@
+//! extraction of raw resources (mine part)
+use crate::block::simple::make_simple;
+use crate::block::*;
+
+make_simple!(
+ DrillBlock,
+ |_, name, _, _, rot: Rotation, s| {
+ let mut base =
+ load!(from name which is ["large-plasma-bore" | "plasma-bore" | "cliff-crusher"], s);
+ let mut top = load!(concat "top" => name which is ["large-plasma-bore" | "plasma-bore" | "cliff-crusher"], s);
+ unsafe { top.rotate(rot.rotated(false).count()) };
+ unsafe { base.overlay(&top) };
+ base
+ },
+ |_, buff: &mut DataRead| read_drill(buff)
+);
+make_simple!(WallDrillBlock, |_, name, _, _, rot: Rotation, scl| {
+ let mut base = load!(from name which is ["cliff-crusher" | "large-cliff-crusher"], scl);
+ let mut top =
+ load!(concat "top" => name which is ["cliff-crusher" | "large-cliff-crusher"], scl);
+ unsafe { top.rotate(rot.rotated(false).count()) };
+ unsafe { base.overlay(&top) };
+ base
+});
+
+/// format:
+/// - progress: [`f32`]
+/// - warmup: [`f32`]
+fn read_drill(buff: &mut DataRead) -> Result<(), DataReadError> {
+ buff.skip(8)
+}
diff --git a/mindus/src/block/liquid.rs b/mindus/src/block/liquid.rs
new file mode 100644
index 0000000..384dc98
--- /dev/null
+++ b/mindus/src/block/liquid.rs
@@ -0,0 +1,128 @@
+//! liquid related things
+use thiserror::Error;
+
+use crate::block::simple::*;
+use crate::block::*;
+use crate::content;
+use crate::data::dynamic::DynType;
+use crate::data::renderer::load;
+use crate::fluid;
+use crate::utils::ImageUtils;
+
+make_simple!(ConduitBlock, |_,
+ name,
+ _,
+ ctx: Option<&RenderingContext>,
+ rot,
+ s| {
+ let ctx = ctx.unwrap();
+
+ let mask = mask(ctx, rot, name);
+ // TODO caps. stopped trying bcz too complex
+ mask2tile(mask, rot, name, s)
+});
+
+pub struct FluidBlock {
+ size: u8,
+ symmetric: bool,
+ build_cost: BuildCost,
+}
+
+impl FluidBlock {
+ #[must_use]
+ pub const fn new(size: u8, symmetric: bool, build_cost: BuildCost) -> Self {
+ assert!(size != 0, "invalid size");
+ Self {
+ size,
+ symmetric,
+ build_cost,
+ }
+ }
+
+ state_impl!(pub Option<fluid::Type>);
+}
+
+impl BlockLogic for FluidBlock {
+ impl_block!();
+
+ fn data_from_i32(&self, config: i32, _: GridPos) -> Result<DynData, DataConvertError> {
+ if config < 0 || config > i32::from(u16::MAX) {
+ return Err(DataConvertError::Custom(Box::new(FluidConvertError(
+ config,
+ ))));
+ }
+ Ok(DynData::Content(content::Type::Fluid, config as u16))
+ }
+
+ fn deserialize_state(&self, data: DynData) -> Result<Option<State>, DeserializeError> {
+ match data {
+ DynData::Empty => Ok(Some(Self::create_state(None))),
+ DynData::Content(content::Type::Fluid, id) => Ok(Some(Self::create_state(Some(
+ FluidDeserializeError::forward(fluid::Type::try_from(id))?,
+ )))),
+ DynData::Content(have, ..) => Err(DeserializeError::Custom(Box::new(
+ FluidDeserializeError::ContentType(have),
+ ))),
+ _ => Err(DeserializeError::InvalidType {
+ have: data.get_type(),
+ expect: DynType::Content,
+ }),
+ }
+ }
+
+ fn serialize_state(&self, state: &State) -> Result<DynData, SerializeError> {
+ Ok(Self::get_state(state)
+ .as_ref()
+ .map_or(DynData::Empty, |&fluid| {
+ DynData::Content(content::Type::Fluid, fluid.into())
+ }))
+ }
+
+ fn draw(
+ &self,
+ _: &str,
+ state: Option<&State>,
+ _: Option<&RenderingContext>,
+ _: Rotation,
+ s: Scale,
+ ) -> ImageHolder<4> {
+ let mut p = load!("liquid-source", s);
+ if let Some(state) = state
+ && let Some(liq) = Self::get_state(state)
+ {
+ let mut top = load!("center", s);
+ unsafe { p.overlay(top.tint(liq.color())) };
+ return p;
+ }
+ p
+ }
+
+ /// format:
+ /// - fluid: [`u16`] as [`Fluid`](fluid::Type)
+ fn read(&self, b: &mut Build, buff: &mut DataRead) -> Result<(), DataReadError> {
+ let f = buff.read_u16()?;
+ b.state = Some(Self::create_state(fluid::Type::try_from(f).ok()));
+ Ok(())
+ }
+}
+
+#[derive(Clone, Copy, Debug, Eq, PartialEq, Error)]
+#[error("invalid config ({0}) for fluid")]
+pub struct FluidConvertError(pub i32);
+
+#[derive(Clone, Copy, Debug, Eq, PartialEq, Error)]
+pub enum FluidDeserializeError {
+ #[error("expected Fluid but got {0:?}")]
+ ContentType(content::Type),
+ #[error("fluid not found")]
+ NotFound(#[from] fluid::TryFromU16Error),
+}
+
+impl FluidDeserializeError {
+ pub fn forward<T, E: Into<Self>>(result: Result<T, E>) -> Result<T, DeserializeError> {
+ match result {
+ Ok(v) => Ok(v),
+ Err(e) => Err(DeserializeError::Custom(Box::new(e.into()))),
+ }
+ }
+}
diff --git a/src/block/logic.rs b/mindus/src/block/logic.rs
index a099765..4626730 100644
--- a/src/block/logic.rs
+++ b/mindus/src/block/logic.rs
@@ -3,14 +3,14 @@ use std::borrow::Cow;
use std::string::FromUtf8Error;
use crate::block::simple::*;
-use crate::data::dynamic::{DynSerializer, DynType};
-use crate::{block::*, Serializer};
+use crate::data::dynamic::DynType;
+use crate::{Serializable, block::*};
use crate::data::{self, CompressError, DataRead, DataWrite};
make_simple!(
MemoryBlock =>
- |_, _, _, buff: &mut DataRead| {
+ |_, buff: &mut DataRead| {
// format:
// - iterate [`u32`]
// - memory: [`f64`]
@@ -19,29 +19,12 @@ make_simple!(
}
);
-make_register! {
- "reinforced-message" -> MessageLogic::new(1, true, cost!(Graphite: 10, Beryllium: 5));
- "message" -> MessageLogic::new(1, true, cost!(Copper: 5, Graphite: 5));
- "switch" => SwitchLogic::new(1, true, cost!(Copper: 5, Graphite: 5));
- "micro-processor" -> ProcessorLogic::new(1, true, cost!(Copper: 90, Lead: 50, Silicon: 50));
- "logic-processor" -> ProcessorLogic::new(2, true, cost!(Lead: 320, Graphite: 60, Thorium: 50, Silicon: 80));
- "hyper-processor" -> ProcessorLogic::new(3, true, cost!(Lead: 450, Thorium: 75, Silicon: 150, SurgeAlloy: 50));
- "memory-cell" -> MemoryBlock::new(1, true, cost!(Copper: 30, Graphite: 30, Silicon: 30));
- "memory-bank" -> MemoryBlock::new(2, true, cost!(Copper: 30, Graphite: 80, Silicon: 80, PhaseFabric: 30));
- "logic-display" -> BasicBlock::new(3, true, cost!(Lead: 100, Metaglass: 50, Silicon: 50));
- "large-logic-display" -> BasicBlock::new(6, true, cost!(Lead: 200, Metaglass: 100, Silicon: 150, PhaseFabric: 75));
- "canvas" => CanvasBlock::new(2, true, cost!(Silicon: 30, Beryllium: 10), 12);
- // editor only
- "world-processor" -> BasicBlock::new(1, true, &[]);
- "world-message" -> MessageLogic::new(1, true, &[]);
- "world-cell" -> MemoryBlock::new(1, true, &[]);
-}
-
pub struct CanvasBlock {
size: u8,
symmetric: bool,
build_cost: BuildCost,
canvas_size: u8,
+ pal: &'static [(u8, u8, u8)],
}
macro_rules! h {
@@ -50,7 +33,25 @@ macro_rules! h {
(v[0], v[1], v[2])
}};
}
-const PALETTE: &[(u8, u8, u8); 8] = &[
+pub const L_PALETTE: &[(u8, u8, u8); 16] = &[
+ h!("#452b3f"),
+ h!("#8a5865"),
+ h!("#e08d51"),
+ h!("#fabf61"),
+ h!("#f5eeb0"),
+ h!("#2c5e3b"),
+ h!("#609c4f"),
+ h!("#c6cc54"),
+ h!("#78c2d6"),
+ h!("#5479b0"),
+ h!("#56546e"),
+ h!("#839fa6"),
+ h!("#e0d3c8"),
+ h!("#f05b5b"),
+ h!("#8f325f"),
+ h!("#eb6c98"),
+];
+pub const S_PALETTE: &[(u8, u8, u8); 8] = &[
h!("#362944"),
h!("#c45d9f"),
h!("#e39aac"),
@@ -63,7 +64,13 @@ const PALETTE: &[(u8, u8, u8); 8] = &[
impl CanvasBlock {
#[must_use]
- pub const fn new(size: u8, symmetric: bool, build_cost: BuildCost, canvas_size: u8) -> Self {
+ pub const fn new(
+ size: u8,
+ symmetric: bool,
+ build_cost: BuildCost,
+ canvas_size: u8,
+ pal: &'static [(u8, u8, u8)],
+ ) -> Self {
assert!(size != 0, "invalid size");
assert!(canvas_size != 0, "invalid size");
Self {
@@ -71,22 +78,23 @@ impl CanvasBlock {
symmetric,
build_cost,
canvas_size,
+ pal,
}
}
- state_impl!(pub Image<Vec<u8>, 1>);
+ state_impl!(pub Image<Box<[u8]>, 1>);
}
-fn deser_canvas_image(b: &[u8], size: usize) -> Image<Vec<u8>, 1> {
- let mut p = Image::alloc(size as u32, size as u32);
+fn deser_canvas_image(b: &[u8], size: usize, bpp: usize) -> Image<Box<[u8]>, 1> {
+ let mut p = Image::alloc(size as u32, size as u32).boxed();
for i in 0..(size * size) {
- let offset = i * 3;
+ let offset = i * bpp;
let mut n = 0;
- for i in 0..3 {
+ for i in 0..bpp {
let word = (i + offset) >> 3;
- n |= (((b[word] & (1 << ((i + offset) & 7))) != 0) as u8) << i;
+ n |= (((b[word] & (1u8 << ((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
}
@@ -103,6 +111,7 @@ impl BlockLogic for CanvasBlock {
DynData::ByteArray(b) => Ok(Some(Self::create_state(deser_canvas_image(
&b,
self.canvas_size as usize,
+ self.pal.len().next_power_of_two().ilog2() as _,
)))),
_ => Err(DeserializeError::InvalidType {
have: data.get_type(),
@@ -112,17 +121,18 @@ impl BlockLogic for CanvasBlock {
}
fn serialize_state(&self, state: &State) -> Result<DynData, SerializeError> {
+ let bpp = self.pal.len().next_power_of_two().ilog2() as usize;
let mut o = vec![0; self.canvas_size as usize * self.canvas_size as usize * 3];
let p = Self::get_state(state);
for i in 0..(self.canvas_size * self.canvas_size) as usize {
- let index = unsafe {
+ let &[index] = unsafe {
p.pixel(
i as u32 % self.canvas_size as u32,
i as u32 / self.canvas_size as u32,
- )[0]
+ )
};
- let offset = i * 3;
- for i in 0..3 {
+ let offset = i * bpp;
+ for i in 0..bpp {
let word = (i + offset) >> 3;
if index >> i & 1 == 0 {
o[word] &= !(1 << ((i + offset) & 7));
@@ -137,7 +147,7 @@ impl BlockLogic for CanvasBlock {
/// i thought about drawing the borders and stuff but it felt like too much work
fn draw(
&self,
- _: &str,
+ n: &str,
state: Option<&State>,
_: Option<&RenderingContext>,
_: Rotation,
@@ -152,44 +162,40 @@ impl BlockLogic for CanvasBlock {
Scale::Eigth => 1,
};
let mut img = Image::alloc(p.width(), p.height());
- for ([r, g, b, a], &y) in img.chunked_mut().zip(p.buffer.iter()) {
- (*r, *g, *b) = PALETTE[y as usize];
+ for ([r, g, b, a], &y) in img.chunked_mut().zip(p.buffer().iter()) {
+ (*r, *g, *b) = self.pal[y as usize];
*a = 255;
}
- let img = img.as_mut().scale((s * self.size as u32) - offset * 2);
- let mut borders = load!("canvas", s);
- unsafe {
- borders
- .borrow_mut()
- .overlay_at(&img.as_ref(), offset, offset)
- };
+ let img = img.scale::<fimg::scale::Nearest>(
+ (s * self.size as u32) - offset * 2,
+ (s * self.size as u32) - offset * 2,
+ );
+
+ let mut borders = load!(from n which is ["canvas" | "large-canvas"], s);
+ unsafe { borders.overlay_at(&img, offset, offset) };
return borders;
}
- let mut def = Image::alloc(s * self.size as u32, s * self.size as u32);
- for [r, g, b, a] in def.buffer.array_chunks_mut::<4>() {
- (*r, *g, *b) = PALETTE[0];
+ // FIXME: make const
+ let mut def = Image::alloc(s * self.size as u32, s * self.size as u32).boxed();
+ for [r, g, b, a] in def.chunked_mut() {
+ (*r, *g, *b) = self.pal[0];
*a = 255;
}
- ImageHolder::from(def)
+ unsafe { def.mapped(crate::utils::Cow::Own) }
}
/// format:
/// - len: [`i32`]
/// - read(len) -> [`deser_canvas_image`]
- fn read(
- &self,
- build: &mut Build,
- _: &BlockRegistry,
- _: &EntityMapping,
- buff: &mut DataRead,
- ) -> Result<(), DataReadError> {
+ fn read(&self, build: &mut Build, buff: &mut DataRead) -> Result<(), DataReadError> {
let n = buff.read_i32()? as usize;
let mut b = vec![0; n];
buff.read_bytes(&mut b)?;
build.state = Some(Self::create_state(deser_canvas_image(
&b,
self.canvas_size as usize,
+ self.pal.len().next_power_of_two().ilog2() as _,
)));
Ok(())
}
@@ -252,13 +258,7 @@ impl BlockLogic for MessageLogic {
Ok(DynData::String(Some(Self::get_state(state).clone())))
}
- fn read(
- &self,
- b: &mut Build,
- _: &BlockRegistry,
- _: &EntityMapping,
- buff: &mut DataRead,
- ) -> Result<(), DataReadError> {
+ fn read(&self, b: &mut Build, buff: &mut DataRead) -> Result<(), DataReadError> {
b.state = Some(Self::create_state(buff.read_utf()?.to_string()));
Ok(())
}
@@ -306,29 +306,23 @@ impl BlockLogic for SwitchLogic {
Ok(DynData::Boolean(*Self::get_state(state)))
}
- fn read(
- &self,
- build: &mut Build,
- _: &BlockRegistry,
- _: &EntityMapping,
- buff: &mut DataRead,
- ) -> Result<(), DataReadError> {
+ fn read(&self, build: &mut Build, buff: &mut DataRead) -> Result<(), DataReadError> {
build.state = Some(Self::create_state(buff.read_bool()?));
Ok(())
}
fn draw(
&self,
- _: &str,
+ name: &str,
state: Option<&State>,
_: Option<&RenderingContext>,
_: Rotation,
s: Scale,
) -> ImageHolder<4> {
- let mut base = load!("switch", s);
+ let mut base = load!(from name which is ["switch" | "world-switch"], s);
if let Some(state) = state {
if *Self::get_state(state) {
- let on = load!("switch-on", s);
+ let on = load!(concat "on" => name which is ["switch" | "world-switch"], s);
unsafe { base.overlay(&on) };
return base;
}
@@ -371,8 +365,7 @@ fn read_decompressed(buff: &mut DataRead) -> Result<ProcessorState, ProcessorDes
buff.read_bytes(&mut code)?;
let code = String::from_utf8(code)?;
let link_cnt = buff.read_u32()? as usize;
- let mut links = vec![];
- links.reserve(link_cnt);
+ let mut links = Vec::with_capacity(link_cnt);
for _ in 0..link_cnt {
let name = buff.read_utf()?;
let x = buff.read_i16()?;
@@ -412,13 +405,7 @@ impl BlockLogic for ProcessorLogic {
}
}
- fn read(
- &self,
- b: &mut Build,
- _: &BlockRegistry,
- _: &EntityMapping,
- buff: &mut DataRead,
- ) -> Result<(), DataReadError> {
+ fn read(&self, b: &mut Build, buff: &mut DataRead) -> Result<(), DataReadError> {
let n = buff.read_u32()? as usize;
let mut v = vec![0; n];
buff.read_bytes(&mut v)?;
@@ -428,7 +415,7 @@ impl BlockLogic for ProcessorLogic {
));
for _ in 0..buff.read_u32()? {
let _ = buff.read_utf()?;
- let _ = DynSerializer.deserialize(buff).unwrap();
+ let _ = DynData::deserialize(buff).unwrap();
}
let memory = buff.read_u32()? as usize;
buff.skip(memory * 8)?;
@@ -512,7 +499,7 @@ impl ProcessorSerializeError {
}
}
-#[derive(Clone, Debug, Eq, PartialEq, Default)]
+#[derive(Clone, Debug, Eq, PartialEq, Default, Hash)]
pub struct ProcessorLink {
name: String,
x: i16,
@@ -545,7 +532,7 @@ impl ProcessorLink {
}
}
-#[derive(Clone, Debug, Eq, PartialEq, Default)]
+#[derive(Clone, Debug, Eq, PartialEq, Default, Hash)]
pub struct ProcessorState {
code: String,
links: Vec<ProcessorLink>,
@@ -629,3 +616,28 @@ pub enum CreateError {
#[error("link {name} already points to ({x}, {y})")]
DuplicatePos { name: String, x: i16, y: i16 },
}
+#[rustfmt::skip]
+static BITMASKS: [[Image<&[u8], 4>;3]; 256] = include!("x.rs");
+make_simple!(TileableDisplay, |_,
+ _,
+ _,
+ ctx: Option<&RenderingContext>,
+ _,
+ s| {
+ let c = ctx.unwrap();
+ let [f, d, h, b] = c.corners;
+ let [c, a, g, e] = c.cross;
+ let swizzled = [a, b, c, d, e, f, g, h];
+ use std::simd::prelude::*;
+ let mut b = load!("tile-logic-display", s);
+ unsafe {
+ b.overlay(
+ &BITMASKS[u8x8::from_array(
+ swizzled.map(|x| x.is_some_and(|x| x.0.name() == "tile-logic-display") as u8),
+ )
+ .simd_eq(u8x8::splat(1))
+ .to_bitmask() as usize][s as usize],
+ )
+ };
+ b
+});
diff --git a/mindus/src/block/mod.rs b/mindus/src/block/mod.rs
new file mode 100644
index 0000000..3b57d07
--- /dev/null
+++ b/mindus/src/block/mod.rs
@@ -0,0 +1,1094 @@
+//! deal with blocks.
+//!
+//! different block types are organized into modules
+use bobbin_bits::U4::{self, B0000, B0001, B0010, B0100, B1000};
+use fimg::DynImage;
+use std::error::Error;
+use std::fmt;
+
+use crate::block::all::{L_PALETTE, S_PALETTE, Type};
+use crate::content::Content;
+use crate::data::dynamic::{DynData, DynType};
+use crate::data::map::{Build, mcg};
+use crate::data::{self, CompressError, renderer::*};
+use crate::data::{DataRead, GridPos, ReadError as DataReadError};
+use crate::item::storage::ItemStorage;
+use crate::utils::Cow;
+
+macro_rules! mods {
+ ($($mod:ident)*) => {
+ $(pub mod $mod;)*
+
+ mod all {
+ $(#[allow(unused_imports)] pub use crate::block::$mod::*;)*
+ pub use super::simple::BasicBlock;
+ }
+ }
+}
+
+mods! {
+ content defense distribution drills liquid logic payload power production turrets walls units campaign
+}
+
+pub mod ratios;
+mod simple;
+use simple::*;
+
+macro_rules! disp {
+ ($($k:ident,)+) => {
+ use all::{$($k,)+};
+ #[enum_dispatch::enum_dispatch]
+ pub(crate) enum BlockLogicEnum {
+ $($k,)+
+ }
+
+ impl ratios::Ratios for BlockLogicEnum {
+ fn io(&self, state: Option<&State>, name: &str) -> ratios::Io {
+ match self {
+ $(Self::$k(x) => x.io(state, name),)+
+ }
+ }
+ }
+ pub const trait ConstFrom<T>: Sized {
+ fn fro(value: T) -> Self;
+ }
+ $(
+ const impl ConstFrom<$k> for BlockLogicEnum {
+ fn fro(v: $k) -> Self {
+ BlockLogicEnum::$k(v)
+ }
+ }
+ )+
+
+ /*impl std::fmt::Debug for BlockLogicEnum {
+ fn fmt(&self, w: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
+ match self {
+ $(BlockLogicEnum::$k { .. } => write!(w, stringify!($k)),)+
+ }
+ }
+ }*/
+ }
+}
+
+disp! {
+ BasicBlock,
+ WallBlock,
+ DuctBlock,
+ BridgeBlock,
+ ItemBlock,
+ ProductionBlock,
+ SeparatorBlock,
+ StackConveyor,
+ HeatCrafter,
+ ConnectorBlock,
+ ItemTurret,
+ ConveyorBlock,
+ PayloadRouter,
+ WallDrillBlock,
+ DrillBlock,
+ NuclearGeneratorBlock,
+ GeneratorBlock,
+ ConduitBlock,
+ HeatedBlock,
+ RadarBlock,
+ ShieldBlock,
+ PointDefenseTurret,
+ JunctionBlock,
+ Turret,
+ MemoryBlock,
+ MessageLogic,
+ ConstructorBlock,
+ AssemblerBlock,
+ UnitFactory,
+ SimpleDuctBlock,
+ SurgeRouter,
+ SimplePayloadBlock,
+ PayloadConveyor,
+ ImpactReactorBlock,
+ Neoplasia,
+ DiodeBlock,
+ HeatConduit,
+ ContinousTurret,
+ TractorBeamTurret,
+ TileableDisplay,
+ AssemblerModule,
+ RepairTurret,
+ FluidBlock,
+ CanvasBlock,
+ SwitchLogic,
+ ProcessorLogic,
+ PayloadBlock,
+ LampBlock,
+ UnitCargoLoader,
+ DoorBlock,
+ LandingPadBlock,
+}
+
+pub trait Cast {
+ fn downcast_ref(state: &State) -> Option<&Self>;
+ fn downcast_mut(state: &mut State) -> Option<&mut Self>;
+}
+
+macro_rules! stater {
+ ($($k: ident($v: ty),)+) => {
+ #[derive(Debug, Clone, Hash)]
+ pub enum State {
+ $($k($v),)+
+ }
+
+ $(
+ impl From<$v> for State {
+ fn from(v: $v) -> State { State::$k(v) }
+ }
+
+ impl Cast for $v {
+ fn downcast_ref(state: &State) -> Option<&Self> {
+ match state {
+ State::$k(v) => Some(v),
+ _ => None,
+ }
+ }
+ fn downcast_mut(state: &mut State) -> Option<&mut Self> {
+ match state {
+ State::$k(v) => Some(v),
+ _ => None,
+ }
+ }
+ }
+ )+
+ }
+}
+
+stater! {
+ // TODO deoptionize
+ String(String),
+ Item(Option<crate::item::Type>),
+ Fluid(Option<crate::fluid::Type>),
+ Image(Image<Box<[u8]>, 1>),
+ Point(Option<(i32, i32)>),
+ Bool(bool),
+ Processor(logic::ProcessorState),
+ Payload(payload::Payload),
+ Power(Vec<(i16, i16)>),
+ Color(power::Rgba),
+ Command(Option<crate::data::command::UnitCommand>),
+ Unit(Option<crate::unit::Type>),
+}
+
+impl State {
+ pub fn downcast_ref<T: Cast>(&self) -> Option<&T> {
+ T::downcast_ref(self)
+ }
+
+ pub fn downcast_mut<T: Cast>(&mut self) -> Option<&mut T> {
+ T::downcast_mut(self)
+ }
+
+ pub fn new<T: Into<Self>>(from: T) -> Self {
+ from.into()
+ }
+}
+
+#[enum_dispatch::enum_dispatch(BlockLogicEnum)]
+pub trait BlockLogic: ratios::Ratios {
+ /// mindustry blocks are the same width and height
+ fn get_size(&self) -> u8;
+
+ fn is_symmetric(&self) -> bool;
+
+ fn create_build_cost(&self) -> Option<ItemStorage>;
+
+ fn data_from_i32(&self, config: i32, pos: GridPos) -> Result<DynData, DataConvertError>;
+
+ fn deserialize_state(&self, data: DynData) -> Result<Option<State>, DeserializeError>;
+
+ #[allow(unused_variables)]
+ fn mirror_state(&self, state: &mut State, horizontally: bool, vertically: bool) {}
+
+ #[allow(unused_variables)]
+ fn rotate_state(&self, state: &mut State, clockwise: bool) {}
+
+ fn serialize_state(&self, state: &State) -> Result<DynData, SerializeError>;
+
+ #[allow(unused_variables)]
+ fn draw(
+ &self,
+ name: &str,
+ state: Option<&State>,
+ context: Option<&RenderingContext>,
+ rot: Rotation,
+ scale: Scale,
+ ) -> ImageHolder<4> {
+ unimplemented!("{name}")
+ }
+
+ #[allow(unused_variables)]
+ fn read(&self, build: &mut Build, buff: &mut DataRead) -> Result<(), DataReadError> {
+ Ok(())
+ }
+}
+
+// i wish i could derive
+macro_rules! impl_block {
+ () => {
+ fn get_size(&self) -> u8 {
+ self.size
+ }
+
+ fn is_symmetric(&self) -> bool {
+ self.symmetric
+ }
+
+ fn create_build_cost(&self) -> Option<$crate::item::storage::ItemStorage> {
+ if self.build_cost.is_empty() {
+ None
+ } else {
+ let mut storage = crate::item::storage::Storage::new();
+ for (ty, cnt) in self.build_cost {
+ storage.add(*ty, *cnt, u32::MAX);
+ }
+ Some(storage)
+ }
+ }
+ };
+}
+pub(crate) use impl_block;
+
+#[derive(Debug, thiserror::Error)]
+pub enum DataConvertError {
+ #[error(transparent)]
+ Custom(#[from] Box<dyn Error + Sync + Send>),
+}
+
+impl DataConvertError {
+ pub fn forward<T, E: Error + Sync + Send + 'static>(result: Result<T, E>) -> Result<T, Self> {
+ match result {
+ Ok(v) => Ok(v),
+ Err(e) => Err(Self::Custom(Box::new(e))),
+ }
+ }
+}
+
+#[derive(Debug, thiserror::Error)]
+pub enum DeserializeError {
+ #[error(transparent)]
+ DecompressError(#[from] data::DecompressError),
+ #[error("expected type {expect:?} but got {have:?}")]
+ InvalidType { have: DynType, expect: DynType },
+ #[error(transparent)]
+ Custom(#[from] Box<dyn Error + Sync + Send>),
+}
+
+impl DeserializeError {
+ pub fn forward<T, E: Error + Sync + Send + 'static>(result: Result<T, E>) -> Result<T, Self> {
+ match result {
+ Ok(v) => Ok(v),
+ Err(e) => Err(Self::Custom(Box::new(e))),
+ }
+ }
+}
+
+#[derive(Debug, thiserror::Error)]
+pub enum SerializeError {
+ #[error(transparent)]
+ Custom(#[from] Box<dyn Error + Sync + Send>),
+ #[error(transparent)]
+ Compress(#[from] CompressError),
+}
+
+impl SerializeError {
+ pub fn forward<T, E: Error + Sync + Send + 'static>(result: Result<T, E>) -> Result<T, Self> {
+ match result {
+ Ok(v) => Ok(v),
+ Err(e) => Err(Self::Custom(Box::new(e))),
+ }
+ }
+}
+
+/// a block. put it in stuff!
+pub struct Block {
+ image_random: Option<&'static [[DynImage<&'static [u8]>; 3]; 8]>,
+ image: Option<&'static [DynImage<&'static [u8]>; 3]>,
+ pub(crate) name: Type,
+ logic: BlockLogicEnum,
+}
+
+impl core::hash::Hash for Block {
+ fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
+ self.name.hash(state);
+ }
+}
+
+impl PartialEq for Block {
+ fn eq(&self, rhs: &Block) -> bool {
+ self.name == rhs.name
+ }
+}
+
+impl Block {
+ /// this blocks name
+ /// ```
+ /// assert!(mindus::block::DISTRIBUTOR.name() == "distributor")
+ /// ```
+ #[must_use]
+ #[inline]
+ pub const fn name(&self) -> &'static str {
+ self.name.get_name()
+ }
+
+ pub fn io(&self, state: Option<&State>) -> ratios::Io {
+ <BlockLogicEnum as ratios::Ratios>::io(&self.logic, state, self.name.get_name())
+ }
+
+ /// should you send context to [`image`]?
+ #[must_use]
+ #[inline]
+ pub const fn wants_context(&self) -> bool {
+ use BlockLogicEnum::*;
+ matches!(
+ self.logic,
+ ConveyorBlock(..)
+ | DuctBlock(..)
+ | StackConveyor(..)
+ | ConduitBlock(..)
+ | TileableDisplay(..)
+ )
+ }
+
+ /// draw this block, with this state
+ #[must_use]
+ #[inline]
+ pub fn image(
+ &self,
+ state: Option<&State>,
+ context: Option<&RenderingContext>,
+ rot: Rotation,
+ scale: Scale,
+ ) -> DynImage<Cow> {
+ if let Some(imgs) = &self.image_random {
+ return unsafe { imgs[mcg() as usize][scale as usize].mapped(Cow::Ref) };
+ }
+ if let Some(imgs) = &self.image {
+ return unsafe { imgs[scale as usize].mapped(Cow::Ref) };
+ }
+ DynImage::Rgba(
+ self.logic
+ .draw(self.name.get_name(), state, context, rot, scale),
+ )
+ }
+
+ /// size.
+ #[must_use]
+ #[inline]
+ pub fn get_size(&self) -> u8 {
+ self.logic.get_size()
+ }
+
+ /// does it matter if its rotated
+ #[must_use]
+ #[inline]
+ pub fn is_symmetric(&self) -> bool {
+ self.logic.is_symmetric()
+ }
+
+ /// cost
+ #[must_use]
+ #[inline]
+ pub fn get_build_cost(&self) -> Option<ItemStorage> {
+ self.logic.create_build_cost()
+ }
+
+ pub(crate) fn data_from_i32(
+ &self,
+ config: i32,
+ pos: GridPos,
+ ) -> Result<DynData, DataConvertError> {
+ self.logic.data_from_i32(config, pos)
+ }
+
+ pub(crate) fn deserialize_state(
+ &self,
+ data: DynData,
+ ) -> Result<Option<State>, DeserializeError> {
+ self.logic.deserialize_state(data)
+ }
+
+ pub(crate) fn mirror_state(&self, state: &mut State, horizontally: bool, vertically: bool) {
+ self.logic.mirror_state(state, horizontally, vertically);
+ }
+
+ pub(crate) fn rotate_state(&self, state: &mut State, clockwise: bool) {
+ self.logic.rotate_state(state, clockwise);
+ }
+
+ pub(crate) fn serialize_state(&self, state: &State) -> Result<DynData, SerializeError> {
+ self.logic.serialize_state(state)
+ }
+
+ #[inline]
+ pub(crate) fn read(&self, build: &mut Build, buff: &mut DataRead) -> Result<(), DataReadError> {
+ self.logic.read(build, buff)
+ }
+}
+
+impl fmt::Debug for Block {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "Block<{:?}>", self.name)
+ }
+}
+
+#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
+/// the possible rotation states of a object
+#[repr(u8)]
+pub enum Rotation {
+ Up,
+ Right,
+ Down,
+ Left,
+}
+
+impl Rotation {
+ #[must_use]
+ /// count rotations
+ pub const fn count(self) -> u8 {
+ self as u8
+ }
+
+ #[must_use]
+ /// mask
+ pub const fn mask(self) -> U4 {
+ match self {
+ Rotation::Up => B1000,
+ Rotation::Right => B0100,
+ Rotation::Down => B0010,
+ Rotation::Left => B0001,
+ }
+ }
+
+ #[must_use]
+ /// character of this rot (Right => >, Up => ^, Left => <, Down => v)
+ pub const fn ch(self) -> char {
+ match self {
+ Rotation::Right => '>',
+ Rotation::Up => '^',
+ Rotation::Left => '<',
+ Rotation::Down => 'v',
+ }
+ }
+
+ #[must_use]
+ /// mirror the directions.
+ pub const fn mirrored(self, horizontally: bool, vertically: bool) -> Self {
+ match self {
+ Self::Right => {
+ if horizontally {
+ Self::Left
+ } else {
+ Self::Right
+ }
+ }
+ Self::Up => {
+ if vertically {
+ Self::Down
+ } else {
+ Self::Up
+ }
+ }
+ Self::Left => {
+ if horizontally {
+ Self::Right
+ } else {
+ Self::Left
+ }
+ }
+ Self::Down => {
+ if vertically {
+ Self::Up
+ } else {
+ Self::Down
+ }
+ }
+ }
+ }
+
+ /// mirror in place
+ pub fn mirror(&mut self, horizontally: bool, vertically: bool) {
+ *self = self.mirrored(horizontally, vertically);
+ }
+
+ #[must_use]
+ /// rotate the rotation
+ pub const fn rotated(self, clockwise: bool) -> Self {
+ match self {
+ Self::Right => {
+ if clockwise {
+ Self::Down
+ } else {
+ Self::Up
+ }
+ }
+ Self::Up => {
+ if clockwise {
+ Self::Right
+ } else {
+ Self::Left
+ }
+ }
+ Self::Left => {
+ if clockwise {
+ Self::Up
+ } else {
+ Self::Down
+ }
+ }
+ Self::Down => {
+ if clockwise {
+ Self::Left
+ } else {
+ Self::Right
+ }
+ }
+ }
+ }
+
+ /// rotate the rotation in place
+ pub fn rotate(&mut self, clockwise: bool) {
+ *self = self.rotated(clockwise);
+ }
+
+ #[must_use]
+ /// rotate 180
+ pub const fn rotated_180(self) -> Self {
+ match self {
+ Self::Right => Self::Left,
+ Self::Up => Self::Down,
+ Self::Left => Self::Right,
+ Self::Down => Self::Up,
+ }
+ }
+
+ /// rotate 180 in place
+ pub fn rotate_180(&mut self) {
+ *self = self.rotated_180();
+ }
+}
+
+impl From<u8> for Rotation {
+ fn from(val: u8) -> Self {
+ match val & 3 {
+ 0 => Self::Right,
+ 1 => Self::Up,
+ 2 => Self::Left,
+ _ => Self::Down,
+ }
+ }
+}
+
+impl From<Rotation> for u8 {
+ fn from(rot: Rotation) -> Self {
+ match rot {
+ Rotation::Right => 0,
+ Rotation::Up => 1,
+ Rotation::Left => 2,
+ Rotation::Down => 3,
+ }
+ }
+}
+
+macro_rules! make_register {
+ ($($field:literal $op:tt $logic:expr;)+) => { paste::paste! {
+ $(
+ make_register!(impl $field $op $logic);
+ )+
+ pub static BLOCK_REGISTRY: phf::Map<&str, &Block> = phf::phf_map! {$(
+ $field => &[<$field:snake:upper>],
+ )+};
+
+ impl content::Type {
+ pub const fn to_block(self) -> Option<&'static Block> {
+ // static L: &[&Block] = &[$(&[<$field:snake:upper>],)+];
+ // L.get(self as usize).copied()
+ match self {
+ $(content::Type::[<$field:camel>] => Some(&[<$field:snake:upper>]),)+
+ _ => None,
+ }
+ }
+ }
+ }};
+ (impl $field: literal => $logic: expr) => {
+ paste::paste! { pub static [<$field:snake:upper>]: Block = Block {
+ name: crate::block::content::Type::[<$field:camel>], logic: <crate::block::BlockLogicEnum as crate::block::ConstFrom<_>>::fro($logic), image: None, image_random: None,
+ }; }
+ };
+ (impl $field: literal -> $logic: expr) => {
+ paste::paste! { pub static [<$field:snake:upper>]: Block = Block {
+ name: crate::block::content::Type::[<$field:camel>], logic: <crate::block::BlockLogicEnum as crate::block::ConstFrom<_>>::fro($logic), image: Some(&car::map!(crate::data::renderer::load!($field), DynImage::from)), image_random: None,
+ }; }
+ };
+ (impl $field: literal : $size: literal) => {
+ paste::paste! { pub static [<$field:snake:upper>]: Block = Block {
+ name: crate::block::content::Type::[<$field:camel>], logic: BlockLogicEnum::BasicBlock(BasicBlock::new($size, true, &[])), image: Some(&car::map!(crate::data::renderer::load!($field), DynImage::from)), image_random: None,
+ }; }
+ };
+ (impl $field: literal @ $size: literal) => {
+ paste::paste! { pub static [<$field:snake:upper>]: Block = Block {
+ name: crate::block::content::Type::[<$field:camel>], logic: BlockLogicEnum::BasicBlock(BasicBlock::new($size, true, &[])), image_random: Some(&crate::data::renderer::load!(8x $field)), image: None,
+ }; }
+ };
+ // floors
+ (impl $field: literal > $size: literal) => {
+ paste::paste! { pub static [<$field:snake:upper>]: Block = Block {
+ name: crate::block::content::Type::[<$field:camel>], logic: BlockLogicEnum::BasicBlock(BasicBlock::new($size, true, &[])), image: Some(&car::map!(crate::data::renderer::load!("empty4"), DynImage::from)), image_random: None,
+ }; }
+ };
+}
+impl content::Type {
+ pub const FLOOR: [Self; 96] = {
+ let mut i = 0;
+ let mut bl = [Self::OreCopper; _];
+ let mut oi = 0;
+ while i < Self::ALL.len() {
+ if let Some(b) = Self::ALL[i].to_block()
+ && b.image
+ == Some(&car::map!(
+ crate::data::renderer::load!("empty4"),
+ DynImage::from
+ ))
+ {
+ bl[oi] = Self::ALL[i];
+ oi += 1;
+ }
+ i += 1;
+ }
+ bl
+ };
+}
+// pub(self) use make_register;
+make_register! {
+ "metal-wall-1": 1;
+ "metal-wall-2": 1;
+ "metal-wall-3": 1;
+ "colored-floor" > 1;
+ "colored-wall": 1;
+ "darksand" > 1;
+ "sand-floor" > 1;
+ "yellow-stone" > 1;
+ "arkyic-stone" > 1;
+ "carbon-stone" > 1;
+ "dacite" > 1;
+ "dirt" > 1;
+ "arkycite-floor" > 1;
+ "basalt" > 1;
+ "ice" > 1;
+ "molten-slag" > 1;
+ "moss" > 1;
+ "mud" > 1;
+ "magmarock" > 1;
+ "grass" > 1;
+ "ice-snow" > 1;
+ "hotrock" > 1;
+ "char" > 1;
+ "snow" > 1;
+ "salt" > 1;
+ "shale" > 1;
+ "metal-floor" > 1;
+ "metal-floor-2" > 1;
+ "metal-floor-3" > 1;
+ "metal-floor-4" > 1;
+ "metal-floor-5" > 1;
+ "dark-panel-1" > 1;
+ "dark-panel-2" > 1;
+ "dark-panel-3" > 1;
+ "dark-panel-4" > 1;
+ "dark-panel-5" > 1;
+ "dark-panel-6" > 1;
+ "darksand-tainted-water" > 1;
+ "darksand-water" > 1;
+ "deep-tainted-water" > 1;
+ "deep-water" > 1;
+ "sand-water" > 1;
+ "shallow-water" > 1;
+ "space" > 1;
+ "stone" > 1;
+ "stone-vent" > 1;
+ "basalt-vent" > 1;
+ "arkyic-vent" > 1;
+ "beryllic-stone" > 1;
+ "bluemat" > 1;
+ "carbon-vent" > 1;
+ "core-zone" > 1;
+ "crater-stone" > 1;
+ "crystal-floor" > 1;
+ "crystalline-stone" > 1;
+ "crystalline-vent" > 1;
+ "metal-floor-damaged" > 1;
+ "dense-red-stone" > 1;
+ "ferric-craters" > 1; // ferris section
+ "ferric-stone" > 1;
+ "pooled-cryofluid" > 1;
+ "red-ice" > 1;
+ "red-stone-vent" > 1;
+ "red-stone" > 1;
+ "redmat" > 1;
+ "regolith" > 1;
+ "rhyolite-crater" > 1;
+ "rhyolite" > 1;
+ "rough-rhyolite" > 1;
+ "tainted-water" > 1;
+ "tar" > 1;
+ "yellow-stone-plates" > 1;
+ "yellow-stone-vent" > 1;
+ "spore-moss" > 1;
+ "ore-beryllium" > 1;
+ "ore-copper" > 1;
+ "ore-lead" > 1;
+ "ore-coal" > 1;
+ "ore-scrap" > 1;
+ "ore-thorium" > 1;
+ "ore-titanium" > 1;
+ "ore-tungsten" > 1;
+ "ore-crystal-thorium" > 1;
+ "ore-wall-beryllium" @ 1;
+ "ore-wall-thorium" @ 1;
+ "ore-wall-tungsten" @ 1;
+ "ore-wall-graphite" @ 1;
+ "graphitic-wall" @ 1;
+ "boulder" @ 1;
+ "arkyic-wall" @ 1;
+ "beryllic-stone-wall" @ 1;
+ "carbon-wall" @ 1;
+ "cliff": 1;
+ "crystalline-stone-wall" @ 1;
+ "dacite-wall" @ 1;
+ "dark-metal" @ 1;
+ "dirt-wall" @ 1;
+ "dune-wall" @ 1;
+ "ferric-stone-wall" @ 1;
+ "ice-wall" @ 1;
+ "pebbles" @ 1;
+ "pine": 1;
+ "red-diamond-wall" @ 1;
+ "red-ice-wall" @ 1;
+ "red-stone-wall" @ 1;
+ "regolith-wall" @ 1;
+ "rhyolite-vent" @ 1;
+ "rhyolite-wall" @ 1;
+ "salt-wall" @ 1;
+ "sand-wall" @ 1;
+ "shale-wall" @ 1;
+ "shrubs" @ 1;
+ "snow-pine": 1;
+ "snow-wall" @ 1;
+ "spawn": 1;
+ "spore-pine": 1;
+ "spore-wall" @ 1;
+ "stone-wall" @ 1;
+ "yellow-stone-wall" @ 1;
+ // props
+ "yellow-stone-boulder" @ 1;
+ "snow-boulder" @ 1;
+ "shale-boulder" @ 1;
+ "arkyic-boulder" @ 1;
+ "basalt-boulder" @ 1;
+ "beryllic-boulder" @ 1;
+ "carbon-boulder" @ 1;
+ "crystalline-boulder" @ 1;
+ "dacite-boulder" @ 1;
+ "ferric-boulder" @ 1;
+ "red-ice-boulder" @ 1;
+ "red-stone-boulder" @ 1;
+ "rhyolite-boulder" @ 1;
+ "sand-boulder" @ 1;
+ "pur-bush": 1;
+ "tendrils" @ 1;
+ // these are tall but uh (TODO layering)
+ "white-tree-dead": 1;
+ "yellowcoral": 1;
+ "white-tree": 1;
+ "redweed" @ 1;
+ "spore-cluster" @ 1;
+ "crystal-blocks" @ 1;
+ "crystal-cluster" @ 1;
+ "vibrant-crystal-cluster" @ 1;
+ "crystal-orbs" @ 1;
+ // end tall
+ "build1": 1;
+ "build2": 1;
+ "build3": 1;
+ "build4": 1;
+ "build5": 1;
+ "build6": 1;
+ "build7": 1;
+ "build8": 1;
+ "build9": 1;
+ "build10": 1;
+ "build11": 1;
+ "build12": 1;
+ "build13": 1;
+ "build14": 1;
+ "build15": 1;
+ "build16": 1;
+ "conveyor" => ConveyorBlock::new(1, false, cost!(Copper: 1));
+ "titanium-conveyor" => ConveyorBlock::new(1, false, cost!(Copper: 1, Lead: 1, Titanium: 1));
+ "plastanium-conveyor" => StackConveyor::new(1, false, cost!(Graphite: 1, Silicon: 1, Plastanium: 1));
+ "armored-conveyor" => ConveyorBlock::new(1, false, cost!(Metaglass: 1, Thorium: 1, Plastanium: 1));
+ "junction" -> JunctionBlock::new(1, true, cost!(Copper: 2));
+ "bridge-conveyor" -> BridgeBlock::new(1, false, cost!(Copper: 6, Lead: 6), 4, true);
+ "phase-conveyor" -> BridgeBlock::new(1, false, cost!(Lead: 10, Graphite: 10, Silicon: 7, PhaseFabric: 5), 12, true);
+ "sorter" => ItemBlock::new(1, true, cost!(Copper: 2, Lead: 2));
+ "inverted-sorter" => ItemBlock::new(1, true, cost!(Copper: 2, Lead: 2));
+ "unloader" => ItemBlock::new(1, true, cost!(Titanium: 25, Silicon: 30));
+ "router" -> BasicBlock::new(1, true, cost!(Copper: 3));
+ "distributor" -> BasicBlock::new(2, true, cost!(Copper: 4, Lead: 4));
+ "overflow-gate" -> BasicBlock::new(1, true, cost!(Copper: 4, Lead: 2));
+ "underflow-gate" -> BasicBlock::new(1, true, cost!(Copper: 4, Lead: 2));
+ "mass-driver" => BridgeBlock::new(3, true, cost!(Lead: 125, Titanium: 125, Thorium: 50, Silicon: 75), 55, false);
+ "duct" => DuctBlock::new(1, false, cost!(Beryllium: 1));
+ "armored-duct" => DuctBlock::new(1, false, cost!(Beryllium: 2, Tungsten: 1));
+ "duct-router" => ItemBlock::new(1, true, cost!(Beryllium: 10));
+ "overflow-duct" => SimpleDuctBlock::new(1, true, cost!(Graphite: 8, Beryllium: 8));
+ "underflow-duct" => SimpleDuctBlock::new(1, true, cost!(Graphite: 8, Beryllium: 8));
+ "duct-bridge" => BridgeBlock::new(1, true, cost!(Beryllium: 20), 3, true);
+ "duct-unloader" => ItemBlock::new(1, true, cost!(Graphite: 20, Silicon: 20, Tungsten: 10));
+ "surge-conveyor" => StackConveyor::new(1, false, cost!(SurgeAlloy: 1, Tungsten: 1));
+ "surge-router" => SurgeRouter::new(1, false, cost!(SurgeAlloy: 5, Tungsten: 1)); // not symmetric
+ "unit-cargo-loader" -> UnitCargoLoader::new(3, true, cost!(Silicon: 80, SurgeAlloy: 50, Oxide: 20));
+ "unit-cargo-unload-point" => ItemBlock::new(2, true, cost!(Silicon: 60, Tungsten: 60));
+ "cultivator" -> ProductionBlock::new(2, true, cost!(Copper: 25, Lead: 25, Silicon: 10));
+ "graphite-press" -> ProductionBlock::new(2, true, cost!(Copper: 75, Lead: 30));
+ "multi-press" -> ProductionBlock::new(3, true, cost!(Lead: 100, Graphite: 50, Titanium: 100, Silicon: 25));
+ "silicon-smelter" -> ProductionBlock::new(2, true, cost!(Copper: 30, Lead: 25));
+ "silicon-crucible" -> ProductionBlock::new(3, true, cost!(Metaglass: 80, Titanium: 120, Silicon: 60, Plastanium: 35));
+ "kiln" -> ProductionBlock::new(2, true, cost!(Copper: 60, Lead: 30, Graphite: 30));
+ "plastanium-compressor" -> ProductionBlock::new(2, true, cost!(Lead: 115, Graphite: 60, Titanium: 80, Silicon: 80));
+ "phase-weaver" -> ProductionBlock::new(2, true, cost!(Lead: 120, Thorium: 75, Silicon: 130));
+ "surge-smelter" -> ProductionBlock::new(3, true, cost!(Lead: 80, Thorium: 70, Silicon: 80));
+ "cryofluid-mixer" -> ProductionBlock::new(2, true, cost!(Lead: 65, Titanium: 60, Silicon: 40));
+ "pyratite-mixer" -> ProductionBlock::new(2, true, cost!(Copper: 50, Lead: 25));
+ "blast-mixer" -> ProductionBlock::new(2, true, cost!(Lead: 30, Titanium: 20));
+ "melter" -> ProductionBlock::new(1, true, cost!(Copper: 30, Lead: 35, Graphite: 45));
+ "separator" -> SeparatorBlock::new(2, true, cost!(Copper: 30, Titanium: 25));
+ "disassembler" -> SeparatorBlock::new(3, true, cost!(Titanium: 100, Thorium: 80, Silicon: 150, Plastanium: 40));
+ "spore-press" -> ProductionBlock::new(2, true, cost!(Lead: 35, Silicon: 30));
+ "pulverizer" -> ProductionBlock::new(1, true, cost!(Copper: 30, Lead: 25));
+ "coal-centrifuge" -> ProductionBlock::new(2, true, cost!(Lead: 30, Graphite: 40, Titanium: 20));
+ "incinerator" -> BasicBlock::new(1, true, cost!(Lead: 15, Graphite: 5));
+ "silicon-arc-furnace" -> ProductionBlock::new(3, true, cost!(Beryllium: 70, Graphite: 80));
+ "electrolyzer" => ProductionBlock::new(3, true, cost!(Silicon: 50, Graphite: 40, Beryllium: 130, Tungsten: 80));
+ "atmospheric-concentrator" -> ProductionBlock::new(3, true, cost!(Oxide: 60, Beryllium: 180, Silicon: 150));
+ "oxidation-chamber" => HeatCrafter::new(3, true, cost!(Tungsten: 120, Graphite: 80, Silicon: 100, Beryllium: 120));
+ "electric-heater" => HeatCrafter::new(2, false, cost!(Tungsten: 30, Oxide: 30));
+ "slag-heater" => HeatCrafter::new(3, false, cost!(Tungsten: 50, Oxide: 20, Beryllium: 20));
+ "phase-heater" => HeatCrafter::new(2, false, cost!(Oxide: 30, Carbide: 30, Beryllium: 30));
+ "heat-redirector" => HeatConduit::new(3, false, cost!(Tungsten: 10, Graphite: 10));
+ "small-heat-redirector" => HeatConduit::new(2, false, cost!(SurgeAlloy: 8, Graphite: 8));
+ "heat-router" => HeatConduit::new(3, false, cost!(Tungsten: 15, Graphite: 10));
+ "slag-incinerator" -> BasicBlock::new(1, true, cost!(Tungsten: 15));
+ "carbide-crucible" -> ProductionBlock::new(3, true, cost!(Tungsten: 110, Thorium: 150, Oxide: 60));
+ "slag-centrifuge" -> ProductionBlock::new(3, true, cost!());
+ // slag centrifuge
+ "surge-crucible" -> ProductionBlock::new(3, true, cost!(Silicon: 100, Graphite: 80, Tungsten: 80, Oxide: 80));
+ "cyanogen-synthesizer" -> ProductionBlock::new(3, true, cost!(Carbide: 50, Silicon: 80, Beryllium: 90));
+ "phase-synthesizer" -> ProductionBlock::new(3, true, cost!(Carbide: 90, Silicon: 100, Thorium: 100, Tungsten: 200));
+ "heat-reactor" => HeatCrafter::new(3, false, cost!(Oxide: 70, Graphite: 20, Carbide: 10, Thorium: 80));
+ "payload-conveyor" => PayloadConveyor::new(3, false, cost!(Copper: 10, Graphite: 10));
+ "payload-router" => PayloadRouter::new(3, false, cost!(Copper: 10, Graphite: 15));
+ "reinforced-payload-conveyor" => PayloadConveyor::new(3, false, cost!(Tungsten: 10));
+ "reinforced-payload-router" => PayloadRouter::new(3, false, cost!(Tungsten: 15));
+ "payload-mass-driver" -> BridgeBlock::new(3, true, cost!(Tungsten: 120, Silicon: 120, Graphite: 50), 700, false);
+ "large-payload-mass-driver" -> BridgeBlock::new(5, true, cost!(Thorium: 200, Tungsten: 200, Silicon: 200, Graphite: 100, Oxide: 30), 1100, false);
+ "small-deconstructor" => SimplePayloadBlock::new(3, true, cost!(Beryllium: 100, Silicon: 100, Oxide: 40, Graphite: 80));
+ "deconstructor" => SimplePayloadBlock::new(5, true, cost!(Beryllium: 250, Oxide: 100, Silicon: 250, Carbide: 250));
+ "constructor" => PayloadBlock::new(3, true, cost!(Silicon: 100, Beryllium: 150, Tungsten: 80));
+ "large-constructor" => PayloadBlock::new(5, true, cost!(Silicon: 150, Oxide: 150, Tungsten: 200, PhaseFabric: 40));
+ "payload-loader" => SimplePayloadBlock::new(3, false, cost!(Graphite: 50, Silicon: 50, Tungsten: 80));
+ "payload-unloader" => SimplePayloadBlock::new(3, false, cost!(Graphite: 50, Silicon: 50, Tungsten: 30));
+ "copper-wall" -> WallBlock::new(1, true, cost!(Copper: 6));
+ "copper-wall-large" -> WallBlock::new(2, true, cost!(Copper: 6 * 4));
+ "titanium-wall" -> WallBlock::new(1, true, cost!(Titanium: 6));
+ "titanium-wall-large" -> WallBlock::new(2, true, cost!(Titanium: 6 * 4));
+ "plastanium-wall" -> WallBlock::new(1, true, cost!(Metaglass: 2, Plastanium: 5));
+ "plastanium-wall-large" -> WallBlock::new(2, true, cost!(Metaglass: 2 * 4, Plastanium: 5 * 4));
+ "thorium-wall" -> WallBlock::new(1, true, cost!(Thorium: 6));
+ "thorium-wall-large" -> WallBlock::new(2, true, cost!(Thorium: 6 * 4));
+ "phase-wall" -> WallBlock::new(1, true, cost!(PhaseFabric: 6));
+ "phase-wall-large" -> WallBlock::new(2, true, cost!(PhaseFabric: 6 * 4));
+ "surge-wall" -> WallBlock::new(1, true, cost!(SurgeAlloy: 6));
+ "surge-wall-large" -> WallBlock::new(2, true, cost!(SurgeAlloy: 6 * 4));
+ "door" => DoorBlock::new(1, true, cost!(Titanium: 6, Silicon: 4));
+ "door-large" => DoorBlock::new(2, true, cost!(Titanium: 6 * 4, Silicon: 4 * 4));
+ "tungsten-wall" -> WallBlock::new(1, true, cost!(Tungsten: 6));
+ "tungsten-wall-large" -> WallBlock::new(2, true, cost!(Tungsten: 6 * 4));
+ "blast-door" -> DoorBlock::new(2, true, cost!(Tungsten: 24, Silicon: 24));
+ "reinforced-surge-wall" -> WallBlock::new(1, true, cost!(SurgeAlloy: 6, Tungsten: 2));
+ "reinforced-surge-wall-large" -> WallBlock::new(2, true, cost!(SurgeAlloy: 6 * 4, Tungsten: 2 * 4));
+ "carbide-wall" -> WallBlock::new(1, true, cost!(Thorium: 6, Carbide: 6));
+ "carbide-wall-large" -> WallBlock::new(2, true, cost!(Thorium: 6 * 4, Carbide: 6 * 4));
+ "shielded-wall" -> WallBlock::new(2, true, cost!(PhaseFabric: 20, SurgeAlloy: 12, Beryllium: 12));
+ "beryllium-wall" -> WallBlock::new(1, true, cost!(Beryllium: 6));
+ "beryllium-wall-large" -> WallBlock::new(2, true, cost!(Beryllium: 6 * 4));
+ "scrap-wall" -> WallBlock::new(1, true, cost!(Scrap: 6));
+ "scrap-wall-large" -> WallBlock::new(2, true, cost!(Scrap: 24));
+ "scrap-wall-huge" -> WallBlock::new(3, true, cost!(Scrap: 54));
+ "scrap-wall-gigantic" -> WallBlock::new(4, true, cost!(Scrap: 96));
+ "thruster" => WallBlock::new(4, false, cost!(Scrap: 96));
+ "mender" -> HeatedBlock::new(1, true, cost!(Copper: 25, Lead: 30));
+ "mend-projector" -> HeatedBlock::new(2, true, cost!(Copper: 50, Lead: 100, Titanium: 25, Silicon: 40));
+ "overdrive-projector" -> HeatedBlock::new(2, true, cost!(Lead: 100, Titanium: 75, Silicon: 75, Plastanium: 30));
+ "overdrive-dome" -> HeatedBlock::new(3, true, cost!(Lead: 200, Titanium: 130, Silicon: 130, Plastanium: 80, SurgeAlloy: 120));
+ "force-projector" -> BasicBlock::new(3, true, cost!(Lead: 100, Titanium: 75, Silicon: 125));
+ "regen-projector" -> BasicBlock::new(3, true, cost!(Silicon: 80, Tungsten: 60, Oxide: 40, Beryllium: 80));
+ "shock-mine" -> BasicBlock::new(1, true, cost!(Lead: 25, Silicon: 12));
+ "radar" -> RadarBlock::new(1, true, cost!(Silicon: 60, Graphite: 50, Beryllium: 10));
+ "build-tower" -> BasicBlock::new(3, true, cost!(Silicon: 150, Oxide: 40, Thorium: 60));
+ "shockwave-tower" -> BasicBlock::new(3, true, cost!(SurgeAlloy: 50, Silicon: 150, Oxide: 30, Tungsten: 100));
+ "reinforced-pump" -> BasicBlock::new(2, true, cost!(Beryllium: 40, Tungsten: 30, Silicon: 20));
+ "mechanical-pump" -> BasicBlock::new(1, true, cost!(Copper: 15, Metaglass: 10));
+ "rotary-pump" -> BasicBlock::new(2, true, cost!(Copper: 70, Metaglass: 50, Titanium: 35, Silicon: 20));
+ "impulse-pump" -> BasicBlock::new(3, true, cost!(Copper: 80, Metaglass: 90, Titanium: 40, Thorium: 35, Silicon: 30));
+ "conduit" => ConduitBlock::new(1, false, cost!(Metaglass: 1));
+ "pulse-conduit" => ConduitBlock::new(1, false, cost!(Metaglass: 1, Titanium: 2));
+ "plated-conduit" => ConduitBlock::new(1, false, cost!(Metaglass: 1, Thorium: 2, Plastanium: 1));
+ "liquid-router" -> BasicBlock::new(1, true, cost!(Metaglass: 2, Graphite: 4));
+ "liquid-container" -> BasicBlock::new(2, true, cost!(Metaglass: 15, Titanium: 10));
+ "liquid-tank" -> BasicBlock::new(3, true, cost!(Metaglass: 40, Titanium: 30));
+ "liquid-junction" -> BasicBlock::new(1, true, cost!(Metaglass: 8, Graphite: 4));
+ "bridge-conduit" -> BridgeBlock::new(1, true, cost!(Metaglass: 8, Graphite: 4), 4, true);
+ "phase-conduit" -> BridgeBlock::new(1, true, cost!(Metaglass: 20, Titanium: 10, Silicon: 7, PhaseFabric: 5), 12, true);
+ "reinforced-conduit" => ConduitBlock::new(1, false, cost!(Beryllium: 2));
+ "reinforced-liquid-junction" -> BasicBlock::new(1, true, cost!(Graphite: 4, Beryllium: 8));
+ "reinforced-bridge-conduit" => BridgeBlock::new(1, true, cost!(Graphite: 8, Beryllium: 20), 4, true);
+ "reinforced-liquid-router" -> BasicBlock::new(1, true, cost!(Graphite: 8, Beryllium: 4));
+ "reinforced-liquid-container" -> BasicBlock::new(2, true, cost!(Tungsten: 10, Beryllium: 16));
+ "reinforced-liquid-tank" -> BasicBlock::new(3, true, cost!(Tungsten: 40, Beryllium: 50));
+ "ground-factory" => UnitFactory::new(3, false, cost!(Copper: 50, Lead: 120, Silicon: 80), units::GROUND_UNITS);
+ "air-factory" => UnitFactory::new(3, false, cost!(Copper: 60, Lead: 70), units::AIR_UNITS);
+ "naval-factory" => UnitFactory::new(3, false, cost!(Copper: 150, Lead: 130, Metaglass: 120), units::NAVAL_UNITS);
+ "additive-reconstructor" => ConstructorBlock::new(3, false, cost!(Copper: 200, Lead: 120, Silicon: 90));
+ "multiplicative-reconstructor" => ConstructorBlock::new(5, false, cost!(Lead: 650, Titanium: 350, Thorium: 650, Silicon: 450));
+ "exponential-reconstructor" => ConstructorBlock::new(7, false, 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));
+ "tank-fabricator" => UnitFactory::new(3, true, cost!(Silicon: 200, Beryllium: 150), &[crate::unit::Type::Stell]);
+ "ship-fabricator" => UnitFactory::new(3, true, cost!(Silicon: 250, Beryllium: 200), &[crate::unit::Type::Elude]);
+ "mech-fabricator" => UnitFactory::new(3, true, cost!(Silicon: 200, Graphite: 300, Tungsten: 60), &[crate::unit::Type::Merui]);
+ "tank-refabricator" => ConstructorBlock::new(3, true, cost!(Beryllium: 200, Tungsten: 80, Silicon: 100));
+ "mech-refabricator" => ConstructorBlock::new(3, true, cost!(Beryllium: 250, Tungsten: 120, Silicon: 150));
+ "ship-refabricator" => ConstructorBlock::new(3, true, cost!(Beryllium: 200, Tungsten: 100, Silicon: 150, Oxide: 40));
+ "prime-refabricator" => ConstructorBlock::new(5, true, cost!(Thorium: 250, Oxide: 200, Tungsten: 200, Silicon: 400));
+ "tank-assembler" => AssemblerBlock::new(5, true, cost!(Thorium: 500, Oxide: 150, Carbide: 80, Silicon: 500));
+ "ship-assembler" => AssemblerBlock::new(5, true, cost!(Carbide: 100, Oxide: 200, Tungsten: 500, Silicon: 800, Thorium: 400));
+ "mech-assembler" => AssemblerBlock::new(5, true, cost!(Carbide: 200, Thorium: 600, Oxide: 200, Tungsten: 500, Silicon: 900)); // smh collaris
+ "basic-assembler-module" => AssemblerModule::new(5, true, cost!(Carbide: 300, Thorium: 500, Oxide: 200, PhaseFabric: 400)); // the dummy block
+ "unit-repair-tower" -> BasicBlock::new(2, true, cost!(Graphite: 90, Silicon: 90, Tungsten: 80));
+ "launch-pad" -> BasicBlock::new(3, true, cost!(Copper: 350, Lead: 200, Titanium: 150, Silicon: 140));
+ "landing-pad" => LandingPadBlock::new(4, true, cost!(Copper: 200, Graphite: 100, Titanium: 100));
+ "advanced-launch-pad" -> BasicBlock::new(4, true, cost!(Copper: 350, Silicon: 250, Lead: 300, Titanium: 200));
+ "interplanetary-accelerator" -> BasicBlock::new(7, true, cost!(Copper: 16000, Silicon: 11000, Thorium: 13000, Titanium: 12000, SurgeAlloy: 6000, PhaseFabric: 5000));
+ "mechanical-drill" -> DrillBlock::new(2, true, cost!(Copper: 12));
+ "pneumatic-drill" -> DrillBlock::new(2, true, cost!(Copper: 18, Graphite: 10));
+ "laser-drill" -> DrillBlock::new(3, true, cost!(Copper: 35, Graphite: 30, Titanium: 20, Silicon: 30));
+ "blast-drill" -> DrillBlock::new(4, true, cost!(Copper: 65, Titanium: 50, Thorium: 75, Silicon: 60));
+ "water-extractor" -> BasicBlock::new(2, true, cost!(Copper: 30, Lead: 30, Metaglass: 30, Graphite: 30));
+ "oil-extractor" -> BasicBlock::new(3, true, cost!(Copper: 150, Lead: 115, Graphite: 175, Thorium: 115, Silicon: 75));
+ "vent-condenser" -> ProductionBlock::new(3, true, cost!(Graphite: 20, Beryllium: 60));
+ "cliff-crusher" => WallDrillBlock::new(2, false, cost!(Beryllium: 100, Graphite: 40));
+ "large-cliff-crusher" => WallDrillBlock::new(3, false, cost!(Silicon: 80, SurgeAlloy: 15, Beryllium: 100, Tungsten: 50));
+ "plasma-bore" => DrillBlock::new(2, false, cost!(Beryllium: 40));
+ "large-plasma-bore" => DrillBlock::new(3, false, cost!(Silicon: 100, Oxide: 25, Beryllium: 100, Tungsten: 70));
+ "impact-drill" -> DrillBlock::new(4, true, cost!(Silicon: 70, Beryllium: 90, Graphite: 60));
+ "eruption-drill" -> DrillBlock::new(5, true, cost!(Silicon: 200, Oxide: 20, Tungsten: 200, Thorium: 120));
+ "reinforced-message" -> MessageLogic::new(1, true, cost!(Graphite: 10, Beryllium: 5));
+ "message" -> MessageLogic::new(1, true, cost!(Copper: 5, Graphite: 5));
+ "switch" => SwitchLogic::new(1, true, cost!(Copper: 5, Graphite: 5));
+ "micro-processor" -> ProcessorLogic::new(1, true, cost!(Copper: 90, Lead: 50, Silicon: 50));
+ "logic-processor" -> ProcessorLogic::new(2, true, cost!(Lead: 320, Graphite: 60, Thorium: 50, Silicon: 80));
+ "hyper-processor" -> ProcessorLogic::new(3, true, cost!(Lead: 450, Thorium: 75, Silicon: 150, SurgeAlloy: 50));
+ "memory-cell" -> MemoryBlock::new(1, true, cost!(Copper: 30, Graphite: 30, Silicon: 30));
+ "memory-bank" -> MemoryBlock::new(2, true, cost!(Copper: 30, Graphite: 80, Silicon: 80, PhaseFabric: 30));
+ "logic-display" -> BasicBlock::new(3, true, cost!(Lead: 100, Metaglass: 50, Silicon: 50));
+ "large-logic-display" -> BasicBlock::new(6, true, cost!(Lead: 200, Metaglass: 100, Silicon: 150, PhaseFabric: 75));
+ "tile-logic-display" => TileableDisplay::new(1, false, cost!(Lead: 8, Silicon: 8, Metaglass: 8, PhaseFabric: 3));
+ "canvas" => CanvasBlock::new(2, true, cost!(Silicon: 10, Beryllium: 10), 12, S_PALETTE);
+ "large-canvas" => CanvasBlock::new(3, true, cost!(Silicon: 15, Beryllium: 15, SurgeAlloy: 15), 24, L_PALETTE);
+ "illuminator" -> LampBlock::new(1, true, cost!(Lead: 8, Graphite: 12, Silicon: 8));
+ "power-node" -> ConnectorBlock::new(1, true, cost!(Copper: 1, Lead: 3), 10);
+ "power-node-large" -> ConnectorBlock::new(2, true, cost!(Lead: 10, Titanium: 5, Silicon: 3), 15);
+ "surge-tower" -> ConnectorBlock::new(2, true, cost!(Lead: 10, Titanium: 7, Silicon: 15, SurgeAlloy: 15), 2);
+ "diode" => DiodeBlock::new(1, false, cost!(Metaglass: 10, Silicon: 10, Plastanium: 5));
+ "battery" -> BasicBlock::new(1, true, cost!(Copper: 5, Lead: 20));
+ "battery-large" -> BasicBlock::new(3, true, cost!(Lead: 50, Titanium: 20, Silicon: 30));
+ "combustion-generator" -> GeneratorBlock::new(1, true, cost!(Copper: 25, Lead: 15));
+ "thermal-generator" -> GeneratorBlock::new(2, true, cost!(Copper: 40, Lead: 50, Metaglass: 40, Graphite: 35, Silicon: 35));
+ "steam-generator" -> GeneratorBlock::new(2, true, cost!(Copper: 35, Lead: 40, Graphite: 25, Silicon: 30));
+ "differential-generator" -> GeneratorBlock::new(3, true, cost!(Copper: 70, Lead: 100, Metaglass: 50, Titanium: 50, Silicon: 65));
+ "rtg-generator" -> GeneratorBlock::new(2, true, cost!(Lead: 100, Thorium: 50, Silicon: 75, Plastanium: 75, PhaseFabric: 25));
+ "solar-panel" -> GeneratorBlock::new(1, true, cost!(Lead: 10, Silicon: 15));
+ "solar-panel-large" -> GeneratorBlock::new(3, true, cost!(Lead: 80, Silicon: 110, PhaseFabric: 15));
+ "thorium-reactor" -> NuclearGeneratorBlock::new(3, true, cost!(Lead: 300, Metaglass: 50, Graphite: 150, Thorium: 150, Silicon: 200));
+ "impact-reactor" -> ImpactReactorBlock::new(4, true, cost!(Lead: 500, Metaglass: 250, Graphite: 400, Thorium: 100, Silicon: 300, SurgeAlloy: 250));
+ "beam-node" -> ConnectorBlock::new(1, true, cost!(Beryllium: 8), 4);
+ "beam-tower" -> ConnectorBlock::new(3, true, cost!(Beryllium: 30, Oxide: 10, Silicon: 10), 12);
+ "turbine-condenser" -> GeneratorBlock::new(3, true, cost!(Beryllium: 60));
+ "chemical-combustion-chamber" -> GeneratorBlock::new(3, true, cost!(Graphite: 40, Tungsten: 40, Oxide: 40, Silicon: 30));
+ "pyrolysis-generator" -> GeneratorBlock::new(3, true, cost!(Graphite: 50, Carbide: 50, Oxide: 60, Silicon: 50));
+ "flux-reactor" -> GeneratorBlock::new(5, true, cost!(Graphite: 300, Carbide: 200, Oxide: 100, Silicon: 600, SurgeAlloy: 300));
+ "neoplasia-reactor" => Neoplasia::new(5, true, cost!(Tungsten: 1000, Carbide: 300, Oxide: 150, Silicon: 500, PhaseFabric: 300, SurgeAlloy: 200));
+ "core-shard" -> BasicBlock::new(3, true, cost!(Copper: 1000, Lead: 800));
+ "core-foundation" -> BasicBlock::new(4, true, cost!(Copper: 3000, Lead: 3000, Silicon: 2000));
+ "core-nucleus" -> BasicBlock::new(5, true, cost!(Copper: 8000, Lead: 8000, Thorium: 4000, Silicon: 5000));
+ "core-bastion" -> BasicBlock::new(4, true, cost!(Graphite: 1000, Silicon: 1000, Beryllium: 800));
+ "core-citadel" -> BasicBlock::new(5, true, cost!(Silicon: 4000, Beryllium: 4000, Tungsten: 3000, Oxide: 1000));
+ "core-acropolis" -> BasicBlock::new(6, true, cost!(Beryllium: 6000, Silicon: 5000, Tungsten: 5000, Carbide: 3000, Oxide: 3000));
+ "container" -> BasicBlock::new(2, true, cost!(Titanium: 100));
+ "vault" -> BasicBlock::new(3, true, cost!(Titanium: 250, Thorium: 125));
+ "reinforced-container" -> BasicBlock::new(2, true, cost!(Tungsten: 30, Graphite: 40));
+ "reinforced-vault" -> BasicBlock::new(3, true, cost!(Tungsten: 125, Thorium: 70, Beryllium: 100));
+ "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));
+ // sandbox only
+ "beam-link" -> ConnectorBlock::new(3, true, &[], 12);
+ "power-source" -> ConnectorBlock::new(1, true, &[], 100);
+ "power-void" -> BasicBlock::new(1, true, &[]);
+ "world-processor" -> ProcessorLogic::new(1, true, &[]);
+ "world-message" -> MessageLogic::new(1, true, &[]);
+ "world-cell" -> MemoryBlock::new(1, true, &[]);
+ "world-switch" => SwitchLogic::new(1, true, &[]);
+ "liquid-source" => FluidBlock::new(1, true, &[]);
+ "liquid-void" -> BasicBlock::new(1, true, &[]);
+ "shield-projector" -> ShieldBlock::new(3, true, &[]);
+ "large-shield-projector" -> ShieldBlock::new(4, true, &[]);
+ "payload-source" => PayloadBlock::new(5, false, &[]);
+ "payload-void" => SimplePayloadBlock::new(5, true, &[]);
+ "item-source" => ItemBlock::new(1, true, &[]);
+ "item-void" -> BasicBlock::new(1, true, &[]);
+ "heat-source" => HeatCrafter::new(1, false, &[]);
+ "target-dummy" -> BasicBlock::new(2, true, &[]);
+}
diff --git a/mindus/src/block/payload.rs b/mindus/src/block/payload.rs
new file mode 100644
index 0000000..80a8a6f
--- /dev/null
+++ b/mindus/src/block/payload.rs
@@ -0,0 +1,272 @@
+//! payload related bits and bobs
+use thiserror::Error;
+
+use crate::block::content::Type as BlockEnum;
+use crate::block::simple::*;
+use crate::block::{self, *};
+use crate::content;
+use crate::data::ReadError;
+use crate::data::dynamic::DynType;
+use crate::data::entity_mapping;
+use crate::unit;
+
+make_simple!(SimplePayloadBlock, |_, n, _, _, r: Rotation, scl| {
+ match n {
+ "deconstructor" | "small-deconstructor" | "payload-void" => {
+ let mut base = load!(from n which is ["deconstructor" | "small-deconstructor" | "payload-void"], scl);
+ let mut r#in = load!(scl -> match n {
+ "small-deconstructor" => "factory-in-3",
+ _ => "factory-in-5",
+ });
+ unsafe { r#in.rotate(r.rotated(false).count()) };
+ unsafe { base.overlay(&r#in) };
+ let top = load!(scl -> match n {
+ "small-deconstructor" => "small-deconstructor-top",
+ "deconstructor" => "deconstructor-top",
+ _ => "payload-void-top",
+ });
+ unsafe { base.overlay(&top) };
+ base
+ }
+ // "payload-loader" | "payload-unloader"
+ _ => {
+ let mut base = load!(from n which is ["payload-loader" | "payload-unloader"], scl);
+ let mut input = load!("factory-in-3-dark", scl);
+ unsafe { input.rotate(r.rotated(false).count()) };
+ unsafe { base.overlay(&input) };
+
+ let mut output = load!("factory-out-3-dark", scl);
+ unsafe { output.rotate(r.rotated(false).count()) };
+ unsafe { base.overlay(&output) };
+
+ let top =
+ load!(concat "top" => n which is ["payload-loader" | "payload-unloader"], scl);
+ unsafe { base.overlay(&top) };
+ base
+ }
+ }
+});
+make_simple!(
+ PayloadConveyor,
+ |_, n, _, _, r: Rotation, s| {
+ let mut base =
+ load!(from n which is ["payload-conveyor" | "reinforced-payload-conveyor"], s);
+ unsafe { base.rotate(r.rotated(false).count()) };
+ base
+ },
+ read_payload_conveyor
+);
+
+make_simple!(
+ PayloadRouter,
+ |_, n, _, _, r: Rotation, s| {
+ let mut base = load!(from n which is ["payload-router" | "reinforced-payload-router"], s);
+ unsafe { base.rotate(r.rotated(false).count()) };
+ let over =
+ load!(concat "over" => n which is ["payload-router" | "reinforced-payload-router"], s);
+ unsafe { base.overlay(&over) };
+ base
+ },
+ read_payload_router
+);
+
+#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
+/// payload item cfg
+pub enum Payload {
+ Empty,
+ Block(block::content::Type),
+ Unit(unit::Type),
+}
+
+/// a payload related block with [item cfg](Payload)
+pub struct PayloadBlock {
+ size: u8,
+ symmetric: bool,
+ build_cost: BuildCost,
+}
+
+impl PayloadBlock {
+ #[must_use]
+ pub const fn new(size: u8, symmetric: bool, build_cost: BuildCost) -> Self {
+ assert!(size != 0, "invalid size");
+ Self {
+ size,
+ symmetric,
+ build_cost,
+ }
+ }
+
+ state_impl!(pub Payload);
+}
+
+impl BlockLogic for PayloadBlock {
+ impl_block!();
+
+ fn draw(
+ &self,
+ name: &str,
+ _: Option<&State>,
+ _: Option<&RenderingContext>,
+ r: Rotation,
+ s: Scale,
+ ) -> ImageHolder<4> {
+ let mut base =
+ load!(from name which is ["constructor" | "large-constructor" | "payload-source"], s);
+ let mut out = load!(s -> match name {
+ "constructor" => "factory-out-3",
+ "large-constructor" => "factory-out-5-dark",
+ _ => "factory-out-5",
+ });
+ unsafe { out.rotate(r.rotated(false).count()) };
+ unsafe { base.overlay(&out) };
+ let top = load!(concat "top" => name which is ["constructor" | "large-constructor" | "payload-source"], s);
+ unsafe { base.overlay(&top) };
+ base
+ }
+
+ fn data_from_i32(&self, _: i32, _: GridPos) -> Result<DynData, DataConvertError> {
+ Ok(DynData::Empty)
+ }
+
+ fn deserialize_state(&self, data: DynData) -> Result<Option<State>, DeserializeError> {
+ match data {
+ DynData::Empty => Ok(Some(Self::create_state(Payload::Empty))),
+ DynData::Content(content::Type::Block, id) => {
+ let block = PayloadDeserializeError::forward(block::content::Type::try_from(id))?;
+ Ok(Some(Self::create_state(Payload::Block(block))))
+ }
+ DynData::Content(content::Type::Unit, id) => {
+ let unit = PayloadDeserializeError::forward(unit::Type::try_from(id))?;
+ Ok(Some(Self::create_state(Payload::Unit(unit))))
+ }
+ DynData::Content(have, ..) => Err(DeserializeError::Custom(Box::new(
+ PayloadDeserializeError::ContentType(have),
+ ))),
+ _ => Err(DeserializeError::InvalidType {
+ have: data.get_type(),
+ expect: DynType::Content,
+ }),
+ }
+ }
+
+ fn serialize_state(&self, state: &State) -> Result<DynData, SerializeError> {
+ match Self::get_state(state) {
+ Payload::Empty => Ok(DynData::Empty),
+ Payload::Block(block) => Ok(DynData::Content(content::Type::Block, (*block).into())),
+ Payload::Unit(unit) => Ok(DynData::Content(content::Type::Unit, (*unit).into())),
+ }
+ }
+}
+
+/// format:
+/// - call [`read_payload_conveyor`]
+/// - t: [`u8`]
+/// - sort: [`u16`]
+/// - recdir: [`u8`]
+fn read_payload_router(b: &mut Build, buff: &mut DataRead) -> Result<(), DataReadError> {
+ read_payload_conveyor(b, buff)?;
+ buff.skip(4)
+}
+
+/// format:
+/// - [`skip(4)`](`DataRead::skip`)
+/// - rot: [`f32`]
+/// - become [`read_payload`]
+fn read_payload_conveyor(_: &mut Build, buff: &mut DataRead) -> Result<(), DataReadError> {
+ buff.skip(8)?;
+ read_payload(buff)
+}
+
+/// format:
+/// - iterate [`i16`]..0
+/// - [`u8`], [`i16`], [`i32`]
+pub(crate) fn read_payload_seq(buff: &mut DataRead) -> Result<(), DataReadError> {
+ let amount = (-buff.read_i16()?) as usize;
+ buff.skip(amount * 7)
+}
+
+/// format:
+/// - vector: ([`f32`], [`f32`])
+/// - rotation: [`f32`]
+/// - become [`read_payload`]
+pub(crate) fn read_payload_block(buff: &mut DataRead) -> Result<(), DataReadError> {
+ buff.skip(12)?;
+ read_payload(buff)
+}
+
+/// format:
+/// - exists: [`bool`]
+/// - if !exists: ok
+/// - type: [`u8`]
+/// - if type == `1` (payload block):
+/// - block: [`u16`]
+/// - version: [`u8`]
+/// - [`BlockLogic::read`] (recursion :ferrisHmm:),
+/// - if type == 2 (paylood unit):
+/// - id: [`u8`]
+/// - call [`UnitClass::read`](crate::data::entity_mapping::UnitClass::read)
+pub fn read_payload(buff: &mut DataRead) -> Result<(), DataReadError> {
+ if !buff.read_bool()? {
+ return Ok(());
+ }
+ let t = buff.read_u8()?;
+ const BLOCK: u8 = 1;
+ const UNIT: u8 = 0;
+ match t {
+ BLOCK => {
+ let b = buff.read_u16()?;
+ buff.skip(1)?;
+ let block = BlockEnum::try_from(b)
+ .unwrap_or(BlockEnum::Router)
+ .to_block()
+ .expect("payload should not be a environment block");
+ let mut b = Build::new(block);
+ let _ = b.read(buff);
+ }
+ UNIT => {
+ let u = buff.read_u8()? as usize;
+ let Some(&Some(u)) = entity_mapping::ID.get(u) else {
+ return Err(ReadError::Expected("map entry"));
+ };
+ let _ = u.read(buff)?;
+ }
+ _ => return Err(ReadError::Expected("0 | 1")),
+ }
+ Ok(())
+}
+
+#[cfg(test)]
+mod tests {
+
+ use super::*;
+ #[test]
+ fn payload_conv() {
+ let mut r = DataRead::new(&[0, 0, 0, 0, 0, 0, 0, 0, 0]);
+ read_payload_conveyor(&mut Build::new(&PAYLOAD_CONVEYOR), &mut r).unwrap();
+ assert!(r.read_bool().is_err());
+ let mut r = DataRead::new(&[
+ 65, 198, 232, 0, 67, 51, 255, 249, 1, 1, 0, 157, 0, 67, 197, 128, 0, 128, 1, 3,
+ ]);
+ read_payload_conveyor(&mut Build::new(&PAYLOAD_CONVEYOR), &mut r).unwrap();
+ assert!(r.read_bool().is_err());
+ }
+}
+
+#[derive(Clone, Copy, Debug, Eq, PartialEq, Error)]
+pub enum PayloadDeserializeError {
+ #[error("expected Unit or Block but got {0:?}")]
+ ContentType(content::Type),
+ #[error("payload block not found")]
+ BlockNotFound(#[from] block::content::TryFromU16Error),
+ #[error("payload unit not found")]
+ UnitNotFound(#[from] unit::TryFromU16Error),
+}
+
+impl PayloadDeserializeError {
+ pub fn forward<T, E: Into<Self>>(result: Result<T, E>) -> Result<T, DeserializeError> {
+ match result {
+ Ok(v) => Ok(v),
+ Err(e) => Err(DeserializeError::Custom(Box::new(e.into()))),
+ }
+ }
+}
diff --git a/mindus/src/block/power.rs b/mindus/src/block/power.rs
new file mode 100644
index 0000000..3fde947
--- /dev/null
+++ b/mindus/src/block/power.rs
@@ -0,0 +1,213 @@
+//! power connection and generation
+use thiserror::Error;
+
+use crate::block::simple::*;
+use crate::block::*;
+use crate::data::dynamic::DynType;
+
+make_simple!(GeneratorBlock => |_, buff: &mut DataRead| read_generator(buff));
+make_simple!(NuclearGeneratorBlock => |_, buff: &mut DataRead| read_nuclear(buff));
+make_simple!(ImpactReactorBlock => |_, buff: &mut DataRead| read_impact(buff));
+make_simple!(
+ Neoplasia,
+ |_, _, _, _, rot: Rotation, scl| {
+ let mut base = load!("neoplasia-reactor", scl);
+ let mut top = load!(scl -> match rot {
+ Rotation::Up | Rotation::Right => "neoplasia-reactor-top1",
+ Rotation::Down | Rotation::Left => "neoplasia-reactor-top2",
+ });
+ unsafe { top.rotate(rot.rotated(false).count()) };
+ unsafe { base.overlay(&top) };
+ base
+ },
+ |_, buff: &mut DataRead| read_heater(buff)
+);
+make_simple!(DiodeBlock, |_, _, _, _, rot: Rotation, s| {
+ let mut base = load!("diode", s);
+ if rot == Rotation::Right {
+ return base;
+ }
+ let mut top = load!("diode-arrow", s);
+ unsafe { top.rotate(rot.rotated(false).count()) };
+ unsafe { base.overlay(&top) };
+ base
+});
+
+pub struct ConnectorBlock {
+ size: u8,
+ symmetric: bool,
+ build_cost: BuildCost,
+ pub max: u8,
+}
+
+impl ConnectorBlock {
+ #[must_use]
+ pub const fn new(size: u8, symmetric: bool, build_cost: BuildCost, max: u8) -> Self {
+ assert!(size != 0, "invalid size");
+ assert!(
+ !(max == 0 || max > i8::MAX as u8),
+ "invalid maximum link count"
+ );
+ Self {
+ size,
+ symmetric,
+ build_cost,
+ max,
+ }
+ }
+ state_impl!(pub Vec<(i16, i16)>);
+}
+
+impl BlockLogic for ConnectorBlock {
+ impl_block!();
+
+ fn data_from_i32(&self, _: i32, _: GridPos) -> Result<DynData, DataConvertError> {
+ Ok(DynData::Empty)
+ }
+
+ fn deserialize_state(&self, data: DynData) -> Result<Option<State>, DeserializeError> {
+ match data {
+ DynData::Empty => Ok(Some(Self::create_state(Vec::new()))),
+ DynData::Point2Array(s) => Ok(Some(Self::create_state(s))),
+ _ => Err(DeserializeError::InvalidType {
+ have: data.get_type(),
+ expect: DynType::Boolean,
+ }),
+ }
+ }
+
+ fn mirror_state(&self, state: &mut State, horizontally: bool, vertically: bool) {
+ for (dx, dy) in &mut *Self::get_state_mut(state) {
+ if horizontally {
+ *dx = -*dx;
+ }
+ if vertically {
+ *dy = -*dy;
+ }
+ }
+ }
+
+ fn rotate_state(&self, state: &mut State, clockwise: bool) {
+ for (dx, dy) in &mut *Self::get_state_mut(state) {
+ let (cdx, cdy) = (*dx, *dy);
+ *dx = if clockwise { cdy } else { -cdy };
+ *dy = if clockwise { -cdx } else { cdx };
+ }
+ }
+
+ fn serialize_state(&self, state: &State) -> Result<DynData, SerializeError> {
+ Ok(DynData::Point2Array(Self::get_state(state).clone()))
+ }
+}
+
+#[derive(Debug, Error)]
+pub enum ConnectorDeserializeError {
+ #[error("too many links ({have} but only {max} allowed)")]
+ LinkCount { have: usize, max: u8 },
+}
+
+impl ConnectorDeserializeError {
+ pub fn forward<T, E: Into<Self>>(result: Result<T, E>) -> Result<T, DeserializeError> {
+ match result {
+ Ok(v) => Ok(v),
+ Err(e) => Err(DeserializeError::Custom(Box::new(e.into()))),
+ }
+ }
+}
+
+#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
+pub struct Rgba(u8, u8, u8, u8);
+
+impl From<u32> for Rgba {
+ fn from(value: u32) -> Self {
+ Self(
+ (value >> 24) as u8,
+ (value >> 16) as u8,
+ (value >> 8) as u8,
+ value as u8,
+ )
+ }
+}
+
+impl From<Rgba> for u32 {
+ fn from(value: Rgba) -> Self {
+ (u32::from(value.0) << 24)
+ | (u32::from(value.1) << 16)
+ | (u32::from(value.2) << 8)
+ | u32::from(value.3)
+ }
+}
+
+pub struct LampBlock {
+ size: u8,
+ symmetric: bool,
+ build_cost: BuildCost,
+}
+
+impl LampBlock {
+ #[must_use]
+ pub const fn new(size: u8, symmetric: bool, build_cost: BuildCost) -> Self {
+ assert!(size != 0, "invalid size");
+ Self {
+ size,
+ symmetric,
+ build_cost,
+ }
+ }
+
+ state_impl!(pub Rgba);
+}
+
+impl BlockLogic for LampBlock {
+ impl_block!();
+
+ fn data_from_i32(&self, config: i32, _: GridPos) -> Result<DynData, DataConvertError> {
+ Ok(DynData::Int(config))
+ }
+
+ fn deserialize_state(&self, data: DynData) -> Result<Option<State>, DeserializeError> {
+ match data {
+ DynData::Int(rgba) => Ok(Some(Self::create_state(Rgba::from(rgba as u32)))),
+ _ => Err(DeserializeError::InvalidType {
+ have: data.get_type(),
+ expect: DynType::Int,
+ }),
+ }
+ }
+
+ fn serialize_state(&self, state: &State) -> Result<DynData, SerializeError> {
+ let state = Self::get_state(state);
+ Ok(DynData::Int(u32::from(*state) as i32))
+ }
+}
+
+/// format:
+/// - production efficiency: [`f32`]
+/// - generate time: [`f32`]
+fn read_generator(buff: &mut DataRead) -> Result<(), DataReadError> {
+ buff.skip(8)
+}
+
+/// format:
+/// - call [`read_generator`]
+/// - heat: [`f32`]
+fn read_nuclear(buff: &mut DataRead) -> Result<(), DataReadError> {
+ read_generator(buff)?;
+ buff.skip(4)
+}
+
+/// format:
+/// - call [`read_generator`]
+/// - warmup: [`f32`]
+fn read_impact(buff: &mut DataRead) -> Result<(), DataReadError> {
+ read_generator(buff)?;
+ buff.skip(4)
+}
+
+/// format:
+/// - call [`read_generator`]
+/// - heat: [`f32`]
+fn read_heater(buff: &mut DataRead) -> Result<(), DataReadError> {
+ read_generator(buff)?;
+ buff.skip(4)
+}
diff --git a/mindus/src/block/production.rs b/mindus/src/block/production.rs
new file mode 100644
index 0000000..589e73c
--- /dev/null
+++ b/mindus/src/block/production.rs
@@ -0,0 +1,98 @@
+//! the industry part of mindustry
+use crate::block::simple::*;
+use crate::block::*;
+use crate::data::DataRead;
+
+// format: call [`read_production_block`], seed: [`i32`]
+make_simple!(SeparatorBlock => |_, buff: &mut DataRead| buff.skip(12));
+
+make_simple!(
+ ProductionBlock,
+ |_, _, _, _, r: Rotation, s| {
+ // electrolyzer exclusive
+ // ozone <- e(^) -> hydrogen
+ let mut base = load!("electrolyzer", s);
+ let mut hydro = load!(s -> match r {
+ Rotation::Up | Rotation::Left => "electrolyzer-hydrogen-output1"
+ Rotation::Down | Rotation::Right => "electrolyzer-hydrogen-output2"
+ });
+ unsafe { hydro.rotate(r.count()) };
+ unsafe { base.overlay(&hydro) };
+
+ let mut ozone = load!(s -> match r {
+ Rotation::Down | Rotation::Right => "electrolyzer-ozone-output1"
+ Rotation::Up | Rotation::Left => "electrolyzer-ozone-output2"
+ });
+ unsafe { ozone.rotate(r.mirrored(true, true).count()) };
+ unsafe { base.overlay(&ozone) };
+ base
+ },
+ |b: &mut Build, buff: &mut DataRead| {
+ // format:
+ // - progress: `f32`
+ // - warmup: `f32`
+ // (cultivator)
+ // `f32`
+ buff.skip(8 + if b.name() == "cultivator" { 4 } else { 0 })
+ }
+);
+
+make_simple!(
+ HeatCrafter,
+ |_, n, _, _, r: Rotation, s| {
+ let mut base = load!(from n which is ["phase-heater" | "electric-heater" | "oxidation-chamber" | "slag-heater" | "heat-source" | "heat-reactor"], s);
+ let mut top = match r {
+ Rotation::Up | Rotation::Right => {
+ load!(concat "top1" => n which is ["phase-heater" | "electric-heater" | "oxidation-chamber" | "slag-heater" | "heat-source" | "heat-reactor"], s)
+ }
+ Rotation::Down | Rotation::Left => {
+ load!(concat "top2" => n which is ["phase-heater" | "electric-heater" | "oxidation-chamber" | "slag-heater" | "heat-source" | "heat-reactor"], s)
+ }
+ };
+ unsafe { top.rotate(r.rotated(false).count()) };
+ unsafe { base.overlay(&top) };
+ base
+ },
+ |_, buff: &mut DataRead| {
+ // format:
+ // - progress: `f32`
+ // - warmup: `f32`
+ // - heat: f32
+ buff.skip(12)?;
+ Ok(())
+ }
+);
+make_simple!(HeatConduit, |_, n, _, _, r: Rotation, s| {
+ let mut base =
+ load!(from n which is ["heat-router" | "heat-redirector" | "small-heat-redirector"], s);
+ if n == "heat-router" {
+ let t1 = load!("heat-router-top1", s);
+ let t2 = load!("heat-router-top2", s);
+ let x = |n| unsafe {
+ match n {
+ Rotation::Up => t1.clone().rotated(3),
+ Rotation::Right => t1.clone(),
+ Rotation::Down => t2.clone().rotated(1),
+ Rotation::Left => t2.clone().rotated(2),
+ }
+ };
+ unsafe {
+ base.overlay(&x(r.rotated(false)));
+ base.overlay(&x(r));
+ base.overlay(&x(r.rotated(true)));
+ }
+ base
+ } else {
+ let mut top = match r {
+ Rotation::Up | Rotation::Right => {
+ load!(concat "top1" => n which is ["heat-router" | "heat-redirector" | "small-heat-redirector"], s)
+ }
+ Rotation::Down | Rotation::Left => {
+ load!(concat "top2" => n which is ["heat-router" | "heat-redirector" | "small-heat-redirector"], s)
+ }
+ };
+ unsafe { top.rotate(r.rotated(false).count()) };
+ unsafe { base.overlay(&top) };
+ base
+ }
+});
diff --git a/mindus/src/block/ratios.rs b/mindus/src/block/ratios.rs
new file mode 100644
index 0000000..ebaa51d
--- /dev/null
+++ b/mindus/src/block/ratios.rs
@@ -0,0 +1,266 @@
+use std::borrow::Cow;
+use std::collections::HashMap;
+
+use super::State;
+use crate::unit::Type::*;
+#[macro_export]
+macro_rules! ratios {
+ ([$($input:ident: $icnt:literal),*] => [$($output:ident: $ocnt:literal),*]) => {{
+ #[allow(unused_imports)]
+ use $crate::{fluid::Type::*, item::Type::*, block::ConstFrom};
+ const I: &[($crate::block::ratios::Resource, ::std::primitive::f32)] = &[$(($crate::block::ratios::Resource::fro($input), $icnt as ::std::primitive::f32),)*];
+ const O: &[($crate::block::ratios::Resource, ::std::primitive::f32)] = &[$(($crate::block::ratios::Resource::fro($output), $ocnt as ::std::primitive::f32),)*];
+ $crate::block::ratios::Io::new(I, O)
+ }};
+ [$($input:ident: $cnt:literal),*] => {{
+ #[allow(unused_imports)]
+ use $crate::{fluid::Type::*, item::Type::*, block::ConstFrom};
+ const I: &[($crate::block::ratios::Resource, ::std::primitive::f32)] = &[$(($crate::block::ratios::Resource::fro($input), $cnt as ::std::primitive::f32),)*];
+ $crate::block::ratios::Io::new(I, &[][..])
+ }}
+}
+pub use ratios;
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
+pub enum Resource {
+ Item(crate::item::Type),
+ Fluid(crate::fluid::Type),
+}
+
+const impl super::ConstFrom<crate::item::Type> for Resource {
+ fn fro(value: crate::item::Type) -> Self {
+ Self::Item(value)
+ }
+}
+
+const impl super::ConstFrom<crate::fluid::Type> for Resource {
+ fn fro(value: crate::fluid::Type) -> Self {
+ Self::Fluid(value)
+ }
+}
+
+#[derive(Debug, Clone)]
+pub struct Io {
+ pub input: Cow<'static, [(Resource, f32)]>,
+ pub output: Cow<'static, [(Resource, f32)]>,
+}
+
+impl PartialEq for Io {
+ fn eq(&self, other: &Self) -> bool {
+ let sort = |mut x: Vec<_>| {
+ x.sort_by_key(|(x, _)| *x);
+ x
+ };
+ sort(self.input.to_vec()) == sort(other.input.to_vec())
+ && sort(self.output.to_vec()) == sort(other.output.to_vec())
+ }
+}
+
+impl Io {
+ fn none() -> Self {
+ Self {
+ input: Cow::from(&[][..]),
+ output: Cow::from(&[][..]),
+ }
+ }
+
+ pub fn new(input: &'static [(Resource, f32)], output: &'static [(Resource, f32)]) -> Self {
+ Self {
+ input: Cow::from(input),
+ output: Cow::from(output),
+ }
+ }
+}
+
+#[derive(Default)]
+pub(crate) struct IoBuilder {
+ pub net: HashMap<Resource, f32>,
+}
+
+impl std::ops::AddAssign<Io> for IoBuilder {
+ fn add_assign(&mut self, rhs: Io) {
+ for &(res, n) in &*rhs.output {
+ *self.net.entry(res).or_default() += n;
+ }
+ for &(res, n) in &*rhs.input {
+ *self.net.entry(res).or_default() -= n;
+ }
+ }
+}
+
+impl From<IoBuilder> for Io {
+ fn from(value: IoBuilder) -> Self {
+ let (mut input, output): (Vec<_>, Vec<_>) = value
+ .net
+ .into_iter()
+ .filter(|(_, n)| n.abs() > 0.001)
+ .map(|(r, n)| (r, (n * 100.0 + 0.5).floor() / 100.0))
+ .partition(|&(_, n)| n < 0.0);
+ input.iter_mut().for_each(|(_, v)| *v = v.abs());
+ Self {
+ input: Cow::Owned(input),
+ output: Cow::Owned(output),
+ }
+ }
+}
+
+pub trait Ratios {
+ #[inline]
+ #[must_use]
+ #[allow(unused_variables)]
+ fn io(&self, state: Option<&State>, name: &str) -> Io {
+ Io::none()
+ }
+}
+
+macro_rules! just {
+ ($for:ident, [$($input:ident: $icnt:literal),*] => [$($output:ident: $ocnt:literal),*]) => {
+ impl Ratios for super::$for {
+ fn io(&self, _: Option<&State>, _: &str) -> Io {
+ ratios!([$($input : $icnt),*] => [$($output : $ocnt),*])
+ }
+ }
+ }
+}
+
+macro_rules! rats {
+ ($for:ident { $($name:literal: [$($input:ident: $icnt:literal),*] => [$($output:ident: $ocnt:literal),*])+ }) => {
+ impl Ratios for super::$for {
+ fn io(&self, _: Option<&State>, name: &str) -> Io {
+ $(_ = crate::data::renderer::load!($name);)+ // string validation
+ match name {
+ $($name => ratios!([$($input : $icnt),*] => [$($output : $ocnt),*]),)+
+ _ => Io::none()
+ }
+ }
+ }
+ };
+ ($for:ident { none }) => {
+ impl Ratios for super::$for {}
+ }
+}
+
+rats!(ConveyorBlock { none });
+rats!(JunctionBlock { none });
+rats!(StackConveyor { none });
+rats!(BridgeBlock { none });
+rats!(ItemBlock { none });
+rats!(DuctBlock { none });
+rats!(SimpleDuctBlock { none });
+rats!(FluidBlock { none });
+rats!(SurgeRouter { none });
+rats!(ProductionBlock {
+ "cultivator": [Water: 18] => [SporePod: 0.6]
+ "graphite-press": [Coal: 1.33] => [Graphite: 0.66]
+ "multi-press": [Coal: 6, Water: 6] => [Graphite: 4]
+ "silicon-smelter": [Coal: 1.5, Sand: 3] => [Silicon: 1.5]
+ "silicon-crucible": [Coal: 2.66, Sand: 4, Pyratite: 0.66] => [Silicon: 5.33]
+ "kiln": [Lead: 2, Sand: 2] => [Metaglass: 2]
+ "plastanium-compressor": [Oil: 15, Titanium: 2] => [Plastanium: 1]
+ "phase-weaver": [Thorium: 2, Sand: 5] => [PhaseFabric: 0.5]
+ "surge-smelter": [Copper: 2.4, Lead: 3.2, Titanium: 1.6, Silicon: 2.4] => [SurgeAlloy: 0.8]
+ "cryofluid-mixer": [Titanium: 0.5, Water: 12] => [Cryofluid: 12]
+ "pyratite-mixer": [Coal: 0.75, Lead: 1.5, Sand: 1.5] => [Pyratite: 0.75]
+ "blast-mixer": [Pyratite: 0.75, SporePod: 0.75] => [BlastCompound: 0.75]
+ "melter": [Scrap: 6] => [Slag: 12]
+ "spore-press": [SporePod: 3] => [Oil: 18]
+ "pulverizer": [Scrap: 1.5] => [Sand: 1.5]
+ "coal-centrifuge": [Oil: 6] => [Coal: 2]
+ "silicon-arc-furnace": [Graphite: 1.2, Sand: 4.8] => [Silicon: 4.8]
+ "electrolyzer": [Water: 10] => [Ozone: 4, Hydrogen: 6]
+ "atmospheric-concentrator": [] => [Nitrogen: 4]
+ "carbide-crucible": [Tungsten: 0.88, Graphite: 1.33] => [Carbide: 0.44]
+ "cyanogen-synthesizer": [Arkycite: 40, Graphite: 0.75] => [Cyanogen: 3]
+ "phase-synthesizer": [Thorium: 1, Sand: 3, Ozone: 2] => [PhaseFabric: 0.5]
+ "vent-condenser": [] => [Water: 30]
+});
+rats!(SeparatorBlock {
+ "separator": [Slag: 4] => [Copper: 0.71, Lead: 0.43, Graphite: 0.28, Titanium: 0.28]
+ "disassembler": [Slag: 7.2, Scrap: 4] => [Sand: 1.6, Graphite: 0.8, Titanium: 0.8, Thorium: 0.8]
+});
+rats!(HeatConduit { none });
+rats!(HeatCrafter {
+ "oxidation-chamber": [Ozone: 2, Beryllium: 0.5] => [Oxide: 0.5]
+ "phase-heater": [PhaseFabric: 0.12] => []
+});
+rats!(WallBlock { none });
+rats!(DoorBlock { none });
+rats!(HeatedBlock { none }); // these arent erekir, btw
+rats!(ConduitBlock { none });
+impl Ratios for super::UnitFactory {
+ fn io(&self, state: Option<&State>, name: &str) -> Io {
+ state.map_or(Io::none(), |s| {
+ Self::get_state(s).map_or(Io::none(), |t| match (name, t) {
+ ("ground-factory", Dagger) => ratios![Silicon: 0.66, Lead: 0.66],
+ ("ground-factory", Crawler) => ratios![Silicon: 0.8, Coal: 1],
+ ("ground-factory", Nova) => ratios![Silicon: 0.75, Lead: 0.5, Titanium: 0.5],
+ ("air-factory", Flare) => ratios![Silicon: 1],
+ ("air-factory", Mono) => ratios![Silicon: 0.85, Lead: 0.42],
+ ("naval-factory", Risso) => ratios![Silicon: 0.44, Metaglass: 0.77],
+ ("naval-factory", Retusa) => ratios![Silicon: 0.3, Metaglass: 0.5, Titanium: 0.4],
+ ("tank-fabricator", _) => ratios![Beryllium: 1.14, Silicon: 1.42],
+ ("ship-fabricator", _) => ratios![Graphite: 1.25, Silicon: 1.75],
+ ("mech-fabricator", _) => ratios![Beryllium: 1.25, Silicon: 1.75],
+ (f, t) => unreachable!("{f}, {t:?}"),
+ })
+ })
+ }
+}
+rats!(ConstructorBlock {
+ "additive-reconstructor": [Silicon: 4, Graphite: 4] => []
+ "multiplicative-reconstructor": [Silicon: 4.33, Titanium: 2.66, Metaglass: 1.33] => []
+ "exponential-reconstructor": [Silicon: 9.44, Titanium: 8.33, Plastanium: 7.22, Cryofluid: 60] => []
+ "tetrative-reconstructor": [Silicon: 4.16, Plastanium: 2.5, SurgeAlloy: 2.08, PhaseFabric: 1.45, Cryofluid: 180] => []
+ "tank-refabricator": [Hydrogen: 3, Silicon: 1.33, Titanium: 1] => []
+ "mech-refabricator": [Hydrogen: 3, Silicon: 1.11, Tungsten: 0.88] => []
+ "ship-refabricator": [Hydrogen: 3, Silicon: 1.2, Tungsten: 0.8] => []
+ "prime-refabricator": [Nitrogen: 10, Thorium: 1.33, Silicon: 1.66] => []
+});
+rats!(BasicBlock {
+ "water-extractor": [] => [Water: 6.6]
+ "unit-repair-tower": [Ozone: 3] => []
+ "oil-extractor": [Water: 9, Sand: 1] => [] // *cough*
+});
+rats!(WallDrillBlock { none }); // more cough
+rats!(DrillBlock {
+ "laser-drill": [Water: 4.8] => []
+ "blast-drill": [Water: 6] => []
+ "large-plasma-bore": [Nitrogen: 3] => []
+ "impact-drill": [Water: 12] => []
+ "eruption-drill": [Hydrogen: 4] => []
+});
+rats!(MessageLogic { none });
+rats!(SwitchLogic { none });
+rats!(ProcessorLogic { "hyper-processor": [Cryofluid: 4.8] => [] });
+rats!(MemoryBlock { none });
+rats!(CanvasBlock { none });
+rats!(LampBlock { none });
+rats!(ConnectorBlock { none });
+rats!(DiodeBlock { none });
+just!(NuclearGeneratorBlock, [Thorium: 0.16, Cryofluid: 2.4] => []); // thoreactor
+just!(ImpactReactorBlock, [BlastCompound: 0.42, Cryofluid: 15] => []);
+just!(Neoplasia, [Arkycite: 80, Water: 10, PhaseFabric: 0.33] => [Neoplasm: 20]);
+rats!(GeneratorBlock {
+ "differential-generator": [Pyratite: 0.27, Cryofluid: 6] => []
+ "turbine-condenser": [] => [Water: 5]
+ "chemical-combustion-chamber": [Ozone: 2, Arkycite: 40] => []
+ "pyrolysis-generator": [Slag: 20, Arkycite: 40] => [Water: 20]
+ "flux-reactor": [Cyanogen: 9] => []
+ "rtg-generator": [Thorium: 0.07] => []
+});
+rats!(ItemTurret { none }); // eh
+rats!(TractorBeamTurret { none });
+rats!(PointDefenseTurret { none });
+rats!(ContinousTurret { none });
+rats!(Turret { none });
+rats!(ShieldBlock { none });
+rats!(PayloadBlock { none });
+rats!(PayloadConveyor { none });
+rats!(SimplePayloadBlock { none });
+rats!(PayloadRouter { none });
+rats!(RadarBlock { none });
+rats!(UnitCargoLoader { "unit-cargo-loader": [Nitrogen: 10] => [] });
+rats!(AssemblerBlock { none });
+rats!(RepairTurret { none });
+rats!(AssemblerModule { none });
+rats!(TileableDisplay { none });
+rats!(LandingPadBlock { none });
diff --git a/src/block/simple.rs b/mindus/src/block/simple.rs
index 5c4c326..057eb7c 100644
--- a/src/block/simple.rs
+++ b/mindus/src/block/simple.rs
@@ -54,13 +54,13 @@ macro_rules! make_simple {
&self,
_: i32,
_: crate::data::GridPos,
- ) -> Result<crate::DynData, crate::block::DataConvertError> {
- Ok(crate::DynData::Empty)
+ ) -> Result<crate::data::dynamic::DynData, crate::block::DataConvertError> {
+ Ok(crate::data::dynamic::DynData::Empty)
}
fn deserialize_state(
&self,
- _: crate::DynData,
+ _: crate::data::dynamic::DynData,
) -> Result<Option<crate::block::State>, crate::block::DeserializeError> {
Ok(None)
}
@@ -76,8 +76,8 @@ macro_rules! make_simple {
fn serialize_state(
&self,
_: &crate::block::State,
- ) -> Result<crate::DynData, crate::block::SerializeError> {
- Ok(crate::DynData::Empty)
+ ) -> Result<crate::data::dynamic::DynData, crate::block::SerializeError> {
+ Ok(crate::data::dynamic::DynData::Empty)
}
fn draw(
@@ -88,24 +88,20 @@ macro_rules! make_simple {
rot: crate::block::Rotation,
scale: crate::data::renderer::Scale,
) -> crate::data::renderer::ImageHolder<4> {
- #[allow(clippy::redundant_closure_call)]
$draw(self, name, state, context, rot, scale)
}
fn read(
&self,
build: &mut crate::data::map::Build,
- reg: &crate::block::BlockRegistry,
- entity_mapping: &crate::data::map::EntityMapping,
buff: &mut crate::data::DataRead,
) -> Result<(), crate::data::ReadError> {
- #[allow(clippy::redundant_closure_call)]
- $read(build, reg, entity_mapping, buff)
+ $read(build, buff)
}
}
};
($name: ident, $draw: expr) => {
- crate::block::simple::make_simple!($name, $draw, |_, _, _, _| Ok(()));
+ crate::block::simple::make_simple!($name, $draw, |_, _| Ok(()));
};
($name: ident, $draw: expr, $read: expr) => {
crate::block::simple::make_simple!($name, $draw, $read);
@@ -117,11 +113,7 @@ macro_rules! make_simple {
crate::block::simple::make_simple!($name, |_, _, _, _, _, scl| $draw(scl), $read);
};
($name: ident / $draw: expr) => {
- crate::block::simple::make_simple!(
- $name,
- |_, _, _, _, _, scl| $draw(scl),
- |_, _, _, _| Ok(())
- );
+ crate::block::simple::make_simple!($name, |_, _, _, _, _, scl| $draw(scl), |_, _| Ok(()));
};
($name: ident) => {
crate::block::simple::make_simple!($name, |_, n, _, _, _, _| unimplemented!("{n}"));
@@ -132,7 +124,7 @@ pub(crate) use make_simple;
pub type BuildCost = &'static [(item::Type, u32)];
macro_rules! cost {
- ($($item:ident: $cnt:expr),+) => {
+ ($($item:ident: $cnt:expr),*) => {
&[$((crate::item::Type::$item, $cnt)),*]
};
}
diff --git a/mindus/src/block/turrets.rs b/mindus/src/block/turrets.rs
new file mode 100644
index 0000000..d9c83d1
--- /dev/null
+++ b/mindus/src/block/turrets.rs
@@ -0,0 +1,49 @@
+//! idk why its not in the [`crate::block::defense`] module
+use super::simple::make_simple;
+use crate::data::{DataRead, ReadError};
+
+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`]
+/// - iterate [`u8`]
+/// - item: [`u16`] as [`Item`](crate::item::Type)
+/// - amount: [`u16`]
+fn read_item_turret(buff: &mut DataRead) -> Result<(), ReadError> {
+ read_turret(buff)?;
+ for _ in 0..buff.read_u8()? {
+ buff.skip(4)?;
+ }
+ Ok(())
+}
+
+/// format:
+/// - reload: f32
+/// - rotation: f32
+fn read_turret(buff: &mut DataRead) -> Result<(), ReadError> {
+ buff.skip(8)
+}
+
+/// format:
+/// - rotation: [`f32`]
+fn read_point_defense_turret(buff: &mut DataRead) -> Result<(), ReadError> {
+ buff.skip(4)
+}
+
+/// format:
+/// - call [`read_turret`]
+/// - last length: [`f32`]
+fn read_continous_turret(buff: &mut DataRead) -> Result<(), ReadError> {
+ read_turret(buff)?;
+ buff.skip(4)
+}
+
+/// format:
+/// - rotation: [`f32`]
+fn read_tractor_beam_turret(buff: &mut DataRead) -> Result<(), ReadError> {
+ buff.skip(4)
+}
diff --git a/mindus/src/block/units.rs b/mindus/src/block/units.rs
new file mode 100644
index 0000000..6e1bb0f
--- /dev/null
+++ b/mindus/src/block/units.rs
@@ -0,0 +1,341 @@
+//! unit creation related blocks
+use thiserror::Error;
+
+use super::payload::{read_payload_block, read_payload_seq};
+use crate::block::simple::*;
+use crate::block::*;
+use crate::data::command::UnitCommand;
+use crate::data::dynamic::DynType;
+use crate::unit;
+
+// fn is_pay(b: &str) -> bool {
+// matches!(
+// b,
+// "ground-factory"
+// | "air-factory"
+// | "naval-factory"
+// | "additive-reconstructor"
+// | "multiplicative-reconstructor"
+// | "exponential-reconstructor"
+// | "tank-fabricator"
+// | "ship-fabricator"
+// | "mech-fabricator"
+// | "tank-refabricator"
+// | "ship-refabricator"
+// | "payload-conveyor"
+// | "payload-router"
+// | "reinforced-payload-conveyor"
+// | "reinforced-payload-router"
+// | "payload-mass-driver"
+// | "large-payload-mass-driver"
+// | "constructor"
+// | "large-constructor"
+// | "payload-source"
+// )
+// }
+
+make_simple!(
+ AssemblerBlock,
+ |_, name, _, _, rot: Rotation, s| {
+ let mut base =
+ load!(from name which is ["tank-assembler" | "ship-assembler" | "mech-assembler"], s);
+ let mut side = match rot {
+ Rotation::Up | Rotation::Right => {
+ load!(concat "side1" => name which is ["tank-assembler" | "ship-assembler" | "mech-assembler"], s)
+ }
+ Rotation::Down | Rotation::Left => {
+ load!(concat "side2" => name which is ["tank-assembler" | "ship-assembler" | "mech-assembler"], s)
+ }
+ };
+ unsafe { side.rotate(rot.rotated(false).count()) };
+ unsafe { base.overlay(&side) };
+ let top = load!(concat "top" => name which is ["tank-assembler" | "ship-assembler" | "mech-assembler"], s);
+ unsafe { base.overlay(&top) };
+ base
+ },
+ |_, buff| read_assembler(buff)
+);
+
+/// format:
+/// - call [`read_payload_block`]
+/// - progress: [`f32`]
+/// - iterate [`u8`]
+/// - read: [`i32`]
+/// - call [`read_payload_seq`]
+/// - point: ([`f32`], [`f32`]) (maybe [`NaN`](f32::NAN))
+fn read_assembler(buff: &mut DataRead) -> Result<(), DataReadError> {
+ read_payload_block(buff)?;
+ buff.skip(4)?;
+ let n = buff.read_u8()? as usize;
+ buff.skip(n * 4)?;
+ read_payload_seq(buff)?;
+ buff.skip(8)
+}
+
+make_simple!(
+ AssemblerModule,
+ |_, _, _, _, rot: Rotation, scl| {
+ let mut base = load!("basic-assembler-module", scl);
+ let mut side = load!(scl -> match rot {
+ Rotation::Up | Rotation::Right => "basic-assembler-module-side1",
+ _ => "basic-assembler-module-side2",
+ });
+ unsafe { side.rotate(rot.rotated(false).count()) };
+ unsafe { base.overlay(&side) };
+ base
+ },
+ |_, buff| read_payload_block(buff)
+);
+
+make_simple!(
+ RepairTurret => |_, buff: &mut DataRead| {
+ buff.skip(4) // rotation: [`f32`]
+ }
+);
+
+pub const GROUND_UNITS: &[unit::Type] =
+ &[unit::Type::Dagger, unit::Type::Crawler, unit::Type::Nova];
+pub const AIR_UNITS: &[unit::Type] = &[unit::Type::Flare, unit::Type::Mono];
+pub const NAVAL_UNITS: &[unit::Type] = &[unit::Type::Risso, unit::Type::Retusa];
+
+pub struct ConstructorBlock {
+ size: u8,
+ symmetric: bool,
+ build_cost: BuildCost,
+}
+
+impl ConstructorBlock {
+ #[must_use]
+ pub const fn new(size: u8, symmetric: bool, build_cost: BuildCost) -> Self {
+ assert!(size != 0, "invalid size");
+ Self {
+ size,
+ symmetric,
+ build_cost,
+ }
+ }
+
+ state_impl!(pub Option<UnitCommand>);
+}
+
+impl BlockLogic for ConstructorBlock {
+ impl_block!();
+
+ fn data_from_i32(&self, _: i32, _: GridPos) -> Result<DynData, DataConvertError> {
+ Ok(DynData::Empty)
+ }
+
+ fn deserialize_state(&self, data: DynData) -> Result<Option<State>, DeserializeError> {
+ match data {
+ DynData::Empty => Ok(Some(Self::create_state(None))),
+ DynData::Content(crate::content::Type::UnitCommand, n) => {
+ Ok(Some(Self::create_state(Some(
+ UnitCommand::try_from(n as u8)
+ .map_err(|x| DeserializeError::Custom(Box::new(x)))?,
+ ))))
+ }
+ DynData::UnitCommand(u) => Ok(Some(Self::create_state(Some(u)))),
+ _ => Err(DeserializeError::InvalidType {
+ have: data.get_type(),
+ expect: DynType::UnitCommand,
+ }),
+ }
+ }
+
+ fn serialize_state(&self, state: &State) -> Result<DynData, SerializeError> {
+ Ok(Self::get_state(state).map_or(DynData::Empty, DynData::UnitCommand))
+ }
+
+ fn draw(
+ &self,
+ name: &str,
+ _: Option<&State>,
+ _: Option<&RenderingContext>,
+ rot: Rotation,
+ s: Scale,
+ ) -> ImageHolder<4> {
+ let mut base = load!(from name which is ["additive-reconstructor" | "multiplicative-reconstructor" | "exponential-reconstructor" | "tetrative-reconstructor" | "tank-refabricator" | "mech-refabricator" | "ship-refabricator" | "prime-refabricator"], s);
+ let times = rot.rotated(false).count();
+ let mut out = load!(s -> match name {
+ "additive-reconstructor" => "factory-out-3",
+ "multiplicative-reconstructor" => "factory-out-5",
+ "tank-refabricator" | "mech-refabricator" | "ship-refabricator" =>
+ "factory-out-3-dark",
+ "exponential-reconstructor" => "factory-out-7",
+ "prime-refabricator" => "factory-out-5-dark",
+ "tetrative-reconstructor" => "factory-out-9",
+ });
+ unsafe { out.rotate(times) };
+ unsafe { base.overlay(&out) };
+
+ let mut r#in = load!(s -> match name {
+ "additive-reconstructor" => "factory-in-3",
+ "multiplicative-reconstructor" => "factory-in-5",
+ "tank-refabricator" | "mech-refabricator" | "ship-refabricator" =>
+ "factory-in-3-dark",
+ "exponential-reconstructor" => "factory-in-7",
+ "prime-refabricator" => "factory-in-5-dark",
+ "tetrative-reconstructor" => "factory-in-9",
+ });
+ unsafe { r#in.rotate(times) };
+ unsafe { base.overlay(&r#in) };
+
+ // TODO: the context cross is too small
+ // for i in 0..4u8 {
+ // if let Some((b, rot)) = dbg!(ctx.cross[i as usize]) {
+ // if rot.mirrored(true, true) != ctx.rotation && match rot {
+ // Rotation::Up => i == 3,
+ // Rotation::Right => i == 4,
+ // Rotation::Down => i == 0,
+ // Rotation::Left => i == 2,
+ // } && is_pay(b.name())
+ // {
+ // let r = unsafe { std::mem::transmute::<u8, Rotation>(i) }
+ // .mirrored(true, true)
+ // .rotated(false);
+ // let mut input = input.clone();
+ // input.rotate(r.count());
+ // base.overlay(&input);
+ // }
+ // }
+ // }
+ let top = load!(concat "top" => name which is ["additive-reconstructor" | "multiplicative-reconstructor" | "exponential-reconstructor" | "tetrative-reconstructor" | "tank-refabricator" | "mech-refabricator" | "ship-refabricator" | "prime-refabricator"], s);
+ unsafe { base.overlay(&top) };
+ base
+ }
+
+ /// format:
+ /// - call [`read_payload_block`]
+ /// - progress: [`f32`]
+ /// - point: ([`f32`], [`f32`]) (maybe [`NaN`](f32::NAN))
+ /// - command: [`DynData::UnitCommand`]
+ fn read(&self, _: &mut Build, buff: &mut DataRead) -> Result<(), DataReadError> {
+ read_payload_block(buff)?;
+ buff.skip(12)?;
+ // self.deserialize_state(DynData::deserialize(buff).unwrap())
+ // .unwrap();
+ Ok(())
+ }
+}
+
+pub struct UnitFactory {
+ size: u8,
+ symmetric: bool,
+ build_cost: BuildCost,
+ valid: &'static [unit::Type],
+}
+
+impl UnitFactory {
+ #[must_use]
+ pub const fn new(
+ size: u8,
+ symmetric: bool,
+ build_cost: BuildCost,
+ valid: &'static [unit::Type],
+ ) -> Self {
+ assert!(size != 0, "invalid size");
+ assert!(!valid.is_empty(), "no valid units");
+ assert!(valid.len() <= i32::MAX as usize, "too many valid units");
+ Self {
+ size,
+ symmetric,
+ build_cost,
+ valid,
+ }
+ }
+
+ state_impl!(pub Option<unit::Type>);
+}
+
+impl BlockLogic for UnitFactory {
+ impl_block!();
+
+ fn data_from_i32(&self, _: i32, _: GridPos) -> Result<DynData, DataConvertError> {
+ Ok(DynData::Int(-1))
+ }
+
+ fn deserialize_state(&self, data: DynData) -> Result<Option<State>, DeserializeError> {
+ match data {
+ DynData::Empty => Ok(Some(Self::create_state(None))),
+ DynData::Int(idx) => {
+ if idx == -1 {
+ Ok(Some(Self::create_state(None)))
+ } else if idx >= 0 && idx < self.valid.len() as i32 {
+ Ok(Some(Self::create_state(Some(self.valid[idx as usize]))))
+ } else {
+ Err(DeserializeError::Custom(Box::new(
+ AssemblerDeserializeError {
+ idx,
+ count: self.valid.len() as i32,
+ },
+ )))
+ }
+ }
+ _ => Err(DeserializeError::InvalidType {
+ have: data.get_type(),
+ expect: DynType::Int,
+ }),
+ }
+ }
+
+ fn serialize_state(&self, state: &State) -> Result<DynData, SerializeError> {
+ if let Some(state) = Self::get_state(state) {
+ for (i, curr) in self.valid.iter().enumerate() {
+ if curr == state {
+ return Ok(DynData::Int(i as i32));
+ }
+ }
+ Err(SerializeError::Custom(Box::new(AssemblerSerializeError(
+ *state,
+ ))))
+ } else {
+ Ok(DynData::Int(-1))
+ }
+ }
+
+ fn draw(
+ &self,
+ name: &str,
+ _: Option<&State>,
+ _: Option<&RenderingContext>,
+ rot: Rotation,
+ s: Scale,
+ ) -> ImageHolder<4> {
+ let mut base = load!(from name which is ["ground-factory" | "air-factory" | "naval-factory" | "tank-fabricator" | "ship-fabricator" | "mech-fabricator"], s);
+ let mut out = load!(s -> match name {
+ "ground-factory" | "air-factory" | "naval-factory" => "factory-out-3",
+ _ => "factory-out-3-dark",
+ });
+ unsafe { out.rotate(rot.rotated(false).count()) };
+ unsafe { base.overlay(&out) };
+ let top = load!(s -> match name {
+ "ground-factory" | "air-factory" | "naval-factory" => "factory-top-3",
+ "tank-fabricator" => "tank-fabricator-top",
+ "ship-fabricator" => "ship-fabricator-top",
+ "mech-fabricator" => "mech-fabricator-top",
+ });
+ unsafe { base.overlay(&top) };
+ base
+ }
+
+ /// format:
+ /// - call [`read_payload_block`]
+ /// - progress: [`f32`]
+ /// - plan: [`u16`]
+ /// - point: ([`f32`], [`f32`]) (maybe [`NaN`](f32::NAN))
+ fn read(&self, _: &mut Build, buff: &mut DataRead) -> Result<(), DataReadError> {
+ read_payload_block(buff)?;
+ buff.skip(14)
+ }
+}
+
+#[derive(Clone, Copy, Debug, Eq, PartialEq, Error)]
+#[error("invalid unit index ({idx}, valid: {count})")]
+pub struct AssemblerDeserializeError {
+ pub idx: i32,
+ pub count: i32,
+}
+
+#[derive(Clone, Copy, Debug, Eq, PartialEq, Error)]
+#[error("invalid unit {0:?}")]
+pub struct AssemblerSerializeError(unit::Type);
diff --git a/mindus/src/block/walls.rs b/mindus/src/block/walls.rs
new file mode 100644
index 0000000..4c2e6c4
--- /dev/null
+++ b/mindus/src/block/walls.rs
@@ -0,0 +1,80 @@
+//! walls
+use crate::block::simple::*;
+use crate::block::*;
+use crate::data::dynamic::DynType;
+use crate::data::renderer::load;
+
+make_simple!(WallBlock, |_, _, _, _, _, s| {
+ let mut base = load!("thruster", s);
+ unsafe { base.overlay(&load!("thruster-top", s)) };
+ base
+});
+
+pub struct DoorBlock {
+ size: u8,
+ symmetric: bool,
+ build_cost: BuildCost,
+}
+
+impl DoorBlock {
+ #[must_use]
+ pub const fn new(size: u8, symmetric: bool, build_cost: BuildCost) -> Self {
+ assert!(size != 0, "invalid size");
+ Self {
+ size,
+ symmetric,
+ build_cost,
+ }
+ }
+
+ state_impl!(pub bool);
+}
+
+impl BlockLogic for DoorBlock {
+ impl_block!();
+
+ fn draw(
+ &self,
+ name: &str,
+ state: Option<&State>,
+ _: Option<&RenderingContext>,
+ _: Rotation,
+ s: Scale,
+ ) -> ImageHolder<4> {
+ if let Some(state) = state {
+ if *Self::get_state(state) {
+ return load!(s -> match name {
+ "door" => "door-open",
+ "blast-door" => "blast-door-open",
+ _ => "door-large-open",
+ });
+ };
+ }
+ load!(from name which is ["door" | "blast-door" | "door-large"], s)
+ }
+
+ fn data_from_i32(&self, _: i32, _: GridPos) -> Result<DynData, DataConvertError> {
+ Ok(DynData::Boolean(false))
+ }
+
+ fn deserialize_state(&self, data: DynData) -> Result<Option<State>, DeserializeError> {
+ match data {
+ DynData::Boolean(opened) => Ok(Some(Self::create_state(opened))),
+ DynData::Empty => Ok(Some(Self::create_state(false))),
+ _ => Err(DeserializeError::InvalidType {
+ have: data.get_type(),
+ expect: DynType::Boolean,
+ }),
+ }
+ }
+
+ fn serialize_state(&self, state: &State) -> Result<DynData, SerializeError> {
+ let state = Self::get_state(state);
+ Ok(DynData::Boolean(*state))
+ }
+
+ fn read(&self, build: &mut Build, buff: &mut DataRead) -> Result<(), DataReadError> {
+ build.state = Some(Self::create_state(buff.read_bool()?));
+ Ok(())
+ }
+}
diff --git a/mindus/src/block/x.rs b/mindus/src/block/x.rs
new file mode 100644
index 0000000..9906470
--- /dev/null
+++ b/mindus/src/block/x.rs
@@ -0,0 +1,18 @@
+[
+ load!("tile-logic-display-39"), load!("tile-logic-display-36"), load!("tile-logic-display-39"), load!("tile-logic-display-36"), load!("tile-logic-display-27"), load!("tile-logic-display-16"), load!("tile-logic-display-27"), load!("tile-logic-display-24"), load!("tile-logic-display-39"), load!("tile-logic-display-36"), load!("tile-logic-display-39"), load!("tile-logic-display-36"), load!("tile-logic-display-27"), load!("tile-logic-display-16"), load!("tile-logic-display-27"), load!("tile-logic-display-24"),
+ load!("tile-logic-display-38"), load!("tile-logic-display-37"), load!("tile-logic-display-38"), load!("tile-logic-display-37"), load!("tile-logic-display-17"), load!("tile-logic-display-41"), load!("tile-logic-display-17"), load!("tile-logic-display-43"), load!("tile-logic-display-38"), load!("tile-logic-display-37"), load!("tile-logic-display-38"), load!("tile-logic-display-37"), load!("tile-logic-display-26"), load!("tile-logic-display-21"), load!("tile-logic-display-26"), load!("tile-logic-display-25"),
+ load!("tile-logic-display-39"), load!("tile-logic-display-36"), load!("tile-logic-display-39"), load!("tile-logic-display-36"), load!("tile-logic-display-27"), load!("tile-logic-display-16"), load!("tile-logic-display-27"), load!("tile-logic-display-24"), load!("tile-logic-display-39"), load!("tile-logic-display-36"), load!("tile-logic-display-39"), load!("tile-logic-display-36"), load!("tile-logic-display-27"), load!("tile-logic-display-16"), load!("tile-logic-display-27"), load!("tile-logic-display-24"),
+ load!("tile-logic-display-38"), load!("tile-logic-display-37"), load!("tile-logic-display-38"), load!("tile-logic-display-37"), load!("tile-logic-display-17"), load!("tile-logic-display-41"), load!("tile-logic-display-17"), load!("tile-logic-display-43"), load!("tile-logic-display-38"), load!("tile-logic-display-37"), load!("tile-logic-display-38"), load!("tile-logic-display-37"), load!("tile-logic-display-26"), load!("tile-logic-display-21"), load!("tile-logic-display-26"), load!("tile-logic-display-25"),
+ load!("tile-logic-display-3"), load!("tile-logic-display-4"), load!("tile-logic-display-3"), load!("tile-logic-display-4"), load!("tile-logic-display-15"), load!("tile-logic-display-40"), load!("tile-logic-display-15"), load!("tile-logic-display-20"), load!("tile-logic-display-3"), load!("tile-logic-display-4"), load!("tile-logic-display-3"), load!("tile-logic-display-4"), load!("tile-logic-display-15"), load!("tile-logic-display-40"), load!("tile-logic-display-15"), load!("tile-logic-display-20"),
+ load!("tile-logic-display-5"), load!("tile-logic-display-28"), load!("tile-logic-display-5"), load!("tile-logic-display-28"), load!("tile-logic-display-29"), load!("tile-logic-display-10"), load!("tile-logic-display-29"), load!("tile-logic-display-23"), load!("tile-logic-display-5"), load!("tile-logic-display-28"), load!("tile-logic-display-5"), load!("tile-logic-display-28"), load!("tile-logic-display-31"), load!("tile-logic-display-11"), load!("tile-logic-display-31"), load!("tile-logic-display-32"),
+ load!("tile-logic-display-3"), load!("tile-logic-display-4"), load!("tile-logic-display-3"), load!("tile-logic-display-4"), load!("tile-logic-display-15"), load!("tile-logic-display-40"), load!("tile-logic-display-15"), load!("tile-logic-display-20"), load!("tile-logic-display-3"), load!("tile-logic-display-4"), load!("tile-logic-display-3"), load!("tile-logic-display-4"), load!("tile-logic-display-15"), load!("tile-logic-display-40"), load!("tile-logic-display-15"), load!("tile-logic-display-20"),
+ load!("tile-logic-display-2"), load!("tile-logic-display-30"), load!("tile-logic-display-2"), load!("tile-logic-display-30"), load!("tile-logic-display-9"), load!("tile-logic-display-46"), load!("tile-logic-display-9"), load!("tile-logic-display-22"), load!("tile-logic-display-2"), load!("tile-logic-display-30"), load!("tile-logic-display-2"), load!("tile-logic-display-30"), load!("tile-logic-display-14"), load!("tile-logic-display-44"), load!("tile-logic-display-14"), load!("tile-logic-display-6"),
+ load!("tile-logic-display-39"), load!("tile-logic-display-36"), load!("tile-logic-display-39"), load!("tile-logic-display-36"), load!("tile-logic-display-27"), load!("tile-logic-display-16"), load!("tile-logic-display-27"), load!("tile-logic-display-24"), load!("tile-logic-display-39"), load!("tile-logic-display-36"), load!("tile-logic-display-39"), load!("tile-logic-display-36"), load!("tile-logic-display-27"), load!("tile-logic-display-16"), load!("tile-logic-display-27"), load!("tile-logic-display-24"),
+ load!("tile-logic-display-38"), load!("tile-logic-display-37"), load!("tile-logic-display-38"), load!("tile-logic-display-37"), load!("tile-logic-display-17"), load!("tile-logic-display-41"), load!("tile-logic-display-17"), load!("tile-logic-display-43"), load!("tile-logic-display-38"), load!("tile-logic-display-37"), load!("tile-logic-display-38"), load!("tile-logic-display-37"), load!("tile-logic-display-26"), load!("tile-logic-display-21"), load!("tile-logic-display-26"), load!("tile-logic-display-25"),
+ load!("tile-logic-display-39"), load!("tile-logic-display-36"), load!("tile-logic-display-39"), load!("tile-logic-display-36"), load!("tile-logic-display-27"), load!("tile-logic-display-16"), load!("tile-logic-display-27"), load!("tile-logic-display-24"), load!("tile-logic-display-39"), load!("tile-logic-display-36"), load!("tile-logic-display-39"), load!("tile-logic-display-36"), load!("tile-logic-display-27"), load!("tile-logic-display-16"), load!("tile-logic-display-27"), load!("tile-logic-display-24"),
+ load!("tile-logic-display-38"), load!("tile-logic-display-37"), load!("tile-logic-display-38"), load!("tile-logic-display-37"), load!("tile-logic-display-17"), load!("tile-logic-display-41"), load!("tile-logic-display-17"), load!("tile-logic-display-43"), load!("tile-logic-display-38"), load!("tile-logic-display-37"), load!("tile-logic-display-38"), load!("tile-logic-display-37"), load!("tile-logic-display-26"), load!("tile-logic-display-21"), load!("tile-logic-display-26"), load!("tile-logic-display-25"),
+ load!("tile-logic-display-3"), load!("tile-logic-display-0"), load!("tile-logic-display-3"), load!("tile-logic-display-0"), load!("tile-logic-display-15"), load!("tile-logic-display-42"), load!("tile-logic-display-15"), load!("tile-logic-display-12"), load!("tile-logic-display-3"), load!("tile-logic-display-0"), load!("tile-logic-display-3"), load!("tile-logic-display-0"), load!("tile-logic-display-15"), load!("tile-logic-display-42"), load!("tile-logic-display-15"), load!("tile-logic-display-12"),
+ load!("tile-logic-display-5"), load!("tile-logic-display-8"), load!("tile-logic-display-5"), load!("tile-logic-display-8"), load!("tile-logic-display-29"), load!("tile-logic-display-35"), load!("tile-logic-display-29"), load!("tile-logic-display-33"), load!("tile-logic-display-5"), load!("tile-logic-display-8"), load!("tile-logic-display-5"), load!("tile-logic-display-8"), load!("tile-logic-display-31"), load!("tile-logic-display-34"), load!("tile-logic-display-31"), load!("tile-logic-display-7"),
+ load!("tile-logic-display-3"), load!("tile-logic-display-0"), load!("tile-logic-display-3"), load!("tile-logic-display-0"), load!("tile-logic-display-15"), load!("tile-logic-display-42"), load!("tile-logic-display-15"), load!("tile-logic-display-12"), load!("tile-logic-display-3"), load!("tile-logic-display-0"), load!("tile-logic-display-3"), load!("tile-logic-display-0"), load!("tile-logic-display-15"), load!("tile-logic-display-42"), load!("tile-logic-display-15"), load!("tile-logic-display-12"),
+ load!("tile-logic-display-2"), load!("tile-logic-display-1"), load!("tile-logic-display-2"), load!("tile-logic-display-1"), load!("tile-logic-display-9"), load!("tile-logic-display-45"), load!("tile-logic-display-9"), load!("tile-logic-display-19"), load!("tile-logic-display-2"), load!("tile-logic-display-1"), load!("tile-logic-display-2"), load!("tile-logic-display-1"), load!("tile-logic-display-14"), load!("tile-logic-display-18"), load!("tile-logic-display-14"), load!("tile-logic-display-13"),
+] \ No newline at end of file
diff --git a/mindus/src/color_mapped b/mindus/src/color_mapped
new file mode 100644
index 0000000..2e7b740
--- /dev/null
+++ b/mindus/src/color_mapped
@@ -0,0 +1,390 @@
+{ let mut l = [[0; 3]; u16::MAX as usize + 1];
+l[1] = [169,53,39];
+l[2] = [127,127,127];
+l[19] = [61,73,128];
+l[20] = [71,84,143];
+l[21] = [74,57,114];
+l[22] = [53,41,83];
+l[23] = [57,50,74];
+l[24] = [116,104,122];
+l[25] = [53,55,81];
+l[26] = [22,24,23];
+l[27] = [84,157,181];
+l[28] = [196,99,50];
+l[29] = [5,0,18];
+l[31] = [66,66,71];
+l[32] = [67,67,71];
+l[33] = [60,60,66];
+l[34] = [49,47,47];
+l[35] = [67,56,49];
+l[36] = [104,74,53];
+l[37] = [167,137,111];
+l[38] = [48,46,46];
+l[39] = [79,49,42];
+l[40] = [41,24,21];
+l[41] = [120,121,134];
+l[42] = [91,57,46];
+l[43] = [89,55,44];
+l[44] = [81,50,43];
+l[45] = [114,75,54];
+l[46] = [116,77,54];
+l[47] = [34,38,43];
+l[48] = [56,50,49];
+l[49] = [60,53,51];
+l[50] = [41,48,43];
+l[51] = [45,39,47];
+l[52] = [58,47,67];
+l[53] = [129,93,56];
+l[54] = [139,61,65];
+l[55] = [146,71,68];
+l[56] = [193,174,168];
+l[57] = [85,112,59];
+l[58] = [56,73,50];
+l[59] = [66,35,30];
+l[60] = [23,25,31];
+l[61] = [40,54,41];
+l[62] = [92,56,38];
+l[63] = [108,46,55];
+l[64] = [31,28,34];
+l[65] = [69,43,42];
+l[66] = [45,39,64];
+l[67] = [84,132,73];
+l[68] = [188,189,191];
+l[69] = [179,183,187];
+l[70] = [162,162,194];
+l[71] = [156,158,187];
+l[72] = [74,70,101];
+l[73] = [86,54,92];
+l[74] = [107,91,75];
+l[75] = [86,56,104];
+l[76] = [122,122,127];
+l[77] = [139,86,149];
+l[78] = [112,70,64];
+l[79] = [160,161,184];
+l[80] = [211,209,255];
+l[81] = [239,247,255];
+l[82] = [90,89,89];
+l[83] = [202,154,90];
+l[84] = [164,111,72];
+l[85] = [117,69,57];
+l[86] = [68,76,81];
+l[87] = [109,99,92];
+l[88] = [78,93,80];
+l[89] = [103,132,86];
+l[90] = [106,90,105];
+l[91] = [251,220,227];
+l[92] = [187,83,89];
+l[93] = [227,129,102];
+l[94] = [255,223,188];
+l[95] = [244,248,255];
+l[96] = [112,187,103];
+l[97] = [114,116,160];
+l[98] = [146,78,148];
+l[99] = [238,247,255];
+l[100] = [90,159,92];
+l[101] = [225,234,252];
+l[102] = [214,219,249];
+l[103] = [196,178,250];
+l[104] = [221,111,78];
+l[105] = [92,88,164];
+l[106] = [230,130,72];
+l[107] = [124,124,129];
+l[108] = [239,247,255];
+l[109] = [119,122,169];
+l[110] = [255,221,185];
+l[111] = [169,170,190];
+l[112] = [91,90,90];
+l[113] = [71,79,84];
+l[114] = [113,102,95];
+l[115] = [81,97,83];
+l[116] = [160,108,69];
+l[117] = [101,129,85];
+l[118] = [132,109,130];
+l[119] = [185,126,179];
+l[120] = [207,161,90];
+l[121] = [124,156,98];
+l[122] = [103,86,102];
+l[123] = [254,220,225];
+l[124] = [150,100,75];
+l[125] = [188,85,89];
+l[126] = [85,87,96];
+l[127] = [83,84,94];
+l[128] = [80,81,90];
+l[129] = [90,91,101];
+l[130] = [93,95,106];
+l[131] = [108,88,76];
+l[132] = [60,62,71];
+l[133] = [65,62,69];
+l[134] = [59,60,69];
+l[135] = [67,69,79];
+l[136] = [70,67,75];
+l[137] = [78,69,76];
+l[138] = [126,128,143];
+l[139] = [72,71,75];
+l[140] = [82,52,89];
+l[141] = [217,157,115];
+l[142] = [140,127,169];
+l[143] = [119,119,119];
+l[144] = [39,39,39];
+l[145] = [141,161,227];
+l[146] = [249,163,199];
+l[147] = [58,143,100];
+l[148] = [118,138,154];
+l[149] = [249,163,199];
+l[150] = [249,163,199];
+l[151] = [58,143,100];
+l[152] = [80,90,107];
+l[153] = [118,138,154];
+l[154] = [147,151,161];
+l[155] = [142,146,155];
+l[156] = [137,140,148];
+l[157] = [138,141,149];
+l[158] = [163,154,156];
+l[159] = [174,182,170];
+l[160] = [198,176,157];
+l[161] = [180,166,152];
+l[162] = [155,161,186];
+l[163] = [186,173,168];
+l[164] = [186,167,167];
+l[165] = [187,153,149];
+l[166] = [176,156,159];
+l[167] = [180,154,155];
+l[168] = [159,159,184];
+l[169] = [130,133,145];
+l[170] = [177,186,167];
+l[171] = [141,112,110];
+l[172] = [115,110,115];
+l[173] = [115,132,126];
+l[174] = [129,137,163];
+l[175] = [113,134,126];
+l[176] = [136,127,135];
+l[177] = [148,124,126];
+l[178] = [148,137,136];
+l[179] = [136,127,135];
+l[180] = [133,126,136];
+l[181] = [160,132,131];
+l[182] = [160,127,124];
+l[183] = [150,124,124];
+l[184] = [143,133,128];
+l[185] = [133,140,166];
+l[186] = [159,140,128];
+l[187] = [136,123,130];
+l[188] = [198,155,129];
+l[189] = [199,155,129];
+l[190] = [127,143,237];
+l[191] = [126,143,236];
+l[192] = [226,241,151];
+l[193] = [219,235,144];
+l[194] = [142,129,181];
+l[195] = [142,129,181];
+l[196] = [255,225,182];
+l[197] = [255,219,175];
+l[198] = [253,221,126];
+l[199] = [253,220,126];
+l[200] = [159,170,186];
+l[201] = [156,164,182];
+l[202] = [165,175,195];
+l[203] = [169,180,200];
+l[204] = [167,178,197];
+l[205] = [167,179,198];
+l[206] = [159,168,188];
+l[207] = [102,167,122];
+l[208] = [94,154,114];
+l[209] = [130,132,145];
+l[210] = [125,127,140];
+l[211] = [121,131,137];
+l[212] = [255,232,133];
+l[213] = [255,226,131];
+l[214] = [164,138,181];
+l[215] = [156,132,176];
+l[216] = [255,219,176];
+l[217] = [149,182,169];
+l[218] = [150,182,169];
+l[219] = [183,161,161];
+l[220] = [186,159,158];
+l[221] = [176,169,168];
+l[222] = [89,91,101];
+l[223] = [145,132,124];
+l[224] = [130,118,116];
+l[225] = [128,135,157];
+l[226] = [148,129,133];
+l[227] = [147,136,135];
+l[228] = [146,136,135];
+l[229] = [111,113,124];
+l[230] = [103,110,146];
+l[231] = [116,122,105];
+l[232] = [104,100,131];
+l[233] = [129,131,145];
+l[234] = [124,125,138];
+l[235] = [188,171,162];
+l[236] = [110,112,124];
+l[237] = [119,115,122];
+l[238] = [120,122,136];
+l[239] = [125,127,140];
+l[240] = [112,114,126];
+l[241] = [121,117,125];
+l[242] = [159,157,161];
+l[243] = [117,118,129];
+l[244] = [134,142,159];
+l[245] = [129,131,142];
+l[246] = [125,127,140];
+l[247] = [133,132,140];
+l[248] = [115,116,129];
+l[249] = [140,142,153];
+l[250] = [140,119,108];
+l[251] = [186,162,149];
+l[252] = [162,141,130];
+l[253] = [151,139,135];
+l[254] = [164,157,161];
+l[255] = [148,156,198];
+l[256] = [143,153,207];
+l[257] = [152,157,165];
+l[258] = [139,151,193];
+l[259] = [138,133,167];
+l[260] = [150,154,167];
+l[261] = [153,160,195];
+l[262] = [150,158,195];
+l[263] = [173,180,190];
+l[264] = [165,170,181];
+l[265] = [147,156,197];
+l[266] = [125,135,130];
+l[267] = [133,171,133];
+l[268] = [141,164,145];
+l[269] = [114,141,121];
+l[270] = [115,133,123];
+l[271] = [113,135,126];
+l[272] = [116,130,128];
+l[273] = [196,187,160];
+l[274] = [200,191,161];
+l[275] = [209,185,151];
+l[276] = [161,159,158];
+l[277] = [200,183,159];
+l[278] = [197,178,157];
+l[279] = [189,168,148];
+l[280] = [189,159,158];
+l[281] = [183,174,164];
+l[282] = [193,179,159];
+l[283] = [133,126,161];
+l[284] = [140,146,161];
+l[285] = [128,131,150];
+l[286] = [130,126,154];
+l[287] = [177,151,153];
+l[288] = [118,144,126];
+l[289] = [116,134,131];
+l[290] = [115,141,128];
+l[291] = [144,125,129];
+l[292] = [117,135,130];
+l[293] = [115,135,127];
+l[294] = [142,133,129];
+l[295] = [148,127,131];
+l[296] = [159,142,136];
+l[297] = [150,155,166];
+l[298] = [153,152,178];
+l[299] = [170,152,156];
+l[300] = [145,152,178];
+l[301] = [146,147,166];
+l[302] = [163,170,162];
+l[303] = [110,132,122];
+l[304] = [148,133,132];
+l[305] = [173,142,133];
+l[306] = [159,135,130];
+l[307] = [147,127,130];
+l[308] = [128,134,157];
+l[309] = [199,182,167];
+l[310] = [205,181,160];
+l[311] = [209,181,157];
+l[312] = [165,146,135];
+l[313] = [179,152,134];
+l[314] = [174,150,134];
+l[315] = [184,175,172];
+l[316] = [187,177,172];
+l[317] = [170,163,164];
+l[318] = [159,143,135];
+l[319] = [154,141,139];
+l[320] = [144,130,130];
+l[321] = [127,129,138];
+l[322] = [148,140,144];
+l[323] = [150,140,142];
+l[324] = [154,148,157];
+l[325] = [150,159,192];
+l[326] = [149,153,173];
+l[327] = [167,172,188];
+l[328] = [149,120,118];
+l[329] = [146,147,173];
+l[330] = [172,169,177];
+l[331] = [131,136,156];
+l[332] = [124,130,155];
+l[333] = [139,129,133];
+l[334] = [145,142,138];
+l[335] = [137,134,130];
+l[336] = [141,130,132];
+l[337] = [135,125,127];
+l[338] = [101,114,115];
+l[339] = [119,108,114];
+l[340] = [118,109,128];
+l[341] = [119,110,116];
+l[342] = [116,119,132];
+l[343] = [121,118,118];
+l[344] = [114,117,130];
+l[345] = [127,112,116];
+l[346] = [130,119,118];
+l[347] = [128,115,136];
+l[348] = [145,137,144];
+l[349] = [130,147,147];
+l[350] = [129,135,159];
+l[351] = [137,136,142];
+l[352] = [136,136,144];
+l[353] = [137,136,143];
+l[354] = [138,134,138];
+l[355] = [125,141,141];
+l[356] = [134,154,150];
+l[357] = [118,105,110];
+l[358] = [106,104,125];
+l[359] = [107,111,128];
+l[360] = [114,102,105];
+l[361] = [104,108,124];
+l[362] = [103,100,120];
+l[363] = [116,109,110];
+l[364] = [129,117,123];
+l[365] = [118,115,137];
+l[366] = [119,123,140];
+l[367] = [124,111,106];
+l[368] = [114,137,129];
+l[369] = [109,112,122];
+l[370] = [118,121,133];
+l[371] = [77,79,87];
+l[372] = [90,91,99];
+l[373] = [122,113,115];
+l[374] = [130,121,122];
+l[375] = [123,111,116];
+l[376] = [129,108,109];
+l[377] = [117,109,111];
+l[378] = [116,108,111];
+l[379] = [88,86,103];
+l[380] = [98,92,93];
+l[381] = [196,178,160];
+l[382] = [174,155,137];
+l[383] = [144,126,113];
+l[384] = [145,125,114];
+l[385] = [181,165,151];
+l[386] = [187,169,156];
+l[387] = [140,130,127];
+l[388] = [143,128,131];
+l[389] = [146,135,136];
+l[390] = [173,178,189];
+l[396] = [181,166,159];
+l[397] = [176,169,169];
+l[398] = [132,131,150];
+l[399] = [123,121,144];
+l[400] = [160,150,197];
+l[401] = [160,154,192];
+l[402] = [160,150,196];
+l[403] = [132,125,157];
+l[404] = [132,122,158];
+l[405] = [113,113,134];
+l[406] = [104,104,123];
+l[407] = [92,82,85];
+l[408] = [131,124,134];
+l[409] = [201,174,156];
+l[410] = [148,137,130];
+l[411] = [138,137,138]; l } \ No newline at end of file
diff --git a/mindus/src/color_mapping.rs b/mindus/src/color_mapping.rs
new file mode 100644
index 0000000..c4a1a85
--- /dev/null
+++ b/mindus/src/color_mapping.rs
@@ -0,0 +1,3 @@
+/// Map a 0xRRGGBB color to a block.
+// pub static COLOR2BLOCK: phf::Map<u32, &Block> = include!(concat!(env!("OUT_DIR"), "/4.rs"));
+pub static BLOCK2COLOR: [[u8; 3]; u16::MAX as usize + 1] = include!("color_mapped");
diff --git a/mindus/src/colors b/mindus/src/colors
new file mode 100644
index 0000000..68e89f3
--- /dev/null
+++ b/mindus/src/colors
Binary files differ
diff --git a/mindus/src/content.rs b/mindus/src/content.rs
new file mode 100644
index 0000000..50acdcf
--- /dev/null
+++ b/mindus/src/content.rs
@@ -0,0 +1,210 @@
+//! contains types of types
+use std::error::Error;
+
+macro_rules! numeric_enum {
+ ($vis:vis enum $tname:ident for $numeric:ty | $error:ident {$($name:ident $(= $val:literal)?),* $(,)?}) =>
+ {
+ crate::content::numeric_enum!($vis enum $tname for $numeric | $error* {$($name $(= $val)?),*});
+
+ impl std::fmt::Display for $error {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ write!(f, "no variant of {} for value {}", stringify!($tname), self.0)
+ }
+ }
+
+ impl std::error::Error for $error {}
+ };
+ ($vis:vis enum $tname:ident for $numeric:ty | $error:ident* {$($name:ident $(= $val:literal)?),* $(,)?}) =>
+ {
+ #[repr($numeric)]
+ #[derive(Copy, Clone, Debug, Eq, Ord, PartialEq, PartialOrd, Hash)]
+ $vis enum $tname { $($name $(= $val)?,)+ }
+
+ #[derive(Copy, Clone, Debug, Eq, PartialEq)]
+ $vis struct $error($vis $numeric);
+
+ impl TryFrom<$numeric> for $tname {
+ type Error = $error;
+
+ #[allow(non_upper_case_globals)]
+ fn try_from(value: $numeric) -> Result<Self, $error> {
+ $(const $name: $numeric = $tname::$name as $numeric;)+
+ match value {
+ $($name => Ok(Self::$name),)+
+ _ => Err($error(value)),
+ }
+ }
+ }
+
+ impl From<$tname> for $numeric { fn from(value: $tname) -> $numeric { value as $numeric } }
+ };
+}
+
+pub(crate) use numeric_enum;
+
+macro_rules! count_exprs {
+ ($($e:expr)*) => {
+ $($crate::content::one!($e) +)* 0
+ }
+}
+
+macro_rules! one {
+ ($e:expr) => {
+ 1
+ };
+}
+pub(crate) use count_exprs;
+pub(crate) use one;
+
+macro_rules! content_enum {
+ ($vis:vis enum $tname:ident / $ctype:ident for u16 | $error:ident {$($val:literal),* $(,)?}) =>
+ {
+ paste::paste! {
+ $crate::content::numeric_enum!($vis enum $tname for u16 | $error* {
+ $([<$val:camel>]),*,
+ });
+
+ impl $tname {
+ pub const ALL: [Self; $crate::content::count_exprs!($($val)+)] = [$(Self::[<$val:camel>]),+];
+
+ pub (crate) fn by_name(name:&str)-> Option<Self> {
+ static MAPPER: std::sync::LazyLock<std::collections::HashMap<&str, $tname>> = std::sync::LazyLock::new(
+ || std::collections::HashMap::from_iter(
+ [
+ $(($val, $tname::[<$val:camel>]),)+
+ ]
+ )
+ );
+ MAPPER.get(name).copied()
+ }
+ }
+ const impl $crate::content::Content for $tname {
+ fn get_type(&self) -> $crate::content::Type {
+ $crate::content::Type::$ctype
+ }
+
+ fn get_id(&self) -> u16 {
+ *self as u16
+ }
+
+ fn get_name(&self) -> &'static str {
+ const NAME: [&str; {$tname::ALL.len()}] = [$($val,)*];
+ NAME[*self as usize]
+ // match self {
+ // $(Self::[<$val:camel>] => $val,)*
+ // }
+ }
+ }
+
+ impl std::fmt::Display for $error {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ write!(f, "no content of type {} for value {}", stringify!($ctype), self.0)
+ }
+ }
+
+ impl std::fmt::Display for $tname {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ match self {
+ $(Self::[<$val:camel>] => f.write_str(strconv::kebab2title!($val)),)*
+ }
+ }
+ }
+
+ impl std::error::Error for $error {}
+ }
+ };
+}
+pub(crate) use content_enum;
+
+macro_rules! color_content_enum {
+ ($vis:vis enum $tname:ident / $ctype:ident for u16 | $error:ident {$($val:literal: $col:literal),* $(,)?}) =>
+ {
+ paste::paste! {
+ $crate::content::content_enum!($vis enum $tname / $ctype for u16 | $error {
+ $($val),*,
+ });
+
+ impl Type {
+ #[must_use]
+ pub const fn color(&self) -> (u8, u8, u8) {
+ match &self {
+ $(Self::[<$val:camel>] => {
+ let v = color_hex::color_from_hex!($col);
+ (v[0], v[1], v[2])
+ },)*
+ }
+ }
+ }
+ }}
+}
+pub(crate) use color_content_enum;
+
+numeric_enum! {
+ pub enum Type for u8 | TryFromU8Error
+ {
+ Item = 0,
+ Block = 1,
+ // Mech = 2,
+ Bullet = 3,
+ Fluid = 4,
+ Modifier = 5,
+ Unit = 6,
+ Weather = 7,
+ // Effect = 8,
+ Sector = 9,
+ // Loadout = 10,
+ // TypeId = 11,
+ // Error = 12,
+ Planet = 13,
+ // Ammo = 14,
+ Team = 15,
+ UnitCommand = 16,
+ UnitStance = 17,
+ }
+}
+
+macro_rules! gen_by_id {
+ ($target:path, $id:expr) => {
+ match <$target>::try_from($id) {
+ Ok(v) => Ok(Box::new(v)),
+ Err(e) => Err(Box::new(e)),
+ }
+ };
+}
+
+impl Type {
+ pub fn get(self, id: u16) -> Result<Box<dyn Content>, Box<dyn Error>> {
+ match self {
+ Self::Item => gen_by_id!(crate::item::Type, id),
+ Self::Block => gen_by_id!(crate::block::content::Type, id),
+ Self::Fluid => gen_by_id!(crate::fluid::Type, id),
+ Self::Modifier => gen_by_id!(crate::modifier::Type, id),
+ Self::Unit => gen_by_id!(crate::unit::Type, id),
+ Self::Team => gen_by_id!(crate::team::Team, id),
+ _ => Ok(Box::new(Generic(self, id))),
+ }
+ }
+}
+pub const trait Content {
+ fn get_type(&self) -> Type;
+
+ fn get_id(&self) -> u16;
+
+ fn get_name(&self) -> &'static str;
+}
+
+struct Generic(Type, u16);
+
+impl Content for Generic {
+ fn get_type(&self) -> Type {
+ self.0
+ }
+
+ fn get_id(&self) -> u16 {
+ self.1
+ }
+
+ fn get_name(&self) -> &'static str {
+ "<unknown>"
+ }
+}
diff --git a/src/data/autotile.rs b/mindus/src/data/autotile.rs
index 92ef1b4..ef73554 100644
--- a/src/data/autotile.rs
+++ b/mindus/src/data/autotile.rs
@@ -1,6 +1,6 @@
-use super::renderer::*;
use super::GridPos;
-use crate::block::{Block, Rotation};
+use super::renderer::*;
+use crate::block::{Block, Rotation, content::Type};
use bobbin_bits::U4;
#[cfg(test)]
@@ -24,10 +24,7 @@ macro_rules! conv {
None
};
($dir:tt) => {
- Some((
- &crate::block::distribution::CONVEYOR,
- crate::data::autotile::dir!($dir),
- ))
+ Some((&crate::block::CONVEYOR, crate::data::autotile::dir!($dir)))
};
}
#[cfg(test)]
@@ -49,16 +46,18 @@ pub(crate) use define;
#[cfg(test)]
pub(crate) use dir;
-pub type Cross<'l> = [Option<(&'l Block, Rotation)>; 4];
+pub type Cross = [Option<(&'static Block, Rotation)>; 4];
+pub type Corners = [Option<(&'static Block, Rotation)>; 4];
/// holds the 4 bordering blocks
#[derive(Copy, Clone)]
-pub struct RenderingContext<'l> {
- pub cross: Cross<'l>,
+pub struct RenderingContext {
+ pub cross: Cross,
+ pub corners: Corners,
pub position: PositionContext,
}
/// holds positions
-#[derive(Copy, Clone, Eq, PartialEq)]
+#[derive(Copy, Clone, Eq, PartialEq, Default)]
pub struct PositionContext {
pub position: GridPos,
pub width: usize,
@@ -76,7 +75,7 @@ impl std::fmt::Debug for PositionContext {
}
#[cfg(test)]
-fn print_crosses(v: Vec<Cross<'_>>, height: usize) -> String {
+fn print_crosses(v: Vec<Cross>, height: usize) -> String {
let mut s = String::new();
for c in v.chunks(height) {
for c in c {
@@ -92,7 +91,7 @@ fn print_crosses(v: Vec<Cross<'_>>, height: usize) -> String {
s
}
-pub fn tile(ctx: &RenderingContext<'_>, name: &str, rot: Rotation, s: Scale) -> ImageHolder<4> {
+pub fn tile(ctx: &RenderingContext, name: &str, rot: Rotation, s: Scale) -> ImageHolder<4> {
mask2tile(mask(ctx, rot, name), rot, name, s)
}
@@ -114,9 +113,9 @@ pub fn mask2tile(mask: U4, rot: Rotation, name: &str, scale: Scale) -> ImageHold
},
// from below
B0010 => match rot {
- Rotation::Left => p!("1-2"), // ┐
- Rotation::Right => p!("1-1"), // ┌
- Rotation::Up => p!("0-3"), // │
+ Rotation::Left => p!("1-2"), // ┐
+ Rotation::Right => p!("1-2-h"), // ┌
+ Rotation::Up => p!("0-3"), // │
Rotation::Down => unreachable!(),
},
// from bottom + left
@@ -224,24 +223,64 @@ pub fn mask(ctx: &RenderingContext, rot: Rotation, n: &str) -> U4 {
U4::from(x)
}
+pub fn nbors(corners: [Option<Type>; 4], cross: [Option<Type>; 4], t: Type) -> u8 {
+ let x = [
+ cross[1], corners[3], cross[0], corners[2], cross[3], corners[0], cross[2], corners[1],
+ ];
+
+ use std::simd::prelude::*;
+ u8x8::from_array(x.map(|x| (x == Some(t)) as u8))
+ .simd_eq(u8x8::splat(1))
+ .to_bitmask() as u8
+}
+
+macro_rules! g {
+ ($name:literal, $($i:literal,)+) => { paste::paste! { [
+ $(load!([<$name _ $i>]),)+
+ ] }};
+}
+
+pub fn select(n: &str, mask: u8) -> [Image<&'static [u8], 4>; 3] {
+ macro_rules! autotiled {
+ ($($name:literal)+) => {{ paste::paste! { $(const [<$name:snake:upper>]: [[Image<&[u8], 4>; 3]; 256] = g![$name,
+39, 36, 39, 36, 27, 16, 27, 24, 39, 36, 39, 36, 27, 16, 27, 24,
+38, 37, 38, 37, 17, 41, 17, 43, 38, 37, 38, 37, 26, 21, 26, 25,
+39, 36, 39, 36, 27, 16, 27, 24, 39, 36, 39, 36, 27, 16, 27, 24,
+38, 37, 38, 37, 17, 41, 17, 43, 38, 37, 38, 37, 26, 21, 26, 25,
+ 3, 4, 3, 4, 15, 40, 15, 20, 3, 4, 3, 4, 15, 40, 15, 20,
+ 5, 28, 5, 28, 29, 10, 29, 23, 5, 28, 5, 28, 31, 11, 31, 32,
+ 3, 4, 3, 4, 15, 40, 15, 20, 3, 4, 3, 4, 15, 40, 15, 20,
+ 2, 30, 2, 30, 9, 46, 9, 22, 2, 30, 2, 30, 14, 44, 14, 6,
+39, 36, 39, 36, 27, 16, 27, 24, 39, 36, 39, 36, 27, 16, 27, 24,
+38, 37, 38, 37, 17, 41, 17, 43, 38, 37, 38, 37, 26, 21, 26, 25,
+39, 36, 39, 36, 27, 16, 27, 24, 39, 36, 39, 36, 27, 16, 27, 24,
+38, 37, 38, 37, 17, 41, 17, 43, 38, 37, 38, 37, 26, 21, 26, 25,
+ 3, 0, 3, 0, 15, 42, 15, 12, 3, 0, 3, 0, 15, 42, 15, 12,
+ 5, 8, 5, 8, 29, 35, 29, 33, 5, 8, 5, 8, 31, 34, 31, 7,
+ 3, 0, 3, 0, 15, 42, 15, 12, 3, 0, 3, 0, 15, 42, 15, 12,
+ 2, 1, 2, 1, 9, 45, 9, 19, 2, 1, 2, 1, 14, 18, 14, 13,];)+ match n {
+ $($name => { [<$name:snake:upper>][mask as usize] },)+
+ x => unreachable!("{x}")
+ }}}};
+}
+ autotiled!("colored-floor" "colored-wall"
+ "metal-tiles-1" "metal-tiles-2" "metal-tiles-3" "metal-tiles-4" "metal-tiles-5""metal-tiles-6" "metal-tiles-7" "metal-tiles-8" "metal-tiles-9" "metal-tiles-10" "metal-tiles-11" "metal-tiles-12" "metal-tiles-13"
+ "metal-wall-1" "metal-wall-2" "metal-wall-3"
+ )
+}
+
pub trait RotationState {
fn get_rotation(&self) -> Option<Rotation>;
}
-pub trait BlockState<'l> {
- fn get_block(&'l self) -> Option<&'l Block>;
-}
-pub trait Crossable {
- fn cross(&self, j: usize, c: &PositionContext) -> Cross;
+pub trait BlockState {
+ fn get_block(&self) -> Option<&'static Block>;
}
#[test]
fn test_cross() {
- let mut reg = crate::block::BlockRegistry::default();
- crate::block::distribution::register(&mut reg);
- let mut ss = super::schematic::SchematicSerializer(&reg);
macro_rules! test {
($schem: literal => $($a:tt,$b:tt,$c:tt,$d:tt)*) => {
- let s = ss.deserialize_base64($schem).unwrap();
+ let s = crate::Schematic::deserialize_base64($schem).unwrap();
let mut c = vec![];
println!("{:#?}", s.blocks);
for (position, _) in s.block_iter() {
@@ -250,7 +289,7 @@ fn test_cross() {
width: s.width,
height: s.height,
};
- c.push(s.cross(&pctx));
+ c.push(s.cross(&pctx).0);
}
let n = s.tags.get("name").map_or("<unknown>", |x| &x);
let cc: Vec<Cross> = vec![
@@ -362,6 +401,7 @@ fn test_mask() {
width: 10,
height: 10,
},
+ corners: Default::default(),
cross: $cross,
},
dir!($rot),
diff --git a/src/data/base64.rs b/mindus/src/data/base64.rs
index 303e9e0..341dd6d 100644
--- a/src/data/base64.rs
+++ b/mindus/src/data/base64.rs
@@ -1,5 +1,5 @@
-use base64::{engine::general_purpose, engine::Engine as _};
pub use base64::{DecodeSliceError as DecodeError, EncodeSliceError as EncodeError};
+use base64::{engine::Engine as _, engine::general_purpose};
const BASE64: general_purpose::GeneralPurpose = general_purpose::STANDARD;
diff --git a/mindus/src/data/command.rs b/mindus/src/data/command.rs
new file mode 100644
index 0000000..f4d679d
--- /dev/null
+++ b/mindus/src/data/command.rs
@@ -0,0 +1,7 @@
+use crate::content::numeric_enum;
+
+numeric_enum! {
+ pub enum UnitCommand for u8 | TryFromU8Error {
+ Move, Repair, Rebuild, Assist, Mine, Boost, EnterPayload, LoadUnits, LoadBlocks, UnloadPayload, LoopPayload
+ }
+}
diff --git a/src/data/dynamic.rs b/mindus/src/data/dynamic.rs
index 344144b..2f4fc2e 100644
--- a/src/data/dynamic.rs
+++ b/mindus/src/data/dynamic.rs
@@ -3,8 +3,7 @@ use thiserror::Error;
use crate::content;
use crate::data::command::{self, UnitCommand};
-use crate::data::{self, DataRead, DataWrite, GridPos, Serializer};
-use crate::logic::LogicField;
+use crate::data::{self, DataRead, DataWrite, GridPos, Serializable};
use crate::team::Team;
macro_rules! datamaker {
@@ -30,6 +29,31 @@ macro_rules! datamaker {
}
}
)+
+
+
+ #[derive(Clone, Copy, Debug, Eq, PartialEq)]
+ pub enum DynType {
+ Content,
+ Point2,
+ Vec2,
+ TechNode,
+ Empty,
+ $($k,)+
+ }
+
+ impl DynData {
+ #[must_use]
+ pub const fn get_type(&self) -> DynType {
+ match self {
+ Self::Empty => DynType::Empty,
+ Self::Point2(..) => DynType::Point2,
+ Self::Vec2(..) => DynType::Vec2,
+ Self::TechNode(..) => DynType::TechNode,
+ Self::Content(..) => DynType::Content,
+ $(Self::$k(..) => DynType::$k,)+
+ }
+ }
+ }
} }
}
@@ -43,7 +67,6 @@ datamaker! {
Boolean(bool),
Double(f64),
Building(GridPos),
- LogicField(LogicField),
ByteArray(Vec<u8>),
UnitCommand(UnitCommand),
BoolArray(Vec<bool>),
@@ -52,67 +75,11 @@ datamaker! {
Team(Team),
}
-impl DynData {
- #[must_use]
- pub const fn get_type(&self) -> DynType {
- match self {
- Self::Empty => DynType::Empty,
- Self::Int(..) => DynType::Int,
- Self::Long(..) => DynType::Long,
- Self::Float(..) => DynType::Float,
- Self::String(..) => DynType::String,
- Self::Content(..) => DynType::Content,
- Self::IntArray(..) => DynType::IntArray,
- Self::Point2(..) => DynType::Point2,
- Self::Point2Array(..) => DynType::Point2Array,
- Self::TechNode(..) => DynType::TechNode,
- Self::Boolean(..) => DynType::Boolean,
- Self::Double(..) => DynType::Double,
- Self::Building(..) => DynType::Building,
- Self::LogicField(..) => DynType::LogicField,
- Self::ByteArray(..) => DynType::ByteArray,
- Self::UnitCommand(..) => DynType::UnitCommand,
- Self::BoolArray(..) => DynType::BoolArray,
- Self::Unit(..) => DynType::Unit,
- Self::Vec2Array(..) => DynType::Vec2Array,
- Self::Vec2(..) => DynType::Vec2,
- Self::Team(..) => DynType::Team,
- }
- }
-}
-
-#[derive(Clone, Copy, Debug, Eq, PartialEq)]
-pub enum DynType {
- Empty,
- Int,
- Long,
- Float,
- String,
- Content,
- IntArray,
- Point2,
- Point2Array,
- TechNode,
- Boolean,
- Double,
- Building,
- LogicField,
- ByteArray,
- UnitCommand,
- BoolArray,
- Unit,
- Vec2Array,
- Vec2,
- Team,
-}
-
-pub struct DynSerializer;
-
-impl Serializer<DynData> for DynSerializer {
+impl Serializable for DynData {
type ReadError = ReadError;
type WriteError = WriteError;
- fn deserialize(&mut self, buff: &mut DataRead<'_>) -> Result<DynData, Self::ReadError> {
+ fn deserialize(buff: &mut DataRead<'_>) -> Result<DynData, Self::ReadError> {
match buff.read_u8()? {
0 => Ok(DynData::Empty),
1 => Ok(DynData::from(buff.read_i32()?)),
@@ -160,7 +127,6 @@ impl Serializer<DynData> for DynSerializer {
10 => Ok(DynData::from(buff.read_bool()?)),
11 => Ok(DynData::from(buff.read_f64()?)),
12 => Ok(DynData::from(GridPos::from(buff.read_u32()?))),
- 13 => Ok(DynData::from(LogicField::try_from(buff.read_u8()?)?)),
14 => {
let len = buff.read_i32()?;
let Ok(len) = usize::try_from(len) else {
@@ -175,10 +141,9 @@ impl Serializer<DynData> for DynSerializer {
let Ok(len) = usize::try_from(len) else {
return Err(ReadError::BoolArrayLen(len));
};
- let mut result = vec![];
- result.reserve(len);
- for _ in 0..len {
- result.push(buff.read_bool()?);
+ let mut result = vec![false; len];
+ for item in result.iter_mut() {
+ *item = buff.read_bool()?;
}
Ok(DynData::from(result))
}
@@ -196,6 +161,11 @@ impl Serializer<DynData> for DynSerializer {
}
19 => Ok(DynData::Vec2(buff.read_f32()?, buff.read_f32()?)),
20 => Ok(DynData::from(Team::of(buff.read_u8()?))),
+ 21 => Ok(DynData::IntArray(
+ (0..dbg!(buff.read_u16()? as usize))
+ .map(|_| buff.read_i32())
+ .collect::<Result<Vec<_>, _>>()?,
+ )),
23 => Ok(DynData::from(
UnitCommand::try_from(buff.read_i16()? as u8)?,
)),
@@ -203,12 +173,8 @@ impl Serializer<DynData> for DynSerializer {
}
}
- fn serialize(
- &mut self,
- buff: &mut DataWrite<'_>,
- data: &DynData,
- ) -> Result<(), Self::WriteError> {
- match data {
+ fn serialize(&self, buff: &mut DataWrite<'_>) -> Result<(), Self::WriteError> {
+ match self {
DynData::Empty => {
buff.write_u8(0)?;
Ok(())
@@ -294,11 +260,6 @@ impl Serializer<DynData> for DynSerializer {
buff.write_u32(u32::from(*pos))?;
Ok(())
}
- DynData::LogicField(fld) => {
- buff.write_u8(13)?;
- buff.write_u8(u8::from(*fld))?;
- Ok(())
- }
DynData::ByteArray(arr) => {
if arr.len() > i32::MAX as usize {
return Err(WriteError::ByteArrayLen(arr.len()));
@@ -368,8 +329,6 @@ pub enum ReadError {
IntArrayLen(i16),
#[error("point2 array too long ({0})")]
Point2ArrayLen(i8),
- #[error("invalid logic field ({0})")]
- LogicField(#[from] crate::logic::TryFromU8Error),
#[error("byte array too long ({0})")]
ByteArrayLen(i32),
#[error("unit command not found")]
@@ -399,7 +358,7 @@ pub enum WriteError {
#[cfg(test)]
mod test {
use super::*;
- use crate::team::{CRUX, DERELICT, SHARDED};
+ use crate::team::Team;
macro_rules! _zero {
($tt:tt) => {
@@ -416,7 +375,7 @@ mod test {
let mut writer = DataWrite::default();
for (i, d) in input.iter().enumerate()
{
- assert_eq!(DynSerializer.serialize(&mut writer, d), Ok(()));
+ assert_eq!(d.serialize(&mut writer), Ok(()));
positions[i] = writer.get_written().len();
}
let written = writer.get_written();
@@ -424,7 +383,7 @@ mod test {
let mut reader = DataRead::new(written);
for (i, original) in input.iter().enumerate()
{
- match DynSerializer.deserialize(&mut reader)
+ match DynData::deserialize(&mut reader)
{
Ok(read) => assert_eq!(*original, read, "serialization of {original:?} became {read:?}"),
e => assert!(false, "could not re-read {original:?} (at {i}), got {e:?}"),
@@ -509,12 +468,6 @@ mod test {
DynData::Building(GridPos(4444, 0xFE98))
);
make_dyn_test!(
- reparse_logic,
- DynData::LogicField(LogicField::Enabled),
- DynData::LogicField(LogicField::Shoot),
- DynData::LogicField(LogicField::Color)
- );
- make_dyn_test!(
reparse_byte_array,
DynData::ByteArray(b"c\x00nstruct \xADditio\nal pylons".to_vec()),
DynData::ByteArray(b"\x00\x01\xFE\xFF".to_vec())
@@ -543,8 +496,8 @@ mod test {
);
make_dyn_test!(
reparse_team,
- DynData::Team(SHARDED),
- DynData::Team(CRUX),
- DynData::Team(DERELICT)
+ DynData::Team(Team::SHARDED),
+ DynData::Team(Team::CRUX),
+ DynData::Team(Team::DERELICT)
);
}
diff --git a/mindus/src/data/entity_mapping.rs b/mindus/src/data/entity_mapping.rs
new file mode 100644
index 0000000..beed2b4
--- /dev/null
+++ b/mindus/src/data/entity_mapping.rs
@@ -0,0 +1,31 @@
+#[derive(Debug, Copy, Clone, PartialEq, Eq)]
+pub enum UnitClass {
+ Block,
+ // same read impl as block
+ Legs,
+ Elevated,
+ Crawl,
+ Boat,
+ Tank,
+ Air,
+ // different read impl from block
+ Mech,
+ Tethered,
+ Payload,
+ Bomb,
+}
+
+pub static ID: [Option<UnitClass>; 47] = amap::amap! {
+ 2 => UnitClass::Block,
+ 24 => UnitClass::Legs,
+ 45 => UnitClass::Elevated,
+ 46 => UnitClass::Crawl,
+ 36 => UnitClass::Tethered,
+ 5 | 23 | 26 => UnitClass::Payload,
+ 39 => UnitClass::Bomb,
+ 20 => UnitClass::Boat,
+ 43 => UnitClass::Tank,
+ 4 | 17 | 19 | 32 => UnitClass::Mech,
+ 21 | 29 | 33 => UnitClass::Legs,
+ 3 | 16 | 18 | 0 | 30 | 31 => UnitClass::Air,
+};
diff --git a/mindus/src/data/map.rs b/mindus/src/data/map.rs
new file mode 100644
index 0000000..afd1497
--- /dev/null
+++ b/mindus/src/data/map.rs
@@ -0,0 +1,1024 @@
+//! the map module
+//! ### format
+//! note: utf = `len<u16>` + `utf8(read(len))`
+//!
+//! note: each section has a `u32` denoting its length
+//!
+//! key: `: T` and `x<T>` both mean read T, `iterate T` means iterate `read_T()` times
+//!
+//! ZLIB compressed stream contains:
+//! - header: 4b = `MSCH` [`MapReader::header`]
+//! - version: `u32` (should be 7+) [`MapReader::version`]
+//! - tag section `<u32>` [`MapReader::tags`]
+//! - 1 byte of idk (skip)
+//! - string map (`u16` for map len, iterate each, read `utf`)
+//! - content header section `<u32>`: [`MapReader::content`] (note: if map v8, will use [`BlockEnum`] and skip reading this)
+//! - iterate `i8` (should = `10`)'
+//! - the type: `i8` (0: item, block: 1, liquid: 4, status: 5, unit: 6, weather: 7, sector: 9, planet: 13
+//! - item count: `u16` (item: 22, block: 422, liquid: 11, status: 21, unit: 66, weather: 6, sector: 35, planet: 7)
+//! - these types all have their own modules: [`item`], [`content`], [`fluid`], [`modifier`], [`mod@unit`], [`weather`], [`sector`], [`planet`]
+//! - iterate `u16`
+//! - name: `utf`
+//! - map section `<u32>` [`MapReader::map`]
+//! - width: `u16`, height: `u16`
+//! - floor and tiles:
+//! - for `i` in `w * h`
+//! - `x = i % w`, `y = i / w`
+//! - floor id: `u16`
+//! - overlay id: `u16`
+//! - consecutives: `u8`
+//! - iterate `(i + 1)..(i + 1 + consecutives)`
+//! - `x = j % w`, `y = j / w`
+//! - i += consecutives
+//! - blocks
+//! - for `i` in `w * h`
+//! - block id: `u16`
+//! - packed?: `i8`
+//! - entity = `(packed & 1) not 0`
+//! - data = `(packed & 2) not 0`
+//! - newdata = `(packed & 3) not 0`
+//! - if entity: central: `bool`
+//! - if entity:
+//! - if central:
+//! - chunk len: `u16`
+//! - if block == building:
+//! - revision: `i8`
+//! - [`Build::read`]
+//! - else skip `chunk len`
+//! - or data
+//! - data: `i8`
+//! - or new data
+//! - data: `i8`
+//! - floor: `i8`
+//! - overlay: `i8`
+//! - extra: `i32`
+//! - else
+//! - consecutives: `u8`
+//! - iterate `(i + 1)..(i + 1 + consecutives)`
+//! - same block
+//! - i += consecutives
+//! - entities section `<u32>` [`MapReader::entities`]
+//! - entity mapping
+//! - iterate `u16`
+//! - id: `i16`, name: `utf`
+//! - team build plans
+//! - for t in `teams<u32>`
+//! - team = `team#<u32>`
+//! - iterate `plans<u32>`
+//! - x: `u16`, y: `u16`, rot: `u16`, id: `u16`
+//! - o: `DynData` (refer to [`DynSerializer`])
+//! - world entities
+//! - iterate `u32`
+//! - len: `u16`
+//! - type: `u8`
+//! - if !mapping\[type\]
+//! - skip(len - 1)
+//! - continue
+//! - id: `u32`
+//! - entity read
+//! - markers section (v8)
+use fimg::DynImage;
+use std::collections::HashMap;
+use std::ops::CoroutineState::*;
+use std::ops::{Coroutine, Index, IndexMut};
+use std::pin::Pin;
+use std::sync::atomic::{AtomicU64, Ordering};
+use thiserror::Error;
+
+use crate::block::content::Type as BlockEnum;
+use crate::block::{Block, Rotation, State};
+use crate::data::DataRead;
+use crate::data::dynamic::DynData;
+use crate::data::renderer::*;
+use crate::fluid::Type as Fluid;
+use crate::item::{Type as Item, storage::Storage};
+use crate::team::Team;
+use crate::unit::Unit;
+#[cfg(doc)]
+use crate::{block::content, data::*, fluid, item, modifier, unit};
+
+use super::{Serializable, entity_mapping};
+use crate::content::Content;
+
+/// a tile in a map
+#[derive(Clone)]
+pub struct Tile {
+ pub floor: BlockEnum,
+ pub ore: BlockEnum,
+ build: Option<Build>,
+ pub nd: [u8; 7],
+}
+
+pub fn table(x: BlockEnum, scale: Scale) -> DynImage<&'static [u8]> {
+ FLOOR_TABLE[x as usize][mcg() as usize][scale as usize]
+}
+
+pub fn mcg() -> u64 {
+ static STATE: AtomicU64 = AtomicU64::new(25);
+ let s = STATE.load(Ordering::Relaxed);
+ // a * s % m
+ let s = (s.wrapping_mul(0xecc5)) % (1 << 32);
+ STATE.store(s, Ordering::Relaxed);
+ (s >> 13) & (0b111)
+}
+
+static FLOOR_TABLE: [[[DynImage<&'static [u8]>; 3]; 8]; BlockEnum::ALL.len()] = {
+ let mut table = [[car::map!(load!("empty"), DynImage::from); 8]; BlockEnum::ALL.len()];
+ macro_rules! image {
+ (| $($x:literal $(|)?)+) => { paste::paste! {
+ $(table[BlockEnum::[<$x:camel>] as usize] = load!(8x $x));+
+ } };
+ (| single $($x:literal $(|)?)+) => { paste::paste! {
+ $(table[BlockEnum::[<$x:camel>] as usize] =
+ car::map!([load!($x); 8], |x| car::map!(x, DynImage::from)));+
+ } }
+ }
+
+ image! [
+ | single "colored-floor" | "colored-wall" | "metal-tiles-1" | "metal-tiles-2" | "metal-tiles-3" | "metal-tiles-4" | "metal-tiles-5" | "metal-tiles-6" | "metal-tiles-7" | "metal-tiles-8" | "metal-tiles-9" | "metal-tiles-10" | "metal-tiles-11" | "metal-tiles-12"
+ | "metal-floor" | "metal-floor-2" | "metal-floor-3" | "metal-floor-4" | "metal-floor-5"
+ | "dark-panel-1" | "dark-panel-2" | "dark-panel-3" | "dark-panel-4" | "dark-panel-5" | "dark-panel-6"
+ | "arkycite-floor"
+ | "darksand-tainted-water" | "darksand-water" | "deep-tainted-water" | "deep-water" | "sand-water" | "shallow-water" | "tainted-water"
+ | "tar" | "pooled-cryofluid"
+ | "space"
+ | "stone-vent"
+ | "core-zone"
+ | "spawn"
+ ];
+ image! {
+ | "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"
+ | "dacite"
+ | "dirt"
+ | "basalt" | "basalt-vent"
+ | "moss"
+ | "mud"
+ | "ice-snow" | "snow" | "salt" | "ice"
+ | "hotrock" | "char" | "magmarock" | "molten-slag"
+ | "shale"
+ | "metal-floor-damaged"
+ | "stone"
+ | "bluemat"
+ | "ferric-craters"
+ | "beryllic-stone"
+ | "grass"
+ | "rhyolite" | "rough-rhyolite" | "rhyolite-crater" | "rhyolite-vent"
+ | "crater-stone"
+ | "redmat"
+ | "red-ice"
+ | "spore-moss"
+ | "regolith"
+ | "ferric-stone"
+ | "arkyic-stone"
+ | "yellow-stone" | "yellow-stone-plates"
+ | "red-stone" | "dense-red-stone"
+ | "carbon-stone"
+ | "crystal-floor" | "crystalline-stone"
+ };
+ table
+};
+
+impl Tile {
+ #[must_use]
+ pub const fn new(floor: BlockEnum, ore: BlockEnum) -> Self {
+ Self {
+ floor,
+ ore,
+ build: None,
+ nd: [0; 7],
+ }
+ }
+
+ fn set_block(&mut self, block: &'static Block) {
+ self.build = Some(Build {
+ block,
+ state: None,
+ items: Storage::new(),
+ liquids: Storage::new(),
+ rotation: Rotation::Up,
+ team: Team::SHARDED,
+ data: 0,
+ });
+ }
+
+ #[must_use]
+ pub const fn build(&self) -> Option<&Build> {
+ self.build.as_ref()
+ }
+
+ /// size of this tile
+ ///
+ /// ._.
+ ///
+ /// dont think about it too much
+ #[must_use]
+ #[inline]
+ pub fn size(&self) -> u8 {
+ self.build.as_ref().map_or(1, |v| v.block.get_size())
+ }
+
+ #[must_use]
+ #[inline]
+ pub fn has_ore(&self) -> bool {
+ self.ore != BlockEnum::Air
+ }
+
+ /// Draw this tiles build.
+ #[must_use]
+ #[inline]
+ pub fn build_image(
+ &self,
+ context: Option<&RenderingContext>,
+ s: Scale,
+ ) -> DynImage<image::Cow> {
+ // building covers floore
+ let Some(b) = &self.build else {
+ unreachable!();
+ };
+ b.image(context, s)
+ }
+}
+
+impl std::fmt::Debug for Tile {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ write!(
+ f,
+ "Tile@{}{}{}",
+ self.floor.get_name(),
+ if self.ore != BlockEnum::Air {
+ format!("+{}", self.ore.get_name())
+ } else {
+ String::new()
+ },
+ if let Some(build) = &self.build {
+ format!(":{}", build.block.name())
+ } else {
+ String::new()
+ }
+ )
+ }
+}
+
+impl BlockState for Tile {
+ fn get_block(&self) -> Option<&'static Block> {
+ Some(self.build()?.block)
+ }
+}
+
+impl RotationState for Tile {
+ fn get_rotation(&self) -> Option<Rotation> {
+ Some(self.build()?.rotation)
+ }
+}
+
+impl RotationState for Option<Tile> {
+ fn get_rotation(&self) -> Option<Rotation> {
+ self.as_ref().unwrap().get_rotation()
+ }
+}
+
+impl BlockState for Option<Tile> {
+ fn get_block(&self) -> Option<&'static Block> {
+ self.as_ref().unwrap().get_block()
+ }
+}
+
+/// a build on a tile in a map
+#[derive(Clone)]
+pub struct Build {
+ pub block: &'static Block,
+ pub items: Storage<Item>,
+ pub liquids: Storage<Fluid>,
+ pub state: Option<State>,
+ // pub health: f32,
+ pub rotation: Rotation,
+ pub team: Team,
+ pub data: i8,
+}
+
+impl std::fmt::Debug for Build {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ write!(f, "Build<{block}>", block = self.block.name(),)
+ }
+}
+
+impl Build {
+ #[must_use]
+ pub fn new(block: &'static Block) -> Build {
+ Self {
+ block,
+ items: Storage::default(),
+ liquids: Storage::default(),
+ state: None,
+ rotation: Rotation::Up,
+ team: Team::SHARDED,
+ data: 0,
+ }
+ }
+
+ fn image(&self, context: Option<&RenderingContext>, s: Scale) -> DynImage<image::Cow> {
+ self.block
+ .image(self.state.as_ref(), context, self.rotation, s)
+ }
+
+ #[must_use]
+ pub const fn name(&self) -> &str {
+ self.block.name()
+ }
+
+ pub fn read(&mut self, buff: &mut DataRead<'_>) -> Result<(), ReadError> {
+ // health
+ let _ = buff.read_f32()?;
+ let rot = buff.read_i8()? as i16;
+ // team
+ let _ = buff.read_i8()?;
+ self.rotation = Rotation::try_from((rot & 127) as u8).unwrap_or(Rotation::Up);
+ let mut mask = 0;
+ let mut version = 0;
+ if rot & 128 != 0 {
+ version = buff.read_u8()?;
+ if version < 3 {
+ return Err(ReadError::Version(version));
+ }
+ buff.skip(1)?;
+ mask = buff.read_u8()?;
+ }
+
+ if mask & 1 != 0 {
+ read_items(buff, &mut self.items)?;
+ }
+ if mask & 2 != 0 {
+ read_power(buff)?;
+ }
+ if mask & 4 != 0 {
+ read_liquids(buff, &mut self.liquids)?;
+ }
+ if mask & 16 != 0 {
+ let _scale = buff.read_f32()?;
+ let _duration = buff.read_f32()?;
+ }
+ // "efficiency"
+ _ = buff.read_u8()? as f64 / 255.;
+ _ = buff.read_u8()? as f64 / 255.;
+
+ if version == 4 {
+ // visible flags for fog
+ _ = buff.read_u64()?;
+ }
+ // "overridden by subclasses"
+ // self.block.read(self, buff)?;
+
+ Ok(())
+ }
+}
+
+/// format:
+/// - iterate [`u16`]
+/// - item: [`u16`] as [`Item`]
+/// - amount: [`u32`]
+///
+fn read_items(from: &mut DataRead, to: &mut Storage<Item>) -> Result<(), ReadError> {
+ to.clear();
+ let n = from.read_u16()?;
+ to.reserve(n as usize);
+ for _ in 0..n {
+ let item = from.read_u16()?;
+ let amount = from.read_u32()?;
+ if let Ok(item) = Item::try_from(item) {
+ to.set(item, amount);
+ }
+ }
+ Ok(())
+}
+
+/// format:
+/// - iterate [`u16`]
+/// - liquid: [`u16`] as [`Fluid`]
+/// - amount: [`f32`]
+fn read_liquids(from: &mut DataRead, to: &mut Storage<Fluid>) -> Result<(), ReadError> {
+ to.clear();
+ let n = from.read_u16()?;
+ to.reserve(n as usize);
+ for _ in 0..n {
+ let fluid = from.read_u16()?;
+ let amount = from.read_f32()?;
+ if let Ok(fluid) = Fluid::try_from(fluid) {
+ to.set(fluid, (amount * 100.0) as u32);
+ }
+ }
+ Ok(())
+}
+
+/// format:
+/// - iterate [`u16`]
+/// - link: [`i32`]
+/// - status: [`f32`]
+fn read_power(from: &mut DataRead) -> Result<(), ReadError> {
+ let n = from.read_u16()? as usize;
+ from.skip((n + 1) * 4)?;
+ Ok(())
+}
+
+#[test]
+fn test_read_items() {
+ let mut s = Storage::new();
+ read_items(
+ &mut DataRead::new(&[
+ 0, 6, 0, 0, 0, 0, 2, 187, 0, 1, 0, 0, 1, 154, 0, 2, 0, 0, 15, 160, 0, 3, 0, 0, 0, 235,
+ 0, 6, 0, 0, 1, 46, 0, 12, 0, 0, 1, 81, 255, 255,
+ ]),
+ &mut s,
+ )
+ .unwrap();
+ assert!(s.get_total() == 5983);
+}
+
+#[test]
+fn test_read_liquids() {
+ let mut s = Storage::new();
+ read_liquids(
+ &mut DataRead::new(&[0, 1, 0, 0, 67, 111, 247, 126, 255, 255]),
+ &mut s,
+ )
+ .unwrap();
+ assert!(s.get(Fluid::Water) == 23996);
+}
+
+/// a map.
+/// ## Does not support serialization yet!
+#[derive(Debug)]
+pub struct Map {
+ pub width: usize,
+ pub height: usize,
+ pub tags: HashMap<String, String>,
+ pub entities: Vec<Unit>,
+ /// row major 2d array
+ /// ```rs
+ /// (0, 0), (1, 0), (2, 0)
+ /// (0, 1), (1, 1), (2, 1)
+ /// (0, 2), (1, 2), (2, 2)
+ /// ```
+ pub tiles: Vec<Tile>,
+}
+
+impl Map {
+ #[lower::apply(wrapping)]
+ pub(crate) fn cross(&self, j: usize) -> [Option<&Tile>; 4] {
+ [
+ self.tiles.get(j + self.width),
+ self.tiles.get(j + 1),
+ self.tiles.get(j - self.width),
+ self.tiles.get(j - 1),
+ ]
+ }
+ #[lower::apply(wrapping)]
+ pub(crate) fn corners(&self, j: usize) -> [Option<&Tile>; 4] {
+ [
+ self.tiles.get(j - self.width - 1),
+ self.tiles.get(j - self.width + 1),
+ self.tiles.get(j + self.width - 1),
+ self.tiles.get(j + self.width + 1),
+ ]
+ }
+
+ #[must_use]
+ pub fn new(width: usize, height: usize, tags: HashMap<String, String>) -> Self {
+ Self {
+ tiles: Vec::with_capacity(width * height),
+ height,
+ width,
+ tags,
+ entities: vec![],
+ }
+ }
+
+ fn push(&mut self, t: Tile) {
+ self.tiles.push(t);
+ }
+}
+
+impl Index<usize> for Map {
+ type Output = Tile;
+ fn index(&self, index: usize) -> &Self::Output {
+ &self.tiles[index]
+ }
+}
+
+impl IndexMut<usize> for Map {
+ fn index_mut(&mut self, index: usize) -> &mut Self::Output {
+ &mut self.tiles[index]
+ }
+}
+
+const MAP_HEADER: [u8; 4] = [b'M', b'S', b'A', b'V'];
+
+/// error occurring when reading a map fails
+#[derive(Debug, Error)]
+pub enum ReadError {
+ #[error("failed to read from buffer")]
+ Read(#[from] super::ReadError),
+ #[error(transparent)]
+ Decompress(#[from] super::DecompressError),
+ #[error("incorrect header ({0:?})")]
+ Header([u8; 4]),
+ #[error("unsupported version ({0})")]
+ Version(u8),
+ #[error("unknown block at index {0:?}")]
+ NoSuchBlock(u16),
+ #[error("no block {0}")]
+ NoBlockFound(String),
+ #[error("failed to read block data")]
+ ReadState(#[from] super::dynamic::ReadError),
+ #[error("no block, but data")]
+ NoBlockWithData,
+}
+
+/// Struct for granular map deserialization.
+pub struct MapReader {
+ #[allow(dead_code)]
+ backing: Vec<u8>,
+ // dataread references 'backing'
+ buff: DataRead<'static>,
+ version: u32,
+}
+
+#[derive(Debug)]
+pub enum ThinBloc {
+ Build(Rotation, &'static Block, Team),
+ Many(Option<&'static Block>, u8),
+}
+
+#[derive(Debug)]
+pub enum ThinMapData {
+ Init { width: u16, height: u16 },
+ Bloc(ThinBloc),
+ Tile { floor: BlockEnum, ore: BlockEnum },
+}
+
+#[derive(Debug)]
+pub enum Bloc {
+ Build(Build, &'static Block),
+ Data(&'static Block, i8),
+ Nd(Option<&'static Block>, [u8; 7]),
+ Many(Option<&'static Block>, u8),
+}
+
+#[derive(Debug)]
+pub enum MapData {
+ Init { width: u16, height: u16 },
+ Bloc(Bloc),
+ Tile { floor: BlockEnum, ore: BlockEnum },
+}
+
+#[derive(Debug)]
+pub enum EntityData {
+ Length(u32),
+ Data(Unit),
+}
+
+macro_rules! tiles {
+ ($count:ident, $me:ident, $w: ident,$r:ident) => {
+ let mut i = 0;
+ while i < $count {
+ let floor_id = $me.buff.read_u16()?;
+ let overlay_id = $me.buff.read_u16()?;
+ let &floor = $r.get(floor_id as usize).unwrap_or(&BlockEnum::Stone);
+ let &ore = $r.get(overlay_id as usize).unwrap_or(&BlockEnum::Air);
+ yield $w::Tile { floor, ore };
+ let consecutives = $me.buff.read_u8()? as usize;
+ for _ in 0..consecutives {
+ yield $w::Tile { floor, ore };
+ }
+ i += consecutives;
+ i += 1;
+ }
+ };
+}
+
+pub type Registrar = [BlockEnum; BlockEnum::ALL.len()];
+impl MapReader {
+ pub fn new(buff: &mut DataRead<'_>) -> Result<Self, ReadError> {
+ let backing = buff.deflate()?;
+ Ok(Self {
+ version: u32::MAX,
+ buff: DataRead::new(unsafe {
+ std::mem::transmute::<&'_ [u8], &'static [u8]>(&backing)
+ }),
+ backing,
+ })
+ }
+
+ pub fn header(&mut self) -> Result<[u8; 4], ReadError> {
+ let b = self.buff.readN::<4>()?;
+ (b == MAP_HEADER).then_some(b).ok_or(ReadError::Header(b))
+ }
+
+ pub fn version(&mut self) -> Result<u32, ReadError> {
+ let x = self.buff.read_u32()?;
+ matches!(x, 7..=11 | 13)
+ .then_some(x)
+ .ok_or(ReadError::Version(x.try_into().unwrap_or(0)))
+ }
+
+ pub fn tags(&mut self) -> Result<HashMap<&str, &str>, ReadError> {
+ let mut tags = HashMap::new();
+ self.buff.skip(5)?;
+ for _ in 0..self.buff.read_u8()? {
+ let key = self.buff.read_utf()?;
+ let value = self.buff.read_utf()?;
+ tags.insert(key, value);
+ }
+ Ok(tags)
+ }
+
+ pub fn content(&mut self) -> Result<Registrar, ReadError> {
+ let mut registrar = BlockEnum::ALL;
+ _ = self.buff.read_u32()?;
+ for _ in 0..self.buff.read_i8()? {
+ let ty = self.buff.read_u8()?;
+ for index in 0..self.buff.read_u16()? as usize {
+ if ty == 1 {
+ let name = self.buff.read_utf()?;
+ let block = BlockEnum::by_name(name)
+ .ok_or_else(|| ReadError::NoBlockFound(name.to_string()))?;
+ registrar.get_mut(index).map(|x| *x = block);
+ } else {
+ let n = self.buff.read_u16()?;
+ self.buff.skip(n as usize)?;
+ }
+ }
+ }
+ Ok(registrar)
+ }
+
+ pub fn tags_alloc(&mut self) -> Result<HashMap<String, String>, ReadError> {
+ let mut tags = HashMap::new();
+ self.buff
+ .read_chunk(true, |buff| {
+ buff.skip(1)?;
+ for _ in 0..buff.read_u8()? {
+ let key = buff.read_utf()?;
+ let value = buff.read_utf()?;
+ tags.insert(key.to_owned(), value.to_owned());
+ }
+ Ok::<(), ReadError>(())
+ })
+ .map(|_| tags)
+ }
+
+ pub fn skip(&mut self) -> Result<(), ReadError> {
+ let len = self.buff.read_u32()? as usize;
+ self.buff.skip(len)?;
+ Ok(())
+ }
+
+ pub fn thin_map(
+ &mut self,
+ r: Registrar,
+ ) -> Result<
+ impl Coroutine<(), Return = Result<(), ReadError>, Yield = ThinMapData> + '_,
+ ReadError,
+ > {
+ let len = self.buff.read_u32()? as usize;
+ let rb4 = self.buff.read;
+ let map = #[coroutine]
+ move || {
+ let w = self.buff.read_u16()?;
+ let h = self.buff.read_u16()?;
+ yield ThinMapData::Init {
+ width: w,
+ height: h,
+ };
+ let w = w as usize;
+ let h = h as usize;
+ let count = w * h;
+ tiles!(count, self, ThinMapData, r);
+
+ let mut i = 0;
+ while i < count {
+ let block_id = self.buff.read_u16()?;
+ let packed = self.buff.read_u8()?;
+ let entity = (packed & 1) != 0;
+ let data = (packed & 2) != 0;
+ let newdata = (packed & 4) != 0;
+ if newdata {
+ self.buff.skip(7)?;
+ }
+ let central = if entity {
+ self.buff.read_bool()?
+ } else {
+ false
+ };
+ let block = *r
+ .get(block_id as usize)
+ .ok_or(ReadError::NoSuchBlock(block_id))?;
+ let block = block.to_block();
+ yield if entity {
+ if central {
+ let len = if self.version > 9 {
+ self.buff.read_u32()? as usize
+ } else {
+ self.buff.read_u16()? as usize
+ };
+ let rb4 = self.buff.read;
+
+ #[cfg(debug_assertions)]
+ println!("reading {block:?} ");
+ let _ = self.buff.read_i8()?;
+ let _ = self.buff.read_f32()?;
+ let rot = self.buff.read_i8()?;
+ let rot = Rotation::try_from((rot & 127) as u8).unwrap_or(Rotation::Up);
+ let team = Team::of(self.buff.read_u8()?);
+ let read = self.buff.read - rb4;
+ let n = len - read;
+ self.buff.skip(n)?;
+
+ ThinMapData::Bloc(ThinBloc::Build(rot, block.unwrap(), team))
+ } else {
+ ThinMapData::Bloc(ThinBloc::Many(None, 0))
+ }
+ } else if data {
+ _ = self.buff.read_i8()?;
+ ThinMapData::Bloc(ThinBloc::Many(block, 0))
+ } else if newdata {
+ ThinMapData::Bloc(ThinBloc::Many(block, 0))
+ } else {
+ let consecutives = self.buff.read_u8()?;
+ i += consecutives as usize;
+ ThinMapData::Bloc(ThinBloc::Many(block, consecutives))
+ };
+
+ i += 1;
+ }
+ let read = self.buff.read - rb4;
+ debug_assert!(len >= read, "overread; supposed to read {len}; read {read}");
+ debug_assert!((len - read) == 0, "supposed to read {len}; read {read}");
+ Ok(())
+ };
+ Ok(map)
+ }
+
+ pub fn collect_map(
+ &mut self,
+ tags: HashMap<String, String>,
+ r: Registrar,
+ ) -> Result<Map, ReadError> {
+ let mut co = self.map(r)?;
+ let (w, h) = match Pin::new(&mut co).resume(()) {
+ Yielded(MapData::Init { width, height }) => (width as usize, height as usize),
+ Complete(Err(x)) => return Err(x),
+ _ => unreachable!(),
+ };
+ let mut m = Map::new(w, h, tags);
+ for _ in 0..w * h {
+ match Pin::new(&mut co).resume(()) {
+ Yielded(MapData::Tile { floor, ore }) => m.push(Tile::new(floor, ore)),
+ Complete(Err(x)) => return Err(x),
+ _ => unreachable!(),
+ }
+ }
+ let mut i = 0;
+ while i < w * h {
+ match Pin::new(&mut co).resume(()) {
+ Yielded(MapData::Bloc(Bloc::Many(None, n))) => i += n as usize,
+ Yielded(MapData::Bloc(Bloc::Build(x, y))) => {
+ m[i].set_block(y);
+ m[i].build = Some(x);
+ }
+ Yielded(MapData::Bloc(Bloc::Data(x, y))) => {
+ m[i].set_block(x);
+ m[i].build.as_mut().unwrap().data = y;
+ }
+ Yielded(MapData::Bloc(Bloc::Many(Some(bloc), n))) => {
+ for i in i..=i + n as usize {
+ m[i].set_block(bloc);
+ }
+ i += n as usize;
+ }
+ Yielded(MapData::Bloc(Bloc::Nd(b, d))) => {
+ b.map(|b| m[i].set_block(b));
+ m[i].nd = d
+ }
+ Complete(Err(x)) => return Err(x),
+ x => unreachable!("{x:?}"),
+ }
+ i += 1;
+ }
+ match Pin::new(&mut co).resume(()) {
+ Complete(Ok(())) => (),
+ _ => unreachable!(),
+ };
+ Ok(m)
+ }
+
+ pub fn map(
+ &mut self,
+ r: Registrar,
+ ) -> Result<impl Coroutine<(), Return = Result<(), ReadError>, Yield = MapData> + '_, ReadError>
+ {
+ let len = self.buff.read_u32()? as usize;
+ let rb4 = self.buff.read;
+
+ let c = #[coroutine]
+ move || {
+ let w = self.buff.read_u16()?;
+ let h = self.buff.read_u16()?;
+ yield MapData::Init {
+ width: w,
+ height: h,
+ };
+ let w = w as usize;
+ let h = h as usize;
+ let count = w * h;
+ tiles!(count, self, MapData, r);
+
+ let mut i = 0;
+ while i < count {
+ let block_id = self.buff.read_u16()?;
+ let packed = self.buff.read_u8()?;
+ let entity = (packed & 1) != 0;
+ let data = (packed & 2) != 0;
+ let newdata = (packed & 4) != 0;
+ let newdata = newdata.then(|| self.buff.readN::<7>()).transpose()?;
+ let central = if entity {
+ self.buff.read_bool()?
+ } else {
+ false
+ };
+
+ let block = r
+ .get(block_id as usize)
+ .ok_or(ReadError::NoSuchBlock(block_id))?;
+ let block = block.to_block();
+ yield if entity {
+ if central {
+ let block = block.ok_or(ReadError::NoBlockWithData)?;
+ let len = if self.version > 9 {
+ self.buff.read_u32()? as usize
+ } else {
+ self.buff.read_u16()? as usize
+ };
+ let rb4 = self.buff.read;
+
+ #[cfg(debug_assertions)]
+ println!("reading {block:?} ");
+ let _revision = self.buff.read_i8()?;
+ let mut b = Build::new(block);
+ b.read(&mut self.buff)?;
+ // implementation not complete, skip remaining bytes (TODO finish impl)
+ let read = self.buff.read - rb4;
+
+ // skip this chunk
+ assert!(len >= read, "overread; supposed to read {len}; read {read}");
+ let n = len - read;
+ if n != 0 {
+ #[cfg(debug_assertions)]
+ println!(
+ "({block:?}) supposed to read {len}; read {read} - skipping excess"
+ );
+ self.buff.skip(n)?;
+ };
+
+ MapData::Bloc(Bloc::Build(b, block))
+ } else {
+ MapData::Bloc(Bloc::Many(None, 0))
+ }
+ } else if data {
+ MapData::Bloc(Bloc::Data(
+ block.ok_or(ReadError::NoBlockWithData)?,
+ self.buff.read_i8()?,
+ ))
+ } else if let Some(nd) = newdata {
+ MapData::Bloc(Bloc::Nd(block, nd))
+ } else {
+ let consecutives = self.buff.read_u8()?;
+ i += consecutives as usize;
+ MapData::Bloc(Bloc::Many(block, consecutives))
+ };
+
+ i += 1;
+ }
+ let read = self.buff.read - rb4;
+ debug_assert!(len >= read, "overread; supposed to read {len}; read {read}");
+ debug_assert!((len - read) == 0, "supposed to read {len}; read {read}");
+ Ok(())
+ };
+ Ok(c)
+ }
+
+ pub fn entities(
+ &mut self,
+ ) -> Result<
+ impl Coroutine<(), Yield = EntityData, Return = Result<(), ReadError>> + '_,
+ ReadError,
+ > {
+ let len = self.buff.read_u32()? as usize;
+ let rb4 = self.buff.read;
+
+ let c = #[coroutine]
+ move || {
+ for _ in 0..self.buff.read_u16()? {
+ self.buff.skip(2)?;
+ let _ = self.buff.read_utf()?;
+ }
+ // read team block plans (ghosts) (SaveVersion.java#389)
+ for _ in 0..self.buff.read_u32()? {
+ self.buff.skip(4)?;
+ for _ in 0..self.buff.read_u32()? {
+ self.buff.skip(8usize)?;
+ let _ = DynData::deserialize(&mut self.buff)?;
+ }
+ }
+ // read world entities (#412). eg units
+ let n = self.buff.read_u32()?;
+ yield EntityData::Length(n);
+ for _ in 0..n {
+ let len = if self.version > 9 {
+ self.buff.read_u32()? as usize
+ } else {
+ self.buff.read_u16()? as usize
+ };
+ let rb4 = self.buff.read;
+ let id = self.buff.read_u8()? as usize;
+ let Some(&Some(u)) = entity_mapping::ID.get(id) else {
+ self.buff.skip(len - 1)?;
+ continue;
+ };
+ _ = self.buff.read_u32()?;
+ yield EntityData::Data(u.read(&mut self.buff)?);
+ let read = self.buff.read - rb4;
+ debug_assert!(len >= read, "overread; supposed to read {len}; read {read}");
+ let n = len - read;
+ if n != 0 && cfg!(debug_assertions) {
+ dbg!("underread: skipping {n} bytes");
+ }
+ self.buff.skip(n)?;
+ }
+ let read = self.buff.read - rb4;
+ debug_assert!(len >= read, "overread; supposed to read {len}; read {read}");
+ debug_assert!((len - read) == 0, "supposed to read {len}; read {read}");
+ Ok(())
+ };
+ Ok(c)
+ }
+
+ pub fn collect_entities(&mut self) -> Result<Vec<Unit>, ReadError> {
+ let mut co = self.entities()?;
+ let n = match Pin::new(&mut co).resume(()) {
+ Yielded(EntityData::Length(x)) => x,
+ Complete(Err(e)) => return Err(e),
+ _ => unreachable!(),
+ };
+ let mut o = Vec::with_capacity(n as usize);
+ for _ in 0..n {
+ match Pin::new(&mut co).resume(()) {
+ Yielded(EntityData::Data(x)) => o.push(x),
+ Complete(Err(e)) => return Err(e),
+ Complete(Ok(())) => break,
+ _ => unreachable!(),
+ }
+ }
+ Ok(o)
+ }
+}
+
+/// serde map
+impl Serializable for Map {
+ type ReadError = ReadError;
+ type WriteError = ();
+ /// deserialize a map
+ ///
+ /// note: does not deserialize all data
+ fn deserialize(buff: &mut DataRead<'_>) -> Result<Map, Self::ReadError> {
+ let mut buff = MapReader::new(buff)?;
+ buff.header()?;
+ buff.version = buff.version()?;
+ let tags = buff.tags_alloc()?;
+ if buff.version >= 12 {
+ buff.skip()?;
+ }
+ let r = buff.content()?;
+ if buff.version == 11 {
+ buff.skip()?;
+ }
+ let mut m = buff.collect_map(tags, r)?;
+ m.entities = buff.collect_entities()?;
+ if buff.version == 8 {
+ // skip marker region
+ buff.skip()?;
+ }
+
+ // skip custom chunks
+ buff.skip()?;
+ Ok(m)
+ }
+
+ /// serialize a map (todo)
+ /// panics: always
+ fn serialize(&self, _: &mut super::DataWrite<'_>) -> Result<(), Self::WriteError> {
+ unimplemented!()
+ }
+}
diff --git a/mindus/src/data/mod.rs b/mindus/src/data/mod.rs
new file mode 100644
index 0000000..9f7959f
--- /dev/null
+++ b/mindus/src/data/mod.rs
@@ -0,0 +1,499 @@
+//! all the IO
+use flate2::{
+ Compress, CompressError as CError, Compression, Decompress, DecompressError as DError,
+ FlushCompress, FlushDecompress, Status,
+};
+use std::backtrace::Backtrace;
+use std::collections::HashMap;
+use std::error::Error;
+use std::fmt;
+use std::str::Utf8Error;
+use thiserror::Error;
+
+pub(crate) mod autotile;
+mod base64;
+pub mod command;
+pub mod dynamic;
+pub mod entity_mapping;
+pub mod map;
+pub mod planet;
+pub mod renderer;
+pub mod schematic;
+pub mod sector;
+pub mod weather;
+
+#[derive(Debug)]
+pub struct DataRead<'d> {
+ pub(crate) data: &'d [u8],
+ // used with read_chunk
+ read: usize,
+}
+
+impl fmt::Display for DataRead<'_> {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "{}", String::from_utf8_lossy(self.data))
+ }
+}
+
+macro_rules! make_read {
+ ($name:ident, $type:ty) => {
+ pub fn $name(&mut self) -> Result<$type, ReadError> {
+ const LEN: usize = std::mem::size_of::<$type>();
+ let output = self.readN::<LEN>()?;
+ Ok(<$type>::from_be_bytes(output))
+ }
+ };
+}
+
+impl<'d> DataRead<'d> {
+ #[must_use]
+ pub const fn new(data: &'d [u8]) -> Self {
+ Self { data, read: 0 }
+ }
+
+ pub fn read_bool(&mut self) -> Result<bool, ReadError> {
+ Ok(self.read_u8()? != 0)
+ }
+
+ make_read!(read_u8, u8);
+ make_read!(read_i8, i8);
+ make_read!(read_u16, u16);
+ make_read!(read_i16, i16);
+ make_read!(read_u32, u32);
+ make_read!(read_i32, i32);
+ make_read!(read_f32, f32);
+ make_read!(read_u64, u64);
+ make_read!(read_i64, i64);
+ make_read!(read_f64, f64);
+
+ pub fn read_utf(&mut self) -> Result<&'d str, ReadError> {
+ let len = self.read_u16()?;
+ let result = std::str::from_utf8(self.eat(len as usize)?)?;
+ Ok(result)
+ }
+
+ pub fn eat(&mut self, n: usize) -> Result<&'d [u8], ReadError> {
+ self.data
+ .split_off(..n)
+ .ok_or(ReadError::Underflow {
+ need: n,
+ have: self.data.len(),
+ bt: Backtrace::capture(),
+ })
+ .inspect(|_| self.read += n)
+ }
+
+ #[allow(non_snake_case)]
+ pub fn readN<const N: usize>(&mut self) -> Result<[u8; N], ReadError> {
+ self.eat(N).map(|x| x.try_into().unwrap())
+ }
+
+ pub fn read_bytes(&mut self, dst: &mut [u8]) -> Result<(), ReadError> {
+ dst.copy_from_slice(self.eat(dst.len())?);
+ Ok(())
+ }
+
+ pub fn skip(&mut self, n: usize) -> Result<(), ReadError> {
+ self.data = self.data.get(n..).ok_or(ReadError::Underflow {
+ need: n,
+ have: self.data.len(),
+ bt: Backtrace::capture(),
+ })?;
+ self.read += n;
+ Ok(())
+ }
+
+ pub fn read_chunk<E: Error + From<ReadError>, T>(
+ &mut self,
+ big: bool,
+ f: impl FnOnce(&mut DataRead) -> Result<T, E>,
+ ) -> Result<T, E> {
+ let len = if big {
+ self.read_u32()? as usize
+ } else {
+ self.read_u16()? as usize
+ };
+ let rb4 = self.read;
+ let r = f(self);
+ let read = self.read - rb4;
+ match r {
+ Err(e) => {
+ // skip this chunk
+ assert!(len >= read, "overread; supposed to read {len}; read {read}");
+ let n = len - read;
+ if n != 0 {
+ #[cfg(debug_assertions)]
+ println!("supposed to read {len}; read {read} - skipping excess");
+ self.skip(n)?;
+ };
+ Err(e)
+ }
+ Ok(v) => {
+ debug_assert!(len >= read, "overread; supposed to read {len}; read {read}");
+ debug_assert!((len - read) == 0, "supposed to read {len}; read {read}");
+ Ok(v)
+ }
+ }
+ }
+
+ pub fn read_vec(&mut self, dst: &mut Vec<u8>, len: usize) -> Result<(), ReadError> {
+ dst.extend_from_slice(self.eat(len)?);
+ Ok(())
+ }
+
+ pub fn read_map(&mut self, dst: &mut HashMap<String, String>) -> Result<(), ReadError> {
+ let n = self.read_u8()?;
+ for _ in 0..n {
+ let key = self.read_utf()?;
+ let value = self.read_utf()?;
+ dst.insert(key.to_owned(), value.to_owned());
+ }
+ Ok(())
+ }
+
+ pub fn deflate(&mut self) -> Result<Vec<u8>, DecompressError> {
+ let mut dec = Decompress::new(true);
+ let mut raw = Vec::with_capacity(1024);
+ loop {
+ let t_in = dec.total_in();
+ let t_out = dec.total_out();
+ let res = dec.decompress_vec(self.data, &mut raw, FlushDecompress::None)?;
+ if dec.total_in() > t_in {
+ // we have to advance input every time, decompress_vec only knows the output position
+ self.data = &self.data[(dec.total_in() - t_in) as usize..];
+ }
+ match res {
+ // there's no more input (and the flush mode says so), we need to reserve additional space
+ Status::Ok | Status::BufError => {}
+ // input was already at the end, so this is referring to the output
+ Status::StreamEnd => break,
+ }
+ if dec.total_in() == t_in && dec.total_out() == t_out {
+ // protect against looping forever
+ return Err(DecompressError::DecompressStall);
+ }
+ raw.reserve(1024);
+ }
+ assert_eq!(dec.total_out() as usize, raw.len());
+ self.read = 0;
+ Ok(raw)
+ }
+}
+
+#[derive(Debug, Error)]
+pub enum DecompressError {
+ #[error("zlib decompression failed")]
+ Decompress(#[from] DError),
+ #[error("decompressor stalled before completion")]
+ DecompressStall,
+}
+
+#[derive(Debug, Error)]
+pub enum ReadError {
+ #[error("buffer underflow (expected {need} but got {have}) ({bt})")]
+ Underflow {
+ need: usize,
+ have: usize,
+
+ bt: Backtrace,
+ },
+ #[error("expected {0}")]
+ Expected(&'static str),
+ #[error("malformed utf8 in string")]
+ Utf8 {
+ #[from]
+ source: Utf8Error,
+ },
+}
+
+impl PartialEq for ReadError {
+ fn eq(&self, _: &Self) -> bool {
+ false
+ }
+}
+
+enum WriteBuff<'d> {
+ // unlike the DataRead want to access the written region after
+ Ref { raw: &'d mut [u8], pos: usize },
+ Vec(Vec<u8>),
+}
+
+impl<'d> WriteBuff<'d> {
+ fn check_capacity(&self, need: usize) -> Result<(), WriteError> {
+ match self {
+ Self::Ref { raw, pos } if raw.len() - pos < need => Err(WriteError::Overflow {
+ need,
+ have: raw.len() - pos,
+ }),
+ _ => Ok(()),
+ }
+ }
+
+ fn write(&mut self, data: &[u8]) {
+ match self {
+ Self::Ref { raw, pos } => {
+ let end = *pos + data.len();
+ raw[*pos..end].copy_from_slice(data);
+ *pos += data.len();
+ }
+ Self::Vec(v) => v.extend_from_slice(data),
+ }
+ }
+}
+
+pub struct DataWrite<'d> {
+ data: WriteBuff<'d>,
+}
+
+macro_rules! make_write {
+ ($name:ident, $type:ty) => {
+ pub fn $name(&mut self, val: $type) -> Result<(), WriteError> {
+ const LEN: usize = std::mem::size_of::<$type>();
+ self.data.check_capacity(LEN)?;
+ self.data.write(&<$type>::to_be_bytes(val));
+ Ok(())
+ }
+ };
+}
+
+impl<'d> DataWrite<'d> {
+ pub fn write_bool(&mut self, val: bool) -> Result<(), WriteError> {
+ self.write_u8(u8::from(val))
+ }
+
+ make_write!(write_u8, u8);
+ make_write!(write_i8, i8);
+ make_write!(write_u16, u16);
+ make_write!(write_i16, i16);
+ make_write!(write_u32, u32);
+ make_write!(write_i32, i32);
+ make_write!(write_f32, f32);
+ make_write!(write_u64, u64);
+ make_write!(write_i64, i64);
+ make_write!(write_f64, f64);
+
+ pub fn write_utf(&mut self, val: &str) -> Result<(), WriteError> {
+ if val.len() > u16::MAX as usize {
+ return Err(WriteError::TooLong { len: val.len() });
+ }
+ self.data.check_capacity(2 + val.len())?;
+ self.data.write(&u16::to_be_bytes(val.len() as u16));
+ self.data.write(val.as_bytes());
+ Ok(())
+ }
+
+ pub fn write_bytes(&mut self, val: &[u8]) -> Result<(), WriteError> {
+ self.data.check_capacity(val.len())?;
+ self.data.write(val);
+ Ok(())
+ }
+
+ #[must_use]
+ pub const fn is_owned(&self) -> bool {
+ matches!(self.data, WriteBuff::Vec(..))
+ }
+
+ #[must_use]
+ pub fn get_written(&self) -> &[u8] {
+ match &self.data {
+ WriteBuff::Ref { raw, pos } => &raw[..*pos],
+ WriteBuff::Vec(v) => v,
+ }
+ }
+
+ /// eat this datawrite
+ ///
+ /// panics if ref write buffer
+ #[must_use]
+ pub fn consume(self) -> Vec<u8> {
+ match self.data {
+ WriteBuff::Vec(v) => v,
+ WriteBuff::Ref { .. } => unreachable!(),
+ }
+ }
+
+ pub fn inflate(self, to: &mut DataWrite) -> Result<(), CompressError> {
+ // compress into the provided buffer
+ let WriteBuff::Vec(raw) = self.data else {
+ unreachable!("write buffer not owned")
+ };
+ let mut comp = Compress::new(Compression::default(), true);
+ // compress the immediate buffer into a temp buffer to copy it to buff? no thanks
+ match &mut to.data {
+ WriteBuff::Ref { raw: dst, pos } => {
+ match comp.compress(&raw, &mut dst[*pos..], FlushCompress::Finish)? {
+ // there's no more input (and the flush mode says so), but we can't resize the output
+ Status::Ok | Status::BufError => {
+ return Err(CompressError::CompressEof(
+ raw.len() - comp.total_in() as usize,
+ ));
+ }
+ Status::StreamEnd => (),
+ }
+ }
+ WriteBuff::Vec(dst) => {
+ let mut input = raw.as_ref();
+ dst.reserve(1024);
+ loop {
+ let t_in = comp.total_in();
+ let t_out = comp.total_out();
+ let res = comp.compress_vec(input, dst, FlushCompress::Finish)?;
+ if comp.total_in() > t_in {
+ // we have to advance input every time, compress_vec only knows the output position
+ input = &input[(comp.total_in() - t_in) as usize..];
+ }
+ match res {
+ // there's no more input (and the flush mode says so), we need to reserve additional space
+ Status::Ok | Status::BufError => (),
+ // input was already at the end, so this is referring to the output
+ Status::StreamEnd => break,
+ }
+ if comp.total_in() == t_in && comp.total_out() == t_out {
+ // protect against looping forever
+ return Err(CompressError::CompressStall);
+ }
+ dst.reserve(1024);
+ }
+ }
+ }
+ assert_eq!(comp.total_in() as usize, raw.len());
+ Ok(())
+ }
+}
+
+impl Default for DataWrite<'static> {
+ fn default() -> Self {
+ Self {
+ data: WriteBuff::Vec(Vec::new()),
+ }
+ }
+}
+
+#[derive(Debug, Error)]
+pub enum CompressError {
+ #[error(transparent)]
+ Compress(#[from] CError),
+ #[error("compression overflow with {0} bytes of input remaining")]
+ CompressEof(usize),
+ #[error("compressor stalled before completion")]
+ CompressStall,
+}
+
+#[derive(Debug, Error)]
+pub enum WriteError {
+ #[error("buffer overflow (expected {need} but got {have})")]
+ Overflow { need: usize, have: usize },
+ #[error("string too long ({len} bytes of {})", u16::MAX)]
+ TooLong { len: usize },
+}
+
+impl PartialEq for WriteError {
+ fn eq(&self, _: &Self) -> bool {
+ false
+ }
+}
+
+impl<'d> From<&'d mut [u8]> for DataWrite<'d> {
+ fn from(value: &'d mut [u8]) -> Self {
+ Self {
+ data: WriteBuff::Ref { raw: value, pos: 0 },
+ }
+ }
+}
+
+impl From<Vec<u8>> for DataWrite<'static> {
+ fn from(value: Vec<u8>) -> Self {
+ Self {
+ data: WriteBuff::Vec(value),
+ }
+ }
+}
+
+impl<'d> TryFrom<DataWrite<'d>> for Vec<u8> {
+ type Error = ();
+
+ fn try_from(value: DataWrite<'d>) -> Result<Self, Self::Error> {
+ match value.data {
+ WriteBuff::Vec(v) => Ok(v),
+ WriteBuff::Ref { .. } => Err(()),
+ }
+ }
+}
+/// basic serialization/deserialization functions
+pub trait Serializable
+where
+ Self: Sized,
+{
+ type ReadError;
+ type WriteError;
+ /// deserialize self from a binary buffer
+ fn deserialize(buff: &mut DataRead<'_>) -> Result<Self, Self::ReadError>;
+ /// transform self into a binary buffer
+ fn serialize(&self, buff: &mut DataWrite<'_>) -> Result<(), Self::WriteError>;
+}
+
+#[derive(Clone, Copy, Eq, PartialEq, Default)]
+pub struct GridPos(pub usize, pub usize);
+
+impl From<u32> for GridPos {
+ fn from(value: u32) -> Self {
+ GridPos((value >> 16) as u16 as usize, value as u16 as usize)
+ }
+}
+
+impl From<GridPos> for u32 {
+ /// ```
+ /// # use mindus::data::GridPos;
+ /// assert_eq!(GridPos::from(u32::from(GridPos(1000, 5))), GridPos(1000, 5));
+ /// ```
+ fn from(value: GridPos) -> Self {
+ ((value.0 << 16) | value.1) as u32
+ }
+}
+
+impl fmt::Debug for GridPos {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "({0}, {1})", self.0, self.1)
+ }
+}
+
+#[cfg(test)]
+mod test {
+ use super::*;
+
+ #[test]
+ fn read() {
+ let mut read = DataRead::new("Thé qûick ઉrown fox 🦘 over\0\rthe lazy dog.".as_bytes());
+ assert_eq!(read.read_u8(), Ok(84));
+ assert_eq!(read.read_i8(), Ok(104));
+ assert_eq!(read.read_i8(), Ok(-61));
+ assert_eq!(read.read_u16(), Ok(43296));
+ assert_eq!(read.read_i16(), Ok(29123));
+ assert_eq!(read.read_i16(), Ok(-17559));
+ assert_eq!(read.read_i32(), Ok(1_667_965_152));
+ assert_eq!(read.read_i32(), Ok(-1_433_832_849));
+ assert_eq!(read.read_i64(), Ok(8_605_851_562_280_493_296));
+ assert_eq!(read.read_i64(), Ok(-6_942_694_510_468_635_278));
+ assert_eq!(read.read_utf(), Ok("the lazy dog."));
+ }
+
+ #[test]
+ fn write() {
+ let mut write = DataWrite::default();
+ assert_eq!(write.write_u8(84), Ok(()));
+ assert_eq!(write.write_i8(104), Ok(()));
+ assert_eq!(write.write_i8(-61), Ok(()));
+ assert_eq!(write.write_u16(43296), Ok(()));
+ assert_eq!(write.write_i16(29123), Ok(()));
+ assert_eq!(write.write_i16(-17559), Ok(()));
+ assert_eq!(write.write_i32(1_667_965_152), Ok(()));
+ assert_eq!(write.write_i32(-1_433_832_849), Ok(()));
+ assert_eq!(write.write_i64(8_605_851_562_280_493_296), Ok(()));
+ assert_eq!(write.write_i64(-6_942_694_510_468_635_278), Ok(()));
+ assert_eq!(write.write_utf("the lazy dog."), Ok(()));
+ assert_eq!(
+ write.get_written(),
+ "Thé qûick ઉrown fox 🦘 over\0\rthe lazy dog.".as_bytes()
+ );
+ }
+}
diff --git a/src/data/planet.rs b/mindus/src/data/planet.rs
index ff20bcd..ff20bcd 100644
--- a/src/data/planet.rs
+++ b/mindus/src/data/planet.rs
diff --git a/mindus/src/data/renderer.rs b/mindus/src/data/renderer.rs
new file mode 100644
index 0000000..a698b30
--- /dev/null
+++ b/mindus/src/data/renderer.rs
@@ -0,0 +1,862 @@
+//! schematic drawing
+use super::GridPos;
+pub(crate) use super::autotile::*;
+use super::schematic::Schematic;
+use crate::block::State;
+use crate::block::content::Type;
+use crate::color_mapping::BLOCK2COLOR;
+use crate::data::map::Registrar;
+use crate::team::Team;
+pub(crate) use crate::utils::*;
+use crate::{Map, content::Content};
+use crate::{
+ block::Rotation,
+ data::map::{ThinBloc, ThinMapData},
+};
+use atools::prelude::*;
+use either::Either;
+use fimg::{BlendingOverlay, BlendingOverlayAt, OverlayAtClipping, uninit};
+use std::hint::unlikely;
+use std::iter::successors;
+use std::ops::Coroutine;
+use std::pin::Pin;
+
+include!(concat!(env!("OUT_DIR"), "/full.rs"));
+include!(concat!(env!("OUT_DIR"), "/quar.rs"));
+include!(concat!(env!("OUT_DIR"), "/eigh.rs"));
+
+#[derive(Debug, Copy, Clone)]
+#[repr(u8)]
+pub enum Scale {
+ Full,
+ // Half,
+ Quarter,
+ Eigth,
+}
+
+impl Scale {
+ #[must_use]
+ pub const fn px(self) -> u8 {
+ match self {
+ Self::Full => 32,
+ Self::Quarter => 32 / 4,
+ Self::Eigth => 32 / 8,
+ }
+ }
+}
+
+impl std::ops::Mul<u32> for Scale {
+ type Output = u32;
+ fn mul(self, rhs: u32) -> u32 {
+ self.px() as u32 * rhs
+ }
+}
+
+#[macro_export]
+macro_rules! load {
+ (raw $name: literal, $scale:expr) => {
+ paste::paste! { match $scale {
+ $crate::data::renderer::Scale::Quarter => $crate::data::renderer::quar::[<$name:snake:upper>],
+ $crate::data::renderer::Scale::Eigth => $crate::data::renderer::eigh::[<$name:snake:upper>],
+ $crate::data::renderer::Scale::Full => $crate::data::renderer::full::[<$name:snake:upper>],
+ }
+ } };
+ (8x $name:literal) => { paste::paste! {
+ car::map!([
+ load!([<$name 1>]),
+ load!([<$name 2>]),
+ load!([<$name 3>]),
+ load!([<$name 4>]),
+ load!([<$name 5>]),
+ load!([<$name 6>]),
+ load!([<$name 7>]),
+ load!([<$name 8>]),
+ ], |x| car::map!(x, DynImage::from))
+ } };
+ ($name:literal, $scale:expr) => { paste::paste! {
+ #[allow(unused_unsafe)] unsafe { match $scale {
+ $crate::data::renderer::Scale::Quarter => &$crate::data::renderer::quar::[<$name:snake:upper>],
+ $crate::data::renderer::Scale::Eigth => &$crate::data::renderer::eigh::[<$name:snake:upper>],
+ $crate::data::renderer::Scale::Full => &$crate::data::renderer::full::[<$name:snake:upper>],
+ }.mapped($crate::utils::Cow::Ref) }
+ } };
+ ($name: ident) => { paste::paste! {
+ [$crate::data::renderer::full::[<$name:snake:upper>].copy(), $crate::data::renderer::quar::[<$name:snake:upper>].copy(), $crate::data::renderer::eigh::[<$name:snake:upper>].copy()]
+ } };
+ ($name: literal) => { paste::paste! {
+ [$crate::data::renderer::full::[<$name:snake:upper>].copy(), $crate::data::renderer::quar::[<$name:snake:upper>].copy(), $crate::data::renderer::eigh::[<$name:snake:upper>].copy()]
+ } };
+ (from $v:ident which is [$($k:literal $(|)?)+], $scale: ident) => {
+ $crate::data::renderer::load!($scale -> match $v {
+ $($k => $k,)+
+ })
+ };
+ // turn load!(s -> match x { "v" => "y" }) into match x { "v" => load!("y", s) }
+ ($scale:ident -> match $v:ident { $($k:pat => $nam:literal $(,)?)+ }) => {
+ match $v {
+ $($k => $crate::data::renderer::load!($nam, $scale),)+
+ #[allow(unreachable_patterns)]
+ n => unreachable!("{n:?}"),
+ }
+ };
+ (concat $x:literal => $v:ident which is [$($k:literal $(|)?)+], $scale: ident) => { paste::paste! {
+ match $v {
+ $($k =>
+ #[allow(unused_unsafe)] unsafe { (match $scale {
+ $crate::data::renderer::Scale::Quarter => &$crate::data::renderer::quar::[<$k:snake:upper _ $x:snake:upper>],
+ $crate::data::renderer::Scale::Eigth => &$crate::data::renderer::eigh::[<$k:snake:upper _ $x:snake:upper>],
+ $crate::data::renderer::Scale::Full => &$crate::data::renderer::full::[<$k:snake:upper _ $x:snake:upper>],
+ }.mapped($crate::utils::Cow::Ref)) },
+ )+
+ #[allow(unreachable_patterns)]
+ n => unreachable!("{n:?}"),
+ }
+ } };
+}
+pub(crate) use load;
+
+/// trait for renderable objects
+pub trait Renderable {
+ /// create a picture
+ #[must_use = "i did so much work for you"]
+ fn render(&self) -> Image<Vec<u8>, 3>;
+}
+
+impl Renderable for Schematic {
+ /// creates a picture of a schematic. Bridges and node connections are not drawn.
+ /// ```
+ /// # use mindus::*;
+ /// # use mindus::block::*;
+ /// let mut s = Schematic::new(2, 3);
+ /// s.put(0, 0, &DISTRIBUTOR);
+ /// s.put(0, 2, &ROUTER);
+ /// s.put(1, 2, &COPPER_WALL);
+ /// let output /*: Image */ = s.render();
+ /// ```
+ fn render(&self) -> Image<Vec<u8>, 3> {
+ let scale = if self.width + self.height > 500 {
+ Scale::Quarter
+ } else {
+ Scale::Full
+ };
+ // fill background
+ // SAFETY: metal-floor is scalexscale, the output is a multiple of scale
+ let x_fac = cfg!(feature = "square") as u32
+ * self.height.checked_sub(self.width).unwrap_or(0) as u32
+ + 2;
+ let y_fac = cfg!(feature = "square") as u32
+ * self.width.checked_sub(self.height).unwrap_or(0) as u32
+ + 2;
+ let mut bg = unsafe {
+ load!("metal-floor", scale).repeated(
+ scale * (self.width + x_fac as usize) as u32,
+ scale * (self.height + y_fac as usize) as u32,
+ )
+ };
+ let mut canvas = Image::alloc(bg.width(), bg.height());
+ for (GridPos(x, y), tile) in self.block_iter() {
+ let ctx = tile.block.wants_context().then(|| {
+ let pctx = PositionContext {
+ position: GridPos(x, y),
+ width: self.width,
+ height: self.height,
+ };
+ let (cross, corners) = self.cross(&pctx);
+ RenderingContext {
+ cross,
+ corners,
+ position: pctx,
+ }
+ });
+ 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;
+ unsafe {
+ canvas.as_mut().overlay_at(
+ &tile.image(
+ ctx.as_ref(),
+ tile.get_rotation().unwrap_or(Rotation::Up),
+ scale,
+ ),
+ scale * (x + x_fac / 2),
+ scale * (y + y_fac / 2),
+ )
+ };
+ }
+ for (p, b) in self.block_iter() {
+ let Some(&State::Point(mut relative)) = b.get_state() else {
+ continue;
+ };
+ let directional = matches!(b.block.name(), "duct-bridge" | "reinforced-bridge-conduit");
+ if false {
+ let offset = match b.rot {
+ Rotation::Right => (1, 0),
+ Rotation::Down => (0, -1),
+ Rotation::Left => (-1, 0),
+ Rotation::Up => (0, 1),
+ };
+ relative = successors(Some(offset), |&(x, y)| Some((x + offset.0, y + offset.1)))
+ .take(4)
+ .find(|x| {
+ self.get((p.0 as i32 + x.0) as _, (p.1 as i32 + x.1) as _)
+ .ok()
+ .flatten()
+ .is_some_and(|x| x.block == b.block)
+ });
+ }
+ if let Some(relative) = relative
+ && relative != (0, 0)
+ && let n @ ("bridge-conveyor" | "bridge-conduit" | "phase-conveyor"
+ | "phase-conduit") = b.block.name()
+ && let Ok(Some(x)) = self.get(
+ (p.0 as i32 + relative.0) as _,
+ (p.1 as i32 + relative.1) as _,
+ )
+ && x.block.name() == n
+ {
+ let mut bridge = load!(concat "bridge" => n which is ["bridge-conveyor" | "bridge-conduit" | "phase-conveyor" | "phase-conduit" | "duct-bridge" | "reinforced-bridge-conduit"], scale);
+
+ /*
+ let mut bridge = bridge.own();
+ bridge.chunked_mut().for_each(|x| match &mut x[3] {
+ 0 => (),
+ y => *y = (*y as f32 * 0.20) as u8,
+ });
+ bridge.save(format!("{n}-bridge.png"));
+ let mut bridge = ImageHolder::from(bridge);
+ */
+ if relative.1 != 0 {
+ // continue;
+ bridge =
+ Image::build(bridge.height(), bridge.width()).buf(bridge.take_buffer());
+ }
+ let arrow = load!(concat "arrow" => n which is ["bridge-conveyor"| "bridge-conduit" | "phase-conveyor" | "phase-conduit" | "duct-bridge" | "reinforced-bridge-conduit"], scale);
+ /*
+ let mut arrow = arrow.own();
+ arrow.chunked_mut().for_each(|x| match &mut x[3] {
+ 0 => (),
+ y => *y = (*y as f32 * 0.20) as u8,
+ });
+ arrow.save(format!("{n}-arrow.png"));
+ let mut arrow = ImageHolder::from(arrow);
+ */
+
+ for index in if relative.0 > 0 {
+ Either::Right(
+ scale.px() as i32 * 2..scale.px() as i32 * relative.0 + scale.px() as i32,
+ )
+ } else {
+ Either::Left(
+ relative.0 * scale.px() as i32 + scale.px() as i32 * 2..scale.px() as i32,
+ )
+ } {
+ unsafe {
+ canvas.overlay_blended_at(
+ &bridge,
+ (p.0 as i32 * scale.px() as i32 + index) as u32,
+ scale * (self.height as u32 - p.1 as u32 - 1 + y_fac / 2),
+ )
+ };
+ }
+
+ for index in if relative.1 > 0 {
+ Either::Right(
+ -(scale.px() as i32) - scale.px() as i32 * (relative.1 - 1)
+ ..-(scale.px() as i32),
+ )
+ } else {
+ Either::Left(0..(-relative.1 - 1) * scale.px() as i32)
+ } {
+ let y =
+ ((self.height as i32 - p.1 as i32 + 1) * scale.px() as i32 + index) as u32;
+
+ unsafe {
+ canvas.overlay_blended_at(&bridge, scale * (p.0 as u32 + x_fac / 2), y)
+ };
+ }
+ if relative.0 != 0 {
+ unsafe {
+ canvas.overlay_blended_at(
+ &arrow.rotated(if directional {
+ b.rot.rotated(false).count()
+ } else if relative.0 < 0 {
+ 2
+ } else {
+ 0
+ }),
+ scale.px() as u32
+ + ((scale * p.0 as u32).cast_signed()
+ + (scale.px() as i32 * relative.0 / 2))
+ as u32,
+ (y_fac / 2 + scale * (self.height as u32 - p.1 as u32)) - 1,
+ )
+ };
+ } else {
+ unsafe {
+ canvas.overlay_blended_at(
+ &arrow.rotated(if directional {
+ b.rot.rotated(false).count()
+ } else if relative.1 < 0 {
+ 1
+ } else {
+ 3
+ }),
+ (scale * p.0 as u32) + (x_fac / 2 + scale.px() as u32) - 1,
+ scale.px() as u32
+ + ((scale * (self.height as u32 - p.1 as u32 - 1)).cast_signed()
+ + (scale.px() as i32 * -relative.1 / 2))
+ as u32,
+ );
+ }
+ }
+ }
+ }
+
+ if matches!(scale, Scale::Full) {
+ ImageUtils::shadow(&mut canvas);
+ unsafe { bg.overlay_blended(&canvas) };
+ } else {
+ unsafe { bg.overlay(&canvas) };
+ }
+ bg
+ }
+}
+
+impl Renderable for Map {
+ /// Draws a map
+ #[implicit_fn::implicit_fn]
+ fn render(&self) -> Image<Vec<u8>, 3> {
+ let scale = if self.width + self.height < 600 {
+ Scale::Full
+ } else if self.width + self.height < 4000 {
+ Scale::Quarter
+ } else {
+ Scale::Eigth
+ };
+ use crate::data::map::table;
+ let mut img = uninit::Image::<_, 3>::new(
+ (scale * self.width as u32).try_into().unwrap(),
+ (scale * self.height as u32).try_into().unwrap(),
+ );
+ // loop1 draws the floor
+ for y in 0..self.height {
+ for x in 0..self.width {
+ // Map::new() allocates w*h items
+ let j = x + self.width * y;
+ let tile = unsafe { self.tiles.get_unchecked(j) };
+ let y = self.height - y - 1;
+ // println!("draw {tile:?} ({x}, {y})");
+
+ if [
+ Type::ColoredFloor,
+ Type::MetalTiles1,
+ Type::MetalTiles2,
+ Type::MetalTiles3,
+ Type::MetalTiles4,
+ Type::MetalTiles5,
+ Type::MetalTiles6,
+ Type::MetalTiles7,
+ Type::MetalTiles8,
+ Type::MetalTiles9,
+ Type::MetalTiles10,
+ Type::MetalTiles11,
+ Type::MetalTiles12,
+ ]
+ .contains(&tile.floor)
+ {
+ let mask = crate::data::autotile::nbors(
+ self.corners(j).map(_.map(_.floor)),
+ self.cross(j).map(_.map(_.floor)),
+ tile.floor,
+ );
+ let i =
+ &crate::data::autotile::select(tile.floor.get_name(), mask)[scale as usize];
+ if tile.floor == Type::ColoredFloor {
+ let mut i = i.boxed();
+ unsafe {
+ img.overlay_at(
+ &i.as_mut()
+ .tint(tile.nd.skip::<3>().take::<3>().into())
+ .as_ref(),
+ scale * x as u32,
+ scale * y as u32,
+ )
+ };
+ } else {
+ unsafe { img.overlay_at(i, scale * x as u32, scale * y as u32) };
+ }
+ } else {
+ unsafe {
+ img.overlay_at(
+ &table(tile.floor, scale),
+ scale * x as u32,
+ scale * y as u32,
+ );
+ }
+ }
+ if Type::FLOOR.contains(&tile.ore) {
+ unsafe {
+ img.overlay_at(&table(tile.ore, scale), scale * x as u32, scale * y as u32);
+ }
+ }
+ }
+ }
+ let mut img = unsafe { img.assume_init() };
+ // loop2 draws the buildings
+ 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;
+ if let Some(build) = tile.build() {
+ let s = build.block.get_size();
+ let x = x
+ - (match s {
+ 1 | 2 => 0,
+ 3 | 4 => 1,
+ 5 | 6 => 2,
+ 7 | 8 => 3,
+ 9 => 4,
+ // SAFETY: no block too big
+ _ => unsafe { std::hint::unreachable_unchecked() },
+ }) as usize;
+ let y = y
+ - (match s {
+ 1 => 0,
+ 2 | 3 => 1,
+ 4 | 5 => 2,
+ 6 | 7 => 3,
+ 8 | 9 => 4,
+ // SAFETY: no block too big
+ _ => unsafe { std::hint::unreachable_unchecked() },
+ }) as usize;
+ if unlikely(matches!(
+ build.block.name,
+ Type::ColoredWall | Type::MetalWall1 | Type::MetalWall2 | Type::MetalWall3
+ )) {
+ let mask = crate::data::autotile::nbors(
+ self.corners(j)
+ .map(|x| x.and_then(|x| x.build().map(|b| b.block.name))),
+ self.cross(j)
+ .map(|x| x.and_then(|x| x.build().map(|b| b.block.name))),
+ build.block.name,
+ );
+ let i =
+ crate::data::autotile::select(build.block.name(), mask)[scale as usize];
+ if build.block.name == Type::ColoredWall {
+ unsafe {
+ img.overlay_at(
+ &i.boxed()
+ .as_mut()
+ .tint(tile.nd.skip::<3>().take::<3>().into())
+ .as_ref(),
+ scale * x as u32,
+ scale * y as u32,
+ )
+ };
+ } else {
+ unsafe { img.overlay_at(&i, scale * x as u32, scale * y as u32) };
+ }
+ continue;
+ }
+ let ctx = build.block.wants_context().then(|| {
+ let pctx = PositionContext {
+ position: GridPos(x, y),
+ width: self.width,
+ height: self.height,
+ };
+ RenderingContext {
+ cross: self
+ .cross(j)
+ .map(|b| b.and_then(|b| Some((b.get_block()?, b.get_rotation()?)))),
+ corners: Default::default(),
+ position: pctx,
+ }
+ });
+ let i = tile.build_image(ctx.as_ref(), scale);
+ let x = scale * x as u32;
+ let y = scale * y as u32;
+ if i.width() + x > img.width() || y + i.height() > img.height() {
+ img.as_mut().clipping_overlay_at(&i, x, y);
+ } else {
+ unsafe { img.as_mut().overlay_at(&i, x, y) };
+ }
+ }
+ }
+ }
+ // 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 % 109][scale as usize],
+ scale * x as u32,
+ scale * y as u32,
+ );
+ },
+ Type::RuneOverlayCrux => unsafe {
+ img.overlay_at(
+ &RUNES.1[tile.nd[2] as usize % 109][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,
+ )
+ };
+ }
+ o if Type::FLOOR.contains(&o) => {}
+ 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) = (
+ entity.state.position.0 as u32,
+ lower::saturating::math! { self.height as u32 - entity.state.position.1 as u32 - 1 },
+ );
+ if x < 10 || x as usize > self.width - 10 || y < 10 || y as usize > self.height - 10 {
+ continue;
+ }
+ unsafe {
+ img.as_mut()
+ .overlay_at(&entity.draw(scale), scale * x, scale * y)
+ };
+ }
+ img
+ }
+}
+
+#[test]
+fn all_blocks() {
+ use crate::block::content::Type;
+ use crate::content::Content;
+ for t in 19..Type::WorldMessage as u16 {
+ let t = Type::try_from(t).unwrap();
+ if matches!(t, |Type::Empty| Type::HeatReactor
+ | Type::LegacyMechPad
+ | Type::LegacyUnitFactory
+ | Type::LegacyUnitFactoryAir
+ | Type::LegacyUnitFactoryGround
+ | Type::CommandCenter)
+ || t.get_name().starts_with("metal-tiles")
+ || t.get_name().starts_with("rune")
+ || t.get_name().starts_with("character")
+ {
+ continue;
+ }
+ let name = t.get_name();
+ let t = crate::block::BLOCK_REGISTRY.get(name).unwrap();
+ let _ = t.image(
+ None,
+ Some(&RenderingContext {
+ corners: [None; 4],
+ cross: [None; 4],
+ position: PositionContext {
+ position: GridPos(0, 0),
+ width: 5,
+ height: 5,
+ },
+ }),
+ Rotation::Up,
+ Scale::Quarter,
+ );
+ }
+}
+
+pub fn draw_units(
+ map: &mut crate::data::map::MapReader,
+ mut img: Image<&mut [u8], 3>,
+ size: (u16, u16),
+) -> Result<(), super::map::ReadError> {
+ use std::ops::CoroutineState::*;
+ let scale = if size.0 + size.1 < 2000 {
+ Scale::Quarter
+ } else {
+ Scale::Eigth
+ };
+
+ let mut co = map.entities()?;
+ let n = match Pin::new(&mut co).resume(()) {
+ Yielded(crate::data::map::EntityData::Length(x)) => x,
+ Complete(Err(e)) => return Err(e),
+ _ => unreachable!(),
+ };
+ 'out: {
+ for _ in 0..n {
+ match Pin::new(&mut co).resume(()) {
+ Yielded(crate::data::map::EntityData::Data(entity)) => {
+ // bounds checks
+ let (x, y) = (
+ entity.state.position.0 as u32,
+ size.1 as u32 - entity.state.position.1 as u32 - 1,
+ );
+ if x < 10
+ || x as usize > size.0 as usize - 10
+ || y < 10
+ || y as usize > size.1 as usize - 10
+ {
+ continue;
+ }
+ unsafe {
+ img.as_mut()
+ .overlay_at(&entity.draw(scale), scale * x, scale * y)
+ };
+ }
+ Complete(Err(e)) => return Err(e),
+ Complete(Ok(())) => break 'out,
+ x => unreachable!("{x:?}"),
+ }
+ }
+ match Pin::new(&mut co).resume(()) {
+ Complete(Ok(())) => (),
+ _ => unreachable!(),
+ };
+ }
+ Ok(())
+}
+
+/// Draws a map in a single pass.
+/// This is quite fast, but, unfortunately, has no memory, so conveyors will be drawing imporperly. As will sorters.
+///
+/// Reader must have read to the map section.
+/// Will walk through the map section. use [`draw_units`] after, if you like.
+pub fn draw_map_single(
+ map: &mut crate::data::map::MapReader,
+ r: Registrar,
+) -> Result<(Image<Box<[u8]>, 3>, (u16, u16)), super::map::ReadError> {
+ use std::ops::CoroutineState::*;
+ let mut co = map.thin_map(r)?;
+ let (w, h) = match Pin::new(&mut co).resume(()) {
+ Yielded(ThinMapData::Init { width, height }) => (width, height),
+ Complete(Err(x)) => return Err(x),
+ _ => unreachable!(),
+ };
+ let scale = if w + h < 2000 {
+ Scale::Quarter
+ } else {
+ Scale::Eigth
+ };
+ let mut img = uninit::Image::<_, 3>::new(
+ (scale * w as u32).try_into().unwrap(),
+ (scale * h as u32).try_into().unwrap(),
+ );
+ use crate::data::map::table;
+ // loop1 draws the floor
+ for y in 0..h {
+ for x in 0..w {
+ let (floor, ore) = match Pin::new(&mut co).resume(()) {
+ Yielded(ThinMapData::Tile { floor, ore }) => (floor, ore),
+ Complete(Err(x)) => return Err(x),
+ _ => unreachable!(),
+ };
+ let y = h - y - 1;
+ // println!("draw tile {floor} {ore} @ {x} {y}");
+ unsafe { img.overlay_at(&table(floor, scale), scale * x as u32, scale * y as u32) };
+ if ore != Type::Air {
+ unsafe {
+ img.overlay_at(&table(ore, scale), scale * x as u32, scale * y as u32);
+ }
+ }
+ }
+ }
+ let mut img = unsafe { img.assume_init() }.boxed();
+ let mut i = 0;
+ while i < (w as usize * h as usize) {
+ let mut draw = |i, r, b: &'static crate::block::Block| {
+ let x = i % w as usize;
+ let y = i / w as usize;
+ let y = h as usize - y - 1;
+ let s = b.get_size();
+ let x = x
+ - (match s {
+ 1 | 2 => 0,
+ 3 | 4 => 1,
+ 5 | 6 => 2,
+ 7 | 8 => 3,
+ 9 => 4,
+ // SAFETY: no block too big
+ _ => unsafe { std::hint::unreachable_unchecked() },
+ }) as usize;
+ let y = y
+ - (match s {
+ 1 => 0,
+ 2 | 3 => 1,
+ 4 | 5 => 2,
+ 6 | 7 => 3,
+ 8 | 9 => 4,
+ // SAFETY: no block too big
+ _ => unsafe { std::hint::unreachable_unchecked() },
+ }) as usize;
+ let ctx = b.wants_context().then(|| {
+ let pctx = PositionContext {
+ position: GridPos(x, y),
+ width: w as usize,
+ height: h as usize,
+ };
+ RenderingContext {
+ corners: [None; 4],
+ cross: [None; 4], // woe
+ position: pctx,
+ }
+ });
+ unsafe {
+ img.as_mut().overlay_at(
+ &b.image(None, ctx.as_ref(), r, scale),
+ scale * x as u32,
+ scale * y as u32,
+ )
+ };
+ };
+ match Pin::new(&mut co).resume(()) {
+ Yielded(ThinMapData::Bloc(ThinBloc::Many(None, n))) => {
+ i += n as usize;
+ }
+ Yielded(ThinMapData::Bloc(ThinBloc::Build(r, bloc, _))) => {
+ draw(i, r, bloc);
+ }
+ Yielded(ThinMapData::Bloc(ThinBloc::Many(Some(bloc), n))) => {
+ for i in i..=i + n as usize {
+ draw(i, Rotation::Up, bloc);
+ }
+ i += n as usize;
+ }
+ Complete(Err(x)) => return Err(x),
+ x => unreachable!("{x:?}"),
+ }
+ i += 1;
+ }
+ match Pin::new(&mut co).resume(()) {
+ Complete(Ok(())) => (),
+ f => unreachable!("{f:?}"),
+ };
+
+ Ok((img, (w, h)))
+}
+
+/// Draws a map in a single pass. Uses the silly team color thing that mindustry has.
+/// probably broken- if you want to use this ask me to update the block2color
+pub fn draw_map_simple(
+ map: &mut crate::data::map::MapReader,
+ r: Registrar,
+) -> Result<(Image<Box<[u8]>, 3>, (u16, u16)), super::map::ReadError> {
+ use std::ops::CoroutineState::*;
+ let mut co = map.thin_map(r)?;
+ let (w, h) = match Pin::new(&mut co).resume(()) {
+ Yielded(ThinMapData::Init { width, height }) => (width, height),
+ Complete(Err(x)) => return Err(x),
+ _ => unreachable!(),
+ };
+ let mut img = uninit::Image::<u8, 3>::new(
+ (w as u32).try_into().unwrap(),
+ (h as u32).try_into().unwrap(),
+ );
+ // loop1 draws the floor
+ for y in 0..h {
+ for x in 0..w {
+ let (floor, ore) = match Pin::new(&mut co).resume(()) {
+ Yielded(ThinMapData::Tile { floor, ore }) => (floor, ore),
+ Complete(Err(x)) => return Err(x),
+ _ => unreachable!(),
+ };
+ let t = (ore != Type::Air).then_some(ore).unwrap_or(floor);
+ let y = h - y - 1;
+ let i1 = img.at(x as u32, y as u32) as usize;
+ unsafe {
+ img.slice(i1..i1 + 3)
+ .write_copy_of_slice(&BLOCK2COLOR[t as u16 as usize][..])
+ };
+ }
+ }
+ let mut img = unsafe { img.assume_init() }.boxed();
+ let mut i = 0;
+ while i < (w as usize * h as usize) {
+ let mut draw = |i, b: &'static crate::block::Block, team: Team| {
+ let x = i % w as usize;
+ let y = i / w as usize;
+ let y = h as usize - y - 1;
+ let s = b.get_size();
+ let x = x
+ - (match s {
+ 1 | 2 => 0,
+ 3 | 4 => 1,
+ 5 | 6 => 2,
+ 7 | 8 => 3,
+ 9 => 4,
+ // SAFETY: no block too big
+ _ => unsafe { std::hint::unreachable_unchecked() },
+ }) as usize;
+ let y = y
+ - (match s {
+ 1 => 0,
+ 2 | 3 => 1,
+ 4 | 5 => 2,
+ 6 | 7 => 3,
+ 8 | 9 => 4,
+ // SAFETY: no block too big
+ _ => unsafe { std::hint::unreachable_unchecked() },
+ }) as usize;
+ 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()));
+ }
+ }
+ }
+ };
+ match Pin::new(&mut co).resume(()) {
+ Yielded(ThinMapData::Bloc(ThinBloc::Many(None, n))) => {
+ i += n as usize;
+ }
+ Yielded(ThinMapData::Bloc(ThinBloc::Build(_, bloc, t))) => {
+ draw(i, bloc, t);
+ }
+ Yielded(ThinMapData::Bloc(ThinBloc::Many(Some(bloc), n))) => {
+ for i in i..=i + n as usize {
+ draw(i, bloc, Team::DERELICT);
+ }
+ i += n as usize;
+ }
+ Complete(Err(x)) => return Err(x),
+ x => unreachable!("{x:?}"),
+ }
+ i += 1;
+ }
+ match Pin::new(&mut co).resume(()) {
+ Complete(Ok(())) => (),
+ f => unreachable!("{f:?}"),
+ };
+
+ Ok((img, (w, h)))
+}
diff --git a/src/data/schematic.rs b/mindus/src/data/schematic.rs
index 31888c2..55baf3f 100644
--- a/src/data/schematic.rs
+++ b/mindus/src/data/schematic.rs
@@ -1,47 +1,49 @@
//! schematic parsing
-use std::collections::hash_map::Entry;
+use fimg::DynImage;
use std::collections::HashMap;
+use std::collections::hash_map::Entry;
use std::fmt::{self, Write};
use thiserror::Error;
-use crate::block::{self, Block, BlockRegistry, Rotation, State};
+use crate::block::ratios::{Io, IoBuilder};
+use crate::block::{self, BLOCK_REGISTRY, Block, Rotation, State};
use crate::data::base64;
-use crate::data::dynamic::{self, DynData, DynSerializer};
+use crate::data::dynamic::{self, DynData};
use crate::data::renderer::*;
-use crate::data::{self, DataRead, DataWrite, GridPos, Serializer};
+use crate::data::{self, DataRead, DataWrite, GridPos, Serializable};
use crate::item::storage::ItemStorage;
-use crate::registry::RegistryEntry;
+use crate::utils::Cow;
use crate::utils::array::Array2D;
/// biggest schematic
-pub const MAX_DIMENSION: usize = 256;
+pub const MAX_DIMENSION: usize = 1024;
/// most possible blocks
-pub const MAX_BLOCKS: u32 = 256 * 256;
+pub const MAX_BLOCKS: u32 = 1024 * 1024;
/// a placement in a schematic
-#[derive(Clone)]
-pub struct Placement<'l> {
- pub block: &'l Block,
+#[derive(Clone, Hash)]
+pub struct Placement {
+ pub block: &'static Block,
pub rot: Rotation,
state: Option<State>,
}
-impl PartialEq for Placement<'_> {
- fn eq(&self, rhs: &Placement<'_>) -> bool {
+impl PartialEq for Placement {
+ fn eq(&self, rhs: &Placement) -> bool {
self.block == rhs.block && self.rot == rhs.rot
}
}
-impl fmt::Debug for Placement<'_> {
+impl fmt::Debug for Placement {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
write!(f, "P<{}[*{}]>", self.block.name(), self.rot.ch())
}
}
-impl<'l> Placement<'l> {
+impl Placement {
/// make a placement from a block
#[must_use]
- pub const fn new(block: &'l Block) -> Self {
+ pub const fn new(block: &'static Block) -> Self {
Self {
block,
rot: Rotation::Up,
@@ -61,16 +63,13 @@ impl<'l> Placement<'l> {
}
/// draws this placement in particular
- ///
- /// # Safety
- /// UB if called before [`warmup`](crate::warmup)
#[must_use]
pub fn image(
&self,
context: Option<&RenderingContext>,
rot: Rotation,
s: Scale,
- ) -> ImageHolder<4> {
+ ) -> DynImage<Cow> {
self.block.image(self.get_state(), context, rot, s)
}
@@ -86,48 +85,49 @@ impl<'l> Placement<'l> {
}
}
-impl<'l> BlockState<'l> for Placement<'l> {
- fn get_block(&self) -> Option<&'l Block> {
+impl BlockState for Placement {
+ fn get_block(&self) -> Option<&'static Block> {
Some(self.block)
}
}
-impl RotationState for Placement<'_> {
+impl RotationState for Placement {
fn get_rotation(&self) -> Option<Rotation> {
Some(self.rot)
}
}
-impl<'l> BlockState<'l> for Option<Placement<'l>> {
- fn get_block(&self) -> Option<&'l Block> {
- let Some(p) = self else {
- return None;
- };
- Some(p.block)
+impl BlockState for Option<Placement> {
+ fn get_block(&self) -> Option<&'static Block> {
+ Some(self.as_ref()?.block)
}
}
-impl RotationState for Option<Placement<'_>> {
+impl RotationState for Option<Placement> {
fn get_rotation(&self) -> Option<Rotation> {
- let Some(p) = self else {
- return None;
- };
- Some(p.rot)
+ Some(self.as_ref()?.rot)
}
}
#[derive(Clone, Debug)]
/// a schematic.
-pub struct Schematic<'l> {
+pub struct Schematic {
pub width: usize,
pub height: usize,
pub tags: HashMap<String, String>,
/// schems can have holes, so [Option] is used.
- pub blocks: Array2D<Option<Placement<'l>>>,
+ pub blocks: Array2D<Option<Placement>>,
+}
+impl core::hash::Hash for Schematic {
+ fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
+ self.width.hash(state);
+ self.height.hash(state);
+ self.blocks.hash(state);
+ }
}
-impl<'l> PartialEq for Schematic<'l> {
- fn eq(&self, rhs: &Schematic<'l>) -> bool {
+impl PartialEq for Schematic {
+ fn eq(&self, rhs: &Schematic) -> bool {
self.width == rhs.width
&& self.height == rhs.height
&& self.blocks == rhs.blocks
@@ -135,23 +135,9 @@ impl<'l> PartialEq for Schematic<'l> {
}
}
-impl<'l> Schematic<'l> {
- #[must_use]
- /// create a new schematic, panicking if too big
- /// ```
- /// # use mindus::Schematic;
- /// let s = Schematic::new(5, 5);
- /// ```
- pub fn new(width: usize, height: usize) -> Self {
- match Self::try_new(width, height) {
- Ok(s) => s,
- Err(NewError::Width(w)) => panic!("invalid schematic width ({w})"),
- Err(NewError::Height(h)) => panic!("invalid schematic height ({h})"),
- }
- }
-
+impl Schematic {
/// the area around a point
- pub(crate) fn cross(&self, c: &PositionContext) -> Cross {
+ pub(crate) fn cross(&self, c: &PositionContext) -> (Cross, Corners) {
let get = |x, y| {
let b = self.get(x?, y?).ok()??;
Some((b.get_block()?, b.get_rotation()?))
@@ -161,43 +147,57 @@ impl<'l> Schematic<'l> {
Some($x)
};
($a:expr => $b:expr) => {
- if $a < $b {
- None
- } else {
- Some($a - $b)
- }
+ if $a < $b { None } else { Some($a - $b) }
};
}
- [
- get(s!(c.position.0), s!(c.position.1 + 1)),
- get(s!(c.position.0 + 1), s!(c.position.1)),
- get(s!(c.position.0), s!(c.position.1 => 1)),
- get(s!(c.position.0 => 1), s!(c.position.1)),
- ]
+ (
+ [
+ get(s!(c.position.0), s!(c.position.1 + 1)),
+ get(s!(c.position.0 + 1), s!(c.position.1)),
+ get(s!(c.position.0), s!(c.position.1 => 1)),
+ get(s!(c.position.0 => 1), s!(c.position.1)),
+ ],
+ [
+ get(s!(c.position.0 => 1), s!(c.position.1 => 1)),
+ get(s!(c.position.0 => 1), s!(c.position.1 + 1)),
+ get(s!(c.position.0 + 1), s!(c.position.1 => 1)),
+ get(s!(c.position.0 + 1), s!(c.position.1 + 1)),
+ ],
+ )
+ }
+
+ /// Ratios of this schematic.
+ /// ```
+ /// # #![feature(const_trait_impl)]
+ /// # use mindus::Schematic;
+ /// # use mindus::block::ratios::ratios;
+ /// assert_eq!(Schematic::deserialize_base64("bXNjaAF4nEWMSw7CMAxEh9REVSqx5hKcCLFISxaR0o9Sg8rtSTpFePPkmWfDwTWQyY8B5z75VdE9wzrkuGicJwA2+T6kFeb+aNDtym2MW8i4LJ/sNWo4dje8ksa31zmXuyv+Y4BTgRD2iIi9M+xM7WrUgnoNhYpQESpCxfKLrUo9FsISLX6vKgwhhCVK+wX5/BtM").unwrap().ratios(),
+ /// ratios![[Coal: 5.25, Lead: 10.5, Sand: 10.5, Water: 180] => [BlastCompound: 5.25, SporePod: 0.75]]);
+ /// ```
+ pub fn ratios(&self) -> Io {
+ let mut io = IoBuilder::default();
+ for p in self.blocks.iter().filter_map(|o| o.as_ref()) {
+ io += p.block.io(p.state.as_ref());
+ }
+ io.into()
}
- /// create a new schematic, erroring if too big
+ /// create a new schematic
/// ```
/// # use mindus::Schematic;
- /// assert!(Schematic::try_new(500, 500).is_err() == true);
+ /// let s = Schematic::new(5, 5);
/// ```
- pub fn try_new(width: usize, height: usize) -> Result<Self, NewError> {
- if width > MAX_DIMENSION {
- return Err(NewError::Width(width));
- }
- if height > MAX_DIMENSION {
- return Err(NewError::Height(height));
- }
+ pub fn new(width: usize, height: usize) -> Self {
let mut tags = HashMap::<String, String>::new();
tags.insert("name".to_string(), String::new());
tags.insert("description".to_string(), String::new());
tags.insert("labels".to_string(), "[]".to_string());
- Ok(Self {
+ Self {
width,
height,
tags,
blocks: Array2D::new(None, width, height),
- })
+ }
}
// #[must_use]
@@ -235,13 +235,14 @@ impl<'l> Schematic<'l> {
/// ```
/// # use mindus::Schematic;
/// # use mindus::block::Rotation;
+ /// # use mindus::block::DUO;
///
/// let mut s = Schematic::new(5, 5);
/// assert!(s.get(0, 0).unwrap().is_none());
- /// s.put(0, 0, &mindus::block::turrets::DUO);
+ /// s.put(0, 0, &DUO);
/// assert!(s.get(0, 0).unwrap().is_some());
/// ```
- pub fn get(&self, x: usize, y: usize) -> Result<Option<&Placement<'l>>, PosError> {
+ pub fn get(&self, x: usize, y: usize) -> Result<Option<&Placement>, PosError> {
if x >= self.width || y >= self.height {
return Err(PosError {
x,
@@ -254,7 +255,7 @@ impl<'l> Schematic<'l> {
}
/// gets a block, mutably
- pub fn get_mut(&mut self, x: usize, y: usize) -> Result<Option<&mut Placement<'l>>, PosError> {
+ pub fn get_mut(&mut self, x: usize, y: usize) -> Result<Option<&mut Placement>, PosError> {
if x >= self.width || y >= self.height {
return Err(PosError {
x,
@@ -269,12 +270,13 @@ impl<'l> Schematic<'l> {
/// put a block in (same as [`Schematic::set`], but less arguments and builder-ness). panics!!!
/// ```
/// # use mindus::Schematic;
+ /// # use mindus::block::ROUTER;
///
/// let mut s = Schematic::new(5, 5);
- /// s.put(0, 0, &mindus::block::distribution::ROUTER);
+ /// s.put(0, 0, &ROUTER);
/// assert!(s.get(0, 0).unwrap().is_some() == true);
/// ```
- pub fn put(&mut self, x: usize, y: usize, block: &'l Block) -> &mut Self {
+ pub fn put(&mut self, x: usize, y: usize, block: &'static Block) -> &mut Self {
self.set(x, y, block, DynData::Empty, Rotation::Up).unwrap();
self
}
@@ -282,18 +284,19 @@ impl<'l> Schematic<'l> {
/// set a block
/// ```
/// # use mindus::Schematic;
- /// # use mindus::DynData;
+ /// # use mindus::data::dynamic::DynData;
/// # use mindus::block::Rotation;
+ /// # use mindus::block::ROUTER;
///
/// let mut s = Schematic::new(5, 5);
- /// s.set(0, 0, &mindus::block::distribution::ROUTER, DynData::Empty, Rotation::Right);
+ /// s.set(0, 0, &ROUTER, DynData::Empty, Rotation::Right);
/// assert!(s.get(0, 0).unwrap().is_some() == true);
/// ```
pub fn set(
&mut self,
x: usize,
y: usize,
- block: &'l Block,
+ block: &'static Block,
data: DynData,
rot: Rotation,
) -> Result<(), PlaceError> {
@@ -326,17 +329,16 @@ impl<'l> Schematic<'l> {
/// take out a block
/// ```
/// # use mindus::Schematic;
- /// # use mindus::DynData;
-
+ /// # use mindus::block::DUO;
/// # use mindus::block::Rotation;
///
/// let mut s = Schematic::new(5, 5);
- /// s.put(0, 0, &mindus::block::turrets::DUO);
+ /// s.put(0, 0, &DUO);
/// assert!(s.get(0, 0).unwrap().is_some() == true);
/// assert!(s.take(0, 0).unwrap().is_some() == true);
/// assert!(s.get(0, 0).unwrap().is_none() == true);
/// ```
- pub fn take(&mut self, x: usize, y: usize) -> Result<Option<Placement<'l>>, PosError> {
+ pub fn take(&mut self, x: usize, y: usize) -> Result<Option<Placement>, PosError> {
if x >= self.width || y >= self.height {
return Err(PosError {
x,
@@ -350,13 +352,11 @@ impl<'l> Schematic<'l> {
}
/// iterate over all the blocks
- pub fn block_iter(&self) -> impl Iterator<Item = (GridPos, &Placement<'_>)> {
- self.blocks.iter().enumerate().filter_map(|(i, p)| {
- let Some(p) = p else {
- return None;
- };
- Some((GridPos(i / self.height, i % self.height), p))
- })
+ pub fn block_iter(&self) -> impl Iterator<Item = (GridPos, &Placement)> {
+ self.blocks
+ .iter()
+ .enumerate()
+ .filter_map(|(i, p)| Some((GridPos(i / self.height, i % self.height), p.as_ref()?)))
}
#[must_use]
@@ -364,11 +364,11 @@ impl<'l> Schematic<'l> {
/// returns (cost, `is_sandbox`)
/// ```
/// # use mindus::Schematic;
- /// # use mindus::DynData;
/// # use mindus::block::Rotation;
+ /// # use mindus::block::CYCLONE;
///
/// let mut s = Schematic::new(5, 5);
- /// s.put(1, 1, &mindus::block::turrets::CYCLONE);
+ /// s.put(1, 1, &CYCLONE);
/// assert_eq!(s.compute_total_cost().0.get_total(), 405);
/// ```
pub fn compute_total_cost(&self) -> (ItemStorage, bool) {
@@ -473,13 +473,10 @@ impl fmt::Display for TruncatedError {
const SCHEMATIC_HEADER: u32 =
((b'm' as u32) << 24) | ((b's' as u32) << 16) | ((b'c' as u32) << 8) | (b'h' as u32);
-/// `serde_schematic`
-pub struct SchematicSerializer<'l>(pub &'l BlockRegistry<'l>);
-
-impl<'l> Serializer<Schematic<'l>> for SchematicSerializer<'l> {
+impl Serializable for Schematic {
type ReadError = ReadError;
type WriteError = WriteError;
- fn deserialize(&mut self, buff: &mut DataRead<'_>) -> Result<Schematic<'l>, Self::ReadError> {
+ fn deserialize(buff: &mut DataRead<'_>) -> Result<Schematic, Self::ReadError> {
let hdr = buff.read_u32()?;
if hdr != SCHEMATIC_HEADER {
return Err(ReadError::Header(hdr));
@@ -501,14 +498,16 @@ impl<'l> Serializer<Schematic<'l>> for SchematicSerializer<'l> {
if num_table < 0 {
return Err(ReadError::TableSize(num_table));
}
- let mut block_table = Vec::new();
- block_table.reserve(num_table as usize);
+ let mut block_table = Vec::with_capacity(num_table as usize);
for _ in 0..num_table {
let name = buff.read_utf()?;
- match self.0.get(name) {
- None => return Err(ReadError::NoSuchBlock(name.to_owned())),
- Some(b) => block_table.push(b),
- }
+ block_table.push(
+ BLOCK_REGISTRY
+ .get(name)
+ .copied()
+ // wont get rendered
+ .unwrap_or(&crate::block::METAL_FLOOR),
+ );
}
let num_blocks = buff.read_i32()?;
if num_blocks < 0 || num_blocks as u32 > MAX_BLOCKS {
@@ -524,7 +523,7 @@ impl<'l> Serializer<Schematic<'l>> for SchematicSerializer<'l> {
let config = if version < 1 {
block.data_from_i32(buff.read_i32()?, pos)?
} else {
- DynSerializer.deserialize(&mut buff)?
+ DynData::deserialize(&mut buff)?
};
let rot = Rotation::from(buff.read_u8()?);
schematic.set(pos.0, pos.1, block, config, rot)?;
@@ -532,24 +531,20 @@ impl<'l> Serializer<Schematic<'l>> for SchematicSerializer<'l> {
Ok(schematic)
}
- fn serialize(
- &mut self,
- buff: &mut DataWrite<'_>,
- data: &Schematic,
- ) -> Result<(), Self::WriteError> {
+ fn serialize(&self, buff: &mut DataWrite<'_>) -> Result<(), Self::WriteError> {
// write the header first just in case
buff.write_u32(SCHEMATIC_HEADER)?;
buff.write_u8(1)?;
let mut rbuff = DataWrite::default();
// don't have to check dimensions because they're already limited to MAX_DIMENSION
- rbuff.write_i16(data.width as i16)?;
- rbuff.write_i16(data.height as i16)?;
- if data.tags.len() > u8::MAX as usize {
- return Err(WriteError::TagCount(data.tags.len()));
+ rbuff.write_i16(self.width as i16)?;
+ rbuff.write_i16(self.height as i16)?;
+ if self.tags.len() > u8::MAX as usize {
+ return Err(WriteError::TagCount(self.tags.len()));
}
- rbuff.write_u8(data.tags.len() as u8)?;
- for (k, v) in &data.tags {
+ rbuff.write_u8(self.tags.len() as u8)?;
+ for (k, v) in &self.tags {
rbuff.write_utf(k)?;
rbuff.write_utf(v)?;
}
@@ -557,11 +552,11 @@ impl<'l> Serializer<Schematic<'l>> for SchematicSerializer<'l> {
let mut block_map = HashMap::new();
let mut block_table = Vec::new();
let mut block_count = 0i32;
- for curr in data.blocks.iter().filter_map(|b| b.as_ref()) {
+ for curr in self.blocks.iter().filter_map(|b| b.as_ref()) {
block_count += 1;
- if let Entry::Vacant(e) = block_map.entry(curr.block.get_name()) {
+ if let Entry::Vacant(e) = block_map.entry(curr.block.name()) {
e.insert(block_table.len() as u32);
- block_table.push(curr.block.get_name());
+ block_table.push(curr.block.name());
}
}
if block_table.len() > i8::MAX as usize {
@@ -574,14 +569,14 @@ impl<'l> Serializer<Schematic<'l>> for SchematicSerializer<'l> {
}
// don't have to check data.blocks.len() because dimensions don't allow exceeding MAX_BLOCKS
rbuff.write_i32(block_count)?;
- for (pos, curr) in data.block_iter() {
- rbuff.write_i8(block_map[curr.block.get_name()] as i8)?;
+ for (pos, curr) in self.block_iter() {
+ rbuff.write_i8(block_map[curr.block.name()] as i8)?;
rbuff.write_u32(pos.into())?;
let data = match curr.state {
None => DynData::Empty,
Some(ref s) => curr.block.serialize_state(s)?,
};
- DynSerializer.serialize(&mut rbuff, &data)?;
+ data.serialize(&mut rbuff)?;
rbuff.write_u8(curr.rot.into())?;
}
rbuff.inflate(buff)?;
@@ -633,26 +628,24 @@ pub enum WriteError {
Compress(#[from] super::CompressError),
}
-impl<'l> SchematicSerializer<'l> {
+impl Schematic {
/// deserializes a schematic from base64
/// ```
/// # use mindus::*;
/// let string = "bXNjaAF4nGNgZmBmZmDJS8xNZeBOyslPzlYAkwzcKanFyUWZBSWZ+XkMDAxsOYlJqTnFDEzRsYwMfAWJlTn5iSm6RfmlJalFQGlGEGJkZWSYxQAAcBkUPA==";
- /// let reg = build_registry();
- /// let mut ss = SchematicSerializer(&reg);
- /// let s = ss.deserialize_base64(string).unwrap();
+ /// let s = Schematic::deserialize_base64(string).unwrap();
/// assert!(s.get(1, 1).unwrap().unwrap().block.name() == "payload-router");
/// ```
- pub fn deserialize_base64(&mut self, data: &str) -> Result<Schematic<'l>, R64Error> {
+ pub fn deserialize_base64(data: &str) -> Result<Schematic, R64Error> {
let mut buff = vec![0; data.len() / 4 * 3 + 1];
let n_out = base64::decode(data.as_bytes(), buff.as_mut())?;
- Ok(self.deserialize(&mut DataRead::new(&buff[..n_out]))?)
+ Ok(Self::deserialize(&mut DataRead::new(&buff[..n_out]))?)
}
/// serialize a schematic to base64
- pub fn serialize_base64(&mut self, data: &Schematic<'l>) -> Result<String, W64Error> {
+ pub fn serialize_base64(&self) -> Result<String, W64Error> {
let mut buff = DataWrite::default();
- self.serialize(&mut buff, data)?;
+ self.serialize(&mut buff)?;
let buff = buff.get_written();
// round up because of padding
let mut text = vec![0; 4 * (buff.len() / 3 + usize::from(buff.len() % 3 != 0))];
@@ -706,14 +699,12 @@ mod test {
($name:ident, $($val:expr);+;) => {
#[test]
fn $name() {
- let reg = crate::block::build_registry();
- let mut ser = SchematicSerializer(&reg);
$(
- let parsed = unwrap_pretty(ser.deserialize_base64($val));
+ let parsed = unwrap_pretty(Schematic::deserialize_base64($val));
println!("\x1b[38;5;2mdeserialized\x1b[0m {}", parsed.tags.get("name").unwrap());
- let unparsed = unwrap_pretty(ser.serialize_base64(&parsed));
+ let unparsed = unwrap_pretty(parsed.serialize_base64());
println!("\x1b[38;5;2mserialized\x1b[0m {}", parsed.tags.get("name").unwrap());
- let parsed2 = unwrap_pretty(ser.deserialize_base64(&unparsed));
+ let parsed2 = unwrap_pretty(Schematic::deserialize_base64(&unparsed));
println!("\x1b[38;5;2mredeserialized\x1b[0m {}", parsed.tags.get("name").unwrap());
if parsed != parsed2 {
#[cfg(feature = "bin")]
@@ -755,7 +746,7 @@ mod test {
None
};
}
- use crate::block::all::*;
+ use crate::block::*;
let mut s = Schematic::new(3, 3);
s.put(0, 0, &DISTRIBUTOR)
.put(0, 1, &JUNCTION)
@@ -771,10 +762,7 @@ mod test {
pair!(2, 0, ROUTER);
pair!( );
];
- let reg = crate::block::build_registry();
- let mut s = SchematicSerializer(&reg);
-
- let s = s.deserialize_base64("bXNjaAF4nDXKywqAIBQA0fFRBH1itDC7C8E01IT+vgia1VkMFmOwyR3C0N0VG/Mu1ZdwtpATMEa3SazoZdVMPqcudy7/DJovpV4peAAt0xF6").unwrap();
+ let s = Schematic::deserialize_base64("bXNjaAF4nDXKywqAIBQA0fFRBH1itDC7C8E01IT+vgia1VkMFmOwyR3C0N0VG/Mu1ZdwtpATMEa3SazoZdVMPqcudy7/DJovpV4peAAt0xF6").unwrap();
let mut it = s.block_iter();
test_iter![it,
pair!(0, 0, CONVEYOR);
diff --git a/src/data/sector.rs b/mindus/src/data/sector.rs
index ac8c471..ac8c471 100644
--- a/src/data/sector.rs
+++ b/mindus/src/data/sector.rs
diff --git a/src/data/weather.rs b/mindus/src/data/weather.rs
index 8df9f59..8df9f59 100644
--- a/src/data/weather.rs
+++ b/mindus/src/data/weather.rs
diff --git a/mindus/src/exe/draw.rs b/mindus/src/exe/draw.rs
new file mode 100644
index 0000000..6bf8895
--- /dev/null
+++ b/mindus/src/exe/draw.rs
@@ -0,0 +1,41 @@
+use mindus::data::DataRead;
+use mindus::{Schematic, Serializable};
+use std::env::Args;
+
+use crate::print_err;
+
+pub fn main(args: Args) {
+ // process schematics from command line
+ for curr in args {
+ match if curr.ends_with(".msch") {
+ let Ok(v) = std::fs::read(&curr) else {
+ panic!("no file found");
+ };
+ Schematic::deserialize(&mut DataRead::new(&v))
+ } else {
+ match Schematic::deserialize_base64(&curr) {
+ Err(e) => {
+ print_err!(e, "Could not read schematic");
+ continue;
+ }
+ Ok(o) => Ok(o),
+ }
+ } {
+ Ok(s) => {
+ println!("{curr} {}, {:?}", s.tags.get("name").unwrap(), &s.tags);
+ let i = mindus::Renderable::render(&s);
+ if let Ok(v) = std::env::var("SAVE")
+ && v == "1"
+ {
+ i.save("x.png");
+ println!("drawn");
+ continue;
+ }
+ }
+ // continue processing literals & maybe interactive mode
+ Err(e) => {
+ print_err!(e, "Could not read schematic");
+ }
+ }
+ }
+}
diff --git a/mindus/src/exe/map.rs b/mindus/src/exe/map.rs
new file mode 100644
index 0000000..f571761
--- /dev/null
+++ b/mindus/src/exe/map.rs
@@ -0,0 +1,32 @@
+use mindus::data::DataRead;
+use mindus::{Map, Renderable, Serializable};
+use std::env::Args;
+
+use super::print_err;
+
+pub fn main(args: Args) {
+ // process schematics from command line
+ for curr in args {
+ let Ok(s) = std::fs::read(curr) else {
+ continue;
+ };
+ match (|| {
+ let m = Map::deserialize(&mut DataRead::new(&s))?;
+ println!(
+ "rendering {}",
+ m.tags.get("name").map_or("<unknown>", |v| v)
+ );
+ Ok::<_, mindus::data::map::ReadError>(m.render())
+ })() {
+ Err(e) => print_err!(e, "fail"),
+ Ok(m) => {
+ if let Ok(v) = std::env::var("SAVE")
+ && v == "1"
+ {
+ m.save("x.png");
+ continue;
+ }
+ }
+ }
+ }
+}
diff --git a/src/exe/mod.rs b/mindus/src/exe/mod.rs
index aa49f29..aa49f29 100644
--- a/src/exe/mod.rs
+++ b/mindus/src/exe/mod.rs
diff --git a/src/fluid/mod.rs b/mindus/src/fluid.rs
index 7437744..7437744 100644
--- a/src/fluid/mod.rs
+++ b/mindus/src/fluid.rs
diff --git a/src/item/mod.rs b/mindus/src/item/mod.rs
index 5d29176..5d29176 100644
--- a/src/item/mod.rs
+++ b/mindus/src/item/mod.rs
diff --git a/mindus/src/item/storage.rs b/mindus/src/item/storage.rs
new file mode 100644
index 0000000..7fccccc
--- /dev/null
+++ b/mindus/src/item/storage.rs
@@ -0,0 +1,442 @@
+use std::fmt;
+use std::iter::{Enumerate, FusedIterator};
+use std::marker::PhantomData;
+use std::slice;
+
+use crate::item;
+
+#[derive(Clone, Eq)]
+/// stores data
+pub struct Storage<T> {
+ base: Vec<u32>,
+ total: u64,
+ holds: PhantomData<T>,
+}
+
+pub type ItemStorage = Storage<item::Type>;
+
+impl<T> Default for Storage<T> {
+ fn default() -> Self {
+ Self {
+ base: Vec::default(),
+ total: 0,
+ holds: PhantomData,
+ }
+ }
+}
+
+impl<T: std::fmt::Debug + TryFrom<u16>> std::fmt::Debug for Storage<T> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ f.debug_map().entries(self.iter_nonzero()).finish()
+ }
+}
+
+impl<T: TryFrom<u16> + fmt::Debug> fmt::Display for Storage<T> {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ f.debug_map().entries(self.iter_nonzero()).finish()
+ }
+}
+
+impl<T> Storage<T>
+where
+ u16: From<T>,
+{
+ #[must_use]
+ /// create a new storage
+ ///
+ /// ```
+ /// # use mindus::item::storage::ItemStorage;
+ /// // ItemStorage is a alias to Storage<Item>
+ /// let s = ItemStorage::new();
+ /// ```
+ pub fn new() -> Self {
+ Self::default()
+ }
+
+ #[must_use]
+ /// total items
+ pub const fn get_total(&self) -> u64 {
+ self.total
+ }
+
+ #[must_use]
+ /// check if its empty
+ ///
+ /// ```
+ /// # use mindus::item::storage::ItemStorage;
+ /// # use mindus::item;
+ ///
+ /// let mut s = ItemStorage::new();
+ /// assert!(s.is_empty());
+ /// s.set(item::Type::Copper, 500);
+ /// assert!(!s.is_empty());
+ /// s.sub(item::Type::Copper, 500, 0);
+ /// assert!(s.is_empty());
+ /// ```
+ pub const fn is_empty(&self) -> bool {
+ self.total == 0
+ }
+
+ pub fn reserve(&mut self, n: usize) {
+ self.base.reserve_exact(n)
+ }
+
+ /// get item count of certain element
+ ///
+ /// ```
+ /// # use mindus::item::storage::ItemStorage;
+ /// # use mindus::item;
+ ///
+ /// let mut s = ItemStorage::new();
+ /// assert!(s.get(item::Type::Coal) == 0);
+ /// s.set(item::Type::Coal, 500);
+ /// assert!(s.get(item::Type::Titanium) == 0);
+ /// assert!(s.get(item::Type::Coal) == 500);
+ /// s.sub(item::Type::Coal, 500, 0);
+ /// assert!(s.get(item::Type::Coal) == 0);
+ /// ```
+ #[must_use]
+ pub fn get(&self, ty: T) -> u32 {
+ self.base.get(u16::from(ty) as usize).copied().unwrap_or(0)
+ }
+ /// set item count of certain element
+ ///
+ /// ```
+ /// # use mindus::item::storage::ItemStorage;
+ /// # use mindus::item;
+ ///
+ /// let mut s = ItemStorage::new();
+ /// s.set(item::Type::Coal, 500);
+ /// s.set(item::Type::Copper, 500);
+ /// assert!(s.get(item::Type::Copper) == 500);
+ /// ```
+ pub fn set(&mut self, ty: T, count: u32) -> u32 {
+ let idx = u16::from(ty) as usize;
+ match self.base.get_mut(idx) {
+ None => {
+ self.base.resize(idx + 1, 0);
+ self.base[idx] = count;
+ self.total += u64::from(count);
+ 0
+ }
+ Some(curr) => {
+ let prev = *curr;
+ self.total = self.total - u64::from(prev) + u64::from(count);
+ *curr = count;
+ prev
+ }
+ }
+ }
+
+ /// add to a certain elements item count, capping.
+ ///
+ /// ```
+ /// # use mindus::item::storage::ItemStorage;
+ /// # use mindus::item;
+ ///
+ /// let mut s = ItemStorage::new();
+ /// s.add(item::Type::Coal, 500, 500);
+ /// assert!(s.get(item::Type::Coal) == 500);
+ /// s.add(item::Type::Coal, 500, 10000);
+ /// assert!(s.get(item::Type::Coal) == 1000);
+ /// s.add(item::Type::Coal, 500, 1250);
+ /// assert!(s.get(item::Type::Coal) == 1250);
+ /// ```
+ pub fn add(&mut self, ty: T, add: u32, max: u32) -> (u32, u32) {
+ let idx = u16::from(ty) as usize;
+ match self.base.get_mut(idx) {
+ None => {
+ let actual = add.min(max);
+ self.base.resize(idx + 1, 0);
+ self.base[idx] = actual;
+ self.total += u64::from(add);
+ (actual, actual)
+ }
+ Some(curr) => {
+ if *curr < max {
+ let actual = add.min(max - *curr);
+ *curr += actual;
+ self.total += u64::from(actual);
+ (actual, *curr)
+ } else {
+ (0, *curr)
+ }
+ }
+ }
+ }
+
+ /// like [`Storage::add`] but fails
+ pub fn try_add(&mut self, ty: T, add: u32, max: u32) -> Result<(u32, u32), TryAddError> {
+ let idx = u16::from(ty) as usize;
+ match self.base.get_mut(idx) {
+ None => {
+ if add <= max {
+ self.base.resize(idx + 1, 0);
+ self.base[idx] = add;
+ self.total += u64::from(add);
+ Ok((add, add))
+ } else {
+ Err(TryAddError { have: 0, add, max })
+ }
+ }
+ Some(curr) => {
+ if *curr <= max && max - *curr <= add {
+ *curr += add;
+ self.total += u64::from(add);
+ Ok((add, *curr))
+ } else {
+ Err(TryAddError {
+ have: *curr,
+ add,
+ max,
+ })
+ }
+ }
+ }
+ }
+
+ pub fn sub(&mut self, ty: T, sub: u32, min: u32) -> (u32, u32) {
+ match self.base.get_mut(u16::from(ty) as usize) {
+ None => (0, 0),
+ Some(curr) => {
+ if *curr > min {
+ let actual = sub.min(*curr - min);
+ *curr -= actual;
+ self.total -= u64::from(actual);
+ (actual, *curr)
+ } else {
+ (0, *curr)
+ }
+ }
+ }
+ }
+
+ pub fn try_sub(&mut self, ty: T, sub: u32, min: u32) -> Result<(u32, u32), TrySubError> {
+ let idx = u16::from(ty) as usize;
+ match self.base.get_mut(idx) {
+ None => Err(TrySubError { have: 0, sub, min }),
+ Some(curr) => {
+ if *curr >= min && *curr - min >= sub {
+ *curr -= sub;
+ self.total -= u64::from(sub);
+ Ok((sub, *curr))
+ } else {
+ Err(TrySubError {
+ have: *curr,
+ sub,
+ min,
+ })
+ }
+ }
+ }
+ }
+
+ pub fn add_all(&mut self, other: &Storage<T>, max_each: u32) -> (u64, u64) {
+ let mut added = 0u64;
+ if max_each > 0 && other.total > 0 {
+ let mut iter = other.base.iter().enumerate();
+ // resize our vector only once and if necessary
+ let (last, add_last) = iter.rfind(|(_, n)| **n != 0).unwrap();
+ if self.base.len() <= last {
+ self.base.resize(last + 1, 0);
+ }
+ // process items by increasing ID
+ for (idx, add) in iter {
+ let curr = self.base[idx];
+ if curr < max_each {
+ let actual = (*add).min(max_each - curr);
+ self.base[idx] += actual;
+ added += u64::from(actual);
+ }
+ }
+ // process the final element (which we've retrieved first)
+ let curr = self.base[last];
+ if curr < max_each {
+ let actual = (*add_last).min(max_each - curr);
+ self.base[last] += actual;
+ added += u64::from(actual);
+ }
+ // update total
+ self.total += added;
+ }
+ (added, self.total)
+ }
+
+ pub fn pull_all(&mut self, other: &mut Storage<T>, max_each: u32) -> (u64, u64, u64) {
+ let mut added = 0u64;
+ if max_each > 0 && other.total > 0 {
+ let mut iter = other.base.iter_mut().enumerate();
+ // resize our vector only once and if necessary
+ let (last, add_last) = iter.rfind(|(_, n)| **n != 0).unwrap();
+ if self.base.len() <= last {
+ self.base.resize(last + 1, 0);
+ }
+ // process items by increasing ID
+ for (idx, add) in iter {
+ let curr = self.base[idx];
+ if curr < max_each {
+ let actual = (*add).min(max_each - curr);
+ self.base[idx] += actual;
+ *add -= actual;
+ added += u64::from(actual);
+ }
+ }
+ // process the final element (which we've retrieved first)
+ let curr = self.base[last];
+ if curr < max_each {
+ let actual = (*add_last).min(max_each - curr);
+ self.base[last] += actual;
+ *add_last -= actual;
+ added += u64::from(actual);
+ }
+ // update totals
+ self.total += added;
+ other.total -= added;
+ }
+ (added, self.total, other.total)
+ }
+
+ pub fn sub_all(&mut self, other: &Storage<T>, min_each: u32) -> (u64, u64) {
+ let mut subbed = 0u64;
+ if self.total > 0 && other.total > 0 {
+ // no need for resizing, we only remove
+ // process items by increasing ID
+ for (idx, sub) in other.base.iter().enumerate() {
+ if let Some(curr) = self.base.get(idx) {
+ if *curr > min_each {
+ let actual = (*sub).min(*curr - min_each);
+ self.base[idx] -= actual;
+ subbed += u64::from(actual);
+ }
+ } else {
+ break;
+ }
+ }
+ // update total
+ self.total -= subbed;
+ }
+ (subbed, self.total)
+ }
+
+ pub fn diff_all(&mut self, other: &mut Storage<T>, min_each: u32) -> (u64, u64, u64) {
+ let mut subbed = 0u64;
+ if self.total > 0 && other.total > 0 {
+ // no need for resizing, we only remove
+ // consider only indexes present in both
+ let end = self.base.len().min(other.base.len());
+ let lhs = &mut self.base[..end];
+ let rhs = &mut other.base[..end];
+ // process items by increasing ID
+ for (l, r) in lhs.iter_mut().zip(rhs) {
+ if *l > min_each && *r > min_each {
+ let actual = (*l - min_each).min(*r - min_each);
+ *l -= actual;
+ *r -= actual;
+ subbed -= u64::from(actual);
+ }
+ }
+ // update totals
+ self.total -= subbed;
+ other.total -= subbed;
+ }
+ (subbed, self.total, other.total)
+ }
+
+ pub fn clear(&mut self) {
+ self.base.clear();
+ }
+}
+
+impl<T: TryFrom<u16>> Storage<T> {
+ pub fn iter(&self) -> Iter<'_, T> {
+ Iter {
+ base: self.base.iter().enumerate(),
+ all: true,
+ _t: PhantomData,
+ }
+ }
+
+ pub fn iter_nonzero(&self) -> Iter<'_, T> {
+ Iter {
+ base: self.base.iter().enumerate(),
+ all: false,
+ _t: PhantomData,
+ }
+ }
+}
+
+// manual because padding with zeros doesn't affect equality
+impl<T> PartialEq for Storage<T> {
+ fn eq(&self, other: &Self) -> bool {
+ let mut li = self.base.iter().fuse();
+ let mut ri = other.base.iter().fuse();
+ loop {
+ match (li.next(), ri.next()) {
+ (None, None) => return true,
+ (l, r) => {
+ if l.unwrap_or(&0) != r.unwrap_or(&0) {
+ return false;
+ }
+ }
+ }
+ }
+ }
+}
+
+#[derive(Clone, Copy, Debug, Eq, PartialEq, thiserror::Error)]
+#[error("adding {add} to current {have} would exceed {max}")]
+pub struct TryAddError {
+ pub have: u32,
+ pub add: u32,
+ pub max: u32,
+}
+
+#[derive(Clone, Copy, Debug, Eq, PartialEq, thiserror::Error)]
+#[error("removing {sub} from current {have} would drop below {min}")]
+pub struct TrySubError {
+ pub have: u32,
+ pub sub: u32,
+ pub min: u32,
+}
+
+impl<'l, T: TryFrom<u16>> IntoIterator for &'l Storage<T> {
+ type Item = (T, u32);
+
+ type IntoIter = Iter<'l, T>;
+
+ fn into_iter(self) -> Self::IntoIter {
+ self.iter()
+ }
+}
+
+#[derive(Clone, Debug)]
+#[must_use = "iterator is lazy"]
+pub struct Iter<'l, T: TryFrom<u16>> {
+ base: Enumerate<slice::Iter<'l, u32>>,
+ all: bool,
+ _t: PhantomData<T>,
+}
+
+impl<'l, T: TryFrom<u16>> Iterator for Iter<'l, T> {
+ type Item = (T, u32);
+
+ fn next(&mut self) -> Option<Self::Item> {
+ for (idx, cnt) in self.base.by_ref() {
+ if *cnt > 0 || self.all {
+ if let Ok(ty) = T::try_from(idx as u16) {
+ return Some((ty, *cnt));
+ }
+ }
+ }
+ None
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ (0, self.base.size_hint().1)
+ }
+}
+
+impl<'l, T: TryFrom<u16>> FusedIterator for Iter<'l, T> where
+ Enumerate<slice::Iter<'l, u32>>: FusedIterator
+{
+}
diff --git a/mindus/src/lib.rs b/mindus/src/lib.rs
new file mode 100644
index 0000000..c7967ad
--- /dev/null
+++ b/mindus/src/lib.rs
@@ -0,0 +1,37 @@
+//! crate for dealing with mindustry
+#![feature(
+ error_generic_member_access,
+ stmt_expr_attributes,
+ generic_const_exprs,
+ const_trait_impl,
+ coroutine_trait,
+ likely_unlikely,
+ portable_simd,
+ const_convert,
+ vec_from_fn,
+ try_blocks,
+ coroutines,
+ const_cmp,
+ doc_cfg
+)]
+#![allow(clippy::redundant_closure_call, incomplete_features)]
+#![warn(
+ clippy::multiple_unsafe_ops_per_block,
+ clippy::missing_const_for_fn,
+ clippy::missing_safety_doc,
+ unsafe_op_in_unsafe_fn,
+ clippy::dbg_macro,
+ clippy::perf
+)]
+pub mod block;
+pub mod color_mapping;
+pub mod content;
+pub mod data;
+pub mod fluid;
+pub mod item;
+pub mod modifier;
+mod team;
+pub mod unit;
+mod utils;
+#[doc(inline)]
+pub use data::{Serializable, map::Map, renderer::Renderable, schematic::Schematic};
diff --git a/src/modifier.rs b/mindus/src/modifier.rs
index bf1d867..7f9777e 100644
--- a/src/modifier.rs
+++ b/mindus/src/modifier.rs
@@ -28,3 +28,9 @@ content_enum! {
"invincible",
}
}
+
+impl Default for Type {
+ fn default() -> Self {
+ Self::None
+ }
+}
diff --git a/src/team.rs b/mindus/src/team.rs
index 35a651f..70fa3b7 100644
--- a/src/team.rs
+++ b/mindus/src/team.rs
@@ -1,8 +1,10 @@
use std::fmt;
+use atools::Chunked;
+
use crate::content::{Content, Type};
-#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
+#[derive(Clone, Copy, Debug, Eq, Ord, PartialOrd, Default, PartialEq)]
pub struct Team(u8);
impl Team {
@@ -107,30 +109,16 @@ impl Content for Team {
}
impl Team {
- pub const fn color(self) -> (u8, u8, u8) {
- macro_rules! h {
- ($x:literal) => {{
- let v = color_hex::color_from_hex!($x);
- (v[0], v[1], v[2])
- }};
- }
- match self {
- SHARDED => h!("ffd37f"),
- DERELICT => h!("4d4e58"),
- CRUX => h!("f25555"),
- MALIS => h!("a27ce5"),
- GREEN => h!("54d67d"),
- BLUE => h!("6c87fd"),
- NEOPLASTIC => h!("e05438"),
- _ => h!("a9a9a9"),
- }
+ pub const fn color(self) -> [u8; 3] {
+ static COLORS: [[u8; 3]; 256] = include_bytes!("colors").chunked::<3>();
+ COLORS[self.0 as usize]
}
-}
-pub const DERELICT: Team = Team(0);
-pub const SHARDED: Team = Team(1);
-pub const CRUX: Team = Team(2);
-pub const MALIS: Team = Team(3);
-pub const GREEN: Team = Team(4);
-pub const BLUE: Team = Team(5);
-pub const NEOPLASTIC: Team = Team(6);
+ pub const DERELICT: Team = Team(0);
+ pub const SHARDED: Team = Team(1);
+ pub const CRUX: Team = Team(2);
+ pub const MALIS: Team = Team(3);
+ pub const GREEN: Team = Team(4);
+ pub const BLUE: Team = Team(5);
+ pub const NEOPLASTIC: Team = Team(6);
+}
diff --git a/mindus/src/unit.rs b/mindus/src/unit.rs
new file mode 100644
index 0000000..a0fd75e
--- /dev/null
+++ b/mindus/src/unit.rs
@@ -0,0 +1,429 @@
+//! units
+//!
+//! [source](https://github.com/Anuken/Mindustry/blob/master/core/src/mindustry/content/UnitTypes.java)
+#![allow(dead_code)]
+use crate::Serializable;
+use crate::block::payload::read_payload;
+use crate::content::content_enum;
+use crate::data::command::UnitCommand;
+use crate::data::dynamic::DynData;
+use crate::data::entity_mapping::UnitClass;
+use crate::data::{DataRead, ReadError};
+use crate::item::Type as Item;
+use crate::modifier::Type as Status;
+use crate::team::Team;
+use crate::utils::ImageHolder;
+macro_rules! units {
+ ($($unit:literal,)+ $(,)?) => { paste::paste! {
+ content_enum! (pub enum Type / Unit for u16 | TryFromU16Error {
+ $($unit,)+
+ });
+
+ impl Type {
+ fn draw(self, s: crate::data::renderer::Scale) -> ImageHolder<4> {
+ match self {
+ $(Type::[<$unit:camel>] => units!(@help $unit + s),)+
+ }
+ }
+ }
+ } };
+ (@help "block" + $s:expr) => { crate::data::renderer::load!("empty4", $s) };
+ (@help $v:literal + $s:expr) => { crate::data::renderer::load!($v, $s) };
+}
+
+units! {
+ "dagger",
+ "mace",
+ "fortress",
+ "scepter",
+ "reign",
+ "nova",
+ "pulsar",
+ "quasar",
+ "vela",
+ "corvus",
+ "crawler",
+ "atrax",
+ "spiroct",
+ "arkyid",
+ "toxopid",
+ "flare",
+ "horizon",
+ "zenith",
+ "antumbra",
+ "eclipse",
+ "mono",
+ "poly",
+ "mega",
+ "quad",
+ "oct",
+ "risso",
+ "minke",
+ "bryde",
+ "sei",
+ "omura",
+ "retusa",
+ "oxynoe",
+ "cyerce",
+ "aegires",
+ "navanax",
+ "alpha",
+ "beta",
+ "gamma",
+ "stell",
+ "locus",
+ "precept",
+ "vanquish",
+ "conquer",
+ "merui",
+ "cleroi",
+ "anthicus",
+ "anthicus-missile",
+ "tecta",
+ "collaris",
+ "elude",
+ "avert",
+ "obviate",
+ "quell",
+ "quell-missile",
+ "disrupt",
+ "disrupt-missile",
+ "renale",
+ "latum",
+ "evoke",
+ "incite",
+ "emanate",
+ "block",
+ "manifold",
+ "assembly-drone",
+ "scathe-missile",
+}
+
+#[derive(Default, Debug)]
+pub struct UnitState {
+ pub ammo: f32,
+ pub elevation: f32,
+ pub flag: i64,
+ pub health: f32,
+ pub is_shooting: bool,
+ pub rotation: f32,
+ pub shield: f32,
+ pub stack: (Option<Item>, u32),
+ /// how many status can you realistically be afflicted with
+ pub status: [Status; 10],
+ pub team: Team,
+ pub velocity: (f32, f32),
+ pub position: (f32, f32),
+ pub controller: Controller,
+}
+// pub trait TryThen {
+// fn try_then<O: Try<Output = Option<T>, Residual = E>, T, E, R: Try<Output = T, Residual = E>>(
+// self,
+// then: impl FnMut() -> R,
+// ) -> O;
+// }
+// impl TryThen for bool {
+// fn try_then<
+// O: Try<Output = Option<T>, Residual = E>,
+// T,
+// E,
+// R: Try<Output = T, Residual = E>,
+// >(
+// self,
+// mut then: impl FnMut() -> R,
+// ) {
+// match self {
+// false => O::from_output(None),
+// true => match then().branch() {
+// ControlFlow::Continue(x) => O::from_output(Some(x)),
+// ControlFlow::Break(x) => O::from_residual(x),
+// },
+// }
+// }
+// }
+pub trait TryThen {
+ fn try_then<T, E>(self, f: impl FnMut() -> Result<T, E>) -> Result<Option<T>, E>;
+}
+impl TryThen for bool {
+ fn try_then<T, E>(self, mut f: impl FnMut() -> Result<T, E>) -> Result<Option<T>, E> {
+ self.then_some(()).map(|()| f()).transpose()
+ }
+}
+
+#[derive(Default, Debug)]
+pub enum Controller {
+ Player(i32),
+ Logic(i32),
+ Command {
+ target: Option<i32>,
+ pos: Option<(f32, f32)>,
+ command: Option<UnitCommand>,
+ },
+ #[default]
+ Assembler,
+}
+
+impl Controller {
+ /// format:
+ /// - match [`u8`]
+ /// - (0): player
+ /// - player: [`i32`]
+ ///
+ /// - (3): logic ai
+ /// - position: [`i32`]
+ ///
+ /// - (6): command
+ /// - has_attack: [`bool`]
+ /// - has_pos: [`bool`]
+ /// - if `has_pos`:
+ /// - pos: ([`f32`], [`f32`])
+ /// - if `has_attack`:
+ /// - ty: [`i8`]
+ /// - target_id: [`i32`]
+ /// - command: [`i8`] attempt as [`UnitCommand`]
+ /// - (_): assembler
+ fn read(buff: &mut DataRead) -> Result<Controller, ReadError> {
+ Ok(match buff.read_u8()? {
+ 0 => Controller::Player(buff.read_i32()?),
+ 3 => Controller::Logic(buff.read_i32()?),
+ t @ (4 | 6 | 7 | 8 | 9) => {
+ let has_attack = buff.read_bool()?;
+ let pos = buff
+ .read_bool()?
+ .try_then::<_, ReadError>(|| try { (buff.read_f32()?, buff.read_f32()?) })?;
+ let target = has_attack.try_then::<_, ReadError>(|| try {
+ buff.skip(1)?;
+ buff.read_i32()?
+ })?;
+ let n = buff.read_i8()?;
+ let command = u8::try_from(n)
+ .ok()
+ .and_then(|x| UnitCommand::try_from(x).ok());
+ if let 7 | 8 | 9 = t {
+ for _ in 0..buff.read_u8()? {
+ match buff.read_u8()? {
+ 0 | 1 => {
+ buff.read_u32()?;
+ }
+ 2 => {
+ buff.read_f32()?;
+ buff.read_f32()?;
+ }
+ _ => {}
+ }
+ }
+ }
+ if t == 8 {
+ // stance
+ buff.read_u8()?;
+ } else if t == 9 {
+ let stances = buff.read_u8()?;
+ buff.skip(stances as _)?;
+ }
+ Controller::Command {
+ target,
+ pos,
+ command,
+ }
+ }
+ 5 => Controller::Assembler,
+ _ => Controller::Assembler,
+ })
+ }
+}
+
+#[derive(Debug)]
+pub struct Unit {
+ pub state: UnitState,
+ pub ty: Type,
+}
+
+impl UnitClass {
+ pub fn read(self, buff: &mut DataRead) -> Result<Unit, ReadError> {
+ let _rev = buff.read_u16()?;
+ let mut state = UnitState::default();
+ read_abilities(buff)?;
+ // state.ammo = buff.read_f32()?;
+ match self {
+ Self::Block
+ | Self::Legs
+ | Self::Elevated
+ | Self::Crawl
+ | Self::Boat
+ | Self::Tank
+ | Self::Air => {
+ state.controller = Controller::read(buff)?;
+ state.elevation = buff.read_f32()?;
+ state.flag = buff.read_i64()?;
+ state.health = buff.read_f32()?;
+ state.is_shooting = buff.read_bool()?;
+ read_tile(buff)?;
+ read_mounts(buff)?;
+ }
+ Self::Mech => {
+ buff.skip(4)?; // base rotation
+ state.controller = Controller::read(buff)?;
+ state.elevation = buff.read_f32()?;
+ state.flag = buff.read_i64()?;
+ state.health = buff.read_f32()?;
+ state.is_shooting = buff.read_bool()?;
+ read_tile(buff)?;
+ read_mounts(buff)?;
+ }
+ Self::Payload => {
+ state.controller = Controller::read(buff)?;
+ state.elevation = buff.read_f32()?;
+ state.flag = buff.read_i64()?;
+ state.health = buff.read_f32()?;
+ state.is_shooting = buff.read_bool()?;
+ read_tile(buff)?;
+ read_mounts(buff)?;
+ for _ in 0..buff.read_i32()? {
+ // recursion more!
+ // this is unreliable, as read_payload may not read the full block.
+ // if read_plans reports a error, with a payload unit, this is why
+ let _ = read_payload(buff);
+ }
+ }
+ Self::Bomb => {
+ state.controller = Controller::read(buff)?;
+ state.elevation = buff.read_f32()?;
+ state.flag = buff.read_i64()?;
+ state.health = buff.read_f32()?;
+ state.is_shooting = buff.read_bool()?;
+ buff.skip(4)?; // lifetime
+ read_tile(buff)?;
+ read_mounts(buff)?;
+ }
+ Self::Tethered => {
+ buff.skip(4)?;
+ state.controller = Controller::read(buff)?;
+ state.elevation = buff.read_f32()?;
+ state.flag = buff.read_i64()?;
+ state.health = buff.read_f32()?;
+ state.is_shooting = buff.read_bool()?;
+ read_tile(buff)?;
+ read_mounts(buff)?;
+ for _ in 0..buff.read_i32()? {
+ // recursion more!
+ read_payload(buff)?;
+ }
+ }
+ }
+ read_plans(buff)?;
+ state.rotation = buff.read_f32()?;
+ state.shield = buff.read_f32()?;
+ buff.skip(1)?; // spawned_by_core
+ state.stack = read_stack(buff)?;
+ state.status = read_status(buff)?;
+ state.team = Team::of(buff.read_u8()?);
+ if self == Self::Bomb {
+ buff.skip(4)?; // time
+ }
+ let ty = Type::try_from(buff.read_u16()?).unwrap_or(Type::ScatheMissile); // shrug
+ buff.skip(1)?; // update_building
+ state.velocity = (buff.read_f32()?, buff.read_f32()?);
+ state.position = (
+ (buff.read_f32()? / 8.0).floor(),
+ (buff.read_f32()? / 8.0).floor(),
+ );
+ Ok(Unit { state, ty })
+ }
+}
+
+/// format:
+/// - iterate [`u8`]
+/// - ability: [`f32`]
+fn read_abilities(buff: &mut DataRead) -> Result<(), ReadError> {
+ let n = buff.read_u8()? as usize;
+ buff.skip(n * 4)
+}
+
+/// format:
+/// - tile: [`i32`]
+fn read_tile(buff: &mut DataRead) -> Result<(), ReadError> {
+ buff.skip(4)
+}
+
+/// format:
+/// - iterate [`u8`]
+/// - state: [`u8`]
+/// - x aim: [`f32`]
+/// - y aim: [`f32`]
+fn read_mounts(buff: &mut DataRead) -> Result<(), ReadError> {
+ let n = buff.read_u8()? as usize;
+ buff.skip(n * 9)
+}
+
+/// format:
+/// - plan count: [`i32`]
+/// - plan_count == -1 => return
+/// - iterate `plan_count`
+/// - call [`read_plan`]
+fn read_plans(buff: &mut DataRead) -> Result<(), ReadError> {
+ let used = buff.read_i32()?;
+ if used == -1 {
+ return Ok(());
+ }
+ for _ in 0..used {
+ read_plan(buff)?;
+ }
+ Ok(())
+}
+
+/// format:
+/// - ty: [`u8`]
+/// - position: [`i32`]
+/// - if ty != 1
+/// - block: [`u16`]
+/// - rotation: [`i8`]
+/// - has_config: [`bool`]
+/// - config: [`DynData`](crate::data::dynamic::DynData)
+fn read_plan(buff: &mut DataRead) -> Result<(), ReadError> {
+ let ty = buff.read_u8()?;
+ buff.skip(4)?;
+ if ty != 1 {
+ buff.skip(4)?;
+ let _ = DynData::deserialize(buff).unwrap();
+ }
+ Ok(())
+}
+
+/// format:
+/// - item: [`i16`] attempt into [`Item`]
+/// - count: [`u32`]
+fn read_stack(buff: &mut DataRead) -> Result<(Option<Item>, u32), ReadError> {
+ let n = buff.read_i16()?;
+ Ok((
+ (n != -1).then(|| Item::try_from(n as u16).unwrap()),
+ buff.read_u32()?,
+ ))
+}
+
+/// read the status.
+/// i take only 3
+///
+/// format:
+/// - iterate [`i32`]
+/// - status: [`u16`] attempt into [`Status`]
+/// - duration: [`f32`]
+fn read_status(buff: &mut DataRead) -> Result<[Status; 10], ReadError> {
+ let mut status = [Status::None; 10];
+ for i in 0..buff.read_i32()? {
+ let this = Status::try_from(buff.read_u16()?);
+ buff.skip(4)?;
+ if let Ok(s) = this
+ && i < 10
+ {
+ status[i as usize] = s;
+ }
+ }
+ Ok(status)
+}
+
+impl Unit {
+ #[inline]
+ pub fn draw(&self, s: crate::data::renderer::Scale) -> ImageHolder<4> {
+ self.ty.draw(s)
+ }
+}
diff --git a/src/utils/array.rs b/mindus/src/utils/array.rs
index 6685baa..8398b8a 100644
--- a/src/utils/array.rs
+++ b/mindus/src/utils/array.rs
@@ -2,7 +2,7 @@ use std::{
fmt::{Debug, Write},
ops::Deref,
};
-#[derive(Clone, PartialEq, Eq)]
+#[derive(Clone, PartialEq, Eq, Hash)]
pub struct Array2D<T: Clone> {
width: usize,
height: usize,
diff --git a/mindus/src/utils/image/holder.rs b/mindus/src/utils/image/holder.rs
new file mode 100644
index 0000000..45aab38
--- /dev/null
+++ b/mindus/src/utils/image/holder.rs
@@ -0,0 +1,48 @@
+use super::Image;
+
+#[derive(Clone, Debug)]
+pub enum Cow {
+ Ref(&'static [u8]),
+ Own(Box<[u8]>),
+}
+impl From<&'static [u8]> for Cow {
+ fn from(value: &'static [u8]) -> Self {
+ Self::Ref(value)
+ }
+}
+impl From<Box<[u8]>> for Cow {
+ fn from(value: Box<[u8]>) -> Self {
+ Self::Own(value)
+ }
+}
+
+impl Cow {
+ pub fn own(self) -> Box<[u8]> {
+ match self {
+ Self::Own(x) => x,
+ Self::Ref(x) => x.into(),
+ }
+ }
+}
+impl AsRef<[u8]> for Cow {
+ fn as_ref(&self) -> &[u8] {
+ match self {
+ Cow::Ref(x) => x,
+ Cow::Own(x) => &x,
+ }
+ }
+}
+
+impl AsMut<[u8]> for Cow {
+ fn as_mut(&mut self) -> &mut [u8] {
+ match self {
+ Cow::Ref(x) => {
+ *self = Self::Own((*x).into());
+ self.as_mut()
+ }
+ Cow::Own(x) => x,
+ }
+ }
+}
+
+pub type ImageHolder<const CHANNELS: usize> = Image<Cow, CHANNELS>;
diff --git a/mindus/src/utils/image/mod.rs b/mindus/src/utils/image/mod.rs
new file mode 100644
index 0000000..5953ade
--- /dev/null
+++ b/mindus/src/utils/image/mod.rs
@@ -0,0 +1,72 @@
+pub use fimg::*;
+
+mod holder;
+pub use holder::*;
+
+pub trait ImageUtils {
+ /// Tint this image with the color
+ fn tint(&mut self, color: (u8, u8, u8)) -> &mut Self;
+ /// rotate (squares only)
+ /// # Safety
+ ///
+ /// UB if image is not square
+ unsafe fn rotate(&mut self, times: u8) -> &mut Self;
+ unsafe fn rotated(mut self, times: u8) -> Self
+ where
+ Self: Sized,
+ {
+ unsafe { self.rotate(times) };
+ self
+ }
+ /// shadow
+ fn shadow(&mut self) -> &mut Self;
+}
+
+impl<T: AsMut<[u8]> + AsRef<[u8]>> ImageUtils for Image<T, 4> {
+ unsafe fn rotate(&mut self, times: u8) -> &mut Self {
+ match times {
+ 1 => unsafe { self.rot_90() },
+ 2 => self.rot_180(),
+ 3 => unsafe { self.rot_270() },
+ _ => {}
+ }
+ self
+ }
+
+ fn tint(&mut self, (r, g, b): (u8, u8, u8)) -> &mut Self {
+ let [tr, tg, tb] = [r as f32 / 255.0, g as f32 / 255.0, b as f32 / 255.0];
+ for [r, g, b, _] in self.chunked_mut() {
+ *r = (*r as f32 * tr) as u8;
+ *g = (*g as f32 * tg) as u8;
+ *b = (*b as f32 * tb) as u8;
+ }
+ self
+ }
+
+ fn shadow(&mut self) -> &mut Self {
+ let mut shadow = self.as_ref().boxed();
+ for [r, g, b, a] in shadow.chunked_mut() {
+ if *a < 128 {
+ *r /= 10;
+ *g /= 10;
+ *b /= 10;
+ }
+ }
+ shadow.blur(22);
+ for ([r, g, b, a], &[from_r, from_g, from_b, from_a]) in
+ self.chunked_mut().zip(shadow.chunked())
+ {
+ if *a == 0 {
+ (*r, *g, *b, *a) = (from_r, from_g, from_b, from_a);
+ }
+ }
+ self
+ }
+}
+
+#[test]
+fn x() {
+ let mut x = Image::<_, 4>::open("/home/os/pod.png");
+ x.as_mut().shadow();
+ x.save("/home/os/shadowpod.png");
+}
diff --git a/mindus/src/utils/mod.rs b/mindus/src/utils/mod.rs
new file mode 100644
index 0000000..7183f0e
--- /dev/null
+++ b/mindus/src/utils/mod.rs
@@ -0,0 +1,3 @@
+pub mod array;
+pub mod image;
+pub use self::image::{Cow, Image, ImageHolder, ImageUtils, Overlay, OverlayAt};
diff --git a/p2s/.gitignore b/p2s/.gitignore
new file mode 100644
index 0000000..b68bac7
--- /dev/null
+++ b/p2s/.gitignore
@@ -0,0 +1 @@
+quant.png
diff --git a/p2s/Cargo.toml b/p2s/Cargo.toml
new file mode 100644
index 0000000..2411584
--- /dev/null
+++ b/p2s/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "p2s"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+clipp = "0.1.0"
+comat = "0.1.3"
+exoquant = "0.2.0"
+fimg = "0.4.23"
+mindus = { version = "5.0.9", path = "../mindus", default-features = false }
diff --git a/p2s/README.md b/p2s/README.md
new file mode 100644
index 0000000..f8f2d1f
--- /dev/null
+++ b/p2s/README.md
@@ -0,0 +1,4 @@
+# p2s
+
+small example showcasing schematic construction.
+this takes a png, and turns it into a sorter schematic. \ No newline at end of file
diff --git a/p2s/src/main.rs b/p2s/src/main.rs
new file mode 100644
index 0000000..7f894eb
--- /dev/null
+++ b/p2s/src/main.rs
@@ -0,0 +1,101 @@
+use exoquant::{ditherer, Color, Remapper, SimpleColorSpace};
+use fimg::{scale::Nearest, DynImage, Image};
+use mindus::{
+ block::{Rotation, SORTER},
+ data::dynamic::DynData,
+ item::Type::*,
+ Schematic,
+};
+use std::process::ExitCode;
+macro_rules! fail {
+ () => {
+ fail!("<in> (<width>x<height>)")
+ };
+ ($usage:literal) => {{
+ eprintln!(concat!("usage: p2s ", comat::comat!($usage)));
+ return ExitCode::FAILURE;
+ }};
+}
+const ITEMS: [mindus::item::Type; 22] = [
+ Copper,
+ Lead,
+ Metaglass,
+ Graphite,
+ Sand,
+ Coal,
+ Titanium,
+ Thorium,
+ Scrap,
+ Silicon,
+ Plastanium,
+ PhaseFabric,
+ SurgeAlloy,
+ SporePod,
+ BlastCompound,
+ Pyratite,
+ Beryllium,
+ Tungsten,
+ Oxide,
+ Carbide,
+ FissileMatter,
+ DormantCyst,
+];
+
+fn main() -> ExitCode {
+ let mut args = std::env::args().skip(1);
+ let Some(input) = args.next() else {
+ fail!("{bold_red}<input_file>{reset}");
+ };
+ let mut img = DynImage::open(input).to_rgb();
+ let palette = ITEMS
+ .map(|i| i.color())
+ .map(|(r, g, b)| Color::new(r, g, b, 255));
+
+ if let Some(size) = args.next() {
+ let Some((w, h)) = size.split_once('x') else {
+ fail!(".. <w>{bold_red}x{reset}<h>")
+ };
+ let Ok(w) = w.parse() else {
+ fail!(".. <width: valid number>x<h>")
+ };
+ let Ok(h) = h.parse() else {
+ fail!(".. <w>x<h: valid number>")
+ };
+ img = img.scale::<Nearest>(w, h);
+ }
+
+ let quant = Remapper::new(&palette, &SimpleColorSpace::default(), &ditherer::None).remap(
+ &img.chunked()
+ .map(|&[r, g, b]| Color::new(r, g, b, 255))
+ .collect::<Vec<_>>(),
+ img.width() as usize,
+ );
+ Image::<Box<[u8]>, 3>::build(img.width(), img.height())
+ .buf(
+ quant
+ .iter()
+ .map(|&i| ITEMS[i as usize].color())
+ .flat_map(|(r, g, b)| [r, g, b])
+ .collect(),
+ )
+ .scale::<Nearest>(img.width() * 4, img.height() * 4)
+ .save("quant.png");
+ let mut s = Schematic::new(img.width() as usize, img.height() as usize);
+ for x in 0..img.width() as usize {
+ for y in 0..img.height() as usize {
+ s.set(
+ x as usize,
+ y as usize,
+ &SORTER,
+ DynData::Content(
+ mindus::content::Type::Item,
+ quant[(img.height() as usize - y - 1) * img.width() as usize + x] as u16,
+ ),
+ Rotation::Up,
+ )
+ .unwrap();
+ }
+ }
+ clipp::copy(s.serialize_base64().unwrap());
+ ExitCode::SUCCESS
+}
diff --git a/src/block/campaign.rs b/src/block/campaign.rs
deleted file mode 100644
index 1283f3e..0000000
--- a/src/block/campaign.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-//! campaign blocks
-use crate::block::make_register;
-use crate::block::simple::{cost, BasicBlock};
-make_register! {
- "launch-pad" -> BasicBlock::new(3, true, cost!(Copper: 350, Lead: 200, Titanium: 150, Silicon: 140));
- "interplanetary-accelerator" -> BasicBlock::new(7, true, cost!(Copper: 16000, Silicon: 11000, Thorium: 13000, Titanium: 12000, SurgeAlloy: 6000, PhaseFabric: 5000));
-}
diff --git a/src/block/content.rs b/src/block/content.rs
deleted file mode 100644
index d07eb05..0000000
--- a/src/block/content.rs
+++ /dev/null
@@ -1,420 +0,0 @@
-//! everything
-use crate::content::content_enum;
-
-content_enum! {
- pub enum Type / Block for u16 | TryFromU16Error
- {
- "air",
- "spawn",
- "cliff",
- "build1",
- "build2",
- "build3",
- "build4",
- "build5",
- "build6",
- "build7",
- "build8",
- "build9",
- "build10",
- "build11",
- "build12",
- "build13",
- "build14",
- "build15",
- "build16",
- "deep-water",
- "shallow-water",
- "tainted-water",
- "deep-tainted-water",
- "darksand-tainted-water",
- "sand-water",
- "darksand-water",
- "tar",
- "pooled-cryofluid",
- "molten-slag",
- "space",
- "empty",
- "stone",
- "crater-stone",
- "char",
- "basalt",
- "hotrock",
- "magmarock",
- "sand-floor",
- "darksand",
- "dirt",
- "mud",
- "dacite",
- "rhyolite",
- "rhyolite-crater",
- "rough-rhyolite",
- "regolith",
- "yellow-stone",
- "carbon-stone",
- "ferric-stone",
- "ferric-craters",
- "beryllic-stone",
- "crystalline-stone",
- "crystal-floor",
- "yellow-stone-plates",
- "red-stone",
- "dense-red-stone",
- "red-ice",
- "arkycite-floor",
- "arkyic-stone",
- "rhyolite-vent",
- "carbon-vent",
- "arkyic-vent",
- "yellow-stone-vent",
- "red-stone-vent",
- "crystalline-vent",
- "redmat",
- "bluemat",
- "grass",
- "salt",
- "snow",
- "ice",
- "ice-snow",
- "shale",
- "moss",
- "core-zone",
- "spore-moss",
- "stone-wall",
- "spore-wall",
- "dirt-wall",
- "dacite-wall",
- "ice-wall",
- "snow-wall",
- "dune-wall",
- "regolith-wall",
- "yellow-stone-wall",
- "rhyolite-wall",
- "carbon-wall",
- "ferric-stone-wall",
- "beryllic-stone-wall",
- "arkyic-wall",
- "crystalline-stone-wall",
- "red-ice-wall",
- "red-stone-wall",
- "red-diamond-wall",
- "sand-wall",
- "salt-wall",
- "shrubs",
- "shale-wall",
- "spore-pine",
- "snow-pine",
- "pine",
- "white-tree-dead",
- "white-tree",
- "spore-cluster",
- "redweed",
- "pur-bush",
- "yellowcoral",
- "boulder",
- "snow-boulder",
- "shale-boulder",
- "sand-boulder",
- "dacite-boulder",
- "basalt-boulder",
- "carbon-boulder",
- "ferric-boulder",
- "beryllic-boulder",
- "yellow-stone-boulder",
- "arkyic-boulder",
- "crystal-cluster",
- "vibrant-crystal-cluster",
- "crystal-blocks",
- "crystal-orbs",
- "crystalline-boulder",
- "red-ice-boulder",
- "rhyolite-boulder",
- "red-stone-boulder",
- "metal-floor",
- "metal-floor-damaged",
- "metal-floor-2",
- "metal-floor-3",
- "metal-floor-4",
- "metal-floor-5",
- "dark-panel-1",
- "dark-panel-2",
- "dark-panel-3",
- "dark-panel-4",
- "dark-panel-5",
- "dark-panel-6",
- "dark-metal",
- "pebbles",
- "tendrils",
- "ore-copper",
- "ore-lead",
- "ore-scrap",
- "ore-coal",
- "ore-titanium",
- "ore-thorium",
- "ore-beryllium",
- "ore-tungsten",
- "ore-crystal-thorium",
- "ore-wall-thorium",
- "ore-wall-beryllium",
- "graphitic-wall",
- "ore-wall-tungsten",
- "graphite-press",
- "multi-press",
- "silicon-smelter",
- "silicon-crucible",
- "kiln",
- "plastanium-compressor",
- "phase-weaver",
- "surge-smelter",
- "cryofluid-mixer",
- "pyratite-mixer",
- "blast-mixer",
- "melter",
- "separator",
- "disassembler",
- "spore-press",
- "pulverizer",
- "coal-centrifuge",
- "incinerator",
- "silicon-arc-furnace",
- "electrolyzer",
- "atmospheric-concentrator",
- "oxidation-chamber",
- "electric-heater",
- "slag-heater",
- "phase-heater",
- "heat-redirector",
- "heat-router",
- "slag-incinerator",
- "carbide-crucible",
- "slag-centrifuge",
- "surge-crucible",
- "cyanogen-synthesizer",
- "phase-synthesizer",
- "heat-reactor",
- "copper-wall",
- "copper-wall-large",
- "titanium-wall",
- "titanium-wall-large",
- "plastanium-wall",
- "plastanium-wall-large",
- "thorium-wall",
- "thorium-wall-large",
- "phase-wall",
- "phase-wall-large",
- "surge-wall",
- "surge-wall-large",
- "door",
- "door-large",
- "scrap-wall",
- "scrap-wall-large",
- "scrap-wall-huge",
- "scrap-wall-gigantic",
- "thruster",
- "beryllium-wall",
- "beryllium-wall-large",
- "tungsten-wall",
- "tungsten-wall-large",
- "blast-door",
- "reinforced-surge-wall",
- "reinforced-surge-wall-large",
- "carbide-wall",
- "carbide-wall-large",
- "shielded-wall",
- "mender",
- "mend-projector",
- "overdrive-projector",
- "overdrive-dome",
- "force-projector",
- "shock-mine",
- "radar",
- "build-tower",
- "regen-projector",
- "shockwave-tower",
- "shield-projector",
- "large-shield-projector",
- "conveyor",
- "titanium-conveyor",
- "plastanium-conveyor",
- "armored-conveyor",
- "junction",
- "bridge-conveyor",
- "phase-conveyor",
- "sorter",
- "inverted-sorter",
- "router",
- "distributor",
- "overflow-gate",
- "underflow-gate",
- "mass-driver",
- "duct",
- "armored-duct",
- "duct-router",
- "overflow-duct",
- "underflow-duct",
- "duct-bridge",
- "duct-unloader",
- "surge-conveyor",
- "surge-router",
- "unit-cargo-loader",
- "unit-cargo-unload-point",
- "mechanical-pump",
- "rotary-pump",
- "impulse-pump",
- "conduit",
- "pulse-conduit",
- "plated-conduit",
- "liquid-router",
- "liquid-container",
- "liquid-tank",
- "liquid-junction",
- "bridge-conduit",
- "phase-conduit",
- "reinforced-pump",
- "reinforced-conduit",
- "reinforced-liquid-junction",
- "reinforced-bridge-conduit",
- "reinforced-liquid-router",
- "reinforced-liquid-container",
- "reinforced-liquid-tank",
- "power-node",
- "power-node-large",
- "surge-tower",
- "diode",
- "battery",
- "battery-large",
- "combustion-generator",
- "thermal-generator",
- "steam-generator",
- "differential-generator",
- "rtg-generator",
- "solar-panel",
- "solar-panel-large",
- "thorium-reactor",
- "impact-reactor",
- "beam-node",
- "beam-tower",
- "beam-link",
- "turbine-condenser",
- "chemical-combustion-chamber",
- "pyrolysis-generator",
- "flux-reactor",
- "neoplasia-reactor",
- "mechanical-drill",
- "pneumatic-drill",
- "laser-drill",
- "blast-drill",
- "water-extractor",
- "cultivator",
- "oil-extractor",
- "vent-condenser",
- "cliff-crusher",
- "plasma-bore",
- "large-plasma-bore",
- "impact-drill",
- "eruption-drill",
- "core-shard",
- "core-foundation",
- "core-nucleus",
- "core-bastion",
- "core-citadel",
- "core-acropolis",
- "container",
- "vault",
- "unloader",
- "reinforced-container",
- "reinforced-vault",
- "duo",
- "scatter",
- "scorch",
- "hail",
- "wave",
- "lancer",
- "arc",
- "parallax",
- "swarmer",
- "salvo",
- "segment",
- "tsunami",
- "fuse",
- "ripple",
- "cyclone",
- "foreshadow",
- "spectre",
- "meltdown",
- "breach",
- "diffuse",
- "sublimate",
- "titan",
- "disperse",
- "afflict",
- "lustre",
- "scathe",
- "smite",
- "malign",
- "ground-factory",
- "air-factory",
- "naval-factory",
- "additive-reconstructor",
- "multiplicative-reconstructor",
- "exponential-reconstructor",
- "tetrative-reconstructor",
- "repair-point",
- "repair-turret",
- "tank-fabricator",
- "ship-fabricator",
- "mech-fabricator",
- "tank-refabricator",
- "mech-refabricator",
- "ship-refabricator",
- "prime-refabricator",
- "tank-assembler",
- "ship-assembler",
- "mech-assembler",
- "basic-assembler-module",
- "unit-repair-tower",
- "payload-conveyor",
- "payload-router",
- "reinforced-payload-conveyor",
- "reinforced-payload-router",
- "payload-mass-driver",
- "large-payload-mass-driver",
- "small-deconstructor",
- "deconstructor",
- "constructor",
- "large-constructor",
- "payload-loader",
- "payload-unloader",
- "power-source",
- "power-void",
- "item-source",
- "item-void",
- "liquid-source",
- "liquid-void",
- "payload-source",
- "payload-void",
- "heat-source",
- "illuminator",
- "legacy-mech-pad",
- "legacy-unit-factory",
- "legacy-unit-factory-air",
- "legacy-unit-factory-ground",
- "command-center",
- "launch-pad",
- "interplanetary-accelerator",
- "message",
- "switch",
- "micro-processor",
- "logic-processor",
- "hyper-processor",
- "memory-cell",
- "memory-bank",
- "logic-display",
- "large-logic-display",
- "canvas",
- "reinforced-message",
- "world-processor",
- "world-cell",
- "world-message",
- }
-}
diff --git a/src/block/defense.rs b/src/block/defense.rs
deleted file mode 100644
index b1548bc..0000000
--- a/src/block/defense.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-//! defense
-use crate::block::simple::{cost, make_simple, BasicBlock};
-use crate::block::*;
-make_simple!(HeatedBlock => |_, _, _, buff: &mut DataRead| read_heated(buff));
-make_simple!(RadarBlock => |_, _, _, buff: &mut DataRead| buff.skip(4));
-make_simple!(ShieldBlock => |_, _, _, buff: &mut DataRead| read_shield(buff));
-make_register! {
- "mender" -> HeatedBlock::new(1, true, cost!(Copper: 25, Lead: 30));
- "mend-projector" -> HeatedBlock::new(2, true, cost!(Copper: 50, Lead: 100, Titanium: 25, Silicon: 40));
- "overdrive-projector" -> HeatedBlock::new(2, true, cost!(Lead: 100, Titanium: 75, Silicon: 75, Plastanium: 30));
- "overdrive-dome" -> HeatedBlock::new(3, true, cost!(Lead: 200, Titanium: 130, Silicon: 130, Plastanium: 80, SurgeAlloy: 120));
- "force-projector" -> BasicBlock::new(3, true, cost!(Lead: 100, Titanium: 75, Silicon: 125));
- "regen-projector" -> BasicBlock::new(3, true, cost!(Silicon: 80, Tungsten: 60, Oxide: 40, Beryllium: 80));
- "shock-mine" -> BasicBlock::new(1, true, cost!(Lead: 25, Silicon: 12));
- "radar" -> RadarBlock::new(1, true, cost!(Silicon: 60, Graphite: 50, Beryllium: 10));
- "build-tower" -> BasicBlock::new(3, true, cost!(Silicon: 150, Oxide: 40, Thorium: 60));
- "shockwave-tower" -> BasicBlock::new(3, true, cost!(SurgeAlloy: 50, Silicon: 150, Oxide: 30, Tungsten: 100));
- // barrier projector
- // editor only
- "barrier-projector" -> BasicBlock::new(3, true, &[]);
- "shield-projector" -> ShieldBlock::new(3, true, &[]);
- "large-shield-projector" -> ShieldBlock::new(4, true, &[]);
-}
-
-/// format:
-/// - heat: [`f32`]
-/// - phase heat: [`f32`]
-fn read_heated(buff: &mut DataRead) -> Result<(), DataReadError> {
- buff.skip(8)
-}
-
-/// format:
-/// - smoothing: [`f32`]
-/// - broken: [`bool`]
-fn read_shield(buff: &mut DataRead) -> Result<(), DataReadError> {
- buff.skip(5)
-}
diff --git a/src/block/drills.rs b/src/block/drills.rs
deleted file mode 100644
index 4558666..0000000
--- a/src/block/drills.rs
+++ /dev/null
@@ -1,44 +0,0 @@
-//! extraction of raw resources (mine part)
-use super::production::ProductionBlock;
-use crate::block::simple::{cost, make_simple, BasicBlock};
-use crate::block::*;
-
-make_simple!(
- DrillBlock,
- |_, name, _, _, rot: Rotation, s| {
- let mut base =
- load!(from name which is ["large-plasma-bore" | "plasma-bore" | "cliff-crusher"], s);
- unsafe {
- base.overlay(load!(concat "top" => name which is ["large-plasma-bore" | "plasma-bore" | "cliff-crusher"], s).rotate(rot.rotated(false).count()) )
- };
- base
- },
- |_, _, _, buff: &mut DataRead| read_drill(buff)
-);
-make_simple!(WallDrillBlock, |_, _, _, _, rot: Rotation, scl| {
- let mut base = load!("cliff-crusher", scl);
- unsafe { base.overlay(load!("cliff-crusher-top", scl).rotate(rot.rotated(false).count())) };
- base
-});
-
-make_register! {
- "mechanical-drill" -> DrillBlock::new(2, true, cost!(Copper: 12));
- "pneumatic-drill" -> DrillBlock::new(2, true, cost!(Copper: 18, Graphite: 10));
- "laser-drill" -> DrillBlock::new(3, true, cost!(Copper: 35, Graphite: 30, Titanium: 20, Silicon: 30));
- "blast-drill" -> DrillBlock::new(4, true, cost!(Copper: 65, Titanium: 50, Thorium: 75, Silicon: 60));
- "water-extractor" -> BasicBlock::new(2, true, cost!(Copper: 30, Lead: 30, Metaglass: 30, Graphite: 30));
- "oil-extractor" -> BasicBlock::new(3, true, cost!(Copper: 150, Lead: 115, Graphite: 175, Thorium: 115, Silicon: 75));
- "vent-condenser" -> ProductionBlock::new(3, true, cost!(Graphite: 20, Beryllium: 60));
- "cliff-crusher" -> WallDrillBlock::new(2, false, cost!(Beryllium: 100, Graphite: 40));
- "plasma-bore" => DrillBlock::new(2, false, cost!(Beryllium: 40));
- "large-plasma-bore" => DrillBlock::new(3, false, cost!(Silicon: 100, Oxide: 25, Beryllium: 100, Tungsten: 70));
- "impact-drill" -> DrillBlock::new(4, true, cost!(Silicon: 70, Beryllium: 90, Graphite: 60));
- "eruption-drill" -> DrillBlock::new(5, true, cost!(Silicon: 200, Oxide: 20, Tungsten: 200, Thorium: 120));
-}
-
-/// format:
-/// - progress: [`f32`]
-/// - warmup: [`f32`]
-fn read_drill(buff: &mut DataRead) -> Result<(), DataReadError> {
- buff.skip(8)
-}
diff --git a/src/block/environment.rs b/src/block/environment.rs
deleted file mode 100644
index 3fff74f..0000000
--- a/src/block/environment.rs
+++ /dev/null
@@ -1,192 +0,0 @@
-//! grass
-use crate::block::make_register;
-use crate::block::simple::BasicBlock;
-
-macro_rules! register_env {
- ($($field:literal: $size:literal;)+) => {
- make_register!(
- $($field -> BasicBlock::new($size, true, &[]);)*
- );
- };
-}
-
-register_env! {
- "darksand": 1;
- "sand-floor": 1;
- "yellow-stone": 1;
- "arkyic-stone": 1;
- "carbon-stone": 1;
- "ore-beryllium": 1;
- "ore-copper": 1;
- "ore-lead": 1;
- "ore-coal": 1;
- "ore-scrap": 1;
- "ore-thorium": 1;
- "ore-titanium": 1;
- "ore-tungsten": 1;
- "ore-crystal-thorium": 1;
- "ore-wall-beryllium": 1;
- "ore-wall-thorium": 1;
- "ore-wall-tungsten": 1;
- "graphitic-wall": 1;
- "graphitic-wall-large": 2;
- "dacite": 1;
- "dirt": 1;
- "arkycite-floor": 1;
- "basalt": 1;
- "ice": 1;
- "molten-slag": 1;
- "moss": 1;
- "mud": 1;
- "magmarock": 1;
- "grass": 1;
- "ice-snow": 1;
- "hotrock": 1;
- "char": 1;
- "snow": 1;
- "salt": 1;
- "shale": 1;
- "metal-floor": 1;
- "metal-floor-2": 1;
- "metal-floor-3": 1;
- "metal-floor-4": 1;
- "metal-floor-5": 1;
- "dark-panel-1": 1;
- "dark-panel-2": 1;
- "dark-panel-3": 1;
- "dark-panel-4": 1;
- "dark-panel-5": 1;
- "dark-panel-6": 1;
- "darksand-tainted-water": 1;
- "darksand-water": 1;
- "deep-tainted-water": 1;
- "deep-water": 1;
- "sand-water": 1;
- "shallow-water": 1;
- "space": 1;
- "stone": 1;
- "build1": 1;
- "boulder": 1;
- "arkyic-vent": 1;
- "arkyic-wall-large": 2;
- "arkyic-wall": 1;
- "beryllic-stone-wall-large": 2;
- "beryllic-stone-wall": 1;
- "beryllic-stone": 1;
- "bluemat": 1;
- "carbon-vent": 1;
- "carbon-wall-large": 2;
- "carbon-wall": 1;
- "cliff": 1;
- "core-zone": 1;
- "crater-stone": 1;
- "crystal-floor": 1;
- "crystalline-stone-wall-large": 2;
- "crystalline-stone-wall": 1;
- "crystalline-stone": 1;
- "crystalline-vent": 3;
- "dacite-wall-large": 2;
- "dacite-wall": 1;
- "dark-metal-large": 2;
- "dark-metal": 1;
- "metal-floor-damaged": 1;
- "dense-red-stone": 1;
- "dirt-wall-large": 2;
- "dirt-wall": 1;
- "dune-wall-large": 2;
- "dune-wall": 1;
- "ferric-craters": 1; // ferris section
- "ferric-stone-wall-large": 2;
- "ferric-stone-wall": 1;
- "ferric-stone": 1;
- "ice-wall-large": 2;
- "ice-wall": 1;
- "pebbles": 1;
- "pine": 1;
- "pooled-cryofluid": 1;
- "red-diamond-wall": 1;
- "red-ice-wall-large": 2;
- "red-ice-wall": 1;
- "red-ice": 1;
- "red-stone-vent": 1;
- "red-stone-wall-large": 2;
- "red-stone-wall": 1;
- "red-stone": 1;
- "redmat": 1;
- "regolith-wall-large": 2;
- "regolith-wall": 1;
- "regolith": 1;
- "rhyolite-crater": 1;
- "rhyolite-vent": 1;
- "rhyolite-wall-large": 2;
- "rhyolite-wall": 1;
- "rhyolite": 1;
- "rough-rhyolite": 1;
- "salt-wall-large": 2;
- "salt-wall": 1;
- "sand-wall-large": 2;
- "sand-wall": 1;
- "shale-wall-large": 2;
- "shale-wall": 1;
- "shrubs-large": 2;
- "shrubs": 1;
- "snow-pine": 1;
- "snow-wall-large": 2;
- "snow-wall": 1;
- "spawn": 1;
- "spore-moss": 1;
- "spore-pine": 1;
- "spore-wall-large": 2;
- "spore-wall": 1;
- "stone-wall-large": 2;
- "stone-wall": 1;
- "tainted-water": 1;
- "tar": 1;
- "yellow-stone-plates": 1;
- "yellow-stone-vent": 1;
- "yellow-stone-wall-large": 2;
- "yellow-stone-wall": 1;
- // props
- "yellow-stone-boulder": 1;
- "snow-boulder": 1;
- "shale-boulder": 1;
- "arkyic-boulder": 1;
- "basalt-boulder": 1;
- "beryllic-boulder": 1;
- "carbon-boulder": 1;
- "crystalline-boulder": 1;
- "dacite-boulder": 1;
- "ferric-boulder": 1;
- "red-ice-boulder": 1;
- "red-stone-boulder": 1;
- "rhyolite-boulder": 1;
- "sand-boulder": 1;
- "pur-bush": 1;
- "tendrils": 1;
- // these are tall but uh (TODO layering)
- "white-tree-dead": 1;
- "yellowcoral": 1;
- "white-tree": 1;
- "redweed": 1;
- "spore-cluster": 1;
- "crystal-blocks": 1;
- "crystal-cluster": 1;
- "vibrant-crystal-cluster": 1;
- "crystal-orbs": 1;
- // end tall
- "build2": 1;
- "build3": 1;
- "build4": 1;
- "build5": 1;
- "build6": 1;
- "build7": 1;
- "build8": 1;
- "build9": 1;
- "build10": 1;
- "build11": 1;
- "build12": 1;
- "build13": 1;
- "build14": 1;
- "build15": 1;
- "build16": 1;
-}
diff --git a/src/block/liquid.rs b/src/block/liquid.rs
deleted file mode 100644
index d20fb47..0000000
--- a/src/block/liquid.rs
+++ /dev/null
@@ -1,158 +0,0 @@
-//! liquid related things
-use thiserror::Error;
-
-use crate::block::distribution::BridgeBlock;
-use crate::block::simple::*;
-use crate::block::*;
-use crate::content;
-use crate::data::dynamic::DynType;
-use crate::data::renderer::load;
-use crate::fluid;
-use crate::utils::ImageUtils;
-
-make_simple!(ConduitBlock, |_,
- name,
- _,
- ctx: Option<&RenderingContext>,
- rot,
- s| {
- let ctx = ctx.unwrap();
-
- let mask = mask(ctx, rot, name);
- // TODO caps. stopped trying bcz too complex
- mask2tile(mask, rot, name, s)
-});
-
-make_register! {
- "reinforced-pump" -> BasicBlock::new(2, true, cost!(Beryllium: 40, Tungsten: 30, Silicon: 20));
- "mechanical-pump" -> BasicBlock::new(1, true, cost!(Copper: 15, Metaglass: 10));
- "rotary-pump" -> BasicBlock::new(2, true, cost!(Copper: 70, Metaglass: 50, Titanium: 35, Silicon: 20));
- "impulse-pump" -> BasicBlock::new(3, true, cost!(Copper: 80, Metaglass: 90, Titanium: 40, Thorium: 35, Silicon: 30));
- "conduit" => ConduitBlock::new(1, false, cost!(Metaglass: 1));
- "pulse-conduit" => ConduitBlock::new(1, false, cost!(Metaglass: 1, Titanium: 2));
- "plated-conduit" => ConduitBlock::new(1, false, cost!(Metaglass: 1, Thorium: 2, Plastanium: 1));
- "liquid-router" -> BasicBlock::new(1, true, cost!(Metaglass: 2, Graphite: 4));
- "liquid-container" -> BasicBlock::new(2, true, cost!(Metaglass: 15, Titanium: 10));
- "liquid-tank" -> BasicBlock::new(3, true, cost!(Metaglass: 40, Titanium: 30));
- "liquid-junction" -> BasicBlock::new(1, true, cost!(Metaglass: 8, Graphite: 4));
- "bridge-conduit" -> BridgeBlock::new(1, true, cost!(Metaglass: 8, Graphite: 4), 4, true);
- "phase-conduit" -> BridgeBlock::new(1, true, cost!(Metaglass: 20, Titanium: 10, Silicon: 7, PhaseFabric: 5), 12, true);
- "reinforced-conduit" => ConduitBlock::new(1, false, cost!(Beryllium: 2));
- "reinforced-liquid-junction" -> BasicBlock::new(1, true, cost!(Graphite: 4, Beryllium: 8));
- "reinforced-bridge-conduit" => BridgeBlock::new(1, true, cost!(Graphite: 8, Beryllium: 20), 4, true);
- "reinforced-liquid-router" -> BasicBlock::new(1, true, cost!(Graphite: 8, Beryllium: 4));
- "reinforced-liquid-container" -> BasicBlock::new(2, true, cost!(Tungsten: 10, Beryllium: 16));
- "reinforced-liquid-tank" -> BasicBlock::new(3, true, cost!(Tungsten: 40, Beryllium: 50));
- // sandbox only
- "liquid-source" => FluidBlock::new(1, true, &[]);
- "liquid-void" -> BasicBlock::new(1, true, &[]);
-}
-
-pub struct FluidBlock {
- size: u8,
- symmetric: bool,
- build_cost: BuildCost,
-}
-
-impl FluidBlock {
- #[must_use]
- pub const fn new(size: u8, symmetric: bool, build_cost: BuildCost) -> Self {
- assert!(size != 0, "invalid size");
- Self {
- size,
- symmetric,
- build_cost,
- }
- }
-
- state_impl!(pub Option<fluid::Type>);
-}
-
-impl BlockLogic for FluidBlock {
- impl_block!();
-
- fn data_from_i32(&self, config: i32, _: GridPos) -> Result<DynData, DataConvertError> {
- if config < 0 || config > i32::from(u16::MAX) {
- return Err(DataConvertError::Custom(Box::new(FluidConvertError(
- config,
- ))));
- }
- Ok(DynData::Content(content::Type::Fluid, config as u16))
- }
-
- fn deserialize_state(&self, data: DynData) -> Result<Option<State>, DeserializeError> {
- match data {
- DynData::Empty => Ok(Some(Self::create_state(None))),
- DynData::Content(content::Type::Fluid, id) => Ok(Some(Self::create_state(Some(
- FluidDeserializeError::forward(fluid::Type::try_from(id))?,
- )))),
- DynData::Content(have, ..) => Err(DeserializeError::Custom(Box::new(
- FluidDeserializeError::ContentType(have),
- ))),
- _ => Err(DeserializeError::InvalidType {
- have: data.get_type(),
- expect: DynType::Content,
- }),
- }
- }
-
- fn serialize_state(&self, state: &State) -> Result<DynData, SerializeError> {
- Ok(Self::get_state(state)
- .as_ref()
- .map_or(DynData::Empty, |&fluid| {
- DynData::Content(content::Type::Fluid, fluid.into())
- }))
- }
-
- fn draw(
- &self,
- _: &str,
- state: Option<&State>,
- _: Option<&RenderingContext>,
- _: Rotation,
- s: Scale,
- ) -> ImageHolder<4> {
- let mut p = load!("liquid-source", s);
- if let Some(state) = state && let Some(liq) = Self::get_state(state) {
- let mut top = load!("center", s);
- unsafe { p.overlay(top.tint(liq.color())) };
- return p;
- }
- p
- }
-
- /// format:
- /// - fluid: [`u16`] as [`Fluid`](fluid::Type)
- fn read(
- &self,
- b: &mut Build,
- _: &BlockRegistry,
- _: &EntityMapping,
- buff: &mut DataRead,
- ) -> Result<(), DataReadError> {
- let f = buff.read_u16()?;
- b.state = Some(Self::create_state(fluid::Type::try_from(f).ok()));
- Ok(())
- }
-}
-
-#[derive(Clone, Copy, Debug, Eq, PartialEq, Error)]
-#[error("invalid config ({0}) for fluid")]
-pub struct FluidConvertError(pub i32);
-
-#[derive(Clone, Copy, Debug, Eq, PartialEq, Error)]
-pub enum FluidDeserializeError {
- #[error("expected Fluid but got {0:?}")]
- ContentType(content::Type),
- #[error("fluid not found")]
- NotFound(#[from] fluid::TryFromU16Error),
-}
-
-impl FluidDeserializeError {
- pub fn forward<T, E: Into<Self>>(result: Result<T, E>) -> Result<T, DeserializeError> {
- match result {
- Ok(v) => Ok(v),
- Err(e) => Err(DeserializeError::Custom(Box::new(e.into()))),
- }
- }
-}
diff --git a/src/block/mod.rs b/src/block/mod.rs
deleted file mode 100644
index 15b6d97..0000000
--- a/src/block/mod.rs
+++ /dev/null
@@ -1,642 +0,0 @@
-//! deal with blocks.
-//!
-//! categorized as mindustry categorizes them in its assets folder, for easy drawing.
-//!
-//! with the exception of sandbox, that is.
-use bobbin_bits::U4::{self, B0000, B0001, B0010, B0100, B1000};
-use std::error::Error;
-use std::fmt;
-
-use crate::data::dynamic::{DynData, DynType};
-use crate::data::map::{Build, EntityMapping};
-use crate::data::{self, renderer::*, CompressError};
-use crate::data::{DataRead, GridPos, ReadError as DataReadError};
-use crate::item::storage::ItemStorage;
-use crate::registry::RegistryEntry;
-
-macro_rules! mods {
- ($($mod:ident)*) => {
- $(pub mod $mod;)*
-
- pub mod all {
- $(pub use crate::block::$mod::*;)*
- pub use super::simple::BasicBlock;
- }
- }
-}
-
-mods! {
- campaign content defense distribution drills environment liquid logic payload power production storage turrets walls units
-}
-
-mod simple;
-
-macro_rules! disp {
- ($($k:ident,)+) => {
- use all::{$($k,)+};
- #[enum_dispatch::enum_dispatch]
- pub(crate) enum BlockLogicEnum {
- $($k,)+
- }
- #[const_trait]
- pub trait ConstFrom<T>: Sized {
- fn fro(value: T) -> Self;
- }
- $(
- impl const ConstFrom<$k> for BlockLogicEnum {
- fn fro(v: $k) -> Self {
- BlockLogicEnum::$k(v)
- }
- }
- )+
-
- /*impl std::fmt::Debug for BlockLogicEnum {
- fn fmt(&self, w: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
- match self {
- $(BlockLogicEnum::$k { .. } => write!(w, stringify!($k)),)+
- }
- }
- }*/
- }
-}
-
-disp! {
- BasicBlock,
- WallBlock,
- DuctBlock,
- BridgeBlock,
- ItemBlock,
- ProductionBlock,
- SeparatorBlock,
- StackConveyor,
- HeatCrafter,
- ConnectorBlock,
- ItemTurret,
- ConveyorBlock,
- WallDrillBlock,
- DrillBlock,
- NuclearGeneratorBlock,
- GeneratorBlock,
- ConduitBlock,
- HeatedBlock,
- RadarBlock,
- ShieldBlock,
- PointDefenseTurret,
- JunctionBlock,
- Turret,
- MemoryBlock,
- MessageLogic,
- ConstructorBlock,
- AssemblerBlock,
- UnitFactory,
- SimpleDuctBlock,
- SurgeRouter,
- SimplePayloadBlock,
- PayloadConveyor,
- ImpactReactorBlock,
- Neoplasia,
- DiodeBlock,
- HeatConduit,
- ContinousTurret,
- TractorBeamTurret,
- AssemblerModule,
- RepairTurret,
- FluidBlock,
- CanvasBlock,
- SwitchLogic,
- ProcessorLogic,
- PayloadBlock,
- LampBlock,
- DoorBlock,
-}
-
-pub trait Cast {
- fn downcast_ref(state: &State) -> Option<&Self>;
- fn downcast_mut(state: &mut State) -> Option<&mut Self>;
-}
-
-macro_rules! stater {
- ($($k: ident($v: ty),)+) => {
- #[derive(Debug, Clone)]
- pub enum State {
- $($k($v),)+
- }
-
- $(
- impl From<$v> for State {
- fn from(v: $v) -> State { State::$k(v) }
- }
-
- impl Cast for $v {
- fn downcast_ref(state: &State) -> Option<&Self> {
- match state {
- State::$k(v) => Some(v),
- _ => None,
- }
- }
- fn downcast_mut(state: &mut State) -> Option<&mut Self> {
- match state {
- State::$k(v) => Some(v),
- _ => None,
- }
- }
- }
- )+
- }
-}
-
-stater! {
- // TODO deoptionize
- String(String),
- Item(Option<crate::item::Type>),
- Fluid(Option<crate::fluid::Type>),
- Image(Image<Vec<u8>, 1>),
- Point(Option<(i32, i32)>),
- Bool(bool),
- Processor(logic::ProcessorState),
- Payload(payload::Payload),
- Power(Vec<(i16, i16)>),
- Color(power::Rgba),
- Command(Option<crate::data::command::UnitCommand>),
- Unit(Option<crate::unit::Type>),
-}
-
-impl State {
- pub fn downcast_ref<T: Cast>(&self) -> Option<&T> {
- T::downcast_ref(self)
- }
-
- pub fn downcast_mut<T: Cast>(&mut self) -> Option<&mut T> {
- T::downcast_mut(self)
- }
-
- pub fn new<T: Into<Self>>(from: T) -> Self {
- from.into()
- }
-}
-
-#[enum_dispatch::enum_dispatch(BlockLogicEnum)]
-pub trait BlockLogic {
- /// mindustry blocks are the same width and height
- fn get_size(&self) -> u8;
-
- fn is_symmetric(&self) -> bool;
-
- fn create_build_cost(&self) -> Option<ItemStorage>;
-
- fn data_from_i32(&self, config: i32, pos: GridPos) -> Result<DynData, DataConvertError>;
-
- fn deserialize_state(&self, data: DynData) -> Result<Option<State>, DeserializeError>;
-
- #[allow(unused_variables)]
- fn mirror_state(&self, state: &mut State, horizontally: bool, vertically: bool) {}
-
- #[allow(unused_variables)]
- fn rotate_state(&self, state: &mut State, clockwise: bool) {}
-
- fn serialize_state(&self, state: &State) -> Result<DynData, SerializeError>;
-
- #[allow(unused_variables)]
- fn draw(
- &self,
- name: &str,
- state: Option<&State>,
- context: Option<&RenderingContext>,
- rot: Rotation,
- scale: Scale,
- ) -> ImageHolder<4> {
- unimplemented!("{name}")
- }
-
- #[allow(unused_variables)]
- fn read(
- &self,
- build: &mut Build,
- reg: &BlockRegistry,
- mapping: &EntityMapping,
- buff: &mut DataRead,
- ) -> Result<(), DataReadError> {
- Ok(())
- }
-}
-
-// i wish i could derive
-macro_rules! impl_block {
- () => {
- fn get_size(&self) -> u8 {
- self.size
- }
-
- fn is_symmetric(&self) -> bool {
- self.symmetric
- }
-
- fn create_build_cost(&self) -> Option<$crate::item::storage::ItemStorage> {
- if self.build_cost.is_empty() {
- None
- } else {
- let mut storage = crate::item::storage::Storage::new();
- for (ty, cnt) in self.build_cost {
- storage.add(*ty, *cnt, u32::MAX);
- }
- Some(storage)
- }
- }
- };
-}
-pub(crate) use impl_block;
-
-#[derive(Debug, thiserror::Error)]
-pub enum DataConvertError {
- #[error(transparent)]
- Custom(#[from] Box<dyn Error + Sync + Send>),
-}
-
-impl DataConvertError {
- pub fn forward<T, E: Error + Sync + Send + 'static>(result: Result<T, E>) -> Result<T, Self> {
- match result {
- Ok(v) => Ok(v),
- Err(e) => Err(Self::Custom(Box::new(e))),
- }
- }
-}
-
-#[derive(Debug, thiserror::Error)]
-pub enum DeserializeError {
- #[error(transparent)]
- DecompressError(#[from] data::DecompressError),
- #[error("expected type {expect:?} but got {have:?}")]
- InvalidType { have: DynType, expect: DynType },
- #[error(transparent)]
- Custom(#[from] Box<dyn Error + Sync + Send>),
-}
-
-impl DeserializeError {
- pub fn forward<T, E: Error + Sync + Send + 'static>(result: Result<T, E>) -> Result<T, Self> {
- match result {
- Ok(v) => Ok(v),
- Err(e) => Err(Self::Custom(Box::new(e))),
- }
- }
-}
-
-#[derive(Debug, thiserror::Error)]
-pub enum SerializeError {
- #[error(transparent)]
- Custom(#[from] Box<dyn Error + Sync + Send>),
- #[error(transparent)]
- Compress(#[from] CompressError),
-}
-
-impl SerializeError {
- pub fn forward<T, E: Error + Sync + Send + 'static>(result: Result<T, E>) -> Result<T, Self> {
- match result {
- Ok(v) => Ok(v),
- Err(e) => Err(Self::Custom(Box::new(e))),
- }
- }
-}
-
-/// a block. put it in stuff!
-pub struct Block {
- image: Option<[Image<&'static [u8], 4>; 3]>,
- name: &'static str,
- logic: BlockLogicEnum,
-}
-
-impl PartialEq for Block {
- fn eq(&self, rhs: &Block) -> bool {
- self.name == rhs.name
- }
-}
-
-impl Block {
- /// create a new block
- #[must_use]
- #[inline]
- pub(crate) const fn new(
- name: &'static str,
- logic: BlockLogicEnum,
- image: Option<[Image<&'static [u8], 4>; 3]>,
- ) -> Self {
- Self { image, name, logic }
- }
-
- /// this blocks name
- /// ```
- /// assert!(mindus::block::distribution::DISTRIBUTOR.name() == "distributor")
- /// ```
- #[must_use]
- #[inline]
- pub const fn name(&self) -> &'static str {
- self.name
- }
-
- /// should you send context to [`image`]?
- #[must_use]
- #[inline]
- pub fn wants_context(&self) -> bool {
- use BlockLogicEnum::*;
- matches!(
- self.logic,
- ConveyorBlock(..) | DuctBlock(..) | StackConveyor(..) | ConduitBlock(..)
- )
- }
-
- /// draw this block, with this state
- #[must_use]
- #[inline]
- pub fn image(
- &self,
- state: Option<&State>,
- context: Option<&RenderingContext>,
- rot: Rotation,
- scale: Scale,
- ) -> ImageHolder<4> {
- if let Some(imgs) = &self.image {
- return ImageHolder::from((imgs[scale as usize]).copy());
- }
- self.logic.draw(self.name, state, context, rot, scale)
- }
-
- /// size.
- #[must_use]
- #[inline]
- pub fn get_size(&self) -> u8 {
- self.logic.get_size()
- }
-
- /// does it matter if its rotated
- #[must_use]
- #[inline]
- pub fn is_symmetric(&self) -> bool {
- self.logic.is_symmetric()
- }
-
- /// cost
- #[must_use]
- #[inline]
- pub fn get_build_cost(&self) -> Option<ItemStorage> {
- self.logic.create_build_cost()
- }
-
- pub(crate) fn data_from_i32(
- &self,
- config: i32,
- pos: GridPos,
- ) -> Result<DynData, DataConvertError> {
- self.logic.data_from_i32(config, pos)
- }
-
- pub(crate) fn deserialize_state(
- &self,
- data: DynData,
- ) -> Result<Option<State>, DeserializeError> {
- self.logic.deserialize_state(data)
- }
-
- pub(crate) fn mirror_state(&self, state: &mut State, horizontally: bool, vertically: bool) {
- self.logic.mirror_state(state, horizontally, vertically);
- }
-
- pub(crate) fn rotate_state(&self, state: &mut State, clockwise: bool) {
- self.logic.rotate_state(state, clockwise);
- }
-
- pub(crate) fn serialize_state(&self, state: &State) -> Result<DynData, SerializeError> {
- self.logic.serialize_state(state)
- }
-
- #[inline]
- pub(crate) fn read(
- &self,
- build: &mut Build,
- reg: &BlockRegistry,
- mapping: &EntityMapping,
- buff: &mut DataRead,
- ) -> Result<(), DataReadError> {
- self.logic.read(build, reg, mapping, buff)
- }
-}
-
-impl fmt::Debug for Block {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- write!(f, "Block<{:?}>", self.name)
- }
-}
-
-impl RegistryEntry for Block {
- fn get_name(&self) -> &str {
- self.name
- }
-}
-
-#[derive(Clone, Copy, Debug, Eq, PartialEq)]
-/// the possible rotation states of a object
-#[repr(u8)]
-pub enum Rotation {
- Up,
- Right,
- Down,
- Left,
-}
-
-impl Rotation {
- #[must_use]
- /// count rotations
- pub const fn count(self) -> u8 {
- self as u8
- }
-
- #[must_use]
- /// mask
- pub const fn mask(self) -> U4 {
- match self {
- Rotation::Up => B1000,
- Rotation::Right => B0100,
- Rotation::Down => B0010,
- Rotation::Left => B0001,
- }
- }
-
- #[must_use]
- /// character of this rot (Right => >, Up => ^, Left => <, Down => v)
- pub const fn ch(self) -> char {
- match self {
- Rotation::Right => '>',
- Rotation::Up => '^',
- Rotation::Left => '<',
- Rotation::Down => 'v',
- }
- }
-
- #[must_use]
- /// mirror the directions.
- pub const fn mirrored(self, horizontally: bool, vertically: bool) -> Self {
- match self {
- Self::Right => {
- if horizontally {
- Self::Left
- } else {
- Self::Right
- }
- }
- Self::Up => {
- if vertically {
- Self::Down
- } else {
- Self::Up
- }
- }
- Self::Left => {
- if horizontally {
- Self::Right
- } else {
- Self::Left
- }
- }
- Self::Down => {
- if vertically {
- Self::Up
- } else {
- Self::Down
- }
- }
- }
- }
-
- /// mirror in place
- pub fn mirror(&mut self, horizontally: bool, vertically: bool) {
- *self = self.mirrored(horizontally, vertically);
- }
-
- #[must_use]
- /// rotate the rotation
- pub const fn rotated(self, clockwise: bool) -> Self {
- match self {
- Self::Right => {
- if clockwise {
- Self::Down
- } else {
- Self::Up
- }
- }
- Self::Up => {
- if clockwise {
- Self::Right
- } else {
- Self::Left
- }
- }
- Self::Left => {
- if clockwise {
- Self::Up
- } else {
- Self::Down
- }
- }
- Self::Down => {
- if clockwise {
- Self::Left
- } else {
- Self::Right
- }
- }
- }
- }
-
- /// rotate the rotation in place
- pub fn rotate(&mut self, clockwise: bool) {
- *self = self.rotated(clockwise);
- }
-
- #[must_use]
- /// rotate 180
- pub const fn rotated_180(self) -> Self {
- match self {
- Self::Right => Self::Left,
- Self::Up => Self::Down,
- Self::Left => Self::Right,
- Self::Down => Self::Up,
- }
- }
-
- /// rotate 180 in place
- pub fn rotate_180(&mut self) {
- *self = self.rotated_180();
- }
-}
-
-impl From<u8> for Rotation {
- fn from(val: u8) -> Self {
- match val & 3 {
- 0 => Self::Right,
- 1 => Self::Up,
- 2 => Self::Left,
- _ => Self::Down,
- }
- }
-}
-
-impl From<Rotation> for u8 {
- fn from(rot: Rotation) -> Self {
- match rot {
- Rotation::Right => 0,
- Rotation::Up => 1,
- Rotation::Left => 2,
- Rotation::Down => 3,
- }
- }
-}
-
-pub type BlockRegistry<'l> = crate::registry::Registry<'l, Block>;
-pub type RegisterError<'l> = crate::registry::RegisterError<'l, Block>;
-
-macro_rules! make_register {
- ($($field:literal $op:tt $logic:expr;)+) => { paste::paste! {
- $(
- $crate::block::make_register!(impl $field $op $logic);
- )+
-
- pub(crate) fn register(reg: &mut $crate::block::BlockRegistry<'_>) {
- // get the static we make
- $(assert!(reg.register(&[<$field:snake:upper>]).is_ok());)+
- }
- }};
- (impl $field: literal => $logic: expr) => {
- paste::paste! { pub static [<$field:snake:upper>]: $crate::block::Block = $crate::block::Block::new(
- $field, <crate::block::BlockLogicEnum as crate::block::ConstFrom<_>>::fro($logic), None
- ); }
- };
- (impl $field: literal -> $logic: expr) => {
- paste::paste! { pub static [<$field:snake:upper>]: $crate::block::Block = $crate::block::Block::new(
- $field, <crate::block::BlockLogicEnum as crate::block::ConstFrom<_>>::fro($logic), Some(crate::data::renderer::load!($field))
- ); }
- }
-}
-pub(crate) use make_register;
-
-#[must_use]
-/// create a block registry
-pub fn build_registry() -> BlockRegistry<'static> {
- let mut reg = BlockRegistry::default();
- register(&mut reg);
- reg
-}
-
-fn register(reg: &mut BlockRegistry<'_>) {
- turrets::register(reg);
- drills::register(reg);
- distribution::register(reg);
- storage::register(reg);
- liquid::register(reg);
- power::register(reg);
- defense::register(reg);
- production::register(reg);
- payload::register(reg);
- campaign::register(reg);
- logic::register(reg);
- walls::register(reg);
- environment::register(reg);
- units::register(reg);
-}
diff --git a/src/block/payload.rs b/src/block/payload.rs
deleted file mode 100644
index 6a8ef11..0000000
--- a/src/block/payload.rs
+++ /dev/null
@@ -1,324 +0,0 @@
-//! payload related bits and bobs
-use thiserror::Error;
-
-use crate::block::content::Type as BlockEnum;
-use crate::block::distribution::BridgeBlock;
-use crate::block::simple::*;
-use crate::block::{self, *};
-use crate::content::{self, Content};
-use crate::data::dynamic::DynType;
-use crate::data::ReadError;
-use crate::unit;
-
-use super::BlockRegistry;
-
-make_simple!(SimplePayloadBlock, |_, n, _, _, r: Rotation, scl| {
- match n {
- "deconstructor" | "small-deconstructor" | "payload-void" => {
- let mut base = load!(from n which is ["deconstructor" | "small-deconstructor" | "payload-void"], scl);
- let mut r#in = load!(scl -> match n {
- "small-deconstructor" => "factory-in-3",
- _ => "factory-in-5",
- });
- unsafe {
- base.overlay(r#in.rotate(r.rotated(false).count()))
- .overlay(&load!(scl -> match n {
- "small-deconstructor" => "small-deconstructor-top",
- "deconstructor" => "deconstructor-top",
- _ => "payload-void-top",
- }))
- };
- base
- }
- // "payload-loader" | "payload-unloader"
- _ => {
- let mut base = load!(from n which is ["payload-loader" | "payload-unloader"], scl);
- let mut input = load!("factory-in-3-dark", scl);
- let mut output = load!("factory-out-3-dark", scl);
- unsafe {
- base.overlay(input.rotate(r.rotated(false).count()))
- .overlay(output.rotate(r.rotated(false).count()))
- .overlay(
- &load!(concat "top" => n which is ["payload-loader" | "payload-unloader"], scl),
- )
- };
- base
- }
- }
-});
-make_simple!(
- PayloadConveyor,
- |_, n, _, _, r: Rotation, s| {
- let mut base =
- load!(from n which is ["payload-conveyor" | "reinforced-payload-conveyor"], s);
- unsafe { base.rotate(r.rotated(false).count()) };
- base
- },
- read_payload_conveyor
-);
-// make_simple!(PayloadRouter => read_payload_router);
-
-make_register! {
- "payload-conveyor" => PayloadConveyor::new(3, false, cost!(Copper: 10, Graphite: 10));
- "payload-router" => PayloadBlock::new(3, false, cost!(Copper: 10, Graphite: 15));
- "reinforced-payload-conveyor" => PayloadConveyor::new(3, false, cost!(Tungsten: 10));
- "reinforced-payload-router" => PayloadBlock::new(3, false, cost!(Tungsten: 15));
- "payload-mass-driver" -> BridgeBlock::new(3, true, cost!(Tungsten: 120, Silicon: 120, Graphite: 50), 700, false);
- "large-payload-mass-driver" -> BridgeBlock::new(5, true, cost!(Thorium: 200, Tungsten: 200, Silicon: 200, Graphite: 100, Oxide: 30), 1100, false);
- "small-deconstructor" => SimplePayloadBlock::new(3, true, cost!(Beryllium: 100, Silicon: 100, Oxide: 40, Graphite: 80));
- "deconstructor" => SimplePayloadBlock::new(5, true, cost!(Beryllium: 250, Oxide: 100, Silicon: 250, Carbide: 250));
- "constructor" => PayloadBlock::new(3, true, cost!(Silicon: 100, Beryllium: 150, Tungsten: 80));
- "large-constructor" => PayloadBlock::new(5, true, cost!(Silicon: 150, Oxide: 150, Tungsten: 200, PhaseFabric: 40));
- "payload-loader" => SimplePayloadBlock::new(3, false, cost!(Graphite: 50, Silicon: 50, Tungsten: 80));
- "payload-unloader" => SimplePayloadBlock::new(3, false, cost!(Graphite: 50, Silicon: 50, Tungsten: 30));
- // sandbox only
- "payload-source" => PayloadBlock::new(5, false, &[]);
- "payload-void" => SimplePayloadBlock::new(5, true, &[]);
-}
-
-#[derive(Clone, Copy, Debug, Eq, PartialEq)]
-/// payload item cfg
-pub enum Payload {
- Empty,
- Block(block::content::Type),
- Unit(unit::Type),
-}
-
-/// a payload related block with [item cfg](Payload)
-pub struct PayloadBlock {
- size: u8,
- symmetric: bool,
- build_cost: BuildCost,
-}
-
-impl PayloadBlock {
- #[must_use]
- pub const fn new(size: u8, symmetric: bool, build_cost: BuildCost) -> Self {
- assert!(size != 0, "invalid size");
- Self {
- size,
- symmetric,
- build_cost,
- }
- }
-
- state_impl!(pub Payload);
-}
-
-impl BlockLogic for PayloadBlock {
- impl_block!();
-
- fn draw(
- &self,
- name: &str,
- _: Option<&State>,
- _: Option<&RenderingContext>,
- r: Rotation,
- s: Scale,
- ) -> ImageHolder<4> {
- match name {
- "payload-router" | "reinforced-payload-router" => {
- let mut base =
- load!(from name which is ["payload-router" | "reinforced-payload-router"], s);
- unsafe {
- base.rotate(r.rotated(false).count());
- base.overlay(& load!(concat "over" => name which is ["payload-router" | "reinforced-payload-router"], s));
- }
- base
- }
- _ => {
- let mut base = load!(from name which is ["constructor" | "large-constructor" | "payload-source"], s);
- let mut out = load!(s -> match name {
- "constructor" => "factory-out-3",
- "large-constructor" => "factory-out-5-dark",
- _ => "factory-out-5",
- });
- unsafe {
- out.rotate(r.rotated(false).count());
- base.overlay(&out);
- base.overlay(&load!(concat "top" => name which is ["constructor" | "large-constructor" | "payload-source"], s))
- };
- base
- }
- }
- }
-
- fn data_from_i32(&self, _: i32, _: GridPos) -> Result<DynData, DataConvertError> {
- Ok(DynData::Empty)
- }
-
- fn deserialize_state(&self, data: DynData) -> Result<Option<State>, DeserializeError> {
- match data {
- DynData::Empty => Ok(Some(Self::create_state(Payload::Empty))),
- DynData::Content(content::Type::Block, id) => {
- let block = PayloadDeserializeError::forward(block::content::Type::try_from(id))?;
- Ok(Some(Self::create_state(Payload::Block(block))))
- }
- DynData::Content(content::Type::Unit, id) => {
- let unit = PayloadDeserializeError::forward(unit::Type::try_from(id))?;
- Ok(Some(Self::create_state(Payload::Unit(unit))))
- }
- DynData::Content(have, ..) => Err(DeserializeError::Custom(Box::new(
- PayloadDeserializeError::ContentType(have),
- ))),
- _ => Err(DeserializeError::InvalidType {
- have: data.get_type(),
- expect: DynType::Content,
- }),
- }
- }
-
- fn serialize_state(&self, state: &State) -> Result<DynData, SerializeError> {
- match Self::get_state(state) {
- Payload::Empty => Ok(DynData::Empty),
- Payload::Block(block) => Ok(DynData::Content(content::Type::Block, (*block).into())),
- Payload::Unit(unit) => Ok(DynData::Content(content::Type::Unit, (*unit).into())),
- }
- }
-}
-
-/// format:
-/// - call [`read_payload_conveyor`]
-/// - t: [`u8`]
-/// - sort: [`u16`]
-/// - recdir: [`u8`]
-fn read_payload_router(
- b: &mut Build,
- reg: &BlockRegistry,
- entity_mapping: &EntityMapping,
- buff: &mut DataRead,
-) -> Result<(), DataReadError> {
- read_payload_conveyor(b, reg, entity_mapping, buff)?;
- buff.skip(4)
-}
-
-/// format:
-/// - [skip(4)](`DataRead::skip`)
-/// - rot: [`f32`]
-/// - become [`read_payload`]
-fn read_payload_conveyor(
- _: &mut Build,
- reg: &BlockRegistry,
- entity_mapping: &EntityMapping,
- buff: &mut DataRead,
-) -> Result<(), DataReadError> {
- buff.skip(8)?;
- read_payload(reg, entity_mapping, buff)
-}
-
-/// format:
-/// - iterate [`i16`]..0
-/// - [`u8`], [`i16`], [`i32`]
-pub(crate) fn read_payload_seq(buff: &mut DataRead) -> Result<(), DataReadError> {
- let amount = (-buff.read_i16()?) as usize;
- buff.skip(amount * 7)
-}
-
-/// format:
-/// - vector: ([`f32`], [`f32`])
-/// - rotation: [`f32`]
-/// - become [`read_payload`]
-pub(crate) fn read_payload_block(
- reg: &BlockRegistry,
- entity_mapping: &EntityMapping,
- buff: &mut DataRead,
-) -> Result<(), DataReadError> {
- buff.skip(12)?;
- read_payload(reg, entity_mapping, buff)
-}
-
-/// format:
-/// - exists: [`bool`]
-/// - if !exists: ok
-/// - type: [`u8`]
-/// - if type == `1` (payload block):
-/// - block: [`u16`]
-/// - version: [`u8`]
-/// - [`BlockLogic::read`] (recursion :ferrisHmm:),
-/// - if type == 2 (paylood unit):
-/// - id: [`u8`]
-/// - unit read???????? TODO
-fn read_payload(
- reg: &BlockRegistry,
- entity_mapping: &crate::data::map::EntityMapping,
- buff: &mut DataRead,
-) -> Result<(), DataReadError> {
- if !buff.read_bool()? {
- return Ok(());
- }
- let t = buff.read_u8()?;
- const BLOCK: u8 = 1;
- const UNIT: u8 = 0;
- match t {
- BLOCK => {
- let b = buff.read_u16()?;
- let b = BlockEnum::try_from(b).unwrap_or(BlockEnum::Router);
- let block = reg.get(b.get_name()).unwrap();
- block
- .logic
- .read(&mut Build::new(block), reg, entity_mapping, buff)?;
- }
- UNIT => {
- let u = buff.read_u8()?;
- let Some(_u) = entity_mapping.get(&u) else {
- return Err(ReadError::Expected("map entry"));
- };
- // unit::Type::try_from(u).unwrap_or(unit::Type::Alpha).read(todo!());
- }
- _ => return Err(ReadError::Expected("0 | 1")),
- }
- Ok(())
-}
-
-#[cfg(test)]
-mod tests {
- use std::collections::HashMap;
-
- use crate::registry::Registry;
-
- use super::*;
- #[test]
- fn payload_conv() {
- let mut reg = Registry::default();
- register(&mut reg);
- let mut r = DataRead::new(&[0, 0, 0, 0, 0, 0, 0, 0, 0]);
- read_payload_conveyor(
- &mut Build::new(&PAYLOAD_CONVEYOR),
- &reg,
- &HashMap::default(),
- &mut r,
- )
- .unwrap();
- assert!(r.read_bool().is_err());
- let mut r = DataRead::new(&[
- 65, 198, 232, 0, 67, 51, 255, 249, 1, 1, 0, 157, 0, 67, 197, 128, 0, 128, 1, 3,
- ]);
- read_payload_conveyor(
- &mut Build::new(&PAYLOAD_CONVEYOR),
- &reg,
- &HashMap::default(),
- &mut r,
- )
- .unwrap();
- assert!(r.read_bool().is_err());
- }
-}
-
-#[derive(Clone, Copy, Debug, Eq, PartialEq, Error)]
-pub enum PayloadDeserializeError {
- #[error("expected Unit or Block but got {0:?}")]
- ContentType(content::Type),
- #[error("payload block not found")]
- BlockNotFound(#[from] block::content::TryFromU16Error),
- #[error("payload unit not found")]
- UnitNotFound(#[from] unit::TryFromU16Error),
-}
-
-impl PayloadDeserializeError {
- pub fn forward<T, E: Into<Self>>(result: Result<T, E>) -> Result<T, DeserializeError> {
- match result {
- Ok(v) => Ok(v),
- Err(e) => Err(DeserializeError::Custom(Box::new(e.into()))),
- }
- }
-}
diff --git a/src/block/power.rs b/src/block/power.rs
deleted file mode 100644
index 62f32f8..0000000
--- a/src/block/power.rs
+++ /dev/null
@@ -1,251 +0,0 @@
-//! power connection and generation
-use thiserror::Error;
-
-use crate::block::simple::*;
-use crate::block::*;
-use crate::data::dynamic::DynType;
-
-make_simple!(GeneratorBlock => |_, _, _, buff: &mut DataRead| read_generator(buff));
-make_simple!(NuclearGeneratorBlock => |_, _, _, buff: &mut DataRead| read_nuclear(buff));
-make_simple!(ImpactReactorBlock => |_, _, _, buff: &mut DataRead| read_impact(buff));
-make_simple!(
- Neoplasia,
- |_, _, _, _, rot: Rotation, scl| {
- let mut base = load!("neoplasia-reactor", scl);
- unsafe {
- base.overlay(
- load!(scl -> match rot {
- Rotation::Up | Rotation::Right => "neoplasia-reactor-top1",
- Rotation::Down | Rotation::Left => "neoplasia-reactor-top2",
- })
- .rotate(rot.rotated(false).count()),
- )
- };
- base
- },
- |_, _, _, buff: &mut DataRead| read_heater(buff)
-);
-make_simple!(DiodeBlock, |_, _, _, _, rot: Rotation, s| {
- let mut base = load!("diode", s);
- if rot == Rotation::Right {
- return base;
- }
- let mut top = load!("diode-arrow", s);
- unsafe {
- top.rotate(rot.rotated(false).count());
- base.overlay(&top)
- };
- base
-});
-
-make_register! {
- // illuminator == power ?????
- "illuminator" -> LampBlock::new(1, true, cost!(Lead: 8, Graphite: 12, Silicon: 8));
- "power-node" -> ConnectorBlock::new(1, true, cost!(Copper: 1, Lead: 3), 10);
- "power-node-large" -> ConnectorBlock::new(2, true, cost!(Lead: 10, Titanium: 5, Silicon: 3), 15);
- "surge-tower" -> ConnectorBlock::new(2, true, cost!(Lead: 10, Titanium: 7, Silicon: 15, SurgeAlloy: 15), 2);
- "diode" => DiodeBlock::new(1, false, cost!(Metaglass: 10, Silicon: 10, Plastanium: 5));
- "battery" -> BasicBlock::new(1, true, cost!(Copper: 5, Lead: 20));
- "battery-large" -> BasicBlock::new(3, true, cost!(Lead: 50, Titanium: 20, Silicon: 30));
- "combustion-generator" -> GeneratorBlock::new(1, true, cost!(Copper: 25, Lead: 15));
- "thermal-generator" -> GeneratorBlock::new(2, true, cost!(Copper: 40, Lead: 50, Metaglass: 40, Graphite: 35, Silicon: 35));
- "steam-generator" -> GeneratorBlock::new(2, true, cost!(Copper: 35, Lead: 40, Graphite: 25, Silicon: 30));
- "differential-generator" -> GeneratorBlock::new(3, true, cost!(Copper: 70, Lead: 100, Metaglass: 50, Titanium: 50, Silicon: 65));
- "rtg-generator" -> GeneratorBlock::new(2, true, cost!(Lead: 100, Thorium: 50, Silicon: 75, Plastanium: 75, PhaseFabric: 25));
- "solar-panel" -> GeneratorBlock::new(1, true, cost!(Lead: 10, Silicon: 15));
- "solar-panel-large" -> GeneratorBlock::new(3, true, cost!(Lead: 80, Silicon: 110, PhaseFabric: 15));
- "thorium-reactor" -> NuclearGeneratorBlock::new(3, true, cost!(Lead: 300, Metaglass: 50, Graphite: 150, Thorium: 150, Silicon: 200));
- "impact-reactor" -> ImpactReactorBlock::new(4, true,
- cost!(Lead: 500, Metaglass: 250, Graphite: 400, Thorium: 100, Silicon: 300, SurgeAlloy: 250));
- "beam-node" -> ConnectorBlock::new(1, true, cost!(Beryllium: 8), 4);
- "beam-tower" -> ConnectorBlock::new(3, true, cost!(Beryllium: 30, Oxide: 10, Silicon: 10), 12);
- "turbine-condenser" -> GeneratorBlock::new(3, true, cost!(Beryllium: 60));
- "chemical-combustion-chamber" -> GeneratorBlock::new(3, true, cost!(Graphite: 40, Tungsten: 40, Oxide: 40, Silicon: 30));
- "pyrolysis-generator" -> GeneratorBlock::new(3, true, cost!(Graphite: 50, Carbide: 50, Oxide: 60, Silicon: 50));
- "flux-reactor" -> GeneratorBlock::new(5, true, cost!(Graphite: 300, Carbide: 200, Oxide: 100, Silicon: 600, SurgeAlloy: 300));
- "neoplasia-reactor" => Neoplasia::new(5, true, cost!(Tungsten: 1000, Carbide: 300, Oxide: 150, Silicon: 500, PhaseFabric: 300, SurgeAlloy: 200));
- // editor only
- "beam-link" -> ConnectorBlock::new(3, true, &[], 12);
- // sandbox only
- "power-source" -> ConnectorBlock::new(1, true, &[], 100);
- "power-void" -> GeneratorBlock::new(1, true, &[]);
-}
-
-pub struct ConnectorBlock {
- size: u8,
- symmetric: bool,
- build_cost: BuildCost,
- pub max: u8,
-}
-
-impl ConnectorBlock {
- #[must_use]
- pub const fn new(size: u8, symmetric: bool, build_cost: BuildCost, max: u8) -> Self {
- assert!(size != 0, "invalid size");
- assert!(
- !(max == 0 || max > i8::MAX as u8),
- "invalid maximum link count"
- );
- Self {
- size,
- symmetric,
- build_cost,
- max,
- }
- }
- state_impl!(pub Vec<(i16, i16)>);
-}
-
-impl BlockLogic for ConnectorBlock {
- impl_block!();
-
- fn data_from_i32(&self, _: i32, _: GridPos) -> Result<DynData, DataConvertError> {
- Ok(DynData::Empty)
- }
-
- fn deserialize_state(&self, data: DynData) -> Result<Option<State>, DeserializeError> {
- match data {
- DynData::Empty => Ok(Some(Self::create_state(Vec::new()))),
- DynData::Point2Array(s) => Ok(Some(Self::create_state(s))),
- _ => Err(DeserializeError::InvalidType {
- have: data.get_type(),
- expect: DynType::Boolean,
- }),
- }
- }
-
- fn mirror_state(&self, state: &mut State, horizontally: bool, vertically: bool) {
- for (dx, dy) in &mut *Self::get_state_mut(state) {
- if horizontally {
- *dx = -*dx;
- }
- if vertically {
- *dy = -*dy;
- }
- }
- }
-
- fn rotate_state(&self, state: &mut State, clockwise: bool) {
- for (dx, dy) in &mut *Self::get_state_mut(state) {
- let (cdx, cdy) = (*dx, *dy);
- *dx = if clockwise { cdy } else { -cdy };
- *dy = if clockwise { -cdx } else { cdx };
- }
- }
-
- fn serialize_state(&self, state: &State) -> Result<DynData, SerializeError> {
- Ok(DynData::Point2Array(Self::get_state(state).clone()))
- }
-}
-
-#[derive(Debug, Error)]
-pub enum ConnectorDeserializeError {
- #[error("too many links ({have} but only {max} allowed)")]
- LinkCount { have: usize, max: u8 },
-}
-
-impl ConnectorDeserializeError {
- pub fn forward<T, E: Into<Self>>(result: Result<T, E>) -> Result<T, DeserializeError> {
- match result {
- Ok(v) => Ok(v),
- Err(e) => Err(DeserializeError::Custom(Box::new(e.into()))),
- }
- }
-}
-
-#[derive(Clone, Copy, Debug, Eq, PartialEq)]
-pub struct Rgba(u8, u8, u8, u8);
-
-impl From<u32> for Rgba {
- fn from(value: u32) -> Self {
- Self(
- (value >> 24) as u8,
- (value >> 16) as u8,
- (value >> 8) as u8,
- value as u8,
- )
- }
-}
-
-impl From<Rgba> for u32 {
- fn from(value: Rgba) -> Self {
- (u32::from(value.0) << 24)
- | (u32::from(value.1) << 16)
- | (u32::from(value.2) << 8)
- | u32::from(value.3)
- }
-}
-
-pub struct LampBlock {
- size: u8,
- symmetric: bool,
- build_cost: BuildCost,
-}
-
-impl LampBlock {
- #[must_use]
- pub const fn new(size: u8, symmetric: bool, build_cost: BuildCost) -> Self {
- assert!(size != 0, "invalid size");
- Self {
- size,
- symmetric,
- build_cost,
- }
- }
-
- state_impl!(pub Rgba);
-}
-
-impl BlockLogic for LampBlock {
- impl_block!();
-
- fn data_from_i32(&self, config: i32, _: GridPos) -> Result<DynData, DataConvertError> {
- Ok(DynData::Int(config))
- }
-
- fn deserialize_state(&self, data: DynData) -> Result<Option<State>, DeserializeError> {
- match data {
- DynData::Int(rgba) => Ok(Some(Self::create_state(Rgba::from(rgba as u32)))),
- _ => Err(DeserializeError::InvalidType {
- have: data.get_type(),
- expect: DynType::Int,
- }),
- }
- }
-
- fn serialize_state(&self, state: &State) -> Result<DynData, SerializeError> {
- let state = Self::get_state(state);
- Ok(DynData::Int(u32::from(*state) as i32))
- }
-}
-
-/// format:
-/// - production efficiency: [`f32`]
-/// - generate time: [`f32`]
-fn read_generator(buff: &mut DataRead) -> Result<(), DataReadError> {
- buff.skip(8)
-}
-
-/// format:
-/// - call [`read_generator`]
-/// - heat: [`f32`]
-fn read_nuclear(buff: &mut DataRead) -> Result<(), DataReadError> {
- read_generator(buff)?;
- buff.skip(4)
-}
-
-/// format:
-/// - call [`read_generator`]
-/// - warmup: [`f32`]
-fn read_impact(buff: &mut DataRead) -> Result<(), DataReadError> {
- read_generator(buff)?;
- buff.skip(4)
-}
-
-/// format:
-/// - call [`read_generator`]
-/// - heat: [`f32`]
-fn read_heater(buff: &mut DataRead) -> Result<(), DataReadError> {
- read_generator(buff)?;
- buff.skip(4)
-}
diff --git a/src/block/production.rs b/src/block/production.rs
deleted file mode 100644
index cd48482..0000000
--- a/src/block/production.rs
+++ /dev/null
@@ -1,120 +0,0 @@
-//! the industry part of mindustry
-use crate::block::simple::*;
-use crate::block::*;
-use crate::data::DataRead;
-
-make_register! {
- "cultivator" -> ProductionBlock::new(2, true, cost!(Copper: 25, Lead: 25, Silicon: 10));
- "graphite-press" -> ProductionBlock::new(2, true, cost!(Copper: 75, Lead: 30));
- "multi-press" -> ProductionBlock::new(3, true, cost!(Lead: 100, Graphite: 50, Titanium: 100, Silicon: 25));
- "silicon-smelter" -> ProductionBlock::new(2, true, cost!(Copper: 30, Lead: 25));
- "silicon-crucible" -> ProductionBlock::new(3, true, cost!(Metaglass: 80, Titanium: 120, Silicon: 60, Plastanium: 35));
- "kiln" -> ProductionBlock::new(2, true, cost!(Copper: 60, Lead: 30, Graphite: 30));
- "plastanium-compressor" -> ProductionBlock::new(2, true, cost!(Lead: 115, Graphite: 60, Titanium: 80, Silicon: 80));
- "phase-weaver" -> ProductionBlock::new(2, true, cost!(Lead: 120, Thorium: 75, Silicon: 130));
- "surge-smelter" -> ProductionBlock::new(3, true, cost!(Lead: 80, Thorium: 70, Silicon: 80));
- "cryofluid-mixer" -> ProductionBlock::new(2, true, cost!(Lead: 65, Thorium: 60, Silicon: 40));
- "pyratite-mixer" -> ProductionBlock::new(2, true, cost!(Copper: 50, Lead: 25));
- "blast-mixer" -> ProductionBlock::new(2, true, cost!(Lead: 30, Thorium: 20));
- "melter" -> ProductionBlock::new(1, true, cost!(Copper: 30, Lead: 35, Graphite: 45));
- "separator" -> SeparatorBlock::new(2, true, cost!(Copper: 30, Titanium: 25));
- "disassembler" -> SeparatorBlock::new(3, true, cost!(Titanium: 100, Thorium: 80, Silicon: 150, Plastanium: 40));
- "spore-press" -> ProductionBlock::new(2, true, cost!(Lead: 35, Silicon: 30));
- "pulverizer" -> ProductionBlock::new(1, true, cost!(Copper: 30, Lead: 25));
- "coal-centrifuge" -> ProductionBlock::new(2, true, cost!(Lead: 30, Graphite: 40, Titanium: 20));
- "incinerator" -> BasicBlock::new(1, true, cost!(Lead: 15, Graphite: 5));
- "silicon-arc-furnace" -> ProductionBlock::new(3, true, cost!(Beryllium: 70, Graphite: 80));
- "electrolyzer" => ProductionBlock::new(3, true, cost!(Silicon: 50, Graphite: 40, Beryllium: 130, Tungsten: 80));
- "atmospheric-concentrator" -> ProductionBlock::new(3, true, cost!(Oxide: 60, Beryllium: 180, Silicon: 150));
- "oxidation-chamber" => HeatCrafter::new(3, true, cost!(Tungsten: 120, Graphite: 80, Silicon: 100, Beryllium: 120));
- "electric-heater" => HeatCrafter::new(2, false, cost!(Tungsten: 30, Oxide: 30));
- "slag-heater" => HeatCrafter::new(3, false, cost!(Tungsten: 50, Oxide: 20, Beryllium: 20));
- "phase-heater" => HeatCrafter::new(2, false, cost!(Oxide: 30, Carbide: 30, Beryllium: 30));
- "heat-redirector" => HeatConduit::new(3, false, cost!(Tungsten: 10, Graphite: 10));
- "heat-router" => HeatConduit::new(3, false, cost!(Tungsten: 15, Graphite: 10));
- "slag-incinerator" -> BasicBlock::new(1, true, cost!(Tungsten: 15));
- "carbide-crucible" -> ProductionBlock::new(3, true, cost!(Tungsten: 110, Thorium: 150, Oxide: 60));
- // slag centrifuge
- "surge-crucible" -> ProductionBlock::new(3, true, cost!(Silicon: 100, Graphite: 80, Tungsten: 80, Oxide: 80));
- "cyanogen-synthesizer" -> ProductionBlock::new(3, true, cost!(Carbide: 50, Silicon: 80, Beryllium: 90));
- "phase-synthesizer" -> ProductionBlock::new(3, true, cost!(Carbide: 90, Silicon: 100, Thorium: 100, Tungsten: 200));
- // heat reactor
- // sandbox only
- "heat-source" => HeatCrafter::new(1, false, &[]);
-}
-
-// format: call [`read_production_block`], seed: [`i32`]
-make_simple!(SeparatorBlock => |_, _, _, buff: &mut DataRead| buff.skip(12));
-
-make_simple!(
- ProductionBlock,
- |_, _, _, _, r: Rotation, s| {
- // electrolyzer exclusive
- // ozone <- e(^) -> hydrogen
- let mut base = load!("electrolyzer", s);
- unsafe {
- base.overlay(
- load!(s -> match r {
- Rotation::Up | Rotation::Left => "electrolyzer-hydrogen-output1"
- Rotation::Down | Rotation::Right => "electrolyzer-hydrogen-output2"
- })
- .rotate(r.count()),
- );
- base.overlay(
- load!(s -> match r {
- Rotation::Down | Rotation::Right => "electrolyzer-ozone-output1"
- Rotation::Up | Rotation::Left => "electrolyzer-ozone-output2"
- })
- .rotate(r.mirrored(true, true).count()),
- );
- }
- base
- },
- |b: &mut Build<'_>, _, _, buff: &mut DataRead| {
- // format:
- // - progress: `f32`
- // - warmup: `f32`
- // (cultivator)
- // `f32`
- buff.skip(8 + if b.name() == "cultivator" { 4 } else { 0 })
- }
-);
-
-make_simple!(
- HeatCrafter,
- |_, n, _, _, r: Rotation, s| {
- let mut base = load!(from n which is ["phase-heater" | "electric-heater" | "oxidation-chamber" | "slag-heater" | "heat-source"], s);
- unsafe {
- base.overlay(match r {
- Rotation::Up | Rotation::Right => load!(concat "top1" => n which is ["phase-heater" | "electric-heater" | "oxidation-chamber" | "slag-heater" | "heat-source"], s),
- Rotation::Down | Rotation::Left => load!(concat "top2" => n which is ["phase-heater" | "electric-heater" | "oxidation-chamber" | "slag-heater" | "heat-source"], s)
- }.rotate(r.rotated(false).count()))
- };
- base
- },
- |_, _, _, buff: &mut DataRead| {
- // format:
- // - progress: `f32`
- // - warmup: `f32`
- // - heat: f32
- buff.skip(12)?;
- Ok(())
- }
-);
-make_simple!(HeatConduit, |_, n, _, _, r: Rotation, s| {
- let mut base = load!(from n which is ["heat-router" | "heat-redirector"], s);
- unsafe {
- base.overlay(
- match r {
- Rotation::Up | Rotation::Right => {
- load!(concat "top1" => n which is ["heat-router" | "heat-redirector"], s)
- }
- Rotation::Down | Rotation::Left => {
- load!(concat "top2" => n which is ["heat-router" | "heat-redirector"], s)
- }
- }
- .rotate(r.rotated(false).count()),
- )
- };
- base
-});
diff --git a/src/block/storage.rs b/src/block/storage.rs
deleted file mode 100644
index c28b7bd..0000000
--- a/src/block/storage.rs
+++ /dev/null
@@ -1,16 +0,0 @@
-//! cores, vaults, containers
-use crate::block::make_register;
-use crate::block::simple::*;
-
-make_register! {
- "core-shard" -> BasicBlock::new(3, true, cost!(Copper: 1000, Lead: 800));
- "core-foundation" -> BasicBlock::new(4, true, cost!(Copper: 3000, Lead: 3000, Silicon: 2000));
- "core-nucleus" -> BasicBlock::new(5, true, cost!(Copper: 8000, Lead: 8000, Thorium: 4000, Silicon: 5000));
- "core-bastion" -> BasicBlock::new(4, true, cost!(Graphite: 1000, Silicon: 1000, Beryllium: 800));
- "core-citadel" -> BasicBlock::new(5, true, cost!(Silicon: 4000, Beryllium: 4000, Tungsten: 3000, Oxide: 1000));
- "core-acropolis" -> BasicBlock::new(6, true, cost!(Beryllium: 6000, Silicon: 5000, Tungsten: 5000, Carbide: 3000, Oxide: 3000));
- "container" -> BasicBlock::new(2, true, cost!(Titanium: 100));
- "vault" -> BasicBlock::new(3, true, cost!(Titanium: 250, Thorium: 125));
- "reinforced-container" -> BasicBlock::new(2, true, cost!(Tungsten: 30, Graphite: 40));
- "reinforced-vault" -> BasicBlock::new(3, true, cost!(Tungsten: 125, Thorium: 70, Beryllium: 100));
-}
diff --git a/src/block/turrets.rs b/src/block/turrets.rs
deleted file mode 100644
index 3e65ebe..0000000
--- a/src/block/turrets.rs
+++ /dev/null
@@ -1,82 +0,0 @@
-//! idk why its not in the [`crate::block::defense`] module
-use super::simple::make_simple;
-use crate::block::make_register;
-use crate::block::simple::cost;
-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));
-}
-
-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`]
-/// - iterate [`u8`]
-/// - item: [`u16`] as [`Item`](crate::item::Type)
-/// - amount: [`u16`]
-fn read_item_turret(buff: &mut DataRead) -> Result<(), ReadError> {
- read_turret(buff)?;
- for _ in 0..buff.read_u8()? {
- buff.skip(4)?;
- }
- Ok(())
-}
-
-/// format:
-/// - reload: f32
-/// - rotation: f32
-fn read_turret(buff: &mut DataRead) -> Result<(), ReadError> {
- buff.skip(8)
-}
-
-/// format:
-/// - rotation: [`f32`]
-fn read_point_defense_turret(buff: &mut DataRead) -> Result<(), ReadError> {
- buff.skip(4)
-}
-
-/// format:
-/// - call [`read_turret`]
-/// - last length: [`f32`]
-fn read_continous_turret(buff: &mut DataRead) -> Result<(), ReadError> {
- read_turret(buff)?;
- buff.skip(4)
-}
-
-/// format:
-/// - rotation: [`f32`]
-fn read_tractor_beam_turret(buff: &mut DataRead) -> Result<(), ReadError> {
- buff.skip(4)
-}
diff --git a/src/block/units.rs b/src/block/units.rs
deleted file mode 100644
index 83b39af..0000000
--- a/src/block/units.rs
+++ /dev/null
@@ -1,380 +0,0 @@
-//! unit creation related blocks
-use thiserror::Error;
-
-use super::payload::{read_payload_block, read_payload_seq};
-use crate::block::simple::*;
-use crate::block::*;
-use crate::data::command::UnitCommand;
-use crate::data::dynamic::DynType;
-use crate::unit;
-
-// fn is_pay(b: &str) -> bool {
-// matches!(
-// b,
-// "ground-factory"
-// | "air-factory"
-// | "naval-factory"
-// | "additive-reconstructor"
-// | "multiplicative-reconstructor"
-// | "exponential-reconstructor"
-// | "tank-fabricator"
-// | "ship-fabricator"
-// | "mech-fabricator"
-// | "tank-refabricator"
-// | "ship-refabricator"
-// | "payload-conveyor"
-// | "payload-router"
-// | "reinforced-payload-conveyor"
-// | "reinforced-payload-router"
-// | "payload-mass-driver"
-// | "large-payload-mass-driver"
-// | "constructor"
-// | "large-constructor"
-// | "payload-source"
-// )
-// }
-
-make_simple!(
- AssemblerBlock,
- |_, name, _, _, rot: Rotation, s| {
- let mut base =
- load!(from name which is ["tank-assembler" | "ship-assembler" | "mech-assembler"], s);
- unsafe {
- base.overlay(
- match rot {
- Rotation::Up | Rotation::Right => load!(concat "side1" => name which is ["tank-assembler" | "ship-assembler" | "mech-assembler"], s),
- Rotation::Down | Rotation::Left => load!(concat "side2" => name which is ["tank-assembler" | "ship-assembler" | "mech-assembler"], s)
- }
- .rotate(rot.rotated(false).count())
- );
- base.overlay(&load!(concat "top" => name which is ["tank-assembler" | "ship-assembler" | "mech-assembler"], s))
- };
- base
- },
- |_, reg, map, buff| read_assembler(reg, map, buff)
-);
-
-/// format:
-/// - call [`read_payload_block`]
-/// - progress: [`f32`]
-/// - iterate [`u8`]
-/// - read: [`i32`]
-/// - call [`read_payload_seq`]
-/// - point: ([`f32`], [`f32`]) (maybe [`NaN`](f32::NAN))
-fn read_assembler(
- reg: &BlockRegistry,
- map: &EntityMapping,
- buff: &mut DataRead,
-) -> Result<(), DataReadError> {
- read_payload_block(reg, map, buff)?;
- buff.skip(4)?;
- let n = buff.read_u8()? as usize;
- buff.skip(n * 4)?;
- read_payload_seq(buff)?;
- buff.skip(8)
-}
-
-make_simple!(
- AssemblerModule,
- |_, _, _, _, rot: Rotation, scl| {
- let mut base = load!("basic-assembler-module", scl);
- unsafe {
- base.overlay(
- load!(scl -> match rot {
- Rotation::Up | Rotation::Right => "basic-assembler-module-side1",
- _ => "basic-assembler-module-side2",
- })
- .rotate(rot.rotated(false).count()),
- )
- };
- base
- },
- |_, reg, map, buff| read_payload_block(reg, map, buff)
-);
-
-make_simple!(
- RepairTurret => |_, _, _, buff: &mut DataRead| {
- buff.skip(4) // rotation: [`f32`]
- }
-);
-
-const GROUND_UNITS: &[unit::Type] = &[unit::Type::Dagger, unit::Type::Crawler, unit::Type::Nova];
-const AIR_UNITS: &[unit::Type] = &[unit::Type::Flare, unit::Type::Mono];
-const NAVAL_UNITS: &[unit::Type] = &[unit::Type::Risso, unit::Type::Retusa];
-
-make_register! {
- "ground-factory" => UnitFactory::new(3, false, cost!(Copper: 50, Lead: 120, Silicon: 80), GROUND_UNITS);
- "air-factory" => UnitFactory::new(3, false, cost!(Copper: 60, Lead: 70), AIR_UNITS);
- "naval-factory" => UnitFactory::new(3, false, cost!(Copper: 150, Lead: 130, Metaglass: 120), NAVAL_UNITS);
- "additive-reconstructor" => ConstructorBlock::new(3, false, cost!(Copper: 200, Lead: 120, Silicon: 90));
- "multiplicative-reconstructor" => ConstructorBlock::new(5, false, cost!(Lead: 650, Titanium: 350, Thorium: 650, Silicon: 450));
- "exponential-reconstructor" => ConstructorBlock::new(7, false,
- 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));
- "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]);
- "tank-refabricator" => ConstructorBlock::new(3, true, cost!(Beryllium: 200, Tungsten: 80, Silicon: 100));
- "mech-refabricator" => ConstructorBlock::new(3, true, cost!(Beryllium: 250, Tungsten: 120, Silicon: 150));
- "ship-refabricator" => ConstructorBlock::new(3, true, cost!(Beryllium: 200, Tungsten: 100, Silicon: 150, Oxide: 40));
- "prime-refabricator" => ConstructorBlock::new(5, true, cost!(Thorium: 250, Oxide: 200, Tungsten: 200, Silicon: 400));
- "tank-assembler" => AssemblerBlock::new(5, true, cost!(Thorium: 500, Oxide: 150, Carbide: 80, Silicon: 500));
- "ship-assembler" => AssemblerBlock::new(5, true, cost!(Carbide: 100, Oxide: 200, Tungsten: 500, Silicon: 800, Thorium: 400));
- "mech-assembler" => AssemblerBlock::new(5, true, cost!(Carbide: 200, Thorium: 600, Oxide: 200, Tungsten: 500, Silicon: 900)); // smh collaris
- "basic-assembler-module" => AssemblerModule::new(5, true, cost!(Carbide: 300, Thorium: 500, Oxide: 200, PhaseFabric: 400)); // the dummy block
- "unit-repair-tower" -> BasicBlock::new(2, true, cost!(Graphite: 90, Silicon: 90, Tungsten: 80));
-
-}
-
-pub struct ConstructorBlock {
- size: u8,
- symmetric: bool,
- build_cost: BuildCost,
-}
-
-impl ConstructorBlock {
- #[must_use]
- pub const fn new(size: u8, symmetric: bool, build_cost: BuildCost) -> Self {
- assert!(size != 0, "invalid size");
- Self {
- size,
- symmetric,
- build_cost,
- }
- }
-
- state_impl!(pub Option<UnitCommand>);
-}
-
-impl BlockLogic for ConstructorBlock {
- impl_block!();
-
- fn data_from_i32(&self, _: i32, _: GridPos) -> Result<DynData, DataConvertError> {
- Ok(DynData::Empty)
- }
-
- fn deserialize_state(&self, data: DynData) -> Result<Option<State>, DeserializeError> {
- match data {
- DynData::Empty => Ok(Some(Self::create_state(None))),
- DynData::UnitCommand(u) => Ok(Some(Self::create_state(Some(u)))),
- _ => Err(DeserializeError::InvalidType {
- have: data.get_type(),
- expect: DynType::UnitCommand,
- }),
- }
- }
-
- fn serialize_state(&self, state: &State) -> Result<DynData, SerializeError> {
- Ok(Self::get_state(state).map_or(DynData::Empty, DynData::UnitCommand))
- }
-
- fn draw(
- &self,
- name: &str,
- _: Option<&State>,
- _: Option<&RenderingContext>,
- rot: Rotation,
- s: Scale,
- ) -> ImageHolder<4> {
- let mut base = load!(from name which is ["additive-reconstructor" | "multiplicative-reconstructor" | "exponential-reconstructor" | "tetrative-reconstructor" | "tank-refabricator" | "mech-refabricator" | "ship-refabricator" | "prime-refabricator"], s);
- let times = rot.rotated(false).count();
- let mut out = load!(s -> match name {
- "additive-reconstructor" => "factory-out-3",
- "multiplicative-reconstructor" => "factory-out-5",
- "tank-refabricator" | "mech-refabricator" | "ship-refabricator" =>
- "factory-out-3-dark",
- "exponential-reconstructor" => "factory-out-7",
- "prime-refabricator" => "factory-out-5-dark",
- "tetrative-reconstructor" => "factory-out-9",
- });
- unsafe { base.overlay(out.rotate(times)) };
-
- let mut r#in = load!(s -> match name {
- "additive-reconstructor" => "factory-in-3",
- "multiplicative-reconstructor" => "factory-in-5",
- "tank-refabricator" | "mech-refabricator" | "ship-refabricator" =>
- "factory-in-3-dark",
- "exponential-reconstructor" => "factory-in-7",
- "prime-refabricator" => "factory-in-5-dark",
- "tetrative-reconstructor" => "factory-in-9",
- });
- unsafe { base.overlay(r#in.rotate(times)) };
-
- // TODO: the context cross is too small
- // for i in 0..4u8 {
- // if let Some((b, rot)) = dbg!(ctx.cross[i as usize]) {
- // if rot.mirrored(true, true) != ctx.rotation && match rot {
- // Rotation::Up => i == 3,
- // Rotation::Right => i == 4,
- // Rotation::Down => i == 0,
- // Rotation::Left => i == 2,
- // } && is_pay(b.name())
- // {
- // let r = unsafe { std::mem::transmute::<u8, Rotation>(i) }
- // .mirrored(true, true)
- // .rotated(false);
- // let mut input = input.clone();
- // input.rotate(r.count());
- // base.overlay(&input);
- // }
- // }
- // }
-
- unsafe {
- base.overlay(&load!(concat "top" => name which is ["additive-reconstructor" | "multiplicative-reconstructor" | "exponential-reconstructor" | "tetrative-reconstructor" | "tank-refabricator" | "mech-refabricator" | "ship-refabricator" | "prime-refabricator"], s))
- };
- base
- }
-
- /// format:
- /// - call [`read_payload_block`]
- /// - progress: [`f32`]
- /// - point: ([`f32`], [`f32`]) (maybe [`NaN`](f32::NAN))
- /// - command: [`DynData::UnitCommand`]
- fn read(
- &self,
- _: &mut Build,
- reg: &BlockRegistry,
- map: &EntityMapping,
- buff: &mut DataRead,
- ) -> Result<(), DataReadError> {
- read_payload_block(reg, map, buff)?;
- buff.skip(12)?;
- // TODO uncomment when read_payload_block impl finished
- // b.state = self.deserialize_state(DynSerializer.deserialize(buff).unwrap()).unwrap();
- Ok(())
- }
-}
-
-pub struct UnitFactory {
- size: u8,
- symmetric: bool,
- build_cost: BuildCost,
- valid: &'static [unit::Type],
-}
-
-impl UnitFactory {
- #[must_use]
- pub const fn new(
- size: u8,
- symmetric: bool,
- build_cost: BuildCost,
- valid: &'static [unit::Type],
- ) -> Self {
- assert!(size != 0, "invalid size");
- assert!(!valid.is_empty(), "no valid units");
- assert!(valid.len() <= i32::MAX as usize, "too many valid units");
- Self {
- size,
- symmetric,
- build_cost,
- valid,
- }
- }
-
- state_impl!(pub Option<unit::Type>);
-}
-
-impl BlockLogic for UnitFactory {
- impl_block!();
-
- fn data_from_i32(&self, _: i32, _: GridPos) -> Result<DynData, DataConvertError> {
- Ok(DynData::Int(-1))
- }
-
- fn deserialize_state(&self, data: DynData) -> Result<Option<State>, DeserializeError> {
- match data {
- DynData::Empty => Ok(Some(Self::create_state(None))),
- DynData::Int(idx) => {
- if idx == -1 {
- Ok(Some(Self::create_state(None)))
- } else if idx >= 0 && idx < self.valid.len() as i32 {
- Ok(Some(Self::create_state(Some(self.valid[idx as usize]))))
- } else {
- Err(DeserializeError::Custom(Box::new(
- AssemblerDeserializeError {
- idx,
- count: self.valid.len() as i32,
- },
- )))
- }
- }
- _ => Err(DeserializeError::InvalidType {
- have: data.get_type(),
- expect: DynType::Int,
- }),
- }
- }
-
- fn serialize_state(&self, state: &State) -> Result<DynData, SerializeError> {
- if let Some(state) = Self::get_state(state) {
- for (i, curr) in self.valid.iter().enumerate() {
- if curr == state {
- return Ok(DynData::Int(i as i32));
- }
- }
- Err(SerializeError::Custom(Box::new(AssemblerSerializeError(
- *state,
- ))))
- } else {
- Ok(DynData::Int(-1))
- }
- }
-
- fn draw(
- &self,
- name: &str,
- _: Option<&State>,
- _: Option<&RenderingContext>,
- rot: Rotation,
- s: Scale,
- ) -> ImageHolder<4> {
- let mut base = load!(from name which is ["ground-factory" | "air-factory" | "naval-factory" | "tank-fabricator" | "ship-fabricator" | "mech-fabricator"], s);
- unsafe {
- base.overlay(
- load!(s -> match name {
- "ground-factory" | "air-factory" | "naval-factory" => "factory-out-3",
- _ => "factory-out-3-dark",
- })
- .rotate(rot.rotated(false).count()),
- )
- .overlay(&load!(s -> match name {
- "ground-factory" | "air-factory" | "naval-factory" => "factory-top-3",
- "tank-fabricator" => "tank-fabricator-top",
- "ship-fabricator" => "ship-fabricator-top",
- "mech-fabricator" => "mech-fabricator-top",
- }))
- };
- base
- }
-
- /// format:
- /// - call [`read_payload_block`]
- /// - progress: [`f32`]
- /// - plan: [`u16`]
- /// - point: ([`f32`], [`f32`]) (maybe [`NaN`](f32::NAN))
- fn read(
- &self,
- _: &mut Build,
- reg: &BlockRegistry,
- mapping: &EntityMapping,
- buff: &mut DataRead,
- ) -> Result<(), DataReadError> {
- read_payload_block(reg, mapping, buff)?;
- buff.skip(14)
- }
-}
-
-#[derive(Clone, Copy, Debug, Eq, PartialEq, Error)]
-#[error("invalid unit index ({idx}, valid: {count})")]
-pub struct AssemblerDeserializeError {
- pub idx: i32,
- pub count: i32,
-}
-
-#[derive(Clone, Copy, Debug, Eq, PartialEq, Error)]
-#[error("invalid unit {0:?}")]
-pub struct AssemblerSerializeError(unit::Type);
diff --git a/src/block/walls.rs b/src/block/walls.rs
deleted file mode 100644
index 4eaad5c..0000000
--- a/src/block/walls.rs
+++ /dev/null
@@ -1,118 +0,0 @@
-//! walls
-use crate::block::simple::*;
-use crate::block::*;
-use crate::data::dynamic::DynType;
-use crate::data::renderer::load;
-
-make_simple!(WallBlock, |_, _, _, _, _, s| {
- let mut base = load!("thruster", s);
- unsafe { base.overlay(&load!("thruster-top", s)) };
- base
-});
-
-make_register! {
- "copper-wall" -> WallBlock::new(1, true, cost!(Copper: 6));
- "copper-wall-large" -> WallBlock::new(2, true, cost!(Copper: 6 * 4));
- "titanium-wall" -> WallBlock::new(1, true, cost!(Titanium: 6));
- "titanium-wall-large" -> WallBlock::new(2, true, cost!(Titanium: 6 * 4));
- "plastanium-wall" -> WallBlock::new(1, true, cost!(Metaglass: 2, Plastanium: 5));
- "plastanium-wall-large" -> WallBlock::new(2, true, cost!(Metaglass: 2 * 4, Plastanium: 5 * 4));
- "thorium-wall" -> WallBlock::new(1, true, cost!(Thorium: 6));
- "thorium-wall-large" -> WallBlock::new(2, true, cost!(Thorium: 6 * 4));
- "phase-wall" -> WallBlock::new(1, true, cost!(PhaseFabric: 6));
- "phase-wall-large" -> WallBlock::new(2, true, cost!(PhaseFabric: 6 * 4));
- "surge-wall" -> WallBlock::new(1, true, cost!(SurgeAlloy: 6));
- "surge-wall-large" -> WallBlock::new(2, true, cost!(SurgeAlloy: 6 * 4));
- "door" => DoorBlock::new(1, true, cost!(Titanium: 6, Silicon: 4));
- "door-large" => DoorBlock::new(2, true, cost!(Titanium: 6 * 4, Silicon: 4 * 4));
- "tungsten-wall" -> WallBlock::new(1, true, cost!(Tungsten: 6));
- "tungsten-wall-large" -> WallBlock::new(2, true, cost!(Tungsten: 6 * 4));
- "blast-door" -> DoorBlock::new(2, true, cost!(Tungsten: 24, Silicon: 24));
- "reinforced-surge-wall" -> WallBlock::new(1, true, cost!(SurgeAlloy: 6, Tungsten: 2));
- "reinforced-surge-wall-large" -> WallBlock::new(2, true, cost!(SurgeAlloy: 6 * 4, Tungsten: 2 * 4));
- "carbide-wall" -> WallBlock::new(1, true, cost!(Thorium: 6, Carbide: 6));
- "carbide-wall-large" -> WallBlock::new(2, true, cost!(Thorium: 6 * 4, Carbide: 6 * 4));
- "shielded-wall" -> WallBlock::new(2, true, cost!(PhaseFabric: 20, SurgeAlloy: 12, Beryllium: 12));
- "beryllium-wall" -> WallBlock::new(1, true, cost!(Beryllium: 6));
- "beryllium-wall-large" -> WallBlock::new(2, true, cost!(Beryllium: 6 * 4));
- // sandbox only
- "scrap-wall" -> WallBlock::new(1, true, cost!(Scrap: 6));
- "scrap-wall-large" -> WallBlock::new(2, true, cost!(Scrap: 24));
- "scrap-wall-huge" -> WallBlock::new(3, true, cost!(Scrap: 54));
- "scrap-wall-gigantic" -> WallBlock::new(4, true, cost!(Scrap: 96));
- "thruster" => WallBlock::new(4, false, cost!(Scrap: 96));
-}
-
-pub struct DoorBlock {
- size: u8,
- symmetric: bool,
- build_cost: BuildCost,
-}
-
-impl DoorBlock {
- #[must_use]
- pub const fn new(size: u8, symmetric: bool, build_cost: BuildCost) -> Self {
- assert!(size != 0, "invalid size");
- Self {
- size,
- symmetric,
- build_cost,
- }
- }
-
- state_impl!(pub bool);
-}
-
-impl BlockLogic for DoorBlock {
- impl_block!();
-
- fn draw(
- &self,
- name: &str,
- state: Option<&State>,
- _: Option<&RenderingContext>,
- _: Rotation,
- s: Scale,
- ) -> ImageHolder<4> {
- if let Some(state) = state {
- if *Self::get_state(state) {
- return load!(s -> match name {
- "door" => "door-open",
- "blast-door" => "blast-door-open",
- _ => "door-large-open",
- });
- };
- }
- load!(from name which is ["door" | "blast-door" | "door-large"], s)
- }
-
- fn data_from_i32(&self, _: i32, _: GridPos) -> Result<DynData, DataConvertError> {
- Ok(DynData::Boolean(false))
- }
-
- fn deserialize_state(&self, data: DynData) -> Result<Option<State>, DeserializeError> {
- match data {
- DynData::Boolean(opened) => Ok(Some(Self::create_state(opened))),
- _ => Err(DeserializeError::InvalidType {
- have: data.get_type(),
- expect: DynType::Boolean,
- }),
- }
- }
-
- fn serialize_state(&self, state: &State) -> Result<DynData, SerializeError> {
- let state = Self::get_state(state);
- Ok(DynData::Boolean(*state))
- }
-
- fn read(
- &self,
- build: &mut Build,
- _: &BlockRegistry,
- _: &EntityMapping,
- buff: &mut DataRead,
- ) -> Result<(), DataReadError> {
- build.state = Some(Self::create_state(buff.read_bool()?));
- Ok(())
- }
-}
diff --git a/src/content.rs b/src/content.rs
deleted file mode 100644
index 6c2872c..0000000
--- a/src/content.rs
+++ /dev/null
@@ -1,179 +0,0 @@
-//! contains types of types
-use std::error::Error;
-
-macro_rules! numeric_enum {
- ($vis:vis enum $tname:ident for $numeric:ty | $error:ident {$($name:ident $(= $val:literal)?),* $(,)?}) =>
- {
- crate::content::numeric_enum!($vis enum $tname for $numeric | $error* {$($name $(= $val)?),*});
-
- impl std::fmt::Display for $error {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- write!(f, "no variant of {} for value {}", stringify!($tname), self.0)
- }
- }
-
- impl std::error::Error for $error {}
- };
- ($vis:vis enum $tname:ident for $numeric:ty | $error:ident* {$($name:ident $(= $val:literal)?),* $(,)?}) =>
- {
- #[repr($numeric)]
- #[derive(Copy, Clone, Debug, Eq, Ord, PartialEq, PartialOrd, Hash)]
- $vis enum $tname { $($name $(= $val)?,)+ }
-
- #[derive(Copy, Clone, Debug, Eq, PartialEq)]
- $vis struct $error($vis $numeric);
-
- impl TryFrom<$numeric> for $tname {
- type Error = $error;
-
- #[allow(non_upper_case_globals)]
- fn try_from(value: $numeric) -> Result<Self, $error> {
- $(const $name: $numeric = $tname::$name as $numeric;)+
- match value {
- $($name => Ok(Self::$name),)+
- _ => Err($error(value)),
- }
- }
- }
-
- impl From<$tname> for $numeric { fn from(value: $tname) -> $numeric { value as $numeric } }
- };
-}
-
-pub(crate) use numeric_enum;
-
-macro_rules! content_enum {
- ($vis:vis enum $tname:ident / $ctype:ident for u16 | $error:ident {$($val:literal),* $(,)?}) =>
- {
- paste::paste! {
- $crate::content::numeric_enum!($vis enum $tname for u16 | $error* {
- $([<$val:camel>]),*,
- });
-
- impl $crate::content::Content for $tname {
- fn get_type(&self) -> $crate::content::Type {
- $crate::content::Type::$ctype
- }
-
- fn get_id(&self) -> u16 {
- *self as u16
- }
-
- fn get_name(&self) -> &'static str {
- match self {
- $(Self::[<$val:camel>] => $val,)*
- }
- }
- }
-
- impl std::fmt::Display for $error {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- write!(f, "no content of type {} for value {}", stringify!($ctype), self.0)
- }
- }
-
- impl std::fmt::Display for $tname {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- match self {
- $(Self::[<$val:camel>] => f.write_str(strconv::kebab2title!($val)),)*
- }
- }
- }
-
- impl std::error::Error for $error {}
- }
- };
-}
-pub(crate) use content_enum;
-
-macro_rules! color_content_enum {
- ($vis:vis enum $tname:ident / $ctype:ident for u16 | $error:ident {$($val:literal: $col:literal),* $(,)?}) =>
- {
- paste::paste! {
- $crate::content::content_enum!($vis enum $tname / $ctype for u16 | $error {
- $($val),*,
- });
-
- impl Type {
- #[must_use]
- pub const fn color(&self) -> (u8, u8, u8) {
- match &self {
- $(Self::[<$val:camel>] => {
- let v = color_hex::color_from_hex!($col);
- (v[0], v[1], v[2])
- },)*
- }
- }
- }
- }}
-}
-pub(crate) use color_content_enum;
-
-numeric_enum! {
- pub enum Type for u8 | TryFromU8Error
- {
- Item = 0,
- Block = 1,
- // Mech = 2,
- Bullet = 3,
- Fluid = 4,
- Modifier = 5,
- Unit = 6,
- Weather = 7,
- // Effect = 8,
- Sector = 9,
- // Loadout = 10,
- // TypeId = 11,
- // Error = 12,
- Planet = 13,
- // Ammo = 14,
- Team = 15,
- }
-}
-
-macro_rules! gen_by_id {
- ($target:path, $id:expr) => {
- match <$target>::try_from($id) {
- Ok(v) => Ok(Box::new(v)),
- Err(e) => Err(Box::new(e)),
- }
- };
-}
-
-impl Type {
- pub fn get(self, id: u16) -> Result<Box<dyn Content>, Box<dyn Error>> {
- match self {
- Self::Item => gen_by_id!(crate::item::Type, id),
- Self::Block => gen_by_id!(crate::block::content::Type, id),
- Self::Fluid => gen_by_id!(crate::fluid::Type, id),
- Self::Modifier => gen_by_id!(crate::modifier::Type, id),
- Self::Unit => gen_by_id!(crate::unit::Type, id),
- Self::Team => gen_by_id!(crate::team::Team, id),
- _ => Ok(Box::new(Generic(self, id))),
- }
- }
-}
-
-pub trait Content {
- fn get_type(&self) -> Type;
-
- fn get_id(&self) -> u16;
-
- fn get_name(&self) -> &str;
-}
-
-struct Generic(Type, u16);
-
-impl Content for Generic {
- fn get_type(&self) -> Type {
- self.0
- }
-
- fn get_id(&self) -> u16 {
- self.1
- }
-
- fn get_name(&self) -> &str {
- "<unknown>"
- }
-}
diff --git a/src/data/command.rs b/src/data/command.rs
deleted file mode 100644
index 7d5298c..0000000
--- a/src/data/command.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use crate::content::numeric_enum;
-
-numeric_enum! {
- pub enum UnitCommand for u8 | TryFromU8Error {
- Move, Repair, Rebuild, Assist, Mine, Boost,
- }
-}
diff --git a/src/data/map.rs b/src/data/map.rs
deleted file mode 100644
index 636e3f3..0000000
--- a/src/data/map.rs
+++ /dev/null
@@ -1,696 +0,0 @@
-//! the map module
-//! ### format
-//! note: utf = `len<u16>` + `utf8(read(len))`
-//!
-//! note: each section has a `u32` denoting its length
-//!
-//! key: `: T` and `x<T>` both mean read T, `iterate T` means iterate `read_T()` times
-//!
-//! ZLIB compressed stream contains:
-//! - header: 4b = `MSCH`
-//! - version: `u32` (should be 7)
-//! - tag section `<u32>`
-//! - 1 byte of idk (skip)
-//! - string map (`u16` for map len, iterate each, read `utf`)
-//! - content header section `<u32>`:
-//! - iterate `i8` (should = `8`)'
-//! - the type: `i8` (0: item, block: 1, liquid: 4, status: 5, unit: 6, weather: 7, sector: 9, planet: 13//! - item count: `u16` (item: 22, block: 412, liquid: 11, status: 21, unit: 66, weather: 6, sector: 35, planet: 7)
-//! - these types all have their own modules: [`item`], [`content`], [`fluid`], [`modifier`], [`mod@unit`], [`weather`], [`sector`], [`planet`]
-//! - iterate `u16`
-//! - name: `utf`
-//! - map section `<u32>`
-//! - width: `u16`, height: `u16`
-//! - floor and tiles:
-//! - for `i` in `w * h`
-//! - `x = i % w`, `y = i / w`
-//! - floor id: `u16`
-//! - overlay id: `u16`
-//! - consecutives: `u8`
-//! - iterate `(i + 1)..(i + 1 + consecutives)`
-//! - `x = j % w`, `y = j / w`
-//! - i += consecutives
-//! - blocks
-//! - for `i` in `w * h`
-//! - block id: `u16`
-//! - packed?: `i8`
-//! - entity = `(packed & 1) not 0`
-//! - data = `(packed & 2) not 0`
-//! - if entity: central: `bool`
-//! - if entity:
-//! - if central:
-//! - chunk len: `u16`
-//! - if block == building:
-//! - revision: `i8`
-//! - [`read`]
-//! - else skip `chunk len`
-//! - or data
-//! - data: `i8`
-//! - else
-//! - consecutives: `u8`
-//! - iterate `(i + 1)..(i + 1 + consecutives)`
-//! - same block
-//! - i += consecutives
-//! - entities section `<u32>`
-//! - entity mapping
-//! - iterate `u16`
-//! - id: `i16`, name: `utf`
-//! - team build plans
-//! - for t in `teams<u32>`
-//! - team = `team#<u32>`
-//! - iterate `plans<u32>`
-//! - x: `u16`, y: `u16`, rot: `u16`, id: `u16`
-//! - o: `DynData` (refer to [`DynSerializer`])
-//! - world entities
-//! - iterate `u32`
-//! - len: `u16`
-//! - type: `u8`
-//! - if !mapping\[type\]
-//! - skip(len - 1)
-//! - continue
-//! - id: `u32`
-//! - entity read
-use std::collections::HashMap;
-use std::ops::{Index, IndexMut};
-use thiserror::Error;
-
-use crate::block::content::Type as BlockEnum;
-use crate::block::{Block, BlockRegistry, Rotation, State};
-use crate::data::dynamic::DynSerializer;
-use crate::data::renderer::*;
-use crate::data::DataRead;
-use crate::fluid::Type as Fluid;
-use crate::item::{storage::Storage, Type as Item};
-use crate::team::{self, Team};
-#[cfg(doc)]
-use crate::{block::content, data::*, fluid, item, modifier, unit};
-
-use super::Serializer;
-use crate::content::Content;
-use crate::utils::image::ImageUtils;
-
-/// a tile in a map
-#[derive(Clone)]
-pub struct Tile<'l> {
- pub floor: BlockEnum,
- pub ore: BlockEnum,
- build: Option<Build<'l>>,
-}
-
-macro_rules! lo {
- ($v:expr => [$(|)? $($k:literal $(|)?)+], $scale: ident) => { paste::paste! {
- match $v {
- $(BlockEnum::[<$k:camel>] => load!($k, $scale),)+
- n => unreachable!("{n:?}"),
- }
- } };
-}
-
-pub type EntityMapping = HashMap<u8, Box<dyn Content>>;
-impl<'l> Tile<'l> {
- #[must_use]
- pub const fn new(floor: BlockEnum, ore: BlockEnum) -> Self {
- Self {
- floor,
- ore,
- build: None,
- }
- }
-
- fn set_block(&mut self, block: &'l Block) {
- self.build = Some(Build {
- block,
- state: None,
- items: Storage::new(),
- liquids: Storage::new(),
- rotation: Rotation::Up,
- team: crate::team::SHARDED,
- data: 0,
- });
- }
-
- #[must_use]
- pub const fn build(&self) -> Option<&Build<'l>> {
- self.build.as_ref()
- }
-
- /// size of this tile
- ///
- /// ._.
- ///
- /// dont think about it too much
- #[must_use]
- #[inline]
- pub fn size(&self) -> u8 {
- self.build.as_ref().map_or(1, |v| v.block.get_size())
- }
-
- #[inline]
- pub(crate) fn floor(&self, s: Scale) -> ImageHolder<4> {
- lo!(self.floor => [
- | "darksand"
- | "sand-floor"
- | "dacite"
- | "dirt"
- | "arkycite-floor"
- | "basalt"
- | "moss"
- | "mud"
- | "grass"
- | "ice-snow" | "snow" | "salt" | "ice"
- | "hotrock" | "char" | "magmarock"
- | "shale"
- | "metal-floor" | "metal-floor-2" | "metal-floor-3" | "metal-floor-4" | "metal-floor-5" | "metal-floor-damaged"
- | "dark-panel-1" | "dark-panel-2" | "dark-panel-3" | "dark-panel-4" | "dark-panel-5" | "dark-panel-6"
- | "darksand-tainted-water" | "darksand-water" | "deep-tainted-water" | "deep-water" | "sand-water" | "shallow-water" | "tainted-water"
- | "tar" | "pooled-cryofluid" | "molten-slag"
- | "space"
- | "stone"
- | "bluemat"
- | "ferric-craters"
- | "beryllic-stone"
- | "rhyolite" | "rough-rhyolite" | "rhyolite-crater" | "rhyolite-vent"
- | "core-zone"
- | "crater-stone"
- | "redmat"
- | "red-ice"
- | "spore-moss"
- | "regolith"
- | "ferric-stone"
- | "arkyic-stone" | "arkyic-vent"
- | "yellow-stone" | "yellow-stone-plates" | "yellow-stone-vent"
- | "red-stone" | "red-stone-vent" | "dense-red-stone"
- | "carbon-stone" | "carbon-vent"
- | "crystal-floor" | "crystalline-stone" | "crystalline-vent"
- | "empty"], s)
- }
-
- #[must_use]
- #[inline]
- pub(crate) fn ore(&self, s: Scale) -> ImageHolder<4> {
- lo!(self.ore => ["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" | "spawn" | "ore-crystal-thorium"], s)
- }
-
- #[must_use]
- #[inline]
- pub fn has_ore(&self) -> bool {
- self.ore != BlockEnum::Air
- }
-
- /// Draw the floor of this tile
- #[must_use]
- pub fn floor_image(&self, s: Scale) -> ImageHolder<4> {
- let mut floor = self.floor(s);
- if self.has_ore() {
- unsafe { floor.overlay(&self.ore(s)) };
- }
- floor
- }
-
- /// Draw this tiles build.
- #[must_use]
- #[inline]
- pub fn build_image(&self, context: Option<&RenderingContext>, s: Scale) -> ImageHolder<4> {
- // building covers floore
- let Some(b) = &self.build else {
- unreachable!();
- };
- b.image(context, s)
- }
-}
-
-impl std::fmt::Debug for Tile<'_> {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- write!(
- f,
- "Tile@{}{}{}",
- self.floor.get_name(),
- if self.ore != BlockEnum::Air {
- format!("+{}", self.ore.get_name())
- } else {
- String::new()
- },
- if let Some(build) = &self.build {
- format!(":{}", build.block.name())
- } else {
- String::new()
- }
- )
- }
-}
-
-impl<'l> BlockState<'l> for Tile<'l> {
- fn get_block(&self) -> Option<&'l Block> {
- Some(self.build()?.block)
- }
-}
-
-impl RotationState for Tile<'_> {
- fn get_rotation(&self) -> Option<Rotation> {
- Some(self.build()?.rotation)
- }
-}
-
-impl RotationState for Option<Tile<'_>> {
- fn get_rotation(&self) -> Option<Rotation> {
- self.as_ref().unwrap().get_rotation()
- }
-}
-
-impl<'l> BlockState<'l> for Option<Tile<'_>> {
- fn get_block(&'l self) -> Option<&'l Block> {
- self.as_ref().unwrap().get_block()
- }
-}
-
-/// a build on a tile in a map
-#[derive(Clone)]
-pub struct Build<'l> {
- pub block: &'l Block,
- pub items: Storage<Item>,
- pub liquids: Storage<Fluid>,
- pub state: Option<State>,
- // pub health: f32,
- pub rotation: Rotation,
- pub team: Team,
- pub data: i8,
-}
-
-impl std::fmt::Debug for Build<'_> {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- write!(f, "Build<{block}>", block = self.block.name(),)
- }
-}
-
-impl<'l> Build<'l> {
- #[must_use]
- pub fn new(block: &'l Block) -> Build<'l> {
- Self {
- block,
- items: Storage::default(),
- liquids: Storage::default(),
- state: None,
- rotation: Rotation::Up,
- team: team::SHARDED,
- data: 0,
- }
- }
-
- fn image(&self, context: Option<&RenderingContext>, s: Scale) -> ImageHolder<4> {
- self.block
- .image(self.state.as_ref(), context, self.rotation, s)
- }
-
- #[must_use]
- pub const fn name(&self) -> &str {
- self.block.name()
- }
-
- pub fn read(
- &mut self,
- buff: &mut DataRead<'_>,
- reg: &BlockRegistry,
- map: &EntityMapping,
- ) -> Result<(), ReadError> {
- // health
- let _ = buff.read_f32()?;
- let rot = buff.read_i8()? as i16;
- // team
- let _ = buff.read_i8()?;
- self.rotation = Rotation::try_from((rot & 127) as u8).unwrap_or(Rotation::Up);
- let mut mask = 0;
- let mut version = 0;
- if rot & 128 != 0 {
- version = buff.read_u8()?;
- if version < 3 {
- return Err(ReadError::Version(version));
- }
- buff.skip(1)?;
- mask = buff.read_u8()?;
- }
-
- if mask & 1 != 0 {
- read_items(buff, &mut self.items)?;
- }
- if mask & 2 != 0 {
- read_power(buff)?;
- }
- if mask & 4 != 0 {
- read_liquids(buff, &mut self.liquids)?;
- }
- // "efficiency"?
- buff.skip(2)?;
- if version == 4 {
- // visible flags for fog
- buff.skip(4)?;
- }
- // "overridden by subclasses"
- self.block.read(self, reg, map, buff)?;
- // implementation not complete, simply error, causing the remaining bytes in the chunk to be skipped (TODO finish impl)
- Err(ReadError::Version(0x0))
- // Ok(())
- }
-}
-
-/// format:
-/// - iterate [`u16`]
-/// - item: [`u16`] as [`Item`]
-/// - amount: [`u32`]
-///
-fn read_items(from: &mut DataRead, to: &mut Storage<Item>) -> Result<(), ReadError> {
- to.clear();
- for _ in 0..from.read_u16()? {
- let item = from.read_u16()?;
- let amount = from.read_u32()?;
- if let Ok(item) = Item::try_from(item) {
- to.set(item, amount);
- }
- }
- Ok(())
-}
-
-/// format:
-/// - iterate [`u16`]
-/// - liquid: [`u16`] as [`Fluid`]
-/// - amount: [`f32`]
-fn read_liquids(from: &mut DataRead, to: &mut Storage<Fluid>) -> Result<(), ReadError> {
- to.clear();
- for _ in 0..from.read_u16()? {
- let fluid = from.read_u16()?;
- let amount = from.read_f32()?;
- if let Ok(fluid) = Fluid::try_from(fluid) {
- to.set(fluid, (amount * 100.0) as u32);
- }
- }
- Ok(())
-}
-
-/// format:
-/// - iterate [`u16`]
-/// - link: [`i32`]
-/// - status: [`f32`]
-fn read_power(from: &mut DataRead) -> Result<(), ReadError> {
- let n = from.read_u16()? as usize;
- from.skip((n + 1) * 4)?;
- Ok(())
-}
-
-#[test]
-fn test_read_items() {
- let mut s = Storage::new();
- read_items(
- &mut DataRead::new(&[
- 0, 6, 0, 0, 0, 0, 2, 187, 0, 1, 0, 0, 1, 154, 0, 2, 0, 0, 15, 160, 0, 3, 0, 0, 0, 235,
- 0, 6, 0, 0, 1, 46, 0, 12, 0, 0, 1, 81, 255, 255,
- ]),
- &mut s,
- )
- .unwrap();
- assert!(s.get_total() == 5983);
-}
-
-#[test]
-fn test_read_liquids() {
- let mut s = Storage::new();
- read_liquids(
- &mut DataRead::new(&[0, 1, 0, 0, 67, 111, 247, 126, 255, 255]),
- &mut s,
- )
- .unwrap();
- assert!(s.get(Fluid::Water) == 23996);
-}
-
-/// a map.
-/// ## Does not support serialization yet!
-#[derive(Debug)]
-pub struct Map<'l> {
- pub width: usize,
- pub height: usize,
- pub tags: HashMap<String, String>,
- /// row major 2d array
- /// ```rs
- /// (0, 0), (1, 0), (2, 0)
- /// (0, 1), (1, 1), (2, 1)
- /// (0, 2), (1, 2), (2, 2)
- /// ```
- pub tiles: Vec<Tile<'l>>,
-}
-
-macro_rules! cond {
- ($cond: expr, $do: expr) => {
- if $cond {
- None
- } else {
- $do
- }
- };
-}
-
-impl<'l> Crossable for Map<'l> {
- // N
- // cond!(pos.position.1 >= (pos.height - 1) as u16, get(j + 1)),
- // // E
- // cond!(
- // pos.position.0 >= (pos.height - 1) as u16,
- // get(j + pos.height)
- // ),
- // // S
- // cond!(
- // pos.position.1 == 0 || pos.position.1 >= pos.height as u16,
- // cond!(pos.position.1 >= (pos.height - 1), get(j + 1)),
- // // E
- // cond!(pos.position.0 >= (pos.height - 1), get(j + pos.height)),
- // // S
- // cond!(
- // pos.position.1 == 0 || pos.position.1 >= pos.height,
- // get(j - 1)
- // ),
- // // W
- // cond!(j < pos.height, get(j - pos.height)),
- fn cross(&self, j: usize, c: &PositionContext) -> Cross {
- let get = |i| {
- let b = &self[i];
- Some((b.get_block()?, b.get_rotation()?))
- };
- [
- cond![
- c.position.1 == 0 || c.position.1 >= c.height,
- get(j + self.height)
- ],
- cond![c.position.0 >= (c.height - 1), get(j + 1)],
- cond![c.position.1 >= (c.height - 1), get(j - self.width)],
- cond![j < c.height, get(j - 1)],
- ]
- }
-}
-
-impl<'l> Map<'l> {
- #[must_use]
- pub fn new(width: usize, height: usize, tags: HashMap<String, String>) -> Self {
- Self {
- tiles: vec![Tile::new(BlockEnum::Air, BlockEnum::Air); width * height],
- height,
- width,
- tags,
- }
- }
-}
-
-impl<'l> Index<usize> for Map<'l> {
- type Output = Tile<'l>;
- fn index(&self, index: usize) -> &Self::Output {
- &self.tiles[index]
- }
-}
-
-impl<'l> IndexMut<usize> for Map<'l> {
- fn index_mut(&mut self, index: usize) -> &mut Self::Output {
- &mut self.tiles[index]
- }
-}
-
-const MAP_HEADER: [u8; 4] = [b'M', b'S', b'A', b'V'];
-
-/// error occurring when reading a map fails
-#[derive(Debug, Error)]
-pub enum ReadError {
- #[error("failed to read from buffer")]
- Read(#[from] super::ReadError),
- #[error(transparent)]
- Decompress(#[from] super::DecompressError),
- #[error("incorrect header ({0:?})")]
- Header([u8; 4]),
- #[error("unsupported version ({0})")]
- Version(u8),
- #[error("unknown block {0:?}")]
- NoSuchBlock(String),
- #[error("failed to read block data")]
- ReadState(#[from] super::dynamic::ReadError),
-}
-
-/// serde map
-pub struct MapSerializer<'l>(pub &'l BlockRegistry<'l>);
-impl<'l> Serializer<Map<'l>> for MapSerializer<'l> {
- type ReadError = ReadError;
- type WriteError = ();
- /// deserialize a map
- ///
- /// notes:
- /// - does not deserialize data
- /// - does not deserialize entities
- fn deserialize(&mut self, buff: &mut DataRead<'_>) -> Result<Map<'l>, Self::ReadError> {
- let buff = buff.deflate()?;
- let mut buff = DataRead::new(&buff);
- {
- let mut b = [0; 4];
- buff.read_bytes(&mut b)?;
- if b != MAP_HEADER {
- return Err(ReadError::Header(b));
- }
- }
- let version = buff.read_u32()?;
- if version != 7 {
- return Err(ReadError::Version(version.try_into().unwrap_or(0)));
- }
- let mut tags = HashMap::new();
- buff.read_chunk(true, |buff| {
- buff.skip(1)?;
- for _ in 0..buff.read_u8()? {
- let key = buff.read_utf()?;
- let value = buff.read_utf()?;
- tags.insert(key.to_owned(), value.to_owned());
- }
- Ok::<(), super::ReadError>(())
- })?;
- // we skip the content header (just keep the respective modules updated)
- buff.skip_chunk()?;
- // map section
- let mut w = 0;
- let mut h = 0;
- let mut m = None;
- buff.read_chunk(true, |buff| {
- w = buff.read_u16()? as usize;
- h = buff.read_u16()? as usize;
- let mut map = Map::new(w, h, tags);
- let count = w * h;
- let mut i = 0;
- while i < count {
- let floor_id = buff.read_u16()?;
- let overlay_id = buff.read_u16()?;
- let floor = BlockEnum::try_from(floor_id).unwrap_or(BlockEnum::Stone);
- let ore = BlockEnum::try_from(overlay_id).unwrap_or(BlockEnum::Air);
- map[i] = Tile::new(floor, ore);
- let consecutives = buff.read_u8()? as usize;
- if consecutives > 0 {
- for i in (i + 1)..(i + 1 + consecutives) {
- map[i] = Tile::new(floor, ore);
- }
- i += consecutives;
- }
- i += 1;
- }
- let mut i = 0usize;
- while i < count {
- let block_id = buff.read_u16()?;
- let packed = buff.read_u8()?;
- let entity = (packed & 1) != 0;
- let data = (packed & 2) != 0;
- let central = if entity { buff.read_bool()? } else { false };
- let block = BlockEnum::try_from(block_id)
- .map_err(|_| ReadError::NoSuchBlock(block_id.to_string()))?;
- let block = if block == BlockEnum::Air {
- None
- } else {
- Some(
- self.0
- .get(block.get_name())
- .ok_or_else(|| ReadError::NoSuchBlock(block.to_string()))?,
- )
- };
- if central {
- if let Some(block) = block {
- map[i].set_block(block);
- }
- }
- if entity {
- if central {
- let mut output = [0u8; 2];
- output.copy_from_slice(&buff.data[..2]);
- let _ = buff.read_chunk(false, |buff| {
- #[cfg(debug_assertions)]
- println!("reading {:?}", map[i].build.as_ref().unwrap());
- let _ = buff.read_i8()?;
-
- map[i]
- .build
- .as_mut()
- .unwrap()
- // map not initialized yet
- .read(buff, self.0, &HashMap::new())?;
- Ok::<(), ReadError>(())
- });
- }
- } else if data {
- if let Some(block) = block {
- map[i].set_block(block);
- }
- map[i].build.as_mut().unwrap().data = buff.read_i8()?;
- } else {
- let consecutives = buff.read_u8()? as usize;
- for i in i..=i + consecutives {
- if let Some(block) = block {
- map.tiles[i].set_block(block);
- }
- }
- i += consecutives;
- }
- i += 1;
- }
- m = Some(map);
- Ok::<(), ReadError>(())
- })?;
- let mut mapping = EntityMapping::new();
- buff.read_chunk(true, |buff| {
- // read entity mapping (SaveVersion.java#436)
- for _ in 0..buff.read_u16()? {
- let id = buff.read_u16()? as u8;
- let nam = buff.read_utf()?;
- dbg!(nam);
- mapping.insert(id, Box::new(Item::Copper));
- // mapping.push(content::Type::get_name(nam));
- }
- // read team block plans (ghosts) (SaveVersion.java#389)
- for _ in 0..buff.read_u32()? {
- buff.skip(4)?;
- for _ in 0..buff.read_u32()? {
- buff.skip(8usize)?;
- let _ = DynSerializer::deserialize(&mut DynSerializer, buff)?;
- }
- }
- // read world entities (#412). eg units
- for _ in 0..buff.read_u32()? {
- let len = buff.read_u16()? as usize;
- let ty = buff.read_u8()?;
- if !mapping.contains_key(&ty) {
- buff.skip(len - 1)?;
- continue;
- }
- let _id = buff.read_u32()?;
- // TODO
- }
- Ok::<(), ReadError>(())
- })?;
- // skip custom chunks
- buff.skip_chunk()?;
- Ok(m.unwrap())
- }
-
- /// serialize a map (todo)
- /// panics: always
- fn serialize(
- &mut self,
- _: &mut super::DataWrite<'_>,
- _: &Map<'_>,
- ) -> Result<(), Self::WriteError> {
- todo!()
- }
-}
diff --git a/src/data/mod.rs b/src/data/mod.rs
deleted file mode 100644
index 0583ea4..0000000
--- a/src/data/mod.rs
+++ /dev/null
@@ -1,530 +0,0 @@
-//! all the IO
-use flate2::{
- Compress, CompressError as CError, Compression, Decompress, DecompressError as DError,
- FlushCompress, FlushDecompress, Status,
-};
-use std::collections::HashMap;
-use std::error::Error;
-use std::fmt;
-use std::str::Utf8Error;
-use thiserror::Error;
-
-pub(crate) mod autotile;
-mod base64;
-pub mod command;
-pub mod dynamic;
-pub mod map;
-pub mod planet;
-pub mod renderer;
-pub mod schematic;
-pub mod sector;
-pub mod weather;
-
-#[derive(Debug)]
-pub struct DataRead<'d> {
- pub(crate) data: &'d [u8],
- // used with read_chunk
- read: usize,
-}
-
-impl fmt::Display for DataRead<'_> {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- write!(f, "{}", String::from_utf8_lossy(self.data))
- }
-}
-
-macro_rules! make_read {
- ($name:ident, $type:ty) => {
- pub fn $name(&mut self) -> Result<$type, ReadError> {
- const LEN: usize = std::mem::size_of::<$type>();
- if self.data.len() < LEN {
- return Err(ReadError::Underflow {
- need: LEN,
- have: self.data.len(),
- });
- }
- let mut output = [0u8; LEN];
- output.copy_from_slice(&self.data[..LEN]);
- self.data = &self.data[LEN..];
- self.read += LEN;
- Ok(<$type>::from_be_bytes(output))
- }
- };
-}
-
-impl<'d> DataRead<'d> {
- #[must_use]
- pub const fn new(data: &'d [u8]) -> Self {
- Self { data, read: 0 }
- }
-
- pub fn read_bool(&mut self) -> Result<bool, ReadError> {
- Ok(self.read_u8()? != 0)
- }
-
- make_read!(read_u8, u8);
- make_read!(read_i8, i8);
- make_read!(read_u16, u16);
- make_read!(read_i16, i16);
- make_read!(read_u32, u32);
- make_read!(read_i32, i32);
- make_read!(read_f32, f32);
- make_read!(read_u64, u64);
- make_read!(read_i64, i64);
- make_read!(read_f64, f64);
-
- pub fn read_utf(&mut self) -> Result<&'d str, ReadError> {
- if self.data.len() < 2 {
- return Err(ReadError::Underflow {
- need: 2,
- have: self.data.len(),
- });
- }
- let len = self.read_u16()?;
- let end = len as usize;
- if self.data.len() < end {
- return Err(ReadError::Underflow {
- need: end,
- have: self.data.len(),
- });
- }
- let result = std::str::from_utf8(&self.data[..end])?;
- self.data = &self.data[end..];
- self.read += end;
- Ok(result)
- }
-
- pub fn read_bytes(&mut self, dst: &mut [u8]) -> Result<(), ReadError> {
- if self.data.len() < dst.len() {
- return Err(ReadError::Underflow {
- need: dst.len(),
- have: self.data.len(),
- });
- }
- dst.copy_from_slice(&self.data[..dst.len()]);
- self.data = &self.data[dst.len()..];
- self.read += dst.len();
- Ok(())
- }
-
- pub fn skip(&mut self, n: usize) -> Result<(), ReadError> {
- if self.data.len() < n {
- return Err(ReadError::Underflow {
- need: n,
- have: self.data.len(),
- });
- }
- self.data = &self.data[n..];
- self.read += n;
- Ok(())
- }
-
- pub fn skip_chunk(&mut self) -> Result<usize, ReadError> {
- let len = self.read_u32()? as usize;
- self.skip(len)?;
- Ok(len)
- }
-
- pub fn read_chunk<E>(
- &mut self,
- big: bool,
- f: impl FnOnce(&mut DataRead) -> Result<(), E>,
- ) -> Result<(), E>
- where
- E: Error + From<ReadError>,
- {
- let len = if big {
- self.read_u32()? as usize
- } else {
- self.read_u16()? as usize
- };
- self.read = 0;
- let r = f(self);
- match r {
- Err(e) => {
- // skip this chunk
- assert!(
- len >= self.read,
- "overread; supposed to read {len}; read {}",
- self.read
- );
- let n = len - self.read;
- if n != 0 {
- #[cfg(debug_assertions)]
- println!(
- "supposed to read {len}; read {} - skipping excess",
- self.read
- );
- self.skip(n)?;
- };
- Err(e)
- }
- Ok(_) => Ok(()),
- }
- }
-
- pub fn read_vec(&mut self, dst: &mut Vec<u8>, len: usize) -> Result<(), ReadError> {
- if self.data.len() < len {
- return Err(ReadError::Underflow {
- need: len,
- have: self.data.len(),
- });
- }
- dst.extend_from_slice(&self.data[..len]);
- self.data = &self.data[len..];
- self.read += len;
- Ok(())
- }
-
- pub fn read_map(&mut self, dst: &mut HashMap<String, String>) -> Result<(), ReadError> {
- let n = self.read_u8()?;
- for _ in 0..n {
- let key = self.read_utf()?;
- let value = self.read_utf()?;
- dst.insert(key.to_owned(), value.to_owned());
- }
- Ok(())
- }
-
- pub fn deflate(&mut self) -> Result<Vec<u8>, DecompressError> {
- let mut dec = Decompress::new(true);
- let mut raw = Vec::<u8>::new();
- raw.reserve(1024);
- loop {
- let t_in = dec.total_in();
- let t_out = dec.total_out();
- let res = dec.decompress_vec(self.data, &mut raw, FlushDecompress::Finish)?;
- if dec.total_in() > t_in {
- // we have to advance input every time, decompress_vec only knows the output position
- self.data = &self.data[(dec.total_in() - t_in) as usize..];
- }
- match res {
- // there's no more input (and the flush mode says so), we need to reserve additional space
- Status::Ok | Status::BufError => (),
- // input was already at the end, so this is referring to the output
- Status::StreamEnd => break,
- }
- if dec.total_in() == t_in && dec.total_out() == t_out {
- // protect against looping forever
- return Err(DecompressError::DecompressStall);
- }
- raw.reserve(1024);
- }
- assert_eq!(dec.total_out() as usize, raw.len());
- self.read = 0;
- Ok(raw)
- }
-}
-
-#[derive(Debug, Error)]
-pub enum DecompressError {
- #[error("zlib decompression failed")]
- Decompress(#[from] DError),
- #[error("decompressor stalled before completion")]
- DecompressStall,
-}
-
-#[derive(Debug, Error)]
-pub enum ReadError {
- #[error("buffer underflow (expected {need} but got {have})")]
- Underflow { need: usize, have: usize },
- #[error("expected {0}")]
- Expected(&'static str),
- #[error("malformed utf8 in string")]
- Utf8 {
- #[from]
- source: Utf8Error,
- },
-}
-
-impl PartialEq for ReadError {
- fn eq(&self, _: &Self) -> bool {
- false
- }
-}
-
-enum WriteBuff<'d> {
- // unlike the DataRead want to access the written region after
- Ref { raw: &'d mut [u8], pos: usize },
- Vec(Vec<u8>),
-}
-
-impl<'d> WriteBuff<'d> {
- fn check_capacity(&self, need: usize) -> Result<(), WriteError> {
- match self {
- Self::Ref { raw, pos } if raw.len() - pos < need => Err(WriteError::Overflow {
- need,
- have: raw.len() - pos,
- }),
- _ => Ok(()),
- }
- }
-
- fn write(&mut self, data: &[u8]) {
- match self {
- Self::Ref { raw, pos } => {
- let end = *pos + data.len();
- raw[*pos..end].copy_from_slice(data);
- *pos += data.len();
- }
- Self::Vec(v) => v.extend_from_slice(data),
- }
- }
-}
-
-pub struct DataWrite<'d> {
- data: WriteBuff<'d>,
-}
-
-macro_rules! make_write {
- ($name:ident, $type:ty) => {
- pub fn $name(&mut self, val: $type) -> Result<(), WriteError> {
- const LEN: usize = std::mem::size_of::<$type>();
- self.data.check_capacity(LEN)?;
- self.data.write(&<$type>::to_be_bytes(val));
- Ok(())
- }
- };
-}
-
-impl<'d> DataWrite<'d> {
- pub fn write_bool(&mut self, val: bool) -> Result<(), WriteError> {
- self.write_u8(u8::from(val))
- }
-
- make_write!(write_u8, u8);
- make_write!(write_i8, i8);
- make_write!(write_u16, u16);
- make_write!(write_i16, i16);
- make_write!(write_u32, u32);
- make_write!(write_i32, i32);
- make_write!(write_f32, f32);
- make_write!(write_u64, u64);
- make_write!(write_i64, i64);
- make_write!(write_f64, f64);
-
- pub fn write_utf(&mut self, val: &str) -> Result<(), WriteError> {
- if val.len() > u16::MAX as usize {
- return Err(WriteError::TooLong { len: val.len() });
- }
- self.data.check_capacity(2 + val.len())?;
- self.data.write(&u16::to_be_bytes(val.len() as u16));
- self.data.write(val.as_bytes());
- Ok(())
- }
-
- pub fn write_bytes(&mut self, val: &[u8]) -> Result<(), WriteError> {
- self.data.check_capacity(val.len())?;
- self.data.write(val);
- Ok(())
- }
-
- #[must_use]
- pub const fn is_owned(&self) -> bool {
- matches!(self.data, WriteBuff::Vec(..))
- }
-
- #[must_use]
- pub fn get_written(&self) -> &[u8] {
- match &self.data {
- WriteBuff::Ref { raw, pos } => &raw[..*pos],
- WriteBuff::Vec(v) => v,
- }
- }
-
- /// eat this datawrite
- ///
- /// panics if ref write buffer
- #[must_use]
- pub fn consume(self) -> Vec<u8> {
- match self.data {
- WriteBuff::Vec(v) => v,
- WriteBuff::Ref { .. } => unreachable!(),
- }
- }
-
- pub fn inflate(self, to: &mut DataWrite) -> Result<(), CompressError> {
- // compress into the provided buffer
- let WriteBuff::Vec(raw) = self.data else {
- unreachable!("write buffer not owned")
- };
- let mut comp = Compress::new(Compression::default(), true);
- // compress the immediate buffer into a temp buffer to copy it to buff? no thanks
- match to.data {
- WriteBuff::Ref {
- raw: ref mut dst,
- ref mut pos,
- } => {
- match comp.compress(&raw, &mut dst[*pos..], FlushCompress::Finish)? {
- // there's no more input (and the flush mode says so), but we can't resize the output
- Status::Ok | Status::BufError => {
- return Err(CompressError::CompressEof(
- raw.len() - comp.total_in() as usize,
- ))
- }
- Status::StreamEnd => (),
- }
- }
- WriteBuff::Vec(ref mut dst) => {
- let mut input = raw.as_ref();
- dst.reserve(1024);
- loop {
- let t_in = comp.total_in();
- let t_out = comp.total_out();
- let res = comp.compress_vec(input, dst, FlushCompress::Finish)?;
- if comp.total_in() > t_in {
- // we have to advance input every time, compress_vec only knows the output position
- input = &input[(comp.total_in() - t_in) as usize..];
- }
- match res {
- // there's no more input (and the flush mode says so), we need to reserve additional space
- Status::Ok | Status::BufError => (),
- // input was already at the end, so this is referring to the output
- Status::StreamEnd => break,
- }
- if comp.total_in() == t_in && comp.total_out() == t_out {
- // protect against looping forever
- return Err(CompressError::CompressStall);
- }
- dst.reserve(1024);
- }
- }
- }
- assert_eq!(comp.total_in() as usize, raw.len());
- Ok(())
- }
-}
-
-impl Default for DataWrite<'static> {
- fn default() -> Self {
- Self {
- data: WriteBuff::Vec(Vec::new()),
- }
- }
-}
-
-#[derive(Debug, Error)]
-pub enum CompressError {
- #[error(transparent)]
- Compress(#[from] CError),
- #[error("compression overflow with {0} bytes of input remaining")]
- CompressEof(usize),
- #[error("compressor stalled before completion")]
- CompressStall,
-}
-
-#[derive(Debug, Error)]
-pub enum WriteError {
- #[error("buffer overflow (expected {need} but got {have})")]
- Overflow { need: usize, have: usize },
- #[error("string too long ({len} bytes of {})", u16::MAX)]
- TooLong { len: usize },
-}
-
-impl PartialEq for WriteError {
- fn eq(&self, _: &Self) -> bool {
- false
- }
-}
-
-impl<'d> From<&'d mut [u8]> for DataWrite<'d> {
- fn from(value: &'d mut [u8]) -> Self {
- Self {
- data: WriteBuff::Ref { raw: value, pos: 0 },
- }
- }
-}
-
-impl From<Vec<u8>> for DataWrite<'static> {
- fn from(value: Vec<u8>) -> Self {
- Self {
- data: WriteBuff::Vec(value),
- }
- }
-}
-
-impl<'d> TryFrom<DataWrite<'d>> for Vec<u8> {
- type Error = ();
-
- fn try_from(value: DataWrite<'d>) -> Result<Self, Self::Error> {
- match value.data {
- WriteBuff::Vec(v) => Ok(v),
- WriteBuff::Ref { .. } => Err(()),
- }
- }
-}
-/// basic serialization/deserialization functions
-pub trait Serializer<D> {
- type ReadError;
- type WriteError;
-
- fn deserialize(&mut self, buff: &mut DataRead<'_>) -> Result<D, Self::ReadError>;
-
- fn serialize(&mut self, buff: &mut DataWrite<'_>, data: &D) -> Result<(), Self::WriteError>;
-}
-
-#[derive(Clone, Copy, Eq, PartialEq)]
-pub struct GridPos(pub usize, pub usize);
-
-impl From<u32> for GridPos {
- fn from(value: u32) -> Self {
- GridPos((value >> 16) as u16 as usize, value as u16 as usize)
- }
-}
-
-impl From<GridPos> for u32 {
- /// ```
- /// # use mindus::data::GridPos;
- /// assert_eq!(GridPos::from(u32::from(GridPos(1000, 5))), GridPos(1000, 5));
- /// ```
- fn from(value: GridPos) -> Self {
- ((value.0 << 16) | value.1) as u32
- }
-}
-
-impl fmt::Debug for GridPos {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- write!(f, "({0}, {1})", self.0, self.1)
- }
-}
-
-#[cfg(test)]
-mod test {
- use super::*;
-
- #[test]
- fn read() {
- let mut read = DataRead::new("Thé qûick ઉrown fox 🦘 over\0\rthe lazy dog.".as_bytes());
- assert_eq!(read.read_u8(), Ok(84));
- assert_eq!(read.read_i8(), Ok(104));
- assert_eq!(read.read_i8(), Ok(-61));
- assert_eq!(read.read_u16(), Ok(43296));
- assert_eq!(read.read_i16(), Ok(29123));
- assert_eq!(read.read_i16(), Ok(-17559));
- assert_eq!(read.read_i32(), Ok(1_667_965_152));
- assert_eq!(read.read_i32(), Ok(-1_433_832_849));
- assert_eq!(read.read_i64(), Ok(8_605_851_562_280_493_296));
- assert_eq!(read.read_i64(), Ok(-6_942_694_510_468_635_278));
- assert_eq!(read.read_utf(), Ok("the lazy dog."));
- }
-
- #[test]
- fn write() {
- let mut write = DataWrite::default();
- assert_eq!(write.write_u8(84), Ok(()));
- assert_eq!(write.write_i8(104), Ok(()));
- assert_eq!(write.write_i8(-61), Ok(()));
- assert_eq!(write.write_u16(43296), Ok(()));
- assert_eq!(write.write_i16(29123), Ok(()));
- assert_eq!(write.write_i16(-17559), Ok(()));
- assert_eq!(write.write_i32(1_667_965_152), Ok(()));
- assert_eq!(write.write_i32(-1_433_832_849), Ok(()));
- assert_eq!(write.write_i64(8_605_851_562_280_493_296), Ok(()));
- assert_eq!(write.write_i64(-6_942_694_510_468_635_278), Ok(()));
- assert_eq!(write.write_utf("the lazy dog."), Ok(()));
- assert_eq!(
- write.get_written(),
- "Thé qûick ઉrown fox 🦘 over\0\rthe lazy dog.".as_bytes()
- );
- }
-}
diff --git a/src/data/renderer.rs b/src/data/renderer.rs
deleted file mode 100644
index 4bbcbe7..0000000
--- a/src/data/renderer.rs
+++ /dev/null
@@ -1,296 +0,0 @@
-//! schematic drawing
-pub(crate) use super::autotile::*;
-use super::schematic::Schematic;
-use super::GridPos;
-use crate::block::Rotation;
-pub(crate) use crate::utils::{Image, ImageHolder, ImageUtils, Overlay, Repeat};
-use crate::Map;
-include!(concat!(env!("OUT_DIR"), "/full.rs"));
-include!(concat!(env!("OUT_DIR"), "/quar.rs"));
-include!(concat!(env!("OUT_DIR"), "/eigh.rs"));
-
-#[derive(Debug, Copy, Clone)]
-#[repr(u8)]
-pub enum Scale {
- Full,
- // Half,
- Quarter,
- Eigth,
-}
-
-impl Scale {
- #[must_use]
- pub const fn px(self) -> u8 {
- match self {
- Self::Full => 32,
- Self::Quarter => 32 / 4,
- Self::Eigth => 32 / 8,
- }
- }
-}
-
-impl std::ops::Mul<u32> for Scale {
- type Output = u32;
- fn mul(self, rhs: u32) -> u32 {
- self.px() as u32 * rhs
- }
-}
-
-#[macro_export]
-macro_rules! load {
- ("empty", $scale:expr) => {
- ImageHolder::from(match $scale {
- $crate::data::renderer::Scale::Quarter => &$crate::data::renderer::quar::EMPTY,
- $crate::data::renderer::Scale::Eigth => &$crate::data::renderer::eigh::EMPTY,
- $crate::data::renderer::Scale::Full => &$crate::data::renderer::full::EMPTY,
- }.copy())
- };
- ($name:literal, $scale:expr) => { paste::paste! {
- ImageHolder::from(match $scale {
- $crate::data::renderer::Scale::Quarter => &$crate::data::renderer::quar::[<$name:snake:upper>],
- $crate::data::renderer::Scale::Eigth => &$crate::data::renderer::eigh::[<$name:snake:upper>],
- $crate::data::renderer::Scale::Full => &$crate::data::renderer::full::[<$name:snake:upper>],
- }.copy())
- } };
- ($name: literal) => { paste::paste! {
- [$crate::data::renderer::full::[<$name:snake:upper>].copy(), $crate::data::renderer::quar::[<$name:snake:upper>].copy(), $crate::data::renderer::eigh::[<$name:snake:upper>].copy()]
- } };
- (from $v:ident which is [$($k:literal $(|)?)+], $scale: ident) => {
- $crate::data::renderer::load!($scale -> match $v {
- $($k => $k,)+
- })
- };
- // turn load!(s -> match x { "v" => "y" }) into match x { "v" => load!("y", s) }
- ($scale:ident -> match $v:ident { $($k:pat => $nam:literal $(,)?)+ }) => {
- match $v {
- $($k => $crate::data::renderer::load!($nam, $scale),)+
- #[allow(unreachable_patterns)]
- n => unreachable!("{n:?}"),
- }
- };
- (concat $x:literal => $v:ident which is [$($k:literal $(|)?)+], $scale: ident) => { paste::paste! {
- match $v {
- $($k =>
- ImageHolder::from(match $scale {
- $crate::data::renderer::Scale::Quarter => &$crate::data::renderer::quar::[<$k:snake:upper _ $x:snake:upper>],
- $crate::data::renderer::Scale::Eigth => &$crate::data::renderer::eigh::[<$k:snake:upper _ $x:snake:upper>],
- $crate::data::renderer::Scale::Full => &$crate::data::renderer::full::[<$k:snake:upper _ $x:snake:upper>],
- }.copy()),
- )+
- #[allow(unreachable_patterns)]
- n => unreachable!("{n:?}"),
- }
- } };
-}
-pub(crate) use load;
-
-/// trait for renderable objects
-pub trait Renderable {
- /// create a picture
- #[must_use = "i did so much work for you"]
- fn render(&self) -> Image<Vec<u8>, 3>;
-}
-
-impl Renderable for Schematic<'_> {
- /// creates a picture of a schematic. Bridges and node connections are not drawn.
- /// ```
- /// use mindus::*;
- /// let mut s = Schematic::new(2, 3);
- /// s.put(0, 0, &block::distribution::DISTRIBUTOR);
- /// s.put(0, 2, &block::distribution::ROUTER);
- /// s.put(1, 2, &block::walls::COPPER_WALL);
- /// let output /*: Image */ = s.render();
- /// ```
- fn render(&self) -> Image<Vec<u8>, 3> {
- // fill background
- // SAFETY: metal-floor is 32x32, the output is a multiple of 32
- let mut bg = unsafe {
- load!("metal-floor", Scale::Full).borrow().repeated(
- ((self.width + 2) * 32) as u32,
- ((self.height + 2) * 32) as u32,
- )
- };
- let mut canvas = Image::alloc(
- ((self.width + 2) * 32) as u32,
- ((self.height + 2) * 32) as u32,
- );
- for (GridPos(x, y), tile) in self.block_iter() {
- let ctx = if tile.block.wants_context() {
- let pctx = PositionContext {
- position: GridPos(x, y),
- width: self.width,
- height: self.height,
- };
- Some(RenderingContext {
- cross: self.cross(&pctx),
- position: pctx,
- })
- } else {
- None
- };
- 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;
- unsafe {
- canvas.as_mut().overlay_at(
- &tile
- .image(
- ctx.as_ref(),
- tile.get_rotation().unwrap_or(Rotation::Up),
- Scale::Full,
- )
- .borrow(),
- (x + 1) * 32,
- (y + 1) * 32,
- )
- };
- }
- canvas.as_mut().shadow();
- for x in 0..canvas.width() {
- for y in 0..canvas.height() {
- // canvas has a shadow
- let p2 = unsafe { canvas.pixel(x, y) };
- let p = unsafe { bg.pixel_mut(x, y) };
- crate::utils::image::blend(p.try_into().unwrap(), p2);
- }
- }
- bg.remove_channel()
- }
-}
-
-impl Renderable for Map<'_> {
- /// Draws a map
- fn render(&self) -> Image<Vec<u8>, 3> {
- let scale = if self.width + self.height < 2000 {
- Scale::Quarter
- } else {
- Scale::Eigth
- };
- // todo combine these (beware of floor drawing atop buildings) (planned solution:? ptr blocks)
- let mut floor: Image<_, 3> =
- Image::alloc(scale * self.width as u32, scale * self.height as u32);
- let mut top: Image<_, 4> =
- Image::alloc(scale * self.width as u32, scale * self.height as u32);
- rayon::join(
- || {
- for y in 0..self.height {
- for x in 0..self.width {
- // Map::new() allocates w*h items
- let j = x + self.width * y;
- let tile = unsafe { self.tiles.get_unchecked(j) };
- let y = self.height - y - 1;
- // draw the floor first.
- // println!("draw {tile:?} ({x}, {y})");
- unsafe {
- floor.as_mut().overlay_at(
- &tile.floor(scale).borrow(),
- scale * x as u32,
- scale * y as u32,
- )
- };
- if tile.has_ore() {
- unsafe {
- floor.as_mut().overlay_at(
- &tile.ore(scale).borrow(),
- scale * x as u32,
- scale * y as u32,
- )
- };
- }
- }
- }
- },
- || {
- for y in 0..self.height {
- for x in 0..self.width {
- // Map::new() allocates w*h items
- let j = x + self.width * y;
- let tile = unsafe { self.tiles.get_unchecked(j) };
- let y = self.height - y - 1;
- // println!("draw {tile:?} ({x}, {y})");
- if let Some(build) = tile.build() {
- let s = build.block.get_size();
- let x = x
- - (match s {
- 1 | 2 => 0,
- 3 | 4 => 1,
- 5 | 6 => 2,
- 7 | 8 => 3,
- 9 => 4,
- // SAFETY: no block too big
- _ => unsafe { std::hint::unreachable_unchecked() },
- }) as usize;
- let y = y
- - (match s {
- 1 => 0,
- 2 | 3 => 1,
- 4 | 5 => 2,
- 6 | 7 => 3,
- 8 | 9 => 4,
- // SAFETY: no block too big
- _ => unsafe { std::hint::unreachable_unchecked() },
- }) as usize;
- let ctx = if build.block.wants_context() {
- let pctx = PositionContext {
- position: GridPos(x, y),
- width: self.width,
- height: self.height,
- };
- let rctx = RenderingContext {
- cross: self.cross(j, &pctx),
- position: pctx,
- };
- Some(rctx)
- } else {
- None
- };
- unsafe {
- top.as_mut().overlay_at(
- &tile.build_image(ctx.as_ref(), scale).borrow(),
- scale * x as u32,
- scale * y as u32,
- )
- };
- }
- }
- }
- },
- );
- unsafe { floor.as_mut().overlay_at(&top.as_ref(), 0, 0) };
- floor
- }
-}
-
-#[test]
-fn all_blocks() {
- use crate::block::content::Type;
- use crate::content::Content;
- let reg = crate::block::build_registry();
- for t in 19..Type::WorldMessage as u16 {
- let t = Type::try_from(t).unwrap();
- if matches!(t, |Type::Empty| Type::SlagCentrifuge
- | Type::HeatReactor
- | Type::LegacyMechPad
- | Type::LegacyUnitFactory
- | Type::LegacyUnitFactoryAir
- | Type::LegacyUnitFactoryGround
- | Type::CommandCenter)
- {
- continue;
- }
- let name = dbg!(t.get_name());
- let t = reg.get(name).unwrap();
- let _ = t.image(
- None,
- Some(&RenderingContext {
- cross: [None; 4],
- position: PositionContext {
- position: GridPos(0, 0),
- width: 5,
- height: 5,
- },
- }),
- Rotation::Up,
- Scale::Quarter,
- );
- }
-}
diff --git a/src/exe/draw.rs b/src/exe/draw.rs
deleted file mode 100644
index 964bcac..0000000
--- a/src/exe/draw.rs
+++ /dev/null
@@ -1,24 +0,0 @@
-use mindus::build_registry;
-use mindus::Renderable;
-use mindus::SchematicSerializer;
-use std::env::Args;
-
-use crate::print_err;
-
-pub fn main(args: Args) {
- let reg = build_registry();
- let mut ss = SchematicSerializer(&reg);
-
- // process schematics from command line
- for curr in args {
- match ss.deserialize_base64(&curr) {
- Ok(s) => {
- s.render().save("x.png");
- }
- // continue processing literals & maybe interactive mode
- Err(e) => {
- print_err!(e, "Could not read schematic");
- }
- }
- }
-}
diff --git a/src/exe/map.rs b/src/exe/map.rs
deleted file mode 100644
index cbb6477..0000000
--- a/src/exe/map.rs
+++ /dev/null
@@ -1,48 +0,0 @@
-use mindus::data::DataRead;
-use mindus::{build_registry, Renderable};
-use mindus::{MapSerializer, Serializer};
-use std::env::Args;
-use std::time::Instant;
-
-use super::print_err;
-pub fn main(args: Args) {
- let reg = build_registry();
- let mut ms = MapSerializer(&reg);
- let runs = std::env::var("RUNS").map_or(10u8, |x| x.parse().unwrap_or(10u8));
-
- // process schematics from command line
- println!("starting timing");
- let then = Instant::now();
- for curr in args {
- let Ok(s) = std::fs::read(curr) else {
- continue;
- };
- let starting_deser = Instant::now();
- match ms.deserialize(&mut DataRead::new(&s)) {
- Err(e) => print_err!(e, "fail"),
- Ok(m) => {
- let deser_took = starting_deser.elapsed();
- if let Ok(v) = std::env::var("SAVE") {
- if v == "1" {
- m.render().save("x.png");
- continue;
- }
- }
- let starting_render = Instant::now();
- for _ in 0..runs {
- drop(m.render());
- }
- let renders_took = starting_render.elapsed();
- let took = then.elapsed();
- println!(
- "μ total: {:.2}s ({} runs) (deser: {}ms, render: {:.2}s) on map {}",
- took.as_secs_f32() / runs as f32,
- runs,
- deser_took.as_millis(),
- renders_took.as_secs_f32() / runs as f32,
- m.tags.get("mapname").unwrap(),
- );
- }
- }
- }
-}
diff --git a/src/item/storage.rs b/src/item/storage.rs
deleted file mode 100644
index ec7f219..0000000
--- a/src/item/storage.rs
+++ /dev/null
@@ -1,425 +0,0 @@
-use std::fmt;
-use std::iter::{Enumerate, FusedIterator};
-use std::marker::PhantomData;
-use std::slice;
-
-use crate::item;
-
-#[derive(Clone, Debug, Eq)]
-/// stores data
-pub struct Storage<T> {
- base: Vec<u32>,
- total: u64,
- holds: PhantomData<T>,
-}
-
-pub type ItemStorage = Storage<item::Type>;
-
-impl<T> Default for Storage<T> {
- fn default() -> Self {
- Self {
- base: Vec::default(),
- total: 0,
- holds: PhantomData,
- }
- }
-}
-
-impl<T> Storage<T>
-where
- u16: From<T>,
-{
- #[must_use]
- /// create a new storage
- ///
- /// ```
- /// # use mindus::item::storage::ItemStorage;
- /// // ItemStorage is a alias to Storage<Item>
- /// let s = ItemStorage::new();
- /// ```
- pub fn new() -> Self {
- Self::default()
- }
-
- #[must_use]
- /// total items
- pub const fn get_total(&self) -> u64 {
- self.total
- }
-
- #[must_use]
- /// check if its empty
- ///
- /// ```
- /// # use mindus::item::storage::ItemStorage;
- /// # use mindus::item;
- ///
- /// let mut s = ItemStorage::new();
- /// assert!(s.is_empty());
- /// s.set(item::Type::Copper, 500);
- /// assert!(!s.is_empty());
- /// s.sub(item::Type::Copper, 500, 0);
- /// assert!(s.is_empty());
- /// ```
- pub const fn is_empty(&self) -> bool {
- self.total == 0
- }
-
- /// get item count of certain element
- ///
- /// ```
- /// # use mindus::item::storage::ItemStorage;
- /// # use mindus::item;
- ///
- /// let mut s = ItemStorage::new();
- /// assert!(s.get(item::Type::Coal) == 0);
- /// s.set(item::Type::Coal, 500);
- /// assert!(s.get(item::Type::Titanium) == 0);
- /// assert!(s.get(item::Type::Coal) == 500);
- /// s.sub(item::Type::Coal, 500, 0);
- /// assert!(s.get(item::Type::Coal) == 0);
- /// ```
- #[must_use]
- pub fn get(&self, ty: T) -> u32 {
- self.base.get(u16::from(ty) as usize).copied().unwrap_or(0)
- }
- /// set item count of certain element
- ///
- /// ```
- /// # use mindus::item::storage::ItemStorage;
- /// # use mindus::item;
- ///
- /// let mut s = ItemStorage::new();
- /// s.set(item::Type::Coal, 500);
- /// s.set(item::Type::Copper, 500);
- /// assert!(s.get(item::Type::Copper) == 500);
- /// ```
- pub fn set(&mut self, ty: T, count: u32) -> u32 {
- let idx = u16::from(ty) as usize;
- match self.base.get_mut(idx) {
- None => {
- self.base.resize(idx + 1, 0);
- self.base[idx] = count;
- self.total += u64::from(count);
- 0
- }
- Some(curr) => {
- let prev = *curr;
- self.total = self.total - u64::from(prev) + u64::from(count);
- *curr = count;
- prev
- }
- }
- }
-
- /// add to a certain elements item count, capping.
- ///
- /// ```
- /// # use mindus::item::storage::ItemStorage;
- /// # use mindus::item;
- ///
- /// let mut s = ItemStorage::new();
- /// s.add(item::Type::Coal, 500, 500);
- /// assert!(s.get(item::Type::Coal) == 500);
- /// s.add(item::Type::Coal, 500, 10000);
- /// assert!(s.get(item::Type::Coal) == 1000);
- /// s.add(item::Type::Coal, 500, 1250);
- /// assert!(s.get(item::Type::Coal) == 1250);
- /// ```
- pub fn add(&mut self, ty: T, add: u32, max: u32) -> (u32, u32) {
- let idx = u16::from(ty) as usize;
- match self.base.get_mut(idx) {
- None => {
- let actual = add.min(max);
- self.base.resize(idx + 1, 0);
- self.base[idx] = actual;
- self.total += u64::from(add);
- (actual, actual)
- }
- Some(curr) => {
- if *curr < max {
- let actual = add.min(max - *curr);
- *curr += actual;
- self.total += u64::from(actual);
- (actual, *curr)
- } else {
- (0, *curr)
- }
- }
- }
- }
-
- /// like [`Storage::add`] but fails
- pub fn try_add(&mut self, ty: T, add: u32, max: u32) -> Result<(u32, u32), TryAddError> {
- let idx = u16::from(ty) as usize;
- match self.base.get_mut(idx) {
- None => {
- if add <= max {
- self.base.resize(idx + 1, 0);
- self.base[idx] = add;
- self.total += u64::from(add);
- Ok((add, add))
- } else {
- Err(TryAddError { have: 0, add, max })
- }
- }
- Some(curr) => {
- if *curr <= max && max - *curr <= add {
- *curr += add;
- self.total += u64::from(add);
- Ok((add, *curr))
- } else {
- Err(TryAddError {
- have: *curr,
- add,
- max,
- })
- }
- }
- }
- }
-
- pub fn sub(&mut self, ty: T, sub: u32, min: u32) -> (u32, u32) {
- match self.base.get_mut(u16::from(ty) as usize) {
- None => (0, 0),
- Some(curr) => {
- if *curr > min {
- let actual = sub.min(*curr - min);
- *curr -= actual;
- self.total -= u64::from(actual);
- (actual, *curr)
- } else {
- (0, *curr)
- }
- }
- }
- }
-
- pub fn try_sub(&mut self, ty: T, sub: u32, min: u32) -> Result<(u32, u32), TrySubError> {
- let idx = u16::from(ty) as usize;
- match self.base.get_mut(idx) {
- None => Err(TrySubError { have: 0, sub, min }),
- Some(curr) => {
- if *curr >= min && *curr - min >= sub {
- *curr -= sub;
- self.total -= u64::from(sub);
- Ok((sub, *curr))
- } else {
- Err(TrySubError {
- have: *curr,
- sub,
- min,
- })
- }
- }
- }
- }
-
- pub fn add_all(&mut self, other: &Storage<T>, max_each: u32) -> (u64, u64) {
- let mut added = 0u64;
- if max_each > 0 && other.total > 0 {
- let mut iter = other.base.iter().enumerate();
- // resize our vector only once and if necessary
- let (last, add_last) = iter.rfind(|(_, n)| **n != 0).unwrap();
- if self.base.len() <= last {
- self.base.resize(last + 1, 0);
- }
- // process items by increasing ID
- for (idx, add) in iter {
- let curr = self.base[idx];
- if curr < max_each {
- let actual = (*add).min(max_each - curr);
- self.base[idx] += actual;
- added += u64::from(actual);
- }
- }
- // process the final element (which we've retrieved first)
- let curr = self.base[last];
- if curr < max_each {
- let actual = (*add_last).min(max_each - curr);
- self.base[last] += actual;
- added += u64::from(actual);
- }
- // update total
- self.total += added;
- }
- (added, self.total)
- }
-
- pub fn pull_all(&mut self, other: &mut Storage<T>, max_each: u32) -> (u64, u64, u64) {
- let mut added = 0u64;
- if max_each > 0 && other.total > 0 {
- let mut iter = other.base.iter_mut().enumerate();
- // resize our vector only once and if necessary
- let (last, add_last) = iter.rfind(|(_, n)| **n != 0).unwrap();
- if self.base.len() <= last {
- self.base.resize(last + 1, 0);
- }
- // process items by increasing ID
- for (idx, add) in iter {
- let curr = self.base[idx];
- if curr < max_each {
- let actual = (*add).min(max_each - curr);
- self.base[idx] += actual;
- *add -= actual;
- added += u64::from(actual);
- }
- }
- // process the final element (which we've retrieved first)
- let curr = self.base[last];
- if curr < max_each {
- let actual = (*add_last).min(max_each - curr);
- self.base[last] += actual;
- *add_last -= actual;
- added += u64::from(actual);
- }
- // update totals
- self.total += added;
- other.total -= added;
- }
- (added, self.total, other.total)
- }
-
- pub fn sub_all(&mut self, other: &Storage<T>, min_each: u32) -> (u64, u64) {
- let mut subbed = 0u64;
- if self.total > 0 && other.total > 0 {
- // no need for resizing, we only remove
- // process items by increasing ID
- for (idx, sub) in other.base.iter().enumerate() {
- if let Some(curr) = self.base.get(idx) {
- if *curr > min_each {
- let actual = (*sub).min(*curr - min_each);
- self.base[idx] -= actual;
- subbed += u64::from(actual);
- }
- } else {
- break;
- }
- }
- // update total
- self.total -= subbed;
- }
- (subbed, self.total)
- }
-
- pub fn diff_all(&mut self, other: &mut Storage<T>, min_each: u32) -> (u64, u64, u64) {
- let mut subbed = 0u64;
- if self.total > 0 && other.total > 0 {
- // no need for resizing, we only remove
- // consider only indexes present in both
- let end = self.base.len().min(other.base.len());
- let lhs = &mut self.base[..end];
- let rhs = &mut other.base[..end];
- // process items by increasing ID
- for (l, r) in lhs.iter_mut().zip(rhs) {
- if *l > min_each && *r > min_each {
- let actual = (*l - min_each).min(*r - min_each);
- *l -= actual;
- *r -= actual;
- subbed -= u64::from(actual);
- }
- }
- // update totals
- self.total -= subbed;
- other.total -= subbed;
- }
- (subbed, self.total, other.total)
- }
-
- #[must_use]
- pub fn iter(&self) -> Iter<'_> {
- Iter {
- base: self.base.iter().enumerate(),
- all: true,
- }
- }
-
- #[must_use]
- pub fn iter_nonzero(&self) -> Iter<'_> {
- Iter {
- base: self.base.iter().enumerate(),
- all: false,
- }
- }
-
- pub fn clear(&mut self) {
- self.base.clear();
- }
-}
-
-// manual because padding with zeros doesn't affect equality
-impl<T> PartialEq for Storage<T> {
- fn eq(&self, other: &Self) -> bool {
- let mut li = self.base.iter().fuse();
- let mut ri = other.base.iter().fuse();
- loop {
- match (li.next(), ri.next()) {
- (None, None) => return true,
- (l, r) => {
- if l.unwrap_or(&0) != r.unwrap_or(&0) {
- return false;
- }
- }
- }
- }
- }
-}
-
-impl<T> fmt::Display for Storage<T>
-where
- u16: From<T>,
-{
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- let mut iter = self.iter_nonzero();
- if let Some((ty, cnt)) = iter.next() {
- write!(f, "{cnt} {ty}")?;
- for (ty, cnt) in iter {
- write!(f, ", {cnt} {ty}")?;
- }
- }
- Ok(())
- }
-}
-
-#[derive(Clone, Copy, Debug, Eq, PartialEq, thiserror::Error)]
-#[error("adding {add} to current {have} would exceed {max}")]
-pub struct TryAddError {
- pub have: u32,
- pub add: u32,
- pub max: u32,
-}
-
-#[derive(Clone, Copy, Debug, Eq, PartialEq, thiserror::Error)]
-#[error("removing {sub} from current {have} would drop below {min}")]
-pub struct TrySubError {
- pub have: u32,
- pub sub: u32,
- pub min: u32,
-}
-
-#[derive(Clone, Debug)]
-pub struct Iter<'l> {
- base: Enumerate<slice::Iter<'l, u32>>,
- all: bool,
-}
-
-impl<'l> Iterator for Iter<'l> {
- type Item = (item::Type, u32);
-
- fn next(&mut self) -> Option<Self::Item> {
- for (idx, cnt) in self.base.by_ref() {
- if *cnt > 0 || self.all {
- if let Ok(ty) = item::Type::try_from(idx as u16) {
- return Some((ty, *cnt));
- }
- }
- }
- None
- }
-
- fn size_hint(&self) -> (usize, Option<usize>) {
- (0, self.base.size_hint().1)
- }
-}
-
-impl<'l> FusedIterator for Iter<'l> where Enumerate<slice::Iter<'l, u32>>: FusedIterator {}
diff --git a/src/lib.rs b/src/lib.rs
deleted file mode 100644
index 1a8c302..0000000
--- a/src/lib.rs
+++ /dev/null
@@ -1,32 +0,0 @@
-//! crate for dealing with mindustry
-#![feature(
- array_chunks,
- const_trait_impl,
- unchecked_math,
- slice_as_chunks,
- slice_swap_unchecked,
- let_chains
-)]
-#![allow(clippy::missing_safety_doc, clippy::missing_const_for_fn, clippy::perf)]
-pub mod block;
-mod content;
-pub mod data;
-pub mod fluid;
-pub mod item;
-mod logic;
-pub mod modifier;
-mod registry;
-mod team;
-pub mod unit;
-mod utils;
-#[doc(inline)]
-pub use {
- block::build_registry,
- data::{
- dynamic::DynData,
- map::{Map, MapSerializer},
- renderer::Renderable,
- schematic::{Schematic, SchematicSerializer},
- Serializer,
- },
-};
diff --git a/src/logic/mod.rs b/src/logic/mod.rs
deleted file mode 100644
index b5e7cc6..0000000
--- a/src/logic/mod.rs
+++ /dev/null
@@ -1,76 +0,0 @@
-use crate::content::numeric_enum;
-
-numeric_enum! {
- pub enum LogicField for u8 | TryFromU8Error
- {
- TotalItems, FirstItem, TotalLiquids, TotalPower, ItemCapacity, LiquidCapacity, PowerCapacity, PowerNetCapacity, PowerNetStored, PowerNetIn,
- PowerNetOut, Ammo, AmmoCapacity, Health, MaxHealth, Heat, Efficiency, Progress, Timescale, Rotation, PosX, PosY, ShootX, ShootY, Size, Dead, Range,
- Shooting, Boosting, MineX, MineY, Mining, Speed, Team, Type, Flag, Controlled, Controller, Name, PayloadCount, PayloadType, Enabled, Shoot, ShootP,
- Config, Color
- }
-}
-
-impl LogicField {
- #[must_use]
- pub const fn is_readable(self) -> bool {
- use LogicField::{
- Ammo, AmmoCapacity, Boosting, Color, Controlled, Controller, Dead, Efficiency, Enabled,
- FirstItem, Flag, Health, Heat, ItemCapacity, LiquidCapacity, MaxHealth, MineX, MineY,
- Mining, Name, PayloadCount, PayloadType, PosX, PosY, PowerCapacity, PowerNetCapacity,
- PowerNetIn, PowerNetOut, PowerNetStored, Progress, Range, Rotation, ShootX, ShootY,
- Shooting, Size, Speed, Team, Timescale, TotalItems, TotalLiquids, TotalPower, Type,
- };
- matches!(
- self,
- TotalItems
- | FirstItem
- | TotalLiquids
- | TotalPower
- | ItemCapacity
- | LiquidCapacity
- | PowerCapacity
- | PowerNetCapacity
- | PowerNetStored
- | PowerNetIn
- | PowerNetOut
- | Ammo
- | AmmoCapacity
- | Health
- | MaxHealth
- | Heat
- | Efficiency
- | Progress
- | Timescale
- | Rotation
- | PosX
- | PosY
- | ShootX
- | ShootY
- | Size
- | Dead
- | Range
- | Shooting
- | Boosting
- | MineX
- | MineY
- | Mining
- | Speed
- | Team
- | Type
- | Flag
- | Controlled
- | Controller
- | Name
- | PayloadCount
- | PayloadType
- | Enabled
- | Color
- )
- }
-
- #[must_use]
- pub const fn is_writable(self) -> bool {
- use LogicField::{Color, Config, Enabled, Shoot, ShootP};
- matches!(self, Enabled | Shoot | ShootP | Config | Color)
- }
-}
diff --git a/src/registry.rs b/src/registry.rs
deleted file mode 100644
index 9603f59..0000000
--- a/src/registry.rs
+++ /dev/null
@@ -1,51 +0,0 @@
-use std::any::type_name;
-use std::collections::hash_map::Entry;
-use std::collections::HashMap;
-use std::error::Error;
-use std::fmt;
-
-pub trait RegistryEntry {
- fn get_name(&self) -> &str;
-}
-
-pub struct Registry<'l, E: RegistryEntry + fmt::Debug + 'static> {
- by_name: HashMap<&'l str, &'l E>,
-}
-
-impl<'l, E: RegistryEntry + fmt::Debug + 'static> Default for Registry<'l, E> {
- fn default() -> Self {
- Self {
- by_name: HashMap::new(),
- }
- }
-}
-
-impl<'l, E: RegistryEntry + fmt::Debug + 'static> Registry<'l, E> {
- pub fn register(&mut self, val: &'l E) -> Result<&'l E, RegisterError<'l, E>> {
- match self.by_name.entry(val.get_name()) {
- Entry::Occupied(e) => Err(RegisterError(e.get())),
- Entry::Vacant(e) => Ok(e.insert(val)),
- }
- }
-
- #[must_use]
- pub fn get(&self, name: &str) -> Option<&'l E> {
- self.by_name.get(name).copied()
- }
-}
-
-#[derive(Clone, Copy, Debug)]
-pub struct RegisterError<'l, E: RegistryEntry + fmt::Debug + 'static>(pub &'l E);
-
-impl<'l, E: RegistryEntry + fmt::Debug + 'static> fmt::Display for RegisterError<'l, E> {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- write!(
- f,
- "{} {:?} already exists",
- type_name::<E>(),
- self.0.get_name()
- )
- }
-}
-
-impl<'l, E: RegistryEntry + fmt::Debug + 'static> Error for RegisterError<'l, E> {}
diff --git a/src/unit/mod.rs b/src/unit/mod.rs
deleted file mode 100644
index 603b376..0000000
--- a/src/unit/mod.rs
+++ /dev/null
@@ -1,75 +0,0 @@
-//! units
-//!
-//! [source](https://github.com/Anuken/Mindustry/blob/master/core/src/mindustry/content/UnitTypes.java)
-use crate::content::content_enum;
-
-content_enum! {
- pub enum Type / Unit for u16 | TryFromU16Error
- {
- "dagger",
- "mace",
- "fortress",
- "scepter",
- "reign",
- "nova",
- "pulsar",
- "quasar",
- "vela",
- "corvus",
- "crawler",
- "atrax",
- "spiroct",
- "arkyid",
- "toxopid",
- "flare",
- "horizon",
- "zenith",
- "antumbra",
- "eclipse",
- "mono",
- "poly",
- "mega",
- "quad",
- "oct",
- "risso",
- "minke",
- "bryde",
- "sei",
- "omura",
- "retusa",
- "oxynoe",
- "cyerce",
- "aegires",
- "navanax",
- "alpha",
- "beta",
- "gamma",
- "stell",
- "locus",
- "precept",
- "vanquish",
- "conquer",
- "merui",
- "cleroi",
- "anthicus",
- "anthicus-missile",
- "tecta",
- "collaris",
- "elude",
- "avert",
- "obviate",
- "quell",
- "quell-missile",
- "disrupt",
- "disrupt-missile",
- "renale",
- "latum",
- "evoke",
- "incite",
- "emanate",
- "block",
- "manifold",
- "assembly-drone",
- "scathe-missile",
- }
-}
diff --git a/src/utils/image.rs b/src/utils/image.rs
deleted file mode 100644
index 8254bb7..0000000
--- a/src/utils/image.rs
+++ /dev/null
@@ -1,728 +0,0 @@
-use fast_image_resize as fr;
-use std::{num::NonZeroU32, slice::SliceIndex};
-
-pub trait Overlay<W> {
- /// Overlay with => self at coordinates x, y, without blending
- /// # Safety
- ///
- /// UB if x, y is out of bounds
- unsafe fn overlay_at(&mut self, with: &W, x: u32, y: u32) -> &mut Self;
-}
-
-pub trait RepeatNew {
- type Output;
- /// Repeat self till it fills a new image of size x, y
- /// # Safety
- ///
- /// UB if self's width is not a multiple of x, or self's height is not a multiple of y
- unsafe fn repeated(&self, x: u32, y: u32) -> Self::Output;
-}
-
-pub trait ImageUtils {
- type With<'a>;
- /// Tint this image with the color
- fn tint(&mut self, color: (u8, u8, u8)) -> &mut Self;
- /// Overlay with => self (does not blend)
- /// # Safety
- ///
- /// UB if a.width != b.width || a.height != b.height
- unsafe fn overlay(&mut self, with: Self::With<'_>) -> &mut Self;
- /// rotate (squares only)
- /// # Safety
- ///
- /// UB if image is not square
- unsafe fn rotate(&mut self, times: u8) -> &mut Self;
- /// flip along the horizontal axis
- fn flip_h(&mut self) -> &mut Self;
- /// flip along the vertical axis
- fn flip_v(&mut self) -> &mut Self;
- /// shadow
- fn shadow(&mut self) -> &mut Self;
- /// scale a image
- fn scale(self, to: u32) -> Image<Vec<u8>, 4>;
-}
-
-macro_rules! unsafe_assert {
- ($cond:expr) => {{
- if !$cond {
- #[cfg(debug_assertions)]
- panic!("assertion failed: {} returned false", stringify!($cond));
- #[cfg(not(debug_assertions))]
- unsafe {
- std::hint::unreachable_unchecked()
- };
- }
- }};
-}
-
-impl Overlay<Image<&[u8], 3>> for Image<&mut [u8], 3> {
- unsafe 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() {
- let with_index = with.slice(i, j);
- let their_px = with.buffer.get_unchecked(with_index);
- let our_index =
- really_unsafe_index(i.unchecked_add(x), j.unchecked_add(y), self.width())
- .unchecked_mul(3);
- let our_px = self
- .buffer
- .get_unchecked_mut(our_index..our_index.unchecked_add(3));
- std::ptr::copy_nonoverlapping(their_px.as_ptr(), our_px.as_mut_ptr(), 3);
- }
- }
- self
- }
-}
-
-impl Overlay<Image<&[u8], 4>> for Image<&mut [u8], 3> {
- unsafe 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() {
- let with_index = really_unsafe_index(i, j, with.width()).unchecked_mul(4);
- // solidity
- if *with.buffer.get_unchecked(with_index.unchecked_add(3)) > 128 {
- let their_px = with
- .buffer
- .get_unchecked(with_index..with_index.unchecked_add(3));
- let our_index =
- really_unsafe_index(i.unchecked_add(x), j.unchecked_add(y), self.width())
- .unchecked_mul(3);
- let our_px = self
- .buffer
- .get_unchecked_mut(our_index..our_index.unchecked_add(3));
- std::ptr::copy_nonoverlapping(their_px.as_ptr(), our_px.as_mut_ptr(), 3);
- }
- }
- }
- self
- }
-}
-
-impl Overlay<Image<&[u8], 4>> for Image<&mut [u8], 4> {
- unsafe 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() {
- let with_index = really_unsafe_index(i, j, with.width()).unchecked_mul(4);
- let their_px = with
- .buffer
- .get_unchecked(with_index..with_index.unchecked_add(4));
- if *their_px.get_unchecked(3) > 128 {
- let our_index =
- really_unsafe_index(i.unchecked_add(x), j.unchecked_add(y), self.width())
- .unchecked_mul(4);
- let our_px = self
- .buffer
- .get_unchecked_mut(our_index..our_index.unchecked_add(4));
- std::ptr::copy_nonoverlapping(their_px.as_ptr(), our_px.as_mut_ptr(), 4);
- }
- }
- }
-
- self
- }
-}
-
-impl RepeatNew for Image<&[u8], 4> {
- type Output = Image<Vec<u8>, 4>;
- unsafe 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, x * self.width(), y * self.height());
- }
- }
- img
- }
-}
-
-pub fn flip_v<const CHANNELS: usize>(img: &mut Image<&mut [u8], CHANNELS>) {
- for y in 0..img.height() / 2 {
- for x in 0..img.width() {
- unsafe {
- // SAFETY: cant overflow
- let y2 = img.height().unchecked_sub(y).unchecked_sub(1);
- // SAFETY: within bounds
- let p2 = img.pixel(x, y2);
- let p = img.pixel(x, y);
- img.set_pixel(x, y2, p);
- img.set_pixel(x, y, p2);
- }
- }
- }
-}
-
-pub fn flip_h<const CHANNELS: usize>(img: &mut Image<&mut [u8], CHANNELS>) {
- for y in 0..img.height() {
- for x in 0..img.width() / 2 {
- // SAFETY: This cannot be out of bounds
- unsafe {
- let x2 = img.width().unchecked_sub(x).unchecked_sub(1);
- let p2 = img.pixel(x2, y);
- let p = img.pixel(x, y);
- img.set_pixel(x2, y, p);
- img.set_pixel(x, y, p2);
- }
- }
- }
-}
-
-pub fn rot_180<const CHANNELS: usize>(img: &mut Image<&mut [u8], CHANNELS>) {
- for y in 0..img.height() / 2 {
- for x in 0..img.width() {
- // SAFETY: this is safe because it cannot be out of bounds
- unsafe {
- let p = img.pixel(x, y);
- let x2 = img.width() - x - 1;
- let y2 = img.height() - y - 1;
- let p2 = img.pixel(x2, y2);
- img.set_pixel(x, y, p2);
- img.set_pixel(x2, y2, p);
- }
- }
- }
-
- if img.height() % 2 != 0 {
- let middle = img.height() / 2;
-
- for x in 0..img.width() / 2 {
- // SAFETY: this is safe because it cannot be out of bounds
- unsafe {
- let p = img.pixel(x, middle);
- let x2 = img.width() - x - 1;
-
- let p2 = img.pixel(x2, middle);
- img.set_pixel(x, middle, p2);
- img.set_pixel(x2, middle, p);
- }
- }
- }
-}
-
-/// # Safety
-///
-/// UB if the image is not square
-#[inline(never)]
-pub unsafe fn rot_90<const CHANNELS: usize>(img: &mut Image<&mut [u8], CHANNELS>) {
- debug_assert_eq!(img.width(), img.height());
- let size = img.width();
- flip_v(img);
- for i in 0..size {
- for j in i..size {
- for c in 0..CHANNELS {
- img.buffer.swap_unchecked(
- (i * size + j) as usize * CHANNELS + c,
- (j * size + i) as usize * CHANNELS + c,
- );
- }
- }
- }
-}
-
-/// # Safety
-///
-/// UB if the image is not square
-pub unsafe fn rot_270<const CHANNELS: usize>(img: &mut Image<&mut [u8], CHANNELS>) {
- debug_assert_eq!(img.width(), img.height());
- flip_h(img);
- let size = img.width();
- for i in 0..size {
- for j in i..size {
- for c in 0..CHANNELS {
- img.buffer.swap_unchecked(
- (i * size + j) as usize * CHANNELS + c,
- (j * size + i) as usize * CHANNELS + c,
- );
- }
- }
- }
-}
-
-impl ImageUtils for Image<&mut [u8], 4> {
- unsafe fn rotate(&mut self, times: u8) -> &mut Self {
- match times {
- 2 => rot_180(self),
- 1 => unsafe { rot_90(self) },
- 3 => unsafe { rot_270(self) },
- _ => {}
- }
- self
- }
-
- fn tint(&mut self, (r, g, b): (u8, u8, u8)) -> &mut Self {
- let [tr, tg, tb] = [r as f32 / 255.0, g as f32 / 255.0, b as f32 / 255.0];
- for [r, g, b, _] in self.buffer.array_chunks_mut::<4>() {
- *r = (*r as f32 * tr) as u8;
- *g = (*g as f32 * tg) as u8;
- *b = (*b as f32 * tb) as u8;
- }
- self
- }
- type With<'a> = &'a Image<&'a [u8], 4>;
- unsafe fn overlay(&mut self, with: &Image<&[u8], 4>) -> &mut Self {
- unsafe_assert!(self.width() == with.width());
- unsafe_assert!(self.height() == with.height());
- for (i, other_pixels) in with.chunked().enumerate() {
- if other_pixels[3] > 128 {
- unsafe {
- let own_pixels = self
- .buffer
- .get_unchecked_mut(i.unchecked_mul(4)..i.unchecked_mul(4).unchecked_add(4));
- std::ptr::copy_nonoverlapping(
- other_pixels.as_ptr(),
- own_pixels.as_mut_ptr(),
- 4,
- );
- }
- }
- }
- self
- }
-
- // this function is very cold but im removing image so might as well use fir
- fn scale(self, to: u32) -> Image<Vec<u8>, 4> {
- let from =
- fr::Image::from_slice_u8(self.width, self.height, self.buffer, fr::PixelType::U8x4)
- .unwrap();
- let to = to.try_into().unwrap();
- let mut dst = fr::Image::new(to, to, fr::PixelType::U8x4);
- fr::Resizer::new(fr::ResizeAlg::Nearest)
- .resize(&from.view(), &mut dst.view_mut())
- .unwrap();
- Image::new(to, to, dst.into_vec())
- }
-
- fn shadow(&mut self) -> &mut Self {
- let mut shadow: Image<Vec<u8>, 4> =
- Image::new(self.width, self.height, self.buffer.to_vec());
- for [r, g, b, a] in shadow.buffer.array_chunks_mut() {
- if *a < 128 {
- *r /= 10;
- *g /= 10;
- *b /= 10;
- }
- }
- blurslice::gaussian_blur_bytes::<4>(
- &mut shadow.buffer,
- self.width() as usize,
- self.height() as usize,
- 9.0,
- )
- .unwrap();
- for ([r, g, b, a], &[from_r, from_g, from_b, from_a]) in self
- .buffer
- .array_chunks_mut()
- .zip(shadow.buffer.array_chunks())
- {
- if *a == 0 {
- (*r, *g, *b, *a) = (from_r, from_g, from_b, from_a);
- }
- }
- self
- }
-
- #[inline]
- fn flip_h(&mut self) -> &mut Self {
- flip_h(self);
- self
- }
-
- #[inline(always)]
- fn flip_v(&mut self) -> &mut Self {
- flip_v(self);
- self
- }
-}
-
-#[inline]
-unsafe fn really_unsafe_index(x: u32, y: u32, w: u32) -> usize {
- // y * w + x
- (y as usize)
- .unchecked_mul(w as usize)
- .unchecked_add(x as usize)
-}
-
-#[derive(Clone, Debug, PartialEq, Eq)]
-pub struct Image<T, const CHANNELS: usize> {
- pub buffer: T,
- pub width: NonZeroU32,
- pub height: NonZeroU32,
-}
-
-impl<const CHANNELS: usize> Default for Image<&'static [u8], CHANNELS> {
- fn default() -> Self {
- Self {
- buffer: &[0; CHANNELS],
- width: NonZeroU32::new(1).unwrap(),
- height: NonZeroU32::new(1).unwrap(),
- }
- }
-}
-
-impl<T, const CHANNELS: usize> Image<T, CHANNELS> {
- #[inline]
- pub fn height(&self) -> u32 {
- self.height.into()
- }
-
- #[inline]
- pub fn width(&self) -> u32 {
- self.width.into()
- }
-
- #[inline]
- pub const fn new(width: NonZeroU32, height: NonZeroU32, buffer: T) -> Self {
- Image {
- width,
- height,
- buffer,
- }
- }
-}
-
-impl<const CHANNELS: usize> Image<&[u8], CHANNELS> {
- #[inline]
- pub const fn copy(&self) -> Self {
- Self {
- width: self.width,
- height: self.height,
- buffer: self.buffer,
- }
- }
-}
-
-impl<T: std::ops::Deref<Target = [u8]>, const CHANNELS: usize> Image<T, CHANNELS> {
- /// # Safety
- ///
- /// - UB if x, y is out of bounds
- /// - UB if buffer is too small
- #[inline]
- pub unsafe fn slice(&self, x: u32, y: u32) -> impl SliceIndex<[u8], Output = [u8]> {
- debug_assert!(x < self.width(), "x out of bounds");
- debug_assert!(y < self.height(), "y out of bounds");
- let index = really_unsafe_index(x, y, self.width()).unchecked_mul(CHANNELS);
- debug_assert!(self.buffer.len() > index);
- index..index.unchecked_add(CHANNELS)
- }
-
- #[inline]
- pub fn chunked(&self) -> impl Iterator<Item = &[u8; CHANNELS]> {
- unsafe_assert!(self.buffer.len() > CHANNELS);
- unsafe_assert!(self.buffer.len() % CHANNELS == 0);
- self.buffer.array_chunks::<CHANNELS>()
- }
-
- /// Return a pixel at (x, y).
- /// # Safety
- ///
- /// Refer to [`slice`]
- #[inline]
- pub unsafe fn pixel(&self, x: u32, y: u32) -> [u8; CHANNELS] {
- *(self.buffer.get_unchecked(self.slice(x, y)).as_ptr().cast())
- }
-}
-impl<T: std::ops::DerefMut<Target = [u8]>, const CHANNELS: usize> Image<T, CHANNELS> {
- /// Return a mutable reference to a pixel at (x, y).
- /// # Safety
- ///
- /// Refer to [`slice`]
- #[inline]
- pub unsafe fn pixel_mut(&mut self, x: u32, y: u32) -> &mut [u8] {
- let idx = self.slice(x, y);
- self.buffer.get_unchecked_mut(idx)
- }
-
- #[inline]
- pub fn chunked_mut(&mut self) -> impl Iterator<Item = &mut [u8; CHANNELS]> {
- self.buffer.array_chunks_mut::<CHANNELS>()
- }
-
- #[inline]
- pub unsafe fn set_pixel(&mut self, x: u32, y: u32, px: [u8; CHANNELS]) {
- std::ptr::copy_nonoverlapping(px.as_ptr(), self.pixel_mut(x, y).as_mut_ptr(), CHANNELS);
- }
-}
-
-impl<const CHANNELS: usize> Image<Vec<u8>, CHANNELS> {
- pub fn alloc(width: u32, height: u32) -> Self {
- Image {
- width: width.try_into().unwrap(),
- height: height.try_into().unwrap(),
- buffer: vec![0; CHANNELS * width as usize * height as usize],
- }
- }
-
- pub fn as_ref(&self) -> Image<&[u8], CHANNELS> {
- Image::new(self.width, self.height, &self.buffer)
- }
-
- pub fn as_mut(&mut self) -> Image<&mut [u8], CHANNELS> {
- Image::new(self.width, self.height, &mut self.buffer)
- }
-}
-
-impl Image<Vec<u8>, 4> {
- pub fn remove_channel(&mut self) -> Image<Vec<u8>, 3> {
- let mut new = vec![0; self.width() as usize * self.height() as usize * 3];
- for (&[r, g, b, _], [nr, ng, nb]) in self
- .buffer
- .array_chunks::<4>()
- .zip(new.array_chunks_mut::<3>())
- {
- (*nr, *ng, *nb) = (r, g, b);
- }
- Image::new(self.width, self.height, new)
- }
-}
-
-impl Image<Vec<u8>, 3> {
- #[cfg(feature = "bin")]
- pub fn save(&self, f: impl AsRef<std::path::Path>) {
- image::save_buffer(
- f,
- &self.buffer,
- self.width(),
- self.height(),
- image::ColorType::Rgb8,
- )
- .unwrap();
- }
-}
-
-#[derive(Clone, Debug)]
-pub enum ImageHolder<const CHANNELS: usize> {
- Borrow(Image<&'static [u8], CHANNELS>),
- Own(Image<Vec<u8>, CHANNELS>),
-}
-
-impl<const CHANNELS: usize> ImageHolder<CHANNELS> {
- #[must_use]
- pub fn own(self) -> Image<Vec<u8>, CHANNELS> {
- match self {
- Self::Own(x) => x,
- Self::Borrow(x) => Image::new(x.width, x.height, x.buffer.to_vec()),
- }
- }
-}
-
-impl<const CHANNELS: usize> ImageHolder<CHANNELS> {
- #[must_use]
- #[inline]
- pub fn borrow(&self) -> Image<&[u8], CHANNELS> {
- match self {
- Self::Own(x) => x.as_ref(),
- Self::Borrow(x) => x.clone(),
- }
- }
-
- #[must_use]
- #[inline]
- pub fn borrow_mut(&mut self) -> Image<&mut [u8], CHANNELS> {
- match self {
- Self::Own(x) => Image::new(x.width, x.height, &mut x.buffer),
- Self::Borrow(_) => {
- *self = Self::from(std::mem::replace(self, Self::from(Image::default())).own());
- self.borrow_mut()
- }
- }
- }
-}
-
-impl Overlay<ImageHolder<4>> for ImageHolder<4> {
- unsafe fn overlay_at(&mut self, with: &ImageHolder<4>, x: u32, y: u32) -> &mut Self {
- self.borrow_mut().overlay_at(&with.borrow(), x, y);
- self
- }
-}
-
-impl ImageUtils for ImageHolder<4> {
- fn tint(&mut self, color: (u8, u8, u8)) -> &mut Self {
- self.borrow_mut().tint(color);
- self
- }
- type With<'a> = &'a Self;
- unsafe fn overlay(&mut self, with: &Self) -> &mut Self {
- self.borrow_mut().overlay(&with.borrow());
- self
- }
-
- unsafe fn rotate(&mut self, times: u8) -> &mut Self {
- if times == 0 {
- return self;
- }
- // borrow mut may clone, so try to avoid
- self.borrow_mut().rotate(times);
- self
- }
-
- fn flip_h(&mut self) -> &mut Self {
- self.borrow_mut().flip_h();
- self
- }
-
- fn flip_v(&mut self) -> &mut Self {
- self.borrow_mut().flip_v();
- self
- }
-
- fn shadow(&mut self) -> &mut Self {
- self.borrow_mut().shadow();
- self
- }
-
- fn scale(mut self, to: u32) -> Image<Vec<u8>, 4> {
- self.borrow_mut().scale(to)
- }
-}
-
-impl<const CHANNELS: usize> From<Image<&'static [u8], CHANNELS>> for ImageHolder<CHANNELS> {
- fn from(value: Image<&'static [u8], CHANNELS>) -> Self {
- Self::Borrow(value)
- }
-}
-
-impl<const CHANNELS: usize> From<Image<Vec<u8>, CHANNELS>> for ImageHolder<CHANNELS> {
- fn from(value: Image<Vec<u8>, CHANNELS>) -> Self {
- Self::Own(value)
- }
-}
-
-#[cfg(test)]
-mod tests {
- use super::*;
- macro_rules! img {
- [[$($v:literal),+] [$($v2:literal),+]] => {{
- let from: Image<Vec<u8>, 1> = Image::new(
- 2.try_into().unwrap(),
- 2.try_into().unwrap(),
- vec![$($v,)+ $($v2,)+]
- );
- from
- }}
- }
-
- #[test]
- fn rem_chnl_test() {
- let mut img: Image<_, 4> = Image::alloc(2, 1);
- unsafe { img.set_pixel(1, 0, [255, 165, 0, 241]) };
- assert_eq!(unsafe { img.pixel(1, 0) }, [255, 165, 0, 241]);
- assert_eq!(unsafe { img.pixel(0, 0) }, [0, 0, 0, 0]);
- let img = img.remove_channel();
- assert_eq!(unsafe { img.pixel(1, 0) }, [255, 165, 0]);
- }
-
- #[test]
- fn rotate_90() {
- let mut from = img![
- [00, 01]
- [02, 10]
- ];
- unsafe { rot_90(&mut from.as_mut()) };
- assert_eq!(
- from,
- img![
- [02, 00]
- [10, 01]
- ]
- );
- }
-
- #[test]
- fn rotate_180() {
- let mut from = img![
- [00, 01]
- [02, 10]
- ];
- rot_180(&mut from.as_mut());
- assert_eq!(
- from,
- img![
- [10, 02]
- [01, 00]
- ]
- );
- }
-
- #[test]
- fn rotate_270() {
- let mut from = img![
- [00, 01]
- [20, 10]
- ];
- unsafe { rot_270(&mut from.as_mut()) };
- assert_eq!(
- from,
- img![
- [01, 10]
- [00, 20]
- ]
- );
- }
-
- #[test]
- fn flip_vertical() {
- let mut from = img![
- [90, 01]
- [21, 42]
- ];
- flip_v(&mut from.as_mut());
- assert_eq!(
- from,
- img![
- [21, 42]
- [90, 01]
- ]
- )
- }
- #[test]
- fn flip_horizontal() {
- let mut from = img![
- [90, 01]
- [21, 42]
- ];
- flip_h(&mut from.as_mut());
- assert_eq!(
- from,
- img![
- [01, 90]
- [42, 21]
- ]
- )
- }
-
- #[test]
- fn scale() {
- let mut from = Image::alloc(6, 6);
- unsafe { from.set_pixel(3, 3, [255, 255, 255, 255]) };
- let from = from.as_mut().scale(12);
- assert_eq!(unsafe { from.pixel(6, 6) }, [255, 255, 255, 255]);
- }
-}
-
-pub fn blend(bg: &mut [u8; 4], fg: [u8; 4]) {
- if fg[3] == 0 {
- return;
- }
- if fg[3] == 255 {
- *bg = fg;
- return;
- }
- let bg_a = bg[3] as f32 / 255.0;
- let fg_a = fg[3] as f32 / 255.0;
- let a = bg_a + fg_a - bg_a * fg_a;
- if a == 0.0 {
- return;
- };
- *bg = [
- (255.0
- * ((((fg[0] as f32 / 255.0) * fg_a) + ((bg[0] as f32 / 255.0) * bg_a) * (1.0 - fg_a))
- / a)) as u8,
- (255.0
- * ((((fg[1] as f32 / 255.0) * fg_a) + ((bg[1] as f32 / 255.0) * bg_a) * (1.0 - fg_a))
- / a)) as u8,
- (255.0
- * ((((fg[2] as f32 / 255.0) * fg_a) + ((bg[2] as f32 / 255.0) * bg_a) * (1.0 - fg_a))
- / a)) as u8,
- (255.0 * a) as u8,
- ]
-}
diff --git a/src/utils/mod.rs b/src/utils/mod.rs
deleted file mode 100644
index 6e781fe..0000000
--- a/src/utils/mod.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-pub mod array;
-pub mod image;
-pub use self::image::{Image, ImageHolder, ImageUtils, Overlay, RepeatNew as Repeat};