diff --git a/assets/world/manifests/site_structures/jungle_ruin/jungle_ruin.ron b/assets/world/manifests/site_structures/jungle_ruin/jungle_ruin.ron new file mode 100644 index 0000000000..52d945d3b5 --- /dev/null +++ b/assets/world/manifests/site_structures/jungle_ruin/jungle_ruin.ron @@ -0,0 +1,292 @@ +#![enable(unwrap_newtypes)] +[ + ( + specifier: "world.structure.jungle_ruin.0", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.1", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.3", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.4", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.5", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.6", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.6", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.8", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.9", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.10", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.11", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.12", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.13", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.14", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.15", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.16", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.17", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.18", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.19", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.20", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.21", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.22", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.23", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.24", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.25", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.26", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.27", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.28", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.29", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.30", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.31", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.32", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.33", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.34", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.35", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.36", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.37", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.38", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.39", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.40", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.41", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.42", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.43", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.44", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.45", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.46", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.47", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.48", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.49", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.50", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.51", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.52", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.53", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.54", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.55", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.56", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.57", + center: (10, 10, 2) + ), + + ( + specifier: "world.structure.jungle_ruin.58", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.59", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.60", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.61", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.62", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.63", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.64", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.65", + center: (10, 10, 2) + ), + ( + specifier: "world.structure.jungle_ruin.66", + center: (10, 10, 2) + ), +] diff --git a/assets/world/structure/jungle_ruin/0.vox b/assets/world/structure/jungle_ruin/0.vox new file mode 100644 index 0000000000..9373b79cf0 --- /dev/null +++ b/assets/world/structure/jungle_ruin/0.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cfcab16548ded934a2804f7573f188b267b8cfb77a90098786565db0c6d8f869 +size 2416 diff --git a/assets/world/structure/jungle_ruin/1.vox b/assets/world/structure/jungle_ruin/1.vox new file mode 100644 index 0000000000..364795371a --- /dev/null +++ b/assets/world/structure/jungle_ruin/1.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b027730f242d55dcf8b1870c93dda4e56aa39a61166d82b1ea76cd693f0ba690 +size 43532 diff --git a/assets/world/structure/jungle_ruin/10.vox b/assets/world/structure/jungle_ruin/10.vox new file mode 100644 index 0000000000..67b0f9db27 --- /dev/null +++ b/assets/world/structure/jungle_ruin/10.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d4f2b9fa2536c981cdafcc1945622d87ae80dafc85ea3988f28140301d259059 +size 4200 diff --git a/assets/world/structure/jungle_ruin/11.vox b/assets/world/structure/jungle_ruin/11.vox new file mode 100644 index 0000000000..b537330b22 --- /dev/null +++ b/assets/world/structure/jungle_ruin/11.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5871b95562320d2bc04364bdeaf170f8b86a82515236fabd8411cb1d4dda10bd +size 3556 diff --git a/assets/world/structure/jungle_ruin/12.vox b/assets/world/structure/jungle_ruin/12.vox new file mode 100644 index 0000000000..3d044f0c75 --- /dev/null +++ b/assets/world/structure/jungle_ruin/12.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:290d75bc1e16abedcb17f95cd1d3036cdd4d44d41c6550bf82202df51bd7d54c +size 6192 diff --git a/assets/world/structure/jungle_ruin/13.vox b/assets/world/structure/jungle_ruin/13.vox new file mode 100644 index 0000000000..146abc3069 --- /dev/null +++ b/assets/world/structure/jungle_ruin/13.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b10a9ce051b07e63926c42f7b50c09b49b9f50dd0bf896f0bb7c20f45a387b7e +size 3796 diff --git a/assets/world/structure/jungle_ruin/14.vox b/assets/world/structure/jungle_ruin/14.vox new file mode 100644 index 0000000000..d3813d3e6b --- /dev/null +++ b/assets/world/structure/jungle_ruin/14.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee6e1b34ee59d97dea9a566d17f9b8cd3d39b6b81cf3e7b2e011c57e644bbf75 +size 4488 diff --git a/assets/world/structure/jungle_ruin/15.vox b/assets/world/structure/jungle_ruin/15.vox new file mode 100644 index 0000000000..cf17694f55 --- /dev/null +++ b/assets/world/structure/jungle_ruin/15.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc9ec29811c158390493b39dd82e40686acb7a5f616e66ea5752b5b5e56d45bf +size 4688 diff --git a/assets/world/structure/jungle_ruin/16.vox b/assets/world/structure/jungle_ruin/16.vox new file mode 100644 index 0000000000..8295a5121a --- /dev/null +++ b/assets/world/structure/jungle_ruin/16.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0762cac782e404afc0a16e9acc37566f32bbb7cfa83fff1071969907fa8ec3c +size 7760 diff --git a/assets/world/structure/jungle_ruin/17.vox b/assets/world/structure/jungle_ruin/17.vox new file mode 100644 index 0000000000..72a85ab50b --- /dev/null +++ b/assets/world/structure/jungle_ruin/17.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f5fa3a41d17b5bce8ed643941485acd2d6722463176325e92158c3ce21993ae +size 3904 diff --git a/assets/world/structure/jungle_ruin/18.vox b/assets/world/structure/jungle_ruin/18.vox new file mode 100644 index 0000000000..20f2a4ba69 --- /dev/null +++ b/assets/world/structure/jungle_ruin/18.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c60a1267f570dbb8f04ad316d3f5de45e0f6fc3cbc2fdc28767091570262c9a +size 4056 diff --git a/assets/world/structure/jungle_ruin/19.vox b/assets/world/structure/jungle_ruin/19.vox new file mode 100644 index 0000000000..4baeeaf964 --- /dev/null +++ b/assets/world/structure/jungle_ruin/19.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b82dd7d8704d0f88af4b707d661fabdfdbe35861b9e8d30406fd28f7d94f2555 +size 4200 diff --git a/assets/world/structure/jungle_ruin/2.vox b/assets/world/structure/jungle_ruin/2.vox new file mode 100644 index 0000000000..70357af8a4 --- /dev/null +++ b/assets/world/structure/jungle_ruin/2.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:227089a6d3c1d63a7468b4e35ba2e849045632f56d96de2f9a0a05970f8a2354 +size 19304 diff --git a/assets/world/structure/jungle_ruin/20.vox b/assets/world/structure/jungle_ruin/20.vox new file mode 100644 index 0000000000..9c485afce9 --- /dev/null +++ b/assets/world/structure/jungle_ruin/20.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13500b1a718a8b042998cab4ea8f392160d6db0acc5fa664362f7eb1def24e35 +size 3752 diff --git a/assets/world/structure/jungle_ruin/21.vox b/assets/world/structure/jungle_ruin/21.vox new file mode 100644 index 0000000000..8ccbda3966 --- /dev/null +++ b/assets/world/structure/jungle_ruin/21.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cfb3f95f583801aba0574ccb2ec34d09adb12bc38f1b768f0f3ef7f6465765c7 +size 3920 diff --git a/assets/world/structure/jungle_ruin/22.vox b/assets/world/structure/jungle_ruin/22.vox new file mode 100644 index 0000000000..40197c77a9 --- /dev/null +++ b/assets/world/structure/jungle_ruin/22.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea4c0020f1ab6f9b13d6a634b1a5e003e2db43dcfb7ff506cb64a49a12d17127 +size 6888 diff --git a/assets/world/structure/jungle_ruin/23.vox b/assets/world/structure/jungle_ruin/23.vox new file mode 100644 index 0000000000..1786e5eef6 --- /dev/null +++ b/assets/world/structure/jungle_ruin/23.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8af685672a14e183a6f190c1c54f17563022b0199728b8f099b3f9dd4fcbdfd +size 5248 diff --git a/assets/world/structure/jungle_ruin/24.vox b/assets/world/structure/jungle_ruin/24.vox new file mode 100644 index 0000000000..e236cc5145 --- /dev/null +++ b/assets/world/structure/jungle_ruin/24.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1db8393e4fc60cb24b05bc9658c6dbbfe207d93675291951f1c1a78e9b887fcb +size 4688 diff --git a/assets/world/structure/jungle_ruin/25.vox b/assets/world/structure/jungle_ruin/25.vox new file mode 100644 index 0000000000..3700f9b860 --- /dev/null +++ b/assets/world/structure/jungle_ruin/25.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c2b6ec567e7cca559c94887780f267fe7138e32a37e94bffa99bfc449fb26822 +size 3904 diff --git a/assets/world/structure/jungle_ruin/26.vox b/assets/world/structure/jungle_ruin/26.vox new file mode 100644 index 0000000000..c8bbe45618 --- /dev/null +++ b/assets/world/structure/jungle_ruin/26.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:280db1329557353a20a9ee1b2333253e0394cf9ca6fbc722e57b170572c92b5d +size 11080 diff --git a/assets/world/structure/jungle_ruin/27.vox b/assets/world/structure/jungle_ruin/27.vox new file mode 100644 index 0000000000..f095a6f569 --- /dev/null +++ b/assets/world/structure/jungle_ruin/27.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b98de82fe3fa6b9bc56b76741c2c8bd889813f02ffb086d33123c0e4c8333483 +size 7236 diff --git a/assets/world/structure/jungle_ruin/28.vox b/assets/world/structure/jungle_ruin/28.vox new file mode 100644 index 0000000000..059c157f00 --- /dev/null +++ b/assets/world/structure/jungle_ruin/28.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a43bdf707545508284c93f16135469e1184744c961c0317ead4484873cc4d550 +size 8232 diff --git a/assets/world/structure/jungle_ruin/29.vox b/assets/world/structure/jungle_ruin/29.vox new file mode 100644 index 0000000000..6ed0d8c9af --- /dev/null +++ b/assets/world/structure/jungle_ruin/29.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23ed2e26dfedaf6c8a048e4c7f8a81f5fba94382a89e920c3445a83521fdba6c +size 13052 diff --git a/assets/world/structure/jungle_ruin/3.vox b/assets/world/structure/jungle_ruin/3.vox new file mode 100644 index 0000000000..b02dc00f9f --- /dev/null +++ b/assets/world/structure/jungle_ruin/3.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f9290feaa1dddb438c269a138dc7c32a77197db0bc0290d253d416228c76cdf +size 4224 diff --git a/assets/world/structure/jungle_ruin/30.vox b/assets/world/structure/jungle_ruin/30.vox new file mode 100644 index 0000000000..ef427fe322 --- /dev/null +++ b/assets/world/structure/jungle_ruin/30.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee5340a2bf3ab8833cf41853c30641a0f22138d4808d10a9560e2c2fefa65d1f +size 13040 diff --git a/assets/world/structure/jungle_ruin/31.vox b/assets/world/structure/jungle_ruin/31.vox new file mode 100644 index 0000000000..44d81c73ae --- /dev/null +++ b/assets/world/structure/jungle_ruin/31.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fcb656fdf8bf99706394c400951084637685437c0d79ca7a3d8bd9db9dd42313 +size 4624 diff --git a/assets/world/structure/jungle_ruin/32.vox b/assets/world/structure/jungle_ruin/32.vox new file mode 100644 index 0000000000..5b20b1995d --- /dev/null +++ b/assets/world/structure/jungle_ruin/32.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56636c994731389c7e80e743875896b397ca85446bdcf2acadf78e9df4d69c00 +size 4292 diff --git a/assets/world/structure/jungle_ruin/33.vox b/assets/world/structure/jungle_ruin/33.vox new file mode 100644 index 0000000000..0a1cbd2e37 --- /dev/null +++ b/assets/world/structure/jungle_ruin/33.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:17850fef67e7326bea9aa598410b0f619de2f9ccad971dd1dd199035c37ff16a +size 4084 diff --git a/assets/world/structure/jungle_ruin/34.vox b/assets/world/structure/jungle_ruin/34.vox new file mode 100644 index 0000000000..a592c74d83 --- /dev/null +++ b/assets/world/structure/jungle_ruin/34.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b1f2c496dcdbdaf3a82270f86593bc475816877e396313ff65cefa159d026fb7 +size 3692 diff --git a/assets/world/structure/jungle_ruin/35.vox b/assets/world/structure/jungle_ruin/35.vox new file mode 100644 index 0000000000..87b6d7a9ac --- /dev/null +++ b/assets/world/structure/jungle_ruin/35.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b230122fe696f2ae95359aa094bff729b30300e3d3ce2a55a38b66d8b9364741 +size 4188 diff --git a/assets/world/structure/jungle_ruin/36.vox b/assets/world/structure/jungle_ruin/36.vox new file mode 100644 index 0000000000..c109e8fa7a --- /dev/null +++ b/assets/world/structure/jungle_ruin/36.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:142f58ea8309016fcec174d732257fe17c717789722c5dfce9a48ae86afa49c8 +size 3612 diff --git a/assets/world/structure/jungle_ruin/37.vox b/assets/world/structure/jungle_ruin/37.vox new file mode 100644 index 0000000000..6647f595be --- /dev/null +++ b/assets/world/structure/jungle_ruin/37.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95b51d5b364948d6b9986c5263c1fb598a8015f796ea82bf67744067823fb5ef +size 52792 diff --git a/assets/world/structure/jungle_ruin/38.vox b/assets/world/structure/jungle_ruin/38.vox new file mode 100644 index 0000000000..91074ff43e --- /dev/null +++ b/assets/world/structure/jungle_ruin/38.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c18db2e46e3a725277d8771550501191cacc90eeb1a2bcc3433d5e7655fbe27 +size 7364 diff --git a/assets/world/structure/jungle_ruin/39.vox b/assets/world/structure/jungle_ruin/39.vox new file mode 100644 index 0000000000..4beb5d9ce8 --- /dev/null +++ b/assets/world/structure/jungle_ruin/39.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea38c14951f7233c290901d49588c45d0788cc34b46d8cd7d4db36bde43df3ea +size 4572 diff --git a/assets/world/structure/jungle_ruin/4.vox b/assets/world/structure/jungle_ruin/4.vox new file mode 100644 index 0000000000..9134ba55a3 --- /dev/null +++ b/assets/world/structure/jungle_ruin/4.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc661abf11e05a02777485f610b914af4725c4191a6b39f0f1e6e3a5a4f9bdd8 +size 18520 diff --git a/assets/world/structure/jungle_ruin/40.vox b/assets/world/structure/jungle_ruin/40.vox new file mode 100644 index 0000000000..f4de6dbc1c --- /dev/null +++ b/assets/world/structure/jungle_ruin/40.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21d761d0a6fb37577622726dc875bb76af8e7c2f80df084d356ae587be6f80d7 +size 3324 diff --git a/assets/world/structure/jungle_ruin/41.vox b/assets/world/structure/jungle_ruin/41.vox new file mode 100644 index 0000000000..acc3c4a404 --- /dev/null +++ b/assets/world/structure/jungle_ruin/41.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:447c17f31f01ab64d67bcf5776c56e946825d1abce7b6eb20d1d4f8755f4475e +size 3468 diff --git a/assets/world/structure/jungle_ruin/42.vox b/assets/world/structure/jungle_ruin/42.vox new file mode 100644 index 0000000000..5d2aade733 --- /dev/null +++ b/assets/world/structure/jungle_ruin/42.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9afafa0f865877f90bb95975bf5c45dd5b81f77abb65a8d4e4a884bf73fc6d3b +size 3864 diff --git a/assets/world/structure/jungle_ruin/43.vox b/assets/world/structure/jungle_ruin/43.vox new file mode 100644 index 0000000000..d6a2c5b283 --- /dev/null +++ b/assets/world/structure/jungle_ruin/43.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b441c09ebeae5c16c690f473c4b3514fbd298a5772ae7411d9e5e79aee6875a +size 3988 diff --git a/assets/world/structure/jungle_ruin/44.vox b/assets/world/structure/jungle_ruin/44.vox new file mode 100644 index 0000000000..6b28adecf8 --- /dev/null +++ b/assets/world/structure/jungle_ruin/44.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc09bc85b27b3dc4c2528f59fbf14c7bf0c1df4975169a782099c25823f29f81 +size 3540 diff --git a/assets/world/structure/jungle_ruin/45.vox b/assets/world/structure/jungle_ruin/45.vox new file mode 100644 index 0000000000..32260507fe --- /dev/null +++ b/assets/world/structure/jungle_ruin/45.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:328ed607db73a18c0cd471f49dc2cabe12f6b1418d3eca8f373aa5392a825b72 +size 3540 diff --git a/assets/world/structure/jungle_ruin/46.vox b/assets/world/structure/jungle_ruin/46.vox new file mode 100644 index 0000000000..2770d0ffc2 --- /dev/null +++ b/assets/world/structure/jungle_ruin/46.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5dac1ad637deecf6ae1823f10393c321549043a01f36e8397bfdb15e7bf3f410 +size 3972 diff --git a/assets/world/structure/jungle_ruin/47.vox b/assets/world/structure/jungle_ruin/47.vox new file mode 100644 index 0000000000..115365d5c7 --- /dev/null +++ b/assets/world/structure/jungle_ruin/47.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:34c2f311f4cfea560951d1a100dc5cdb5de937c4435711bc0a13b7caa9d16e2f +size 3676 diff --git a/assets/world/structure/jungle_ruin/48.vox b/assets/world/structure/jungle_ruin/48.vox new file mode 100644 index 0000000000..7403c07248 --- /dev/null +++ b/assets/world/structure/jungle_ruin/48.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2915bc64634a36d280f77ab41cd1166d6f61f6ca54ae331a8a0f177413a1113d +size 4560 diff --git a/assets/world/structure/jungle_ruin/49.vox b/assets/world/structure/jungle_ruin/49.vox new file mode 100644 index 0000000000..c7967d26e7 --- /dev/null +++ b/assets/world/structure/jungle_ruin/49.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ce4c04429dc94d143adfaaf36a698aad5801b6f4aa9fc6f9bb248ff8b289ae9 +size 4484 diff --git a/assets/world/structure/jungle_ruin/5.vox b/assets/world/structure/jungle_ruin/5.vox new file mode 100644 index 0000000000..3861fa4bd0 --- /dev/null +++ b/assets/world/structure/jungle_ruin/5.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:09a0f3d2daf1404e1c68f28ab5e3990874336a47149b89ca072e97f83ac5812d +size 2732 diff --git a/assets/world/structure/jungle_ruin/50.vox b/assets/world/structure/jungle_ruin/50.vox new file mode 100644 index 0000000000..d6e0f9add5 --- /dev/null +++ b/assets/world/structure/jungle_ruin/50.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:baa2ce13b8960f21c3b47197f5d4932e70e8896f73e3edca205d9e52da9ad9d2 +size 3688 diff --git a/assets/world/structure/jungle_ruin/51.vox b/assets/world/structure/jungle_ruin/51.vox new file mode 100644 index 0000000000..353eb7e464 --- /dev/null +++ b/assets/world/structure/jungle_ruin/51.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0389ded0e2fd34b016ba16c52aa757f2c89f9f04ba9b020db993c1fc9ecf353b +size 3168 diff --git a/assets/world/structure/jungle_ruin/52.vox b/assets/world/structure/jungle_ruin/52.vox new file mode 100644 index 0000000000..44764da171 --- /dev/null +++ b/assets/world/structure/jungle_ruin/52.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ccc09fdd89c9f3fd827d418f99c03b82cc5de4d77b308b1516b5246fc32f364c +size 4756 diff --git a/assets/world/structure/jungle_ruin/53.vox b/assets/world/structure/jungle_ruin/53.vox new file mode 100644 index 0000000000..0b482d614c --- /dev/null +++ b/assets/world/structure/jungle_ruin/53.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:883e7a15a8f7abffa320afdc7f85cd6d1ff46e2d446b6da6337af2af50b187a6 +size 4176 diff --git a/assets/world/structure/jungle_ruin/54.vox b/assets/world/structure/jungle_ruin/54.vox new file mode 100644 index 0000000000..337a9cbd75 --- /dev/null +++ b/assets/world/structure/jungle_ruin/54.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95ce34a4a0e530469e8d190d54a4030c8e906542c14d2eadc32a44fd393e254e +size 10444 diff --git a/assets/world/structure/jungle_ruin/55.vox b/assets/world/structure/jungle_ruin/55.vox new file mode 100644 index 0000000000..061c8b1f5c --- /dev/null +++ b/assets/world/structure/jungle_ruin/55.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:52807011130489bea10dac94e8a533a6d9ca95d264403212902e739698f99fa0 +size 8060 diff --git a/assets/world/structure/jungle_ruin/56.vox b/assets/world/structure/jungle_ruin/56.vox new file mode 100644 index 0000000000..4b55edea2a --- /dev/null +++ b/assets/world/structure/jungle_ruin/56.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c46b36d620570c35a72d1191ff965ef5bbf9515b22f080476539f1a8f73a4c3 +size 8008 diff --git a/assets/world/structure/jungle_ruin/57.vox b/assets/world/structure/jungle_ruin/57.vox new file mode 100644 index 0000000000..0ef432a0a3 --- /dev/null +++ b/assets/world/structure/jungle_ruin/57.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ffa4e7c28bf9591513dd25324a796e1f260361a11527f2a516424f012b45ce5c +size 12452 diff --git a/assets/world/structure/jungle_ruin/58.vox b/assets/world/structure/jungle_ruin/58.vox new file mode 100644 index 0000000000..2b0e7efdca --- /dev/null +++ b/assets/world/structure/jungle_ruin/58.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:498a52681ab5c95aa1204a31917041d8fd8d4083ffc42b528781b84f3cc49099 +size 4292 diff --git a/assets/world/structure/jungle_ruin/59.vox b/assets/world/structure/jungle_ruin/59.vox new file mode 100644 index 0000000000..baa98d9306 --- /dev/null +++ b/assets/world/structure/jungle_ruin/59.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:68083d43ec4d8d6429d80b24837763e179d79dd9bbda74ee93234c7c29c786f6 +size 4904 diff --git a/assets/world/structure/jungle_ruin/6.vox b/assets/world/structure/jungle_ruin/6.vox new file mode 100644 index 0000000000..25bef027a7 --- /dev/null +++ b/assets/world/structure/jungle_ruin/6.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:29e0163c66533e9ad609c17d9fb2d2acacc22a77daf3d7ab667c5785173ccebe +size 2180 diff --git a/assets/world/structure/jungle_ruin/60.vox b/assets/world/structure/jungle_ruin/60.vox new file mode 100644 index 0000000000..0b7b1864fb --- /dev/null +++ b/assets/world/structure/jungle_ruin/60.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74f7e484ffd91ab69ff14d6d475223a5cf97fb603bd5f500ee72e5e6ed4adc28 +size 4016 diff --git a/assets/world/structure/jungle_ruin/61.vox b/assets/world/structure/jungle_ruin/61.vox new file mode 100644 index 0000000000..2bb01160af --- /dev/null +++ b/assets/world/structure/jungle_ruin/61.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:435255bfc4fca746810e0b061e7ed240199728a4ed8c437f8411cca7201f6e42 +size 4040 diff --git a/assets/world/structure/jungle_ruin/62.vox b/assets/world/structure/jungle_ruin/62.vox new file mode 100644 index 0000000000..d5299f09e2 --- /dev/null +++ b/assets/world/structure/jungle_ruin/62.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e641cb72d5e7c5f5ae034c54f35de349a00e4e39f0911b74a498876cce3f22c +size 4332 diff --git a/assets/world/structure/jungle_ruin/63.vox b/assets/world/structure/jungle_ruin/63.vox new file mode 100644 index 0000000000..b489d33597 --- /dev/null +++ b/assets/world/structure/jungle_ruin/63.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f1efcfae955abd1e85ed1d4faa00ce58d252ac28b79cf5db0eb705e4389e261 +size 44580 diff --git a/assets/world/structure/jungle_ruin/64.vox b/assets/world/structure/jungle_ruin/64.vox new file mode 100644 index 0000000000..55e6052d86 --- /dev/null +++ b/assets/world/structure/jungle_ruin/64.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca912a9bc52151f6191494ccdcd25e3dc41b9fdb14c4f65f66dcaeb08610a61a +size 40228 diff --git a/assets/world/structure/jungle_ruin/65.vox b/assets/world/structure/jungle_ruin/65.vox new file mode 100644 index 0000000000..20ee3bedf6 --- /dev/null +++ b/assets/world/structure/jungle_ruin/65.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d5faf1ec686f25899f47e977509c25cd76c1e6a454fcff8819ce804008653d2c +size 29220 diff --git a/assets/world/structure/jungle_ruin/66.vox b/assets/world/structure/jungle_ruin/66.vox new file mode 100644 index 0000000000..4216ad0a55 --- /dev/null +++ b/assets/world/structure/jungle_ruin/66.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33fae333c058cbb8d41c3a3e4d11bfdfa6207c28e6640209fb662541485c5084 +size 34332 diff --git a/assets/world/structure/jungle_ruin/7.vox b/assets/world/structure/jungle_ruin/7.vox new file mode 100644 index 0000000000..dfc4b6544e --- /dev/null +++ b/assets/world/structure/jungle_ruin/7.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dbbc37e7c38c21f29815d958a11dc91c01469aea431f6c1766e77aa85c6b864b +size 8652 diff --git a/assets/world/structure/jungle_ruin/8.vox b/assets/world/structure/jungle_ruin/8.vox new file mode 100644 index 0000000000..c8e9fa92de --- /dev/null +++ b/assets/world/structure/jungle_ruin/8.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:883aef7609a0f16481c484e246d889a2582345803042ad96b514193acdad757d +size 6372 diff --git a/assets/world/structure/jungle_ruin/9.vox b/assets/world/structure/jungle_ruin/9.vox new file mode 100644 index 0000000000..c1ea872dfa --- /dev/null +++ b/assets/world/structure/jungle_ruin/9.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56a654f090c1f2c125e885f6050c6ab1164d106ff23e3dbb35a8dab3ce3341e0 +size 4052 diff --git a/rtsim/src/gen/site.rs b/rtsim/src/gen/site.rs index 9433bbb8c6..2a903bef17 100644 --- a/rtsim/src/gen/site.rs +++ b/rtsim/src/gen/site.rs @@ -32,6 +32,7 @@ impl Site { | SiteKind::ChapelSite(_) | SiteKind::Gnarling(_) | SiteKind::PirateHideout(_) + | SiteKind::JungleRuin(_) | SiteKind::Adlet(_) => Some(false), SiteKind::DwarvenMine(_) => Some(false), // Neutral diff --git a/world/src/civ/mod.rs b/world/src/civ/mod.rs index c77d4701c7..b799641b5d 100644 --- a/world/src/civ/mod.rs +++ b/world/src/civ/mod.rs @@ -259,7 +259,7 @@ impl Civs { let world_dims = ctx.sim.get_aabr(); for _ in 0..initial_civ_count * 3 { attempt(5, || { - let (loc, kind) = match ctx.rng.gen_range(0..78) { + let (loc, kind) = match ctx.rng.gen_range(0..84) { 0..=5 => ( find_site_loc( &mut ctx, @@ -347,6 +347,16 @@ impl Civs { )?, SiteKind::PirateHideout, ), + 69..=75 => ( + find_site_loc( + &mut ctx, + &ProximityRequirementsBuilder::new() + .avoid_all_of(this.jungle_ruin_enemies(), 40) + .finalize(&world_dims), + &SiteKind::JungleRuin, + )?, + SiteKind::JungleRuin, + ), _ => ( find_site_loc( &mut ctx, @@ -384,6 +394,7 @@ impl Civs { SiteKind::CliffTown => (64i32, 25.0), SiteKind::SavannahPit => (48i32, 25.0), SiteKind::CoastalTown => (64i32, 35.0), + SiteKind::JungleRuin => (8i32, 3.0), SiteKind::DesertCity => (64i32, 25.0), SiteKind::ChapelSite => (36i32, 10.0), SiteKind::Tree => (12i32, 8.0), @@ -508,6 +519,9 @@ impl Civs { wpos, )) }, + SiteKind::JungleRuin => WorldSite::jungle_ruin( + site2::Site::generate_jungle_ruin(&Land::from_sim(ctx.sim), &mut rng, wpos), + ), SiteKind::DesertCity => WorldSite::desert_city( site2::Site::generate_desert_city(&Land::from_sim(ctx.sim), &mut rng, wpos), ), @@ -1448,6 +1462,13 @@ impl Civs { }) } + fn jungle_ruin_enemies(&self) -> impl Iterator> + '_ { + self.sites().filter_map(|s| match s.kind { + SiteKind::Tree | SiteKind::GiantTree => None, + _ => Some(s.center), + }) + } + fn town_enemies(&self) -> impl Iterator> + '_ { self.sites().filter_map(|s| match s.kind { SiteKind::Castle | SiteKind::Citadel => None, @@ -1802,6 +1823,7 @@ pub enum SiteKind { Adlet, PirateHideout, //DwarvenMine, + JungleRuin, } impl SiteKind { @@ -1859,7 +1881,10 @@ impl SiteKind { }, SiteKind::Citadel => true, SiteKind::CliffTown => { - (-0.6..0.4).contains(&chunk.temp) && chunk.near_cliffs() && suitable_for_town() + (-0.6..0.4).contains(&chunk.temp) + && chunk.near_cliffs() + && !chunk.river.near_water() + && suitable_for_town() }, SiteKind::SavannahPit => { matches!(chunk.get_biome(), BiomeKind::Savannah) @@ -1874,6 +1899,9 @@ impl SiteKind { SiteKind::PirateHideout => { (0.5..3.5).contains(&(chunk.water_alt - CONFIG.sea_level)) }, + SiteKind::JungleRuin => { + matches!(chunk.get_biome(), BiomeKind::Jungle) + }, SiteKind::DesertCity => { (0.9..1.0).contains(&chunk.temp) && !chunk.near_cliffs() && suitable_for_town() }, diff --git a/world/src/lib.rs b/world/src/lib.rs index 568825839c..92e1a0413d 100644 --- a/world/src/lib.rs +++ b/world/src/lib.rs @@ -157,14 +157,14 @@ impl World { .civs() .sites .iter() - .filter(|(_, site)| !matches!(&site.kind, civ::SiteKind::PirateHideout)) + .filter(|(_, site)| !matches!(&site.kind, civ::SiteKind::PirateHideout | civ::SiteKind::JungleRuin)) .map(|(_, site)| { world_msg::SiteInfo { id: site.site_tmp.map(|i| i.id()).unwrap_or_default(), name: site.site_tmp.map(|id| index.sites[id].name().to_string()), // TODO: Probably unify these, at some point kind: match &site.kind { - civ::SiteKind::Settlement | civ::SiteKind::Refactor | civ::SiteKind::CliffTown | civ::SiteKind::SavannahPit | civ::SiteKind::CoastalTown | civ::SiteKind::DesertCity | civ::SiteKind::PirateHideout => world_msg::SiteKind::Town, + civ::SiteKind::Settlement | civ::SiteKind::Refactor | civ::SiteKind::CliffTown | civ::SiteKind::SavannahPit | civ::SiteKind::CoastalTown | civ::SiteKind::DesertCity | civ::SiteKind::PirateHideout | civ::SiteKind::JungleRuin => world_msg::SiteKind::Town, civ::SiteKind::Dungeon => world_msg::SiteKind::Dungeon { difficulty: match site.site_tmp.map(|id| &index.sites[id].kind) { Some(SiteKind::Dungeon(d)) => d.dungeon_difficulty().unwrap_or(0), diff --git a/world/src/site/economy/context.rs b/world/src/site/economy/context.rs index 3d6d30772a..df60ad86ce 100644 --- a/world/src/site/economy/context.rs +++ b/world/src/site/economy/context.rs @@ -131,6 +131,7 @@ impl Environment { SiteKind::GiantTree(_) => (), SiteKind::Gnarling(_) => {}, SiteKind::Adlet(_) => {}, + SiteKind::JungleRuin(_) => {}, SiteKind::ChapelSite(_) => {}, SiteKind::DwarvenMine(_) => {}, SiteKind::Bridge(_) => {}, diff --git a/world/src/site/mod.rs b/world/src/site/mod.rs index 3ddee2f0dc..2fd6525f86 100644 --- a/world/src/site/mod.rs +++ b/world/src/site/mod.rs @@ -78,6 +78,7 @@ pub enum SiteKind { Bridge(site2::Site), Adlet(site2::Site), PirateHideout(site2::Site), + JungleRuin(site2::Site), } impl Site { @@ -102,9 +103,9 @@ impl Site { } } - pub fn adlet(g: site2::Site) -> Self { + pub fn adlet(ad: site2::Site) -> Self { Self { - kind: SiteKind::Adlet(g), + kind: SiteKind::Adlet(ad), economy: Economy::default(), } } @@ -151,6 +152,13 @@ impl Site { } } + pub fn jungle_ruin(jr: site2::Site) -> Self { + Self { + kind: SiteKind::JungleRuin(jr), + economy: Economy::default(), + } + } + pub fn desert_city(dc: site2::Site) -> Self { Self { kind: SiteKind::DesertCity(dc), @@ -165,9 +173,9 @@ impl Site { } } - pub fn dwarven_mine(p: site2::Site) -> Self { + pub fn dwarven_mine(dm: site2::Site) -> Self { Self { - kind: SiteKind::DwarvenMine(p), + kind: SiteKind::DwarvenMine(dm), economy: Economy::default(), } } @@ -203,14 +211,15 @@ impl Site { SiteKind::SavannahPit(sp) => sp.radius(), SiteKind::CoastalTown(ct) => ct.radius(), SiteKind::PirateHideout(ph) => ph.radius(), + SiteKind::JungleRuin(jr) => jr.radius(), SiteKind::DesertCity(dc) => dc.radius(), SiteKind::ChapelSite(p) => p.radius(), - SiteKind::DwarvenMine(p) => p.radius(), + SiteKind::DwarvenMine(dm) => dm.radius(), SiteKind::Tree(t) => t.radius(), SiteKind::GiantTree(gt) => gt.radius(), SiteKind::Gnarling(g) => g.radius(), SiteKind::Bridge(b) => b.radius(), - SiteKind::Adlet(g) => g.radius(), + SiteKind::Adlet(ad) => ad.radius(), } } @@ -224,14 +233,15 @@ impl Site { SiteKind::SavannahPit(sp) => sp.origin, SiteKind::CoastalTown(ct) => ct.origin, SiteKind::PirateHideout(ph) => ph.origin, + SiteKind::JungleRuin(jr) => jr.origin, SiteKind::DesertCity(dc) => dc.origin, SiteKind::ChapelSite(p) => p.origin, - SiteKind::DwarvenMine(p) => p.origin, + SiteKind::DwarvenMine(dm) => dm.origin, SiteKind::Tree(t) => t.origin, SiteKind::GiantTree(gt) => gt.origin, SiteKind::Gnarling(g) => g.origin, SiteKind::Bridge(b) => b.origin, - SiteKind::Adlet(g) => g.origin, + SiteKind::Adlet(ad) => ad.origin, } } @@ -245,14 +255,15 @@ impl Site { SiteKind::SavannahPit(sp) => sp.spawn_rules(wpos), SiteKind::CoastalTown(ct) => ct.spawn_rules(wpos), SiteKind::PirateHideout(ph) => ph.spawn_rules(wpos), + SiteKind::JungleRuin(jr) => jr.spawn_rules(wpos), SiteKind::DesertCity(dc) => dc.spawn_rules(wpos), SiteKind::ChapelSite(p) => p.spawn_rules(wpos), - SiteKind::DwarvenMine(p) => p.spawn_rules(wpos), + SiteKind::DwarvenMine(dm) => dm.spawn_rules(wpos), SiteKind::Tree(t) => t.spawn_rules(wpos), SiteKind::GiantTree(gt) => gt.spawn_rules(wpos), SiteKind::Gnarling(g) => g.spawn_rules(wpos), SiteKind::Bridge(b) => b.spawn_rules(wpos), - SiteKind::Adlet(g) => g.spawn_rules(wpos), + SiteKind::Adlet(ad) => ad.spawn_rules(wpos), } } @@ -266,14 +277,15 @@ impl Site { SiteKind::SavannahPit(sp) => sp.name(), SiteKind::CoastalTown(ct) => ct.name(), SiteKind::PirateHideout(ph) => ph.name(), + SiteKind::JungleRuin(jr) => jr.name(), SiteKind::DesertCity(dc) => dc.name(), SiteKind::ChapelSite(p) => p.name(), - SiteKind::DwarvenMine(p) => p.name(), + SiteKind::DwarvenMine(dm) => dm.name(), SiteKind::Tree(_) => "Giant Tree", SiteKind::GiantTree(gt) => gt.name(), SiteKind::Gnarling(g) => g.name(), SiteKind::Bridge(b) => b.name(), - SiteKind::Adlet(g) => g.name(), + SiteKind::Adlet(ad) => ad.name(), } } @@ -287,7 +299,6 @@ impl Site { | SiteKind::CliffTown(_) | SiteKind::SavannahPit(_) | SiteKind::CoastalTown(_) - | SiteKind::PirateHideout(_) | SiteKind::DesertCity(_) => Some(common::trade::SiteInformation { id: site_id, unconsumed_stock: self.economy.get_available_stock(), @@ -308,14 +319,15 @@ impl Site { SiteKind::SavannahPit(sp) => sp.render(canvas, dynamic_rng), SiteKind::CoastalTown(ct) => ct.render(canvas, dynamic_rng), SiteKind::PirateHideout(ph) => ph.render(canvas, dynamic_rng), + SiteKind::JungleRuin(jr) => jr.render(canvas, dynamic_rng), SiteKind::DesertCity(dc) => dc.render(canvas, dynamic_rng), SiteKind::ChapelSite(p) => p.render(canvas, dynamic_rng), - SiteKind::DwarvenMine(p) => p.render(canvas, dynamic_rng), + SiteKind::DwarvenMine(dm) => dm.render(canvas, dynamic_rng), SiteKind::Tree(t) => t.render(canvas, dynamic_rng), SiteKind::GiantTree(gt) => gt.render(canvas, dynamic_rng), SiteKind::Gnarling(g) => g.render(canvas, dynamic_rng), SiteKind::Bridge(b) => b.render(canvas, dynamic_rng), - SiteKind::Adlet(g) => g.render(canvas, dynamic_rng), + SiteKind::Adlet(ad) => ad.render(canvas, dynamic_rng), } } @@ -342,14 +354,15 @@ impl Site { SiteKind::SavannahPit(_) => {}, SiteKind::CoastalTown(_) => {}, SiteKind::PirateHideout(_) => {}, + SiteKind::JungleRuin(_) => {}, SiteKind::DesertCity(_) => {}, SiteKind::ChapelSite(p) => p.apply_supplement(dynamic_rng, wpos2d, supplement), - SiteKind::DwarvenMine(p) => p.apply_supplement(dynamic_rng, wpos2d, supplement), + SiteKind::DwarvenMine(dm) => dm.apply_supplement(dynamic_rng, wpos2d, supplement), SiteKind::Tree(_) => {}, SiteKind::GiantTree(gt) => gt.apply_supplement(dynamic_rng, wpos2d, supplement), SiteKind::Gnarling(g) => g.apply_supplement(dynamic_rng, wpos2d, supplement), SiteKind::Bridge(b) => b.apply_supplement(dynamic_rng, wpos2d, supplement), - SiteKind::Adlet(g) => g.apply_supplement(dynamic_rng, wpos2d, supplement), + SiteKind::Adlet(ad) => ad.apply_supplement(dynamic_rng, wpos2d, supplement), } } @@ -378,6 +391,7 @@ impl Site { SiteKind::SavannahPit(site2) => Some(site2), SiteKind::CoastalTown(site2) => Some(site2), SiteKind::PirateHideout(site2) => Some(site2), + SiteKind::JungleRuin(site2) => Some(site2), SiteKind::Tree(_) => None, SiteKind::DesertCity(site2) => Some(site2), SiteKind::ChapelSite(site2) => Some(site2), diff --git a/world/src/site2/mod.rs b/world/src/site2/mod.rs index 6b615b46f4..4e84a5ce04 100644 --- a/world/src/site2/mod.rs +++ b/world/src/site2/mod.rs @@ -1293,6 +1293,37 @@ impl Site { site } + pub fn generate_jungle_ruin(land: &Land, rng: &mut impl Rng, origin: Vec2) -> Self { + let mut rng = reseed(rng); + let mut site = Site { + origin, + name: "".to_string(), + ..Site::default() + }; + let size = 8.0 as i32; + let aabr = Aabr { + min: Vec2::broadcast(-size), + max: Vec2::broadcast(size), + }; + { + let jungle_ruin = plot::JungleRuin::generate(land, &mut reseed(&mut rng), &site, aabr); + let jungle_ruin_alt = jungle_ruin.alt; + let plot = site.create_plot(Plot { + kind: PlotKind::JungleRuin(jungle_ruin), + root_tile: aabr.center(), + tiles: aabr_tiles(aabr).collect(), + seed: rng.gen(), + }); + + site.blit_aabr(aabr, Tile { + kind: TileKind::Building, + plot: Some(plot), + hard_alt: Some(jungle_ruin_alt), + }); + } + site + } + pub fn generate_bridge( land: &Land, index: IndexRef, @@ -1622,6 +1653,7 @@ impl Site { PlotKind::CoastalWorkshop(coastal_workshop) => { coastal_workshop.render_collect(self, canvas) }, + PlotKind::JungleRuin(jungle_ruin) => jungle_ruin.render_collect(self, canvas), PlotKind::Workshop(workshop) => workshop.render_collect(self, canvas), PlotKind::Castle(castle) => castle.render_collect(self, canvas), PlotKind::SeaChapel(sea_chapel) => sea_chapel.render_collect(self, canvas), diff --git a/world/src/site2/plot.rs b/world/src/site2/plot.rs index a1dd961c51..26394dd906 100644 --- a/world/src/site2/plot.rs +++ b/world/src/site2/plot.rs @@ -12,6 +12,7 @@ mod dwarven_mine; mod giant_tree; mod gnarling; mod house; +mod jungle_ruin; mod pirate_hideout; mod savannah_hut; mod savannah_pit; @@ -24,9 +25,9 @@ pub use self::{ cliff_tower::CliffTower, coastal_house::CoastalHouse, coastal_workshop::CoastalWorkshop, desert_city_multiplot::DesertCityMultiPlot, desert_city_temple::DesertCityTemple, dungeon::Dungeon, dwarven_mine::DwarvenMine, giant_tree::GiantTree, - gnarling::GnarlingFortification, house::House, pirate_hideout::PirateHideout, - savannah_hut::SavannahHut, savannah_pit::SavannahPit, savannah_workshop::SavannahWorkshop, - sea_chapel::SeaChapel, workshop::Workshop, + gnarling::GnarlingFortification, house::House, jungle_ruin::JungleRuin, + pirate_hideout::PirateHideout, savannah_hut::SavannahHut, savannah_pit::SavannahPit, + savannah_workshop::SavannahWorkshop, sea_chapel::SeaChapel, workshop::Workshop, }; use super::*; @@ -74,6 +75,7 @@ pub enum PlotKind { DesertCityMultiPlot(DesertCityMultiPlot), DesertCityTemple(DesertCityTemple), SeaChapel(SeaChapel), + JungleRuin(JungleRuin), Plaza, Castle(Castle), Road(Path>), diff --git a/world/src/site2/plot/jungle_ruin.rs b/world/src/site2/plot/jungle_ruin.rs new file mode 100644 index 0000000000..cf6ba810b8 --- /dev/null +++ b/world/src/site2/plot/jungle_ruin.rs @@ -0,0 +1,255 @@ +use super::*; +use crate::{ + assets::AssetHandle, + site2::gen::PrimitiveTransform, + util::{sampler::Sampler, RandomField}, + Land, +}; +use common::{ + generation::EntityInfo, + terrain::{SpriteKind, Structure as PrefabStructure, StructuresGroup}, +}; +use lazy_static::lazy_static; +use rand::prelude::*; +use std::{f32::consts::TAU, sync::Arc}; +use vek::*; + +pub struct JungleRuin { + bounds: Aabr, + pub(crate) alt: i32, +} +impl JungleRuin { + pub fn generate(land: &Land, _rng: &mut impl Rng, site: &Site, tile_aabr: Aabr) -> Self { + let bounds = Aabr { + min: site.tile_wpos(tile_aabr.min), + max: site.tile_wpos(tile_aabr.max), + }; + Self { + bounds, + alt: land.get_alt_approx(site.tile_center_wpos((tile_aabr.max - tile_aabr.min) / 2)) + as i32 + + 2, + } + } +} + +impl Structure for JungleRuin { + #[cfg(feature = "use-dyn-lib")] + const UPDATE_FN: &'static [u8] = b"render_jungleruin\0"; + + #[cfg_attr(feature = "be-dyn-lib", export_name = "render_jungleruin")] + fn render_inner(&self, _site: &Site, land: &Land, painter: &Painter) { + let center = self.bounds.center(); + let plot_base = land.get_alt_approx(center) as i32; + let mut thread_rng = thread_rng(); + let stone = Fill::Sampling(Arc::new(|center| { + Some(match (RandomField::new(0).get(center)) % 52 { + 0..=8 => Block::new(BlockKind::Rock, Rgb::new(92, 99, 86)), + 9..=17 => Block::new(BlockKind::Rock, Rgb::new(83, 89, 78)), + 18..=26 => Block::new(BlockKind::Rock, Rgb::new(75, 89, 66)), + 27..=35 => Block::new(BlockKind::Rock, Rgb::new(79, 83, 73)), + 36..=44 => Block::new(BlockKind::Rock, Rgb::new(66, 80, 59)), + _ => Block::new(BlockKind::Rock, Rgb::new(88, 94, 83)), + }) + })); + let stone_broken = Fill::Sampling(Arc::new(|center| { + Some(match (RandomField::new(0).get(center)) % 56 { + 0..=8 => Block::new(BlockKind::Rock, Rgb::new(92, 99, 86)), + 9..=17 => Block::new(BlockKind::Rock, Rgb::new(83, 89, 78)), + 18..=26 => Block::new(BlockKind::Rock, Rgb::new(75, 89, 66)), + 27..=35 => Block::new(BlockKind::Rock, Rgb::new(79, 83, 73)), + 36..=44 => Block::new(BlockKind::Rock, Rgb::new(66, 80, 59)), + 45..=49 => Block::new(BlockKind::Air, Rgb::new(0, 0, 0)), + _ => Block::new(BlockKind::Rock, Rgb::new(88, 94, 83)), + }) + })); + let grass_fill = Fill::Sampling(Arc::new(|wpos| { + Some(match (RandomField::new(0).get(wpos)) % 30 { + 1..=2 => Block::air(SpriteKind::ShortGrass), + 3..=7 => Block::air(SpriteKind::LongGrass), + 8 => Block::air(SpriteKind::JungleFern), + _ => Block::new(BlockKind::Air, Rgb::new(0, 0, 0)), + }) + })); + let mut ruin_positions = vec![]; + let pos_var = RandomField::new(0).get(center.with_z(plot_base)) % 10; + let radius = 25 + pos_var; + let ruins = 12.0 + pos_var as f32; + let phi = TAU / ruins; + for n in 1..=ruins as i32 { + let pos = Vec2::new( + center.x + (radius as f32 * ((n as f32 * phi).cos())) as i32, + center.y + (radius as f32 * ((n as f32 * phi).sin())) as i32, + ); + let base = land.get_alt_approx(pos) as i32; + let ground_sink = RandomField::new(0).get(pos.with_z(base)) as i32 % 4; + let ruin_pos = pos.with_z(base - 8 - ground_sink); + ruin_positions.push(ruin_pos); + } + let underground_chamber = pos_var < 7; + // center ruin and underground chest chamber + let room_size = 10; + let height_handle = 10; + if underground_chamber { + // room + painter + .aabb(Aabb { + min: (center - room_size - 1).with_z(plot_base - height_handle - room_size - 1), + max: (center + room_size + 1).with_z(plot_base - height_handle + room_size + 1), + }) + .fill(stone.clone()); + painter + .aabb(Aabb { + min: (center - room_size).with_z(plot_base - height_handle - room_size), + max: (center + room_size).with_z(plot_base - height_handle + room_size + 2), + }) + .fill(stone_broken.clone()); + // platform + painter + .aabb(Aabb { + min: (center - room_size + 1).with_z(plot_base - height_handle + room_size + 1), + max: (center + room_size - 1).with_z(plot_base - height_handle + room_size + 2), + }) + .clear(); + let center_ruin_pos = center.with_z(plot_base - 1); + ruin_positions.push(center_ruin_pos); + + // room decor + for d in 0..=5 { + painter + .line( + Vec2::new(center.x, center.y - room_size + 1) + .with_z(plot_base - height_handle - (room_size / 3) + 3), + Vec2::new(center.x, center.y + room_size - 1) + .with_z(plot_base - height_handle - (room_size / 3) + 3), + (room_size - (2 * d)) as f32, + ) + .fill(stone_broken.clone()); + painter + .line( + Vec2::new(center.x, center.y - room_size + 1) + .with_z(plot_base - height_handle - (room_size / 3) + 3), + Vec2::new(center.x, center.y + room_size - 1) + .with_z(plot_base - height_handle - (room_size / 3) + 3), + (room_size - 1 - (2 * d)) as f32, + ) + .clear(); + painter + .line( + Vec2::new(center.x - room_size + 1, center.y) + .with_z(plot_base - height_handle - (room_size / 3) + 3), + Vec2::new(center.x + room_size - 1, center.y) + .with_z(plot_base - height_handle - (room_size / 3) + 3), + (room_size - (2 * d)) as f32, + ) + .fill(stone_broken.clone()); + painter + .line( + Vec2::new(center.x - room_size + 1, center.y) + .with_z(plot_base - height_handle - (room_size / 3) + 3), + Vec2::new(center.x + room_size - 1, center.y) + .with_z(plot_base - height_handle - (room_size / 3) + 3), + (room_size - 1 - (2 * d)) as f32, + ) + .clear(); + } + // clear room + painter + .aabb(Aabb { + min: (center - room_size).with_z(plot_base - height_handle - room_size), + max: (center + room_size).with_z(plot_base - height_handle + room_size - 1), + }) + .clear(); + painter + .aabb(Aabb { + min: (center - room_size).with_z(plot_base - height_handle - room_size), + max: (center + room_size).with_z(plot_base - height_handle - room_size + 1), + }) + .fill(stone); + painter + .aabb(Aabb { + min: (center - room_size).with_z(plot_base - height_handle - room_size + 1), + max: (center + room_size).with_z(plot_base - height_handle - room_size + 2), + }) + .fill(grass_fill); + } + for ruin_pos in ruin_positions { + // ruin models + lazy_static! { + pub static ref RUIN: AssetHandle = + PrefabStructure::load_group("site_structures.jungle_ruin.jungle_ruin"); + } + let rng = RandomField::new(0).get(ruin_pos) % 62; + let ruin = RUIN.read(); + let ruin = ruin[rng as usize % ruin.len()].clone(); + painter + .prim(Primitive::Prefab(Box::new(ruin.clone()))) + .translate(ruin_pos) + .fill(Fill::Prefab(Box::new(ruin), ruin_pos, rng)); + } + if underground_chamber { + // entry + painter + .aabb(Aabb { + min: Vec2::new(center.x - 9, center.y - 3) + .with_z(plot_base - height_handle - room_size + 1), + max: Vec2::new(center.x - 3, center.y + 3).with_z(plot_base + 30), + }) + .clear(); + // stairs + painter + .ramp( + Aabb { + min: Vec2::new(center.x - room_size, center.y - 3) + .with_z(plot_base - height_handle - room_size + 1), + max: Vec2::new(center.x, center.y + 3).with_z(plot_base), + }, + Dir::NegX, + ) + .fill(stone_broken); + let chest_pos = Vec2::new(center.x + room_size - 2, center.y - 3) + .with_z(plot_base - height_handle - room_size + 1); + painter.sprite(chest_pos, SpriteKind::DungeonChest0); + } else { + let chest_radius = radius / 2; + for n in 1..=(ruins / 4.0) as i32 { + let chest_pos = Vec2::new( + center.x + (chest_radius as f32 * ((n as f32 * phi).cos())) as i32, + center.y + (chest_radius as f32 * ((n as f32 * phi).sin())) as i32, + ); + if RandomField::new(0).get(chest_pos.with_z(plot_base)) % 2 > 0 { + painter.sprite(chest_pos.with_z(plot_base - 1), SpriteKind::ChestBuried); + } + } + } + + // npcs + let npc_radius = radius / 4; + for n in 1..=(ruins / 4.0) as i32 { + let npc_pos = Vec2::new( + center.x + (npc_radius as f32 * ((n as f32 * phi).cos())) as i32, + center.y + (npc_radius as f32 * ((n as f32 * phi).sin())) as i32, + ); + match RandomField::new(0).get(center.with_z(plot_base)) % 6 { + // grave robbers + 0 => painter.spawn( + EntityInfo::at(npc_pos.with_z(plot_base).as_()).with_asset_expect( + "common.entity.spot.dwarf_grave_robber", + &mut thread_rng, + ), + ), + // sauroks + 1 => painter.spawn( + EntityInfo::at(npc_pos.with_z(plot_base).as_()) + .with_asset_expect("common.entity.spot.saurok", &mut thread_rng), + ), + // grim salvager + 2 => painter.spawn( + EntityInfo::at(npc_pos.with_z(plot_base).as_()) + .with_asset_expect("common.entity.spot.grim_salvager", &mut thread_rng), + ), + _ => {}, + } + } + } +}