mindustry logic execution, map- and schematic- parsing and rendering
render all content
bendn 2023-07-19
parent 12e4e9b · commit 0cd804d
-rw-r--r--assets/blocks/drills/vent-condenser.pngbin0 -> 1604 bytes
-rw-r--r--assets/blocks/environment/pur-bush-bot.pngbin205 -> 0 bytes
-rw-r--r--assets/blocks/environment/pur-bush.pngbin256 -> 391 bytes
-rw-r--r--assets/blocks/environment/tendrils1.pngbin0 -> 239 bytes
-rw-r--r--assets/blocks/environment/tendrils2.pngbin0 -> 245 bytes
-rw-r--r--assets/blocks/environment/tendrils3.pngbin0 -> 244 bytes
-rw-r--r--assets/blocks/environment/yellowcoral.pngbin0 -> 492 bytes
-rw-r--r--assets/blocks/production/vent-condenser-bottom.pngbin1197 -> 0 bytes
-rw-r--r--assets/blocks/production/vent-condenser-mid.pngbin186 -> 0 bytes
-rw-r--r--assets/blocks/production/vent-condenser-rotator-blur.pngbin11923 -> 0 bytes
-rw-r--r--assets/blocks/production/vent-condenser-rotator.pngbin763 -> 0 bytes
-rw-r--r--assets/blocks/production/vent-condenser.pngbin1002 -> 0 bytes
-rw-r--r--assets/blocks/props/arkyic-boulder-shadow1.pngbin3503 -> 0 bytes
-rw-r--r--assets/blocks/props/arkyic-boulder-shadow2.pngbin3327 -> 0 bytes
-rw-r--r--assets/blocks/props/arkyic-boulder-shadow3.pngbin3167 -> 0 bytes
-rw-r--r--assets/blocks/props/arkyic-boulder1.pngbin507 -> 0 bytes
-rw-r--r--assets/blocks/props/arkyic-boulder2.pngbin492 -> 0 bytes
-rw-r--r--assets/blocks/props/arkyic-boulder3.pngbin458 -> 0 bytes
-rw-r--r--assets/blocks/props/basalt-boulder1.pngbin561 -> 0 bytes
-rw-r--r--assets/blocks/props/basalt-boulder2.pngbin557 -> 0 bytes
-rw-r--r--assets/blocks/props/beryllic-boulder1.pngbin539 -> 0 bytes
-rw-r--r--assets/blocks/props/beryllic-boulder2.pngbin546 -> 0 bytes
-rw-r--r--assets/blocks/props/boulder1.pngbin414 -> 0 bytes
-rw-r--r--assets/blocks/props/boulder2.pngbin402 -> 0 bytes
-rw-r--r--assets/blocks/props/carbon-boulder1.pngbin548 -> 0 bytes
-rw-r--r--assets/blocks/props/carbon-boulder2.pngbin556 -> 0 bytes
-rw-r--r--assets/blocks/props/crystal-blocks-shadow1.pngbin7809 -> 0 bytes
-rw-r--r--assets/blocks/props/crystal-blocks-shadow2.pngbin7462 -> 0 bytes
-rw-r--r--assets/blocks/props/crystal-blocks-shadow3.pngbin6217 -> 0 bytes
-rw-r--r--assets/blocks/props/crystal-blocks1.pngbin1768 -> 0 bytes
-rw-r--r--assets/blocks/props/crystal-blocks2.pngbin1405 -> 0 bytes
-rw-r--r--assets/blocks/props/crystal-blocks3.pngbin1110 -> 0 bytes
-rw-r--r--assets/blocks/props/crystal-cluster-shadow1.pngbin17136 -> 0 bytes
-rw-r--r--assets/blocks/props/crystal-cluster-shadow2.pngbin9510 -> 0 bytes
-rw-r--r--assets/blocks/props/crystal-cluster-shadow3.pngbin11589 -> 0 bytes
-rw-r--r--assets/blocks/props/crystal-cluster1.pngbin2676 -> 0 bytes
-rw-r--r--assets/blocks/props/crystal-cluster2.pngbin1481 -> 0 bytes
-rw-r--r--assets/blocks/props/crystal-cluster3.pngbin1338 -> 0 bytes
-rw-r--r--assets/blocks/props/crystal-orbs-shadow1.pngbin6996 -> 0 bytes
-rw-r--r--assets/blocks/props/crystal-orbs-shadow2.pngbin6690 -> 0 bytes
-rw-r--r--assets/blocks/props/crystal-orbs-shadow3.pngbin6258 -> 0 bytes
-rw-r--r--assets/blocks/props/crystal-orbs1.pngbin1266 -> 0 bytes
-rw-r--r--assets/blocks/props/crystal-orbs2.pngbin1040 -> 0 bytes
-rw-r--r--assets/blocks/props/crystal-orbs3.pngbin1040 -> 0 bytes
-rw-r--r--assets/blocks/props/crystalline-boulder1.pngbin533 -> 0 bytes
-rw-r--r--assets/blocks/props/crystalline-boulder2.pngbin541 -> 0 bytes
-rw-r--r--assets/blocks/props/dacite-boulder1.pngbin561 -> 0 bytes
-rw-r--r--assets/blocks/props/dacite-boulder2.pngbin557 -> 0 bytes
-rw-r--r--assets/blocks/props/ferric-boulder1.pngbin475 -> 0 bytes
-rw-r--r--assets/blocks/props/ferric-boulder2.pngbin477 -> 0 bytes
-rw-r--r--assets/blocks/props/pur-bush-bot.pngbin205 -> 0 bytes
-rw-r--r--assets/blocks/props/pur-bush.pngbin256 -> 0 bytes
-rw-r--r--assets/blocks/props/red-ice-boulder1.pngbin565 -> 0 bytes
-rw-r--r--assets/blocks/props/red-ice-boulder2.pngbin544 -> 0 bytes
-rw-r--r--assets/blocks/props/red-ice-boulder3.pngbin518 -> 0 bytes
-rw-r--r--assets/blocks/props/red-stone-boulder1.pngbin491 -> 0 bytes
-rw-r--r--assets/blocks/props/red-stone-boulder2.pngbin490 -> 0 bytes
-rw-r--r--assets/blocks/props/red-stone-boulder3.pngbin494 -> 0 bytes
-rw-r--r--assets/blocks/props/red-stone-boulder4.pngbin521 -> 0 bytes
-rw-r--r--assets/blocks/props/redweed1.pngbin470 -> 0 bytes
-rw-r--r--assets/blocks/props/redweed2.pngbin307 -> 0 bytes
-rw-r--r--assets/blocks/props/redweed3.pngbin417 -> 0 bytes
-rw-r--r--assets/blocks/props/rhyolite-boulder1.pngbin519 -> 0 bytes
-rw-r--r--assets/blocks/props/rhyolite-boulder2.pngbin504 -> 0 bytes
-rw-r--r--assets/blocks/props/rhyolite-boulder3.pngbin503 -> 0 bytes
-rw-r--r--assets/blocks/props/sand-boulder1.pngbin292 -> 0 bytes
-rw-r--r--assets/blocks/props/sand-boulder2.pngbin313 -> 0 bytes
-rw-r--r--assets/blocks/props/shale-boulder1.pngbin271 -> 0 bytes
-rw-r--r--assets/blocks/props/shale-boulder2.pngbin297 -> 0 bytes
-rw-r--r--assets/blocks/props/snow-boulder1.pngbin411 -> 0 bytes
-rw-r--r--assets/blocks/props/snow-boulder2.pngbin410 -> 0 bytes
-rw-r--r--assets/blocks/props/spore-cluster1.pngbin271 -> 0 bytes
-rw-r--r--assets/blocks/props/spore-cluster2.pngbin303 -> 0 bytes
-rw-r--r--assets/blocks/props/spore-cluster3.pngbin289 -> 0 bytes
-rw-r--r--assets/blocks/props/vibrant-crystal-cluster-shadow1.pngbin7772 -> 0 bytes
-rw-r--r--assets/blocks/props/vibrant-crystal-cluster-shadow2.pngbin10707 -> 0 bytes
-rw-r--r--assets/blocks/props/vibrant-crystal-cluster-shadow3.pngbin12417 -> 0 bytes
-rw-r--r--assets/blocks/props/vibrant-crystal-cluster1.pngbin1052 -> 0 bytes
-rw-r--r--assets/blocks/props/vibrant-crystal-cluster2.pngbin1528 -> 0 bytes
-rw-r--r--assets/blocks/props/vibrant-crystal-cluster3.pngbin1638 -> 0 bytes
-rw-r--r--assets/blocks/props/white-tree-dead-shadow.pngbin22499 -> 0 bytes
-rw-r--r--assets/blocks/props/white-tree-dead.pngbin5502 -> 0 bytes
-rw-r--r--assets/blocks/props/white-tree-shadow.pngbin22500 -> 0 bytes
-rw-r--r--assets/blocks/props/white-tree.pngbin4658 -> 0 bytes
-rw-r--r--assets/blocks/props/yellow-stone-boulder1.pngbin528 -> 0 bytes
-rw-r--r--assets/blocks/props/yellow-stone-boulder2.pngbin552 -> 0 bytes
-rw-r--r--src/block/distribution.rs6
-rw-r--r--src/block/environment.rs17
-rw-r--r--src/block/mod.rs3
-rw-r--r--src/block/payload.rs143
-rw-r--r--src/block/power.rs2
-rw-r--r--src/block/turrets.rs3
-rw-r--r--src/block/units.rs137
-rw-r--r--src/block/walls.rs4
-rw-r--r--src/data/renderer.rs40
95 files changed, 213 insertions, 142 deletions
diff --git a/assets/blocks/drills/vent-condenser.png b/assets/blocks/drills/vent-condenser.png
new file mode 100644
index 0000000..34bfc68
--- /dev/null
+++ b/assets/blocks/drills/vent-condenser.png
Binary files differ
diff --git a/assets/blocks/environment/pur-bush-bot.png b/assets/blocks/environment/pur-bush-bot.png
deleted file mode 100644
index 5704eb7..0000000
--- a/assets/blocks/environment/pur-bush-bot.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/pur-bush.png b/assets/blocks/environment/pur-bush.png
index 98b5faf..7642561 100644
--- a/assets/blocks/environment/pur-bush.png
+++ b/assets/blocks/environment/pur-bush.png
Binary files differ
diff --git a/assets/blocks/environment/tendrils1.png b/assets/blocks/environment/tendrils1.png
new file mode 100644
index 0000000..90345f2
--- /dev/null
+++ b/assets/blocks/environment/tendrils1.png
Binary files differ
diff --git a/assets/blocks/environment/tendrils2.png b/assets/blocks/environment/tendrils2.png
new file mode 100644
index 0000000..b234cc4
--- /dev/null
+++ b/assets/blocks/environment/tendrils2.png
Binary files differ
diff --git a/assets/blocks/environment/tendrils3.png b/assets/blocks/environment/tendrils3.png
new file mode 100644
index 0000000..e998b41
--- /dev/null
+++ b/assets/blocks/environment/tendrils3.png
Binary files differ
diff --git a/assets/blocks/environment/yellowcoral.png b/assets/blocks/environment/yellowcoral.png
new file mode 100644
index 0000000..c78ee38
--- /dev/null
+++ b/assets/blocks/environment/yellowcoral.png
Binary files differ
diff --git a/assets/blocks/production/vent-condenser-bottom.png b/assets/blocks/production/vent-condenser-bottom.png
deleted file mode 100644
index 3fb7182..0000000
--- a/assets/blocks/production/vent-condenser-bottom.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/vent-condenser-mid.png b/assets/blocks/production/vent-condenser-mid.png
deleted file mode 100644
index b70942b..0000000
--- a/assets/blocks/production/vent-condenser-mid.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/vent-condenser-rotator-blur.png b/assets/blocks/production/vent-condenser-rotator-blur.png
deleted file mode 100644
index c0121f9..0000000
--- a/assets/blocks/production/vent-condenser-rotator-blur.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/vent-condenser-rotator.png b/assets/blocks/production/vent-condenser-rotator.png
deleted file mode 100644
index 7711d4b..0000000
--- a/assets/blocks/production/vent-condenser-rotator.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/production/vent-condenser.png b/assets/blocks/production/vent-condenser.png
deleted file mode 100644
index ac3d311..0000000
--- a/assets/blocks/production/vent-condenser.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/arkyic-boulder-shadow1.png b/assets/blocks/props/arkyic-boulder-shadow1.png
deleted file mode 100644
index 48dd992..0000000
--- a/assets/blocks/props/arkyic-boulder-shadow1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/arkyic-boulder-shadow2.png b/assets/blocks/props/arkyic-boulder-shadow2.png
deleted file mode 100644
index 7015713..0000000
--- a/assets/blocks/props/arkyic-boulder-shadow2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/arkyic-boulder-shadow3.png b/assets/blocks/props/arkyic-boulder-shadow3.png
deleted file mode 100644
index e509e05..0000000
--- a/assets/blocks/props/arkyic-boulder-shadow3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/arkyic-boulder1.png b/assets/blocks/props/arkyic-boulder1.png
deleted file mode 100644
index 4f668f4..0000000
--- a/assets/blocks/props/arkyic-boulder1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/arkyic-boulder2.png b/assets/blocks/props/arkyic-boulder2.png
deleted file mode 100644
index b83d01c..0000000
--- a/assets/blocks/props/arkyic-boulder2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/arkyic-boulder3.png b/assets/blocks/props/arkyic-boulder3.png
deleted file mode 100644
index 0e41b06..0000000
--- a/assets/blocks/props/arkyic-boulder3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/basalt-boulder1.png b/assets/blocks/props/basalt-boulder1.png
deleted file mode 100644
index ef36971..0000000
--- a/assets/blocks/props/basalt-boulder1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/basalt-boulder2.png b/assets/blocks/props/basalt-boulder2.png
deleted file mode 100644
index dd1adb5..0000000
--- a/assets/blocks/props/basalt-boulder2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/beryllic-boulder1.png b/assets/blocks/props/beryllic-boulder1.png
deleted file mode 100644
index 430e721..0000000
--- a/assets/blocks/props/beryllic-boulder1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/beryllic-boulder2.png b/assets/blocks/props/beryllic-boulder2.png
deleted file mode 100644
index bb1bf75..0000000
--- a/assets/blocks/props/beryllic-boulder2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/boulder1.png b/assets/blocks/props/boulder1.png
deleted file mode 100644
index ae54a00..0000000
--- a/assets/blocks/props/boulder1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/boulder2.png b/assets/blocks/props/boulder2.png
deleted file mode 100644
index 6e6e310..0000000
--- a/assets/blocks/props/boulder2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/carbon-boulder1.png b/assets/blocks/props/carbon-boulder1.png
deleted file mode 100644
index b418f9a..0000000
--- a/assets/blocks/props/carbon-boulder1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/carbon-boulder2.png b/assets/blocks/props/carbon-boulder2.png
deleted file mode 100644
index 11b7b92..0000000
--- a/assets/blocks/props/carbon-boulder2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/crystal-blocks-shadow1.png b/assets/blocks/props/crystal-blocks-shadow1.png
deleted file mode 100644
index 0d9145b..0000000
--- a/assets/blocks/props/crystal-blocks-shadow1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/crystal-blocks-shadow2.png b/assets/blocks/props/crystal-blocks-shadow2.png
deleted file mode 100644
index 4e39edb..0000000
--- a/assets/blocks/props/crystal-blocks-shadow2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/crystal-blocks-shadow3.png b/assets/blocks/props/crystal-blocks-shadow3.png
deleted file mode 100644
index 75b6d51..0000000
--- a/assets/blocks/props/crystal-blocks-shadow3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/crystal-blocks1.png b/assets/blocks/props/crystal-blocks1.png
deleted file mode 100644
index c82f923..0000000
--- a/assets/blocks/props/crystal-blocks1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/crystal-blocks2.png b/assets/blocks/props/crystal-blocks2.png
deleted file mode 100644
index 0fd20e9..0000000
--- a/assets/blocks/props/crystal-blocks2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/crystal-blocks3.png b/assets/blocks/props/crystal-blocks3.png
deleted file mode 100644
index c9f656c..0000000
--- a/assets/blocks/props/crystal-blocks3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/crystal-cluster-shadow1.png b/assets/blocks/props/crystal-cluster-shadow1.png
deleted file mode 100644
index d24059e..0000000
--- a/assets/blocks/props/crystal-cluster-shadow1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/crystal-cluster-shadow2.png b/assets/blocks/props/crystal-cluster-shadow2.png
deleted file mode 100644
index 7c3a8a3..0000000
--- a/assets/blocks/props/crystal-cluster-shadow2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/crystal-cluster-shadow3.png b/assets/blocks/props/crystal-cluster-shadow3.png
deleted file mode 100644
index 575e8c3..0000000
--- a/assets/blocks/props/crystal-cluster-shadow3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/crystal-cluster1.png b/assets/blocks/props/crystal-cluster1.png
deleted file mode 100644
index 9b05cde..0000000
--- a/assets/blocks/props/crystal-cluster1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/crystal-cluster2.png b/assets/blocks/props/crystal-cluster2.png
deleted file mode 100644
index 0ada3fc..0000000
--- a/assets/blocks/props/crystal-cluster2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/crystal-cluster3.png b/assets/blocks/props/crystal-cluster3.png
deleted file mode 100644
index a9503c2..0000000
--- a/assets/blocks/props/crystal-cluster3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/crystal-orbs-shadow1.png b/assets/blocks/props/crystal-orbs-shadow1.png
deleted file mode 100644
index dda2465..0000000
--- a/assets/blocks/props/crystal-orbs-shadow1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/crystal-orbs-shadow2.png b/assets/blocks/props/crystal-orbs-shadow2.png
deleted file mode 100644
index b741cae..0000000
--- a/assets/blocks/props/crystal-orbs-shadow2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/crystal-orbs-shadow3.png b/assets/blocks/props/crystal-orbs-shadow3.png
deleted file mode 100644
index e3fe7e1..0000000
--- a/assets/blocks/props/crystal-orbs-shadow3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/crystal-orbs1.png b/assets/blocks/props/crystal-orbs1.png
deleted file mode 100644
index 44c6e37..0000000
--- a/assets/blocks/props/crystal-orbs1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/crystal-orbs2.png b/assets/blocks/props/crystal-orbs2.png
deleted file mode 100644
index 5ef0a4f..0000000
--- a/assets/blocks/props/crystal-orbs2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/crystal-orbs3.png b/assets/blocks/props/crystal-orbs3.png
deleted file mode 100644
index 2eef963..0000000
--- a/assets/blocks/props/crystal-orbs3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/crystalline-boulder1.png b/assets/blocks/props/crystalline-boulder1.png
deleted file mode 100644
index 68e7fe8..0000000
--- a/assets/blocks/props/crystalline-boulder1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/crystalline-boulder2.png b/assets/blocks/props/crystalline-boulder2.png
deleted file mode 100644
index bcb2be2..0000000
--- a/assets/blocks/props/crystalline-boulder2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/dacite-boulder1.png b/assets/blocks/props/dacite-boulder1.png
deleted file mode 100644
index d489222..0000000
--- a/assets/blocks/props/dacite-boulder1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/dacite-boulder2.png b/assets/blocks/props/dacite-boulder2.png
deleted file mode 100644
index 659655e..0000000
--- a/assets/blocks/props/dacite-boulder2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/ferric-boulder1.png b/assets/blocks/props/ferric-boulder1.png
deleted file mode 100644
index 4489a8e..0000000
--- a/assets/blocks/props/ferric-boulder1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/ferric-boulder2.png b/assets/blocks/props/ferric-boulder2.png
deleted file mode 100644
index e2526b7..0000000
--- a/assets/blocks/props/ferric-boulder2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/pur-bush-bot.png b/assets/blocks/props/pur-bush-bot.png
deleted file mode 100644
index 5704eb7..0000000
--- a/assets/blocks/props/pur-bush-bot.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/pur-bush.png b/assets/blocks/props/pur-bush.png
deleted file mode 100644
index 98b5faf..0000000
--- a/assets/blocks/props/pur-bush.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/red-ice-boulder1.png b/assets/blocks/props/red-ice-boulder1.png
deleted file mode 100644
index 37ee2b8..0000000
--- a/assets/blocks/props/red-ice-boulder1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/red-ice-boulder2.png b/assets/blocks/props/red-ice-boulder2.png
deleted file mode 100644
index 4f1c2df..0000000
--- a/assets/blocks/props/red-ice-boulder2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/red-ice-boulder3.png b/assets/blocks/props/red-ice-boulder3.png
deleted file mode 100644
index 4b11113..0000000
--- a/assets/blocks/props/red-ice-boulder3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/red-stone-boulder1.png b/assets/blocks/props/red-stone-boulder1.png
deleted file mode 100644
index c0570c6..0000000
--- a/assets/blocks/props/red-stone-boulder1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/red-stone-boulder2.png b/assets/blocks/props/red-stone-boulder2.png
deleted file mode 100644
index 2b877ab..0000000
--- a/assets/blocks/props/red-stone-boulder2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/red-stone-boulder3.png b/assets/blocks/props/red-stone-boulder3.png
deleted file mode 100644
index 4e5567d..0000000
--- a/assets/blocks/props/red-stone-boulder3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/red-stone-boulder4.png b/assets/blocks/props/red-stone-boulder4.png
deleted file mode 100644
index f40ecb9..0000000
--- a/assets/blocks/props/red-stone-boulder4.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/redweed1.png b/assets/blocks/props/redweed1.png
deleted file mode 100644
index 2fbbd9e..0000000
--- a/assets/blocks/props/redweed1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/redweed2.png b/assets/blocks/props/redweed2.png
deleted file mode 100644
index 30243ff..0000000
--- a/assets/blocks/props/redweed2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/redweed3.png b/assets/blocks/props/redweed3.png
deleted file mode 100644
index a8bec50..0000000
--- a/assets/blocks/props/redweed3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/rhyolite-boulder1.png b/assets/blocks/props/rhyolite-boulder1.png
deleted file mode 100644
index a2f8e72..0000000
--- a/assets/blocks/props/rhyolite-boulder1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/rhyolite-boulder2.png b/assets/blocks/props/rhyolite-boulder2.png
deleted file mode 100644
index 7281bd6..0000000
--- a/assets/blocks/props/rhyolite-boulder2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/rhyolite-boulder3.png b/assets/blocks/props/rhyolite-boulder3.png
deleted file mode 100644
index 1c2cbf6..0000000
--- a/assets/blocks/props/rhyolite-boulder3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/sand-boulder1.png b/assets/blocks/props/sand-boulder1.png
deleted file mode 100644
index 4c2cbd9..0000000
--- a/assets/blocks/props/sand-boulder1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/sand-boulder2.png b/assets/blocks/props/sand-boulder2.png
deleted file mode 100644
index 902a0d7..0000000
--- a/assets/blocks/props/sand-boulder2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/shale-boulder1.png b/assets/blocks/props/shale-boulder1.png
deleted file mode 100644
index 6d280cc..0000000
--- a/assets/blocks/props/shale-boulder1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/shale-boulder2.png b/assets/blocks/props/shale-boulder2.png
deleted file mode 100644
index 5ba4033..0000000
--- a/assets/blocks/props/shale-boulder2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/snow-boulder1.png b/assets/blocks/props/snow-boulder1.png
deleted file mode 100644
index c7feac2..0000000
--- a/assets/blocks/props/snow-boulder1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/snow-boulder2.png b/assets/blocks/props/snow-boulder2.png
deleted file mode 100644
index 5f148d7..0000000
--- a/assets/blocks/props/snow-boulder2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/spore-cluster1.png b/assets/blocks/props/spore-cluster1.png
deleted file mode 100644
index 50475fa..0000000
--- a/assets/blocks/props/spore-cluster1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/spore-cluster2.png b/assets/blocks/props/spore-cluster2.png
deleted file mode 100644
index 4d19d2d..0000000
--- a/assets/blocks/props/spore-cluster2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/spore-cluster3.png b/assets/blocks/props/spore-cluster3.png
deleted file mode 100644
index 3802836..0000000
--- a/assets/blocks/props/spore-cluster3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/vibrant-crystal-cluster-shadow1.png b/assets/blocks/props/vibrant-crystal-cluster-shadow1.png
deleted file mode 100644
index 5d68525..0000000
--- a/assets/blocks/props/vibrant-crystal-cluster-shadow1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/vibrant-crystal-cluster-shadow2.png b/assets/blocks/props/vibrant-crystal-cluster-shadow2.png
deleted file mode 100644
index 5c055e1..0000000
--- a/assets/blocks/props/vibrant-crystal-cluster-shadow2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/vibrant-crystal-cluster-shadow3.png b/assets/blocks/props/vibrant-crystal-cluster-shadow3.png
deleted file mode 100644
index 0f65c30..0000000
--- a/assets/blocks/props/vibrant-crystal-cluster-shadow3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/vibrant-crystal-cluster1.png b/assets/blocks/props/vibrant-crystal-cluster1.png
deleted file mode 100644
index 65825d8..0000000
--- a/assets/blocks/props/vibrant-crystal-cluster1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/vibrant-crystal-cluster2.png b/assets/blocks/props/vibrant-crystal-cluster2.png
deleted file mode 100644
index 3fd79a5..0000000
--- a/assets/blocks/props/vibrant-crystal-cluster2.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/vibrant-crystal-cluster3.png b/assets/blocks/props/vibrant-crystal-cluster3.png
deleted file mode 100644
index 71b8ac8..0000000
--- a/assets/blocks/props/vibrant-crystal-cluster3.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/white-tree-dead-shadow.png b/assets/blocks/props/white-tree-dead-shadow.png
deleted file mode 100644
index f95d982..0000000
--- a/assets/blocks/props/white-tree-dead-shadow.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/white-tree-dead.png b/assets/blocks/props/white-tree-dead.png
deleted file mode 100644
index 0a6e16c..0000000
--- a/assets/blocks/props/white-tree-dead.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/white-tree-shadow.png b/assets/blocks/props/white-tree-shadow.png
deleted file mode 100644
index 8ce60aa..0000000
--- a/assets/blocks/props/white-tree-shadow.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/white-tree.png b/assets/blocks/props/white-tree.png
deleted file mode 100644
index a3a3a7a..0000000
--- a/assets/blocks/props/white-tree.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/yellow-stone-boulder1.png b/assets/blocks/props/yellow-stone-boulder1.png
deleted file mode 100644
index 7f5166e..0000000
--- a/assets/blocks/props/yellow-stone-boulder1.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/props/yellow-stone-boulder2.png b/assets/blocks/props/yellow-stone-boulder2.png
deleted file mode 100644
index 9d7f152..0000000
--- a/assets/blocks/props/yellow-stone-boulder2.png
+++ /dev/null
Binary files differ
diff --git a/src/block/distribution.rs b/src/block/distribution.rs
index 9a80e45..a8e1c5d 100644
--- a/src/block/distribution.rs
+++ b/src/block/distribution.rs
@@ -297,8 +297,8 @@ make_register! {
"overflow-gate" => ControlBlock::new(1, true, cost!(Copper: 4, Lead: 2));
"underflow-gate" => ControlBlock::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" => ConveyorBlock::new(1, false, cost!(Beryllium: 1));
- "armored-duct" => ConveyorBlock::new(1, false, cost!(Beryllium: 2, Tungsten: 1));
+ "duct" => ControlBlock::new(1, false, cost!(Beryllium: 1));
+ "armored-duct" => ControlBlock::new(1, false, cost!(Beryllium: 2, Tungsten: 1));
"duct-router" => ItemBlock::new(1, true, cost!(Beryllium: 10));
"overflow-duct" => ControlBlock::new(1, true, cost!(Graphite: 8, Beryllium: 8));
"underflow-duct" => ControlBlock::new(1, true, cost!(Graphite: 8, Beryllium: 8));
@@ -310,7 +310,7 @@ make_register! {
"unit-cargo-unload-point" => ItemBlock::new(2, true, cost!(Silicon: 60, Tungsten: 60));
// sandbox only
"item-source" => ItemBlock::new(1, true, &[]);
- "item-void" => ConveyorBlock::new(1, true, &[]);
+ "item-void" => ControlBlock::new(1, true, &[]);
}
pub struct ItemBlock {
diff --git a/src/block/environment.rs b/src/block/environment.rs
index 0796230..1f1a1f8 100644
--- a/src/block/environment.rs
+++ b/src/block/environment.rs
@@ -109,11 +109,14 @@ register_env! {
"ore-wall-beryllium": 1@3;
"ore-wall-thorium": 1@3;
"ore-wall-tungsten": 1@3;
+ "graphitic-wall": 1@3;
+ "graphitic-wall-large": 2@1;
"pebbles": 1@3;
"pine": 1@1;
"pooled-cryofluid": 1@1;
"red-diamond-wall": 1@3;
"red-ice-wall-large": 2@1;
+ "red-ice-wall": 1@2;
"red-ice": 1@3;
"red-stone-vent": 3@2;
"red-stone-wall-large": 2@1;
@@ -121,6 +124,7 @@ register_env! {
"red-stone": 1@4;
"redmat": 1@3;
"regolith-wall-large": 2@1;
+ "regolith-wall": 1@2;
"regolith": 1@3;
"rhyolite-crater": 1@3;
"rhyolite-vent": 3@2;
@@ -162,6 +166,7 @@ register_env! {
"yellow-stone-wall": 1@2;
"yellow-stone": 1@3;
// props
+ "yellow-stone-boulder": 1@2;
"snow-boulder": 1@2;
"shale-boulder": 1@2;
"arkyic-boulder": 1@3;
@@ -177,8 +182,16 @@ register_env! {
"rhyolite-boulder": 1@3;
"sand-boulder": 1@2;
"yellow-sand-boulder": 1@2;
- // these are tall but uh
+ "pur-bush": 1@1;
+ "tendrils": 1@3;
+ // these are tall but uh (TODO layering)
+ "white-tree-dead": 1@1;
+ "yellowcoral": 1@1;
+ "white-tree": 1@1;
+ "redweed": 1@3;
+ "spore-cluster": 1@3;
"crystal-blocks": 1@3;
- "crytal-cluster": 1@3;
+ "crystal-cluster": 1@3;
+ "vibrant-crystal-cluster": 1@3;
"crystal-orbs": 1@3;
}
diff --git a/src/block/mod.rs b/src/block/mod.rs
index e5e8a49..5b5936e 100644
--- a/src/block/mod.rs
+++ b/src/block/mod.rs
@@ -27,7 +27,7 @@ macro_rules! mods {
}
mods! {
- campaign content defense distribution drills environment liquid logic payload power production storage turrets walls
+ campaign content defense distribution drills environment liquid logic payload power production storage turrets walls units
}
mod simple;
@@ -480,4 +480,5 @@ fn register(reg: &mut BlockRegistry<'_>) {
logic::register(reg);
walls::register(reg);
environment::register(reg);
+ units::register(reg);
}
diff --git a/src/block/payload.rs b/src/block/payload.rs
index 83f9700..416adaf 100644
--- a/src/block/payload.rs
+++ b/src/block/payload.rs
@@ -12,149 +12,26 @@ use crate::unit;
use super::BlockRegistry;
-make_simple!(ConstructorBlock);
-
-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_simple!(SimplePayloadBlock);
make_register! {
- "ground-factory" => AssemblerBlock::new(3, false, cost!(Copper: 50, Lead: 120, Silicon: 80), GROUND_UNITS);
- "air-factory" => AssemblerBlock::new(3, false, cost!(Copper: 60, Lead: 70), AIR_UNITS);
- "naval-factory" => AssemblerBlock::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" => ConstructorBlock::new(1, true, cost!(Copper: 30, Lead: 30, Silicon: 20));
- "repair-turret" => ConstructorBlock::new(2, true, cost!(Thorium: 80, Silicon: 90, Plastanium: 60));
- "tank-fabricator" => ConstructorBlock::new(3, true, cost!(Silicon: 200, Beryllium: 150));
- "ship-fabricator" => ConstructorBlock::new(3, true, cost!(Silicon: 250, Beryllium: 200));
- "mech-fabricator" => ConstructorBlock::new(3, true, cost!(Silicon: 200, Graphite: 300, Tungsten: 60));
- "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" => ConstructorBlock::new(5, true, cost!(Thorium: 500, Oxide: 150, Carbide: 80, Silicon: 500));
- "ship-assembler" => ConstructorBlock::new(5, true, cost!(Carbide: 100, Oxide: 200, Tungsten: 500, Silicon: 800, Thorium: 400));
- "mech-assembler" => ConstructorBlock::new(5, true, cost!(Carbide: 200, Thorium: 600, Oxide: 200, Tungsten: 500, Silicon: 900)); // smh collaris
- "basic-assembler-module" => ConstructorBlock::new(5, true, cost!(Carbide: 300, Thorium: 500, Oxide: 200, PhaseFabric: 400)); // the dummy block
- // payload
- "payload-conveyor" => ConstructorBlock::new(3, false, cost!(Copper: 10, Graphite: 10));
+ "payload-conveyor" => SimplePayloadBlock::new(3, false, cost!(Copper: 10, Graphite: 10));
"payload-router" => PayloadBlock::new(3, false, cost!(Copper: 10, Graphite: 15));
- "reinforced-payload-conveyor" => ConstructorBlock::new(3, false, cost!(Tungsten: 10));
- "reinforced-payload-router" => ConstructorBlock::new(3, false, cost!(Tungsten: 15));
+ "reinforced-payload-conveyor" => SimplePayloadBlock::new(3, false, cost!(Tungsten: 10));
+ "reinforced-payload-router" => SimplePayloadBlock::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" => ConstructorBlock::new(3, true, cost!(Beryllium: 100, Silicon: 100, Oxide: 40, Graphite: 80));
- "deconstructor" => ConstructorBlock::new(5, true, cost!(Beryllium: 250, Oxide: 100, Silicon: 250, Carbide: 250));
+ "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(3, true, cost!(Silicon: 150, Oxide: 150, Tungsten: 200, PhaseFabric: 40));
- "payload-loader" => ConstructorBlock::new(3, false, cost!(Graphite: 50, Silicon: 50, Tungsten: 80));
- "payload-unloader" => ConstructorBlock::new(3, false, cost!(Graphite: 50, Silicon: 50, Tungsten: 30));
+ "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" => ConstructorBlock::new(5, true, &[]);
-}
-
-pub struct AssemblerBlock {
- size: u8,
- symmetric: bool,
- build_cost: BuildCost,
- valid: &'static [unit::Type],
-}
-
-impl AssemblerBlock {
- #[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>);
+ "payload-void" => SimplePayloadBlock::new(5, true, &[]);
}
-impl BlockLogic for AssemblerBlock {
- 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 clone_state(&self, state: &State) -> State {
- let state = Self::get_state(state);
- Box::new(Self::create_state(*state))
- }
-
- fn mirror_state(&self, _: &mut State, _: bool, _: bool) {}
-
- fn rotate_state(&self, _: &mut State, _: bool) {}
-
- 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))
- }
- }
-}
-
-#[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);
-
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Payload {
Empty,
diff --git a/src/block/power.rs b/src/block/power.rs
index 2c21cad..69a1857 100644
--- a/src/block/power.rs
+++ b/src/block/power.rs
@@ -30,7 +30,7 @@ make_register! {
"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));
- "pyrolosis-generator" => GeneratorBlock::new(3, true, cost!(Graphite: 50, Carbide: 50, Oxide: 60, Silicon: 50));
+ "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" => GeneratorBlock::new(5, true, cost!(Tungsten: 1000, Carbide: 300, Oxide: 150, Silicon: 500, PhaseFabric: 300, SurgeAlloy: 200));
// editor only
diff --git a/src/block/turrets.rs b/src/block/turrets.rs
index 1a931ea..e3c3cce 100644
--- a/src/block/turrets.rs
+++ b/src/block/turrets.rs
@@ -30,6 +30,7 @@ make_register! {
"lustre" => TurretBlock::new(4, true, cost!(Silicon: 250, Graphite: 200, Oxide: 50, Carbide: 90));
"scathe" => TurretBlock::new(5, true, cost!(Oxide: 200, SurgeAlloy: 400, Silicon: 800, Carbide: 500, PhaseFabric: 300));
"malign" => TurretBlock::new(5, true, cost!(Carbide: 400, Beryllium: 2000, Silicon: 800, Graphite: 800, PhaseFabric: 300));
+ "smite" => TurretBlock::new(5, true, cost!(Oxide: 200, SurgeAlloy: 400, Silicon: 800, Carbide: 500, PhaseFabric: 300));
}
use crate::data::renderer::*;
@@ -37,7 +38,7 @@ use crate::utils::ImageUtils;
crate::block::simple::make_simple!(TurretBlock, |me: &Self, _, name, _, _| {
let path = match name {
"breach" | "diffuse" | "sublimate" | "titan" | "disperse" | "afflict" | "lustre"
- | "scathe" | "malign" => format!("bases/reinforced-block-{}", me.size),
+ | "scathe" | "malign" | "smite" => format!("bases/reinforced-block-{}", me.size),
_ => format!("bases/block-{}", me.size),
};
let mut base = load("turrets", &path).unwrap().value().clone();
diff --git a/src/block/units.rs b/src/block/units.rs
new file mode 100644
index 0000000..a9d15a4
--- /dev/null
+++ b/src/block/units.rs
@@ -0,0 +1,137 @@
+//! unit creation related blocks
+use thiserror::Error;
+
+use crate::block::simple::*;
+use crate::block::*;
+use crate::data::dynamic::DynType;
+use crate::unit;
+
+make_simple!(ConstructorBlock);
+make_simple!(UnitBlock);
+
+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" => AssemblerBlock::new(3, false, cost!(Copper: 50, Lead: 120, Silicon: 80), GROUND_UNITS);
+ "air-factory" => AssemblerBlock::new(3, false, cost!(Copper: 60, Lead: 70), AIR_UNITS);
+ "naval-factory" => AssemblerBlock::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" => UnitBlock::new(1, true, cost!(Copper: 30, Lead: 30, Silicon: 20));
+ "repair-turret" => UnitBlock::new(2, true, cost!(Thorium: 80, Silicon: 90, Plastanium: 60));
+ "tank-fabricator" => ConstructorBlock::new(3, true, cost!(Silicon: 200, Beryllium: 150));
+ "ship-fabricator" => ConstructorBlock::new(3, true, cost!(Silicon: 250, Beryllium: 200));
+ "mech-fabricator" => ConstructorBlock::new(3, true, cost!(Silicon: 200, Graphite: 300, Tungsten: 60));
+ "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" => ConstructorBlock::new(5, true, cost!(Thorium: 500, Oxide: 150, Carbide: 80, Silicon: 500));
+ "ship-assembler" => ConstructorBlock::new(5, true, cost!(Carbide: 100, Oxide: 200, Tungsten: 500, Silicon: 800, Thorium: 400));
+ "mech-assembler" => ConstructorBlock::new(5, true, cost!(Carbide: 200, Thorium: 600, Oxide: 200, Tungsten: 500, Silicon: 900)); // smh collaris
+ "basic-assembler-module" => ConstructorBlock::new(5, true, cost!(Carbide: 300, Thorium: 500, Oxide: 200, PhaseFabric: 400)); // the dummy block
+ "unit-repair-tower" => UnitBlock::new(2, true, cost!(Graphite: 90, Silicon: 90, Tungsten: 80));
+
+}
+
+pub struct AssemblerBlock {
+ size: u8,
+ symmetric: bool,
+ build_cost: BuildCost,
+ valid: &'static [unit::Type],
+}
+
+impl AssemblerBlock {
+ #[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 AssemblerBlock {
+ 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 clone_state(&self, state: &State) -> State {
+ let state = Self::get_state(state);
+ Box::new(Self::create_state(*state))
+ }
+
+ fn mirror_state(&self, _: &mut State, _: bool, _: bool) {}
+
+ fn rotate_state(&self, _: &mut State, _: bool) {}
+
+ 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))
+ }
+ }
+}
+
+#[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
index 2e58189..0317220 100644
--- a/src/block/walls.rs
+++ b/src/block/walls.rs
@@ -46,13 +46,15 @@ make_register! {
"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));
- "large-tungsten-wall" => WallBlock::new(2, true, cost!(Tungsten: 6 * 4));
+ "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));
diff --git a/src/data/renderer.rs b/src/data/renderer.rs
index 0454d3c..34d4bfd 100644
--- a/src/data/renderer.rs
+++ b/src/data/renderer.rs
@@ -467,3 +467,43 @@ impl Renderable for Map<'_> {
floor
}
}
+
+#[test]
+fn all_blocks() {
+ load_zip();
+ 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,
+ // TODO canvas
+ Type::Canvas
+ | Type::Empty
+ | Type::SlagCentrifuge
+ | Type::HeatReactor
+ | Type::LegacyMechPad
+ | Type::LegacyUnitFactory
+ | Type::LegacyUnitFactoryAir
+ | Type::LegacyUnitFactoryGround
+ | Type::CommandCenter
+ ) {
+ continue;
+ }
+
+ let t = reg.get(dbg!(t.get_name())).unwrap();
+ t.image(
+ None,
+ Some(&RenderingContext {
+ cross: [None; 4],
+ rotation: Rotation::Up,
+ position: PositionContext {
+ position: GridPos(0, 0),
+ width: 5,
+ height: 5,
+ },
+ }),
+ );
+ }
+}