diff --git a/assets/common/entity/wild/aggressive/axebeak.ron b/assets/common/entity/wild/aggressive/axebeak.ron new file mode 100644 index 0000000000..1e5b678eaf --- /dev/null +++ b/assets/common/entity/wild/aggressive/axebeak.ron @@ -0,0 +1,11 @@ +#![enable(implicit_some)] +( + name: Automatic, + body: RandomWith("axebeak"), + alignment: Alignment(Enemy), + loot: LootTable("common.loot_tables.creature.theropod.horned"), + inventory: ( + loadout: FromBody, + ), + meta: [], +) \ No newline at end of file diff --git a/assets/common/entity/wild/aggressive/bristleback.ron b/assets/common/entity/wild/aggressive/bristleback.ron new file mode 100644 index 0000000000..e7fe06176f --- /dev/null +++ b/assets/common/entity/wild/aggressive/bristleback.ron @@ -0,0 +1,11 @@ +#![enable(implicit_some)] +( + name: Automatic, + body: RandomWith("bristleback"), + alignment: Alignment(Enemy), + loot: LootTable("common.loot_tables.creature.quad_medium.generic"), + inventory: ( + loadout: FromBody, + ), + meta: [], +) \ No newline at end of file diff --git a/assets/common/entity/wild/aggressive/tursus.ron b/assets/common/entity/wild/aggressive/tursus.ron new file mode 100644 index 0000000000..c072efdcbe --- /dev/null +++ b/assets/common/entity/wild/aggressive/tursus.ron @@ -0,0 +1,11 @@ +#![enable(implicit_some)] +( + name: Automatic, + body: RandomWith("tursus"), + alignment: Alignment(Enemy), + loot: LootTable("common.loot_tables.creature.biped_large.default"), + inventory: ( + loadout: FromBody, + ), + meta: [], +) \ No newline at end of file diff --git a/assets/common/entity/wild/peaceful/seal.ron b/assets/common/entity/wild/peaceful/seal.ron new file mode 100644 index 0000000000..47621cf03f --- /dev/null +++ b/assets/common/entity/wild/peaceful/seal.ron @@ -0,0 +1,11 @@ +#![enable(implicit_some)] +( + name: Automatic, + body: RandomWith("seal"), + alignment: Alignment(Wild), + loot: LootTable("common.loot_tables.creature.quad_small.fur"), + inventory: ( + loadout: FromBody, + ), + meta: [], +) \ No newline at end of file diff --git a/assets/common/npc_names.ron b/assets/common/npc_names.ron index 9243ab2766..d4e4276c47 100644 --- a/assets/common/npc_names.ron +++ b/assets/common/npc_names.ron @@ -567,6 +567,10 @@ keyword: "akhlut", generic: "Akhlut" ), + bristleback: ( + keyword: "bristleback", + generic: "Bristleback" + ), ) ), quadruped_small: ( @@ -781,6 +785,10 @@ goat: ( keyword: "goat", generic: "Goat" + ), + seal: ( + keyword: "seal", + generic: "Seal" ) ) ), @@ -922,6 +930,10 @@ keyword: "husk_brute", generic: "Husk Brute" ), + tursus: ( + keyword: "tursus", + generic: "Tursus" + ) ) ), golem: ( @@ -994,6 +1006,10 @@ keyword: "dodarock", generic: "Dodarock" ), + axebeak: ( + keyword: "axebeak", + generic: "Axebeak" + ) ) ), dragon: ( diff --git a/assets/voxygen/voxel/biped_large_central_manifest.ron b/assets/voxygen/voxel/biped_large_central_manifest.ron index 2ecc30c8f1..d34fdc6e9b 100644 --- a/assets/voxygen/voxel/biped_large_central_manifest.ron +++ b/assets/voxygen/voxel/biped_large_central_manifest.ron @@ -1092,4 +1092,56 @@ central: ("armor.empty"), ) ), + (Tursus, Male): ( + head: ( + offset: (-6.5, 0.0, -6.5), + central: ("npc.tursus.male.head"), + ), + torso_upper: ( + offset: (-8.0, -12.5, -10.5), + central: ("npc.tursus.male.torso_upper"), + ), + torso_lower: ( + offset: (-7.5, -7.0, -10.0), + central: ("npc.tursus.male.torso_lower"), + ), + jaw: ( + offset: (-4.5, 0.0, -4.0), + central: ("npc.tursus.male.jaw"), + ), + tail: ( + offset: (-4.0, -27.0, -6.0), + central: ("armor.empty"), + ), + second: ( + offset: (0.0, 0.0, 0.0), + central: ("armor.empty"), + ) + ), + (Tursus, Female): ( + head: ( + offset: (-6.5, 0.0, -6.5), + central: ("npc.tursus.male.head"), + ), + torso_upper: ( + offset: (-8.0, -12.5, -10.5), + central: ("npc.tursus.male.torso_upper"), + ), + torso_lower: ( + offset: (-7.5, -7.0, -10.0), + central: ("npc.tursus.male.torso_lower"), + ), + jaw: ( + offset: (-4.5, 0.0, -4.0), + central: ("npc.tursus.male.jaw"), + ), + tail: ( + offset: (-4.0, -27.0, -6.0), + central: ("armor.empty"), + ), + second: ( + offset: (0.0, 0.0, 0.0), + central: ("armor.empty"), + ) + ), }) diff --git a/assets/voxygen/voxel/biped_large_lateral_manifest.ron b/assets/voxygen/voxel/biped_large_lateral_manifest.ron index c5f8f2f087..83d947ea56 100644 --- a/assets/voxygen/voxel/biped_large_lateral_manifest.ron +++ b/assets/voxygen/voxel/biped_large_lateral_manifest.ron @@ -1427,4 +1427,72 @@ lateral: ("npc.husk_brute.male.foot_r"), ) ), + (Tursus, Male): ( + shoulder_l: ( + offset: (-4.5, -4.0, -8.0), + lateral: ("npc.tursus.male.shoulder_l"), + ), + shoulder_r: ( + offset: (-4.5, -4.0, -8.0), + lateral: ("npc.tursus.male.shoulder_r"), + ), + hand_l: ( + offset: (-5.5, -3.5, -15.0), + lateral: ("npc.tursus.male.hand_l"), + ), + hand_r: ( + offset: (-5.5, -3.5, -15.0), + lateral: ("npc.tursus.male.hand_r"), + ), + leg_l: ( + offset: (-3.5, -4.0, -4.0), + lateral: ("npc.tursus.male.leg_l"), + ), + leg_r: ( + offset: (-3.5, -4.0, -4.0), + lateral: ("npc.tursus.male.leg_r"), + ), + foot_l: ( + offset: (-3.0, -5.0, -2.0), + lateral: ("npc.tursus.male.foot_l"), + ), + foot_r: ( + offset: (-3.0, -5.0, -2.0), + lateral: ("npc.tursus.male.foot_r"), + ), + ), + (Tursus, Female): ( + shoulder_l: ( + offset: (-4.5, -4.0, -8.0), + lateral: ("npc.tursus.male.shoulder_l"), + ), + shoulder_r: ( + offset: (-4.5, -4.0, -8.0), + lateral: ("npc.tursus.male.shoulder_r"), + ), + hand_l: ( + offset: (-5.5, -3.5, -15.0), + lateral: ("npc.tursus.male.hand_l"), + ), + hand_r: ( + offset: (-5.5, -3.5, -15.0), + lateral: ("npc.tursus.male.hand_r"), + ), + leg_l: ( + offset: (-3.5, -4.0, -4.0), + lateral: ("npc.tursus.male.leg_l"), + ), + leg_r: ( + offset: (-3.5, -4.0, -4.0), + lateral: ("npc.tursus.male.leg_r"), + ), + foot_l: ( + offset: (-3.0, -5.0, -2.0), + lateral: ("npc.tursus.male.foot_l"), + ), + foot_r: ( + offset: (-3.0, -5.0, -2.0), + lateral: ("npc.tursus.male.foot_r"), + ), + ), }) \ No newline at end of file diff --git a/assets/voxygen/voxel/npc/axebeak/male/chest_back.vox b/assets/voxygen/voxel/npc/axebeak/male/chest_back.vox new file mode 100644 index 0000000000..5a8622548b --- /dev/null +++ b/assets/voxygen/voxel/npc/axebeak/male/chest_back.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f337f1c0e363a8e01ccc054381ee0846b3e6c2e6082aabc62a24140adcea910c +size 2828 diff --git a/assets/voxygen/voxel/npc/axebeak/male/chest_front.vox b/assets/voxygen/voxel/npc/axebeak/male/chest_front.vox new file mode 100644 index 0000000000..6c7eca4d23 --- /dev/null +++ b/assets/voxygen/voxel/npc/axebeak/male/chest_front.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16e4d8f6310f025c93daaeb2405fee3d0784c80076627ce8e0395f9e1df9b1d1 +size 2884 diff --git a/assets/voxygen/voxel/npc/axebeak/male/foot_r.vox b/assets/voxygen/voxel/npc/axebeak/male/foot_r.vox new file mode 100644 index 0000000000..34256ced06 --- /dev/null +++ b/assets/voxygen/voxel/npc/axebeak/male/foot_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efcfa3aca5240e2d0c8ac9713ca94efcf2176ae72febfcbcf66fb06879be3e76 +size 1628 diff --git a/assets/voxygen/voxel/npc/axebeak/male/hand_r.vox b/assets/voxygen/voxel/npc/axebeak/male/hand_r.vox new file mode 100644 index 0000000000..d9fb5348c4 --- /dev/null +++ b/assets/voxygen/voxel/npc/axebeak/male/hand_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3aa959b7c824c1222e3c2222601b787c14c1f5c0f902ebc660d4be35f508fe10 +size 2520 diff --git a/assets/voxygen/voxel/npc/axebeak/male/head.vox b/assets/voxygen/voxel/npc/axebeak/male/head.vox new file mode 100644 index 0000000000..79475a6ff8 --- /dev/null +++ b/assets/voxygen/voxel/npc/axebeak/male/head.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:34c82a1ddf4eefb5f0351f090b9d77c0df514aff4b83edf503d6255324d355bd +size 3196 diff --git a/assets/voxygen/voxel/npc/axebeak/male/jaw.vox b/assets/voxygen/voxel/npc/axebeak/male/jaw.vox new file mode 100644 index 0000000000..44475a1028 --- /dev/null +++ b/assets/voxygen/voxel/npc/axebeak/male/jaw.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07b362165d8f6949983a0325910c9539f489866560f593fa577fb719090c44d4 +size 1624 diff --git a/assets/voxygen/voxel/npc/axebeak/male/leg_r.vox b/assets/voxygen/voxel/npc/axebeak/male/leg_r.vox new file mode 100644 index 0000000000..6ea6c623e1 --- /dev/null +++ b/assets/voxygen/voxel/npc/axebeak/male/leg_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:03303a5b3c92161cef05d8089b2c3df53a1208ccf15993d09f56c4c349a9eaf7 +size 2036 diff --git a/assets/voxygen/voxel/npc/axebeak/male/neck.vox b/assets/voxygen/voxel/npc/axebeak/male/neck.vox new file mode 100644 index 0000000000..345647303f --- /dev/null +++ b/assets/voxygen/voxel/npc/axebeak/male/neck.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:11d594240de360110956130fad5a672f504876f5a3bf8ecd32e17b09c6a8b984 +size 2596 diff --git a/assets/voxygen/voxel/npc/axebeak/male/tail_front.vox b/assets/voxygen/voxel/npc/axebeak/male/tail_front.vox new file mode 100644 index 0000000000..1ee5e4a72f --- /dev/null +++ b/assets/voxygen/voxel/npc/axebeak/male/tail_front.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f10a9b0ec704758ad101a5d79735f3131c5a20be6e79a8ac57be0252712009e +size 4368 diff --git a/assets/voxygen/voxel/npc/bristleback/male/foot_br.vox b/assets/voxygen/voxel/npc/bristleback/male/foot_br.vox new file mode 100644 index 0000000000..054692397d --- /dev/null +++ b/assets/voxygen/voxel/npc/bristleback/male/foot_br.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19e589a775bda39b285da005a0e74a122cb13aa290f26e89859223369292e449 +size 1232 diff --git a/assets/voxygen/voxel/npc/bristleback/male/foot_fr.vox b/assets/voxygen/voxel/npc/bristleback/male/foot_fr.vox new file mode 100644 index 0000000000..e9b9def8ff --- /dev/null +++ b/assets/voxygen/voxel/npc/bristleback/male/foot_fr.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6baead060652857c09b7f87d312684d5e12cff21d387b7a6e58fb4e27a594799 +size 1288 diff --git a/assets/voxygen/voxel/npc/bristleback/male/head.vox b/assets/voxygen/voxel/npc/bristleback/male/head.vox new file mode 100644 index 0000000000..dc15a0e559 --- /dev/null +++ b/assets/voxygen/voxel/npc/bristleback/male/head.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:670b511a28c17c19c9ddba4291d823cd4f158b969b9ca89ede027ceaa9e2f3b2 +size 4852 diff --git a/assets/voxygen/voxel/npc/bristleback/male/jaw.vox b/assets/voxygen/voxel/npc/bristleback/male/jaw.vox new file mode 100644 index 0000000000..77e3129d43 --- /dev/null +++ b/assets/voxygen/voxel/npc/bristleback/male/jaw.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:32f503455d1a9156d68679ecc91e887eaf44922bf50c9e7613f10a41f1af9e9b +size 1484 diff --git a/assets/voxygen/voxel/npc/bristleback/male/leg_br.vox b/assets/voxygen/voxel/npc/bristleback/male/leg_br.vox new file mode 100644 index 0000000000..c1db42778f --- /dev/null +++ b/assets/voxygen/voxel/npc/bristleback/male/leg_br.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad8031ca27ffbb086d75e38d8a4f20727e7b433d8c099a75cf302ef5d040b51e +size 1276 diff --git a/assets/voxygen/voxel/npc/bristleback/male/leg_fr.vox b/assets/voxygen/voxel/npc/bristleback/male/leg_fr.vox new file mode 100644 index 0000000000..07cdbbac20 --- /dev/null +++ b/assets/voxygen/voxel/npc/bristleback/male/leg_fr.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b933075effba021325ad2a45f00dc4d7ca483cd66527f74596f06d176025dc10 +size 1304 diff --git a/assets/voxygen/voxel/npc/bristleback/male/neck.vox b/assets/voxygen/voxel/npc/bristleback/male/neck.vox new file mode 100644 index 0000000000..67227cf088 --- /dev/null +++ b/assets/voxygen/voxel/npc/bristleback/male/neck.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:931e3e29bacbf5b240756ce139f277935347ff4ba1a1d452131d1881fb413f27 +size 1920 diff --git a/assets/voxygen/voxel/npc/bristleback/male/tail.vox b/assets/voxygen/voxel/npc/bristleback/male/tail.vox new file mode 100644 index 0000000000..5342ba499c --- /dev/null +++ b/assets/voxygen/voxel/npc/bristleback/male/tail.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9cd629cf16702e77141b6a84e7b27956bcd5703363fd72b6ca587a36133d6cc1 +size 1192 diff --git a/assets/voxygen/voxel/npc/bristleback/male/torso_back.vox b/assets/voxygen/voxel/npc/bristleback/male/torso_back.vox new file mode 100644 index 0000000000..95aa7a3758 --- /dev/null +++ b/assets/voxygen/voxel/npc/bristleback/male/torso_back.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c553059c694bbd8b0eefb3dcd312f14ca0e74b968256c7c6c10fced6fb88c16 +size 2292 diff --git a/assets/voxygen/voxel/npc/bristleback/male/torso_front.vox b/assets/voxygen/voxel/npc/bristleback/male/torso_front.vox new file mode 100644 index 0000000000..75a93cb26a --- /dev/null +++ b/assets/voxygen/voxel/npc/bristleback/male/torso_front.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:044eed19ce74ae47ad3490b4386d2a2a0ec5789c0f2870b964499ef80d2f4f67 +size 5372 diff --git a/assets/voxygen/voxel/npc/seal/male/chest.vox b/assets/voxygen/voxel/npc/seal/male/chest.vox new file mode 100644 index 0000000000..47681d2726 --- /dev/null +++ b/assets/voxygen/voxel/npc/seal/male/chest.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6fd8a478dacf0490fafaabfaa65666e6ee57ac928e477f9dfa61499afa5c889d +size 3376 diff --git a/assets/voxygen/voxel/npc/seal/male/foot_br.vox b/assets/voxygen/voxel/npc/seal/male/foot_br.vox new file mode 100644 index 0000000000..ce9a87f373 --- /dev/null +++ b/assets/voxygen/voxel/npc/seal/male/foot_br.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8693ca8428cf58b4bb732fe99f2ff3eb2d7237a02724360b1cd2541774351826 +size 1292 diff --git a/assets/voxygen/voxel/npc/seal/male/foot_fr.vox b/assets/voxygen/voxel/npc/seal/male/foot_fr.vox new file mode 100644 index 0000000000..25893a4b71 --- /dev/null +++ b/assets/voxygen/voxel/npc/seal/male/foot_fr.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d2ccf130916313c9428abae66e057fb4a6e527e91bc05f71d2a426c17d42f0c +size 1292 diff --git a/assets/voxygen/voxel/npc/seal/male/head.vox b/assets/voxygen/voxel/npc/seal/male/head.vox new file mode 100644 index 0000000000..90ff8f6201 --- /dev/null +++ b/assets/voxygen/voxel/npc/seal/male/head.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3cabfbce65d87e29a267f7fb031c8cac0d929416d75c1a08530c3b136e61737c +size 2128 diff --git a/assets/voxygen/voxel/npc/tursus/male/foot_l.vox b/assets/voxygen/voxel/npc/tursus/male/foot_l.vox new file mode 100644 index 0000000000..517e13f396 --- /dev/null +++ b/assets/voxygen/voxel/npc/tursus/male/foot_l.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd49d2abc127581c60c32ae14960b7e2dbaca78afa6c65a3a20166de8c70a943 +size 1796 diff --git a/assets/voxygen/voxel/npc/tursus/male/foot_r.vox b/assets/voxygen/voxel/npc/tursus/male/foot_r.vox new file mode 100644 index 0000000000..94a3464a7a --- /dev/null +++ b/assets/voxygen/voxel/npc/tursus/male/foot_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8cd0f1c548fd1171c28cf26353b6a234b2717c9345a4346e9d87e26108469b68 +size 1796 diff --git a/assets/voxygen/voxel/npc/tursus/male/hand_l.vox b/assets/voxygen/voxel/npc/tursus/male/hand_l.vox new file mode 100644 index 0000000000..439e541e52 --- /dev/null +++ b/assets/voxygen/voxel/npc/tursus/male/hand_l.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad5db719fa0e895833fc2f69a907de9a04b056bad0906494ceddedc9b07b579c +size 3428 diff --git a/assets/voxygen/voxel/npc/tursus/male/hand_r.vox b/assets/voxygen/voxel/npc/tursus/male/hand_r.vox new file mode 100644 index 0000000000..549e93b4d0 --- /dev/null +++ b/assets/voxygen/voxel/npc/tursus/male/hand_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bcd57321a317d764d0d3f980efbdc4f764a9ec441d763186c43d48cded893017 +size 3428 diff --git a/assets/voxygen/voxel/npc/tursus/male/head.vox b/assets/voxygen/voxel/npc/tursus/male/head.vox new file mode 100644 index 0000000000..459357fa61 --- /dev/null +++ b/assets/voxygen/voxel/npc/tursus/male/head.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:368cce33ccc00940e5edf548d83f54a422007e743c482f151953aac06ff97335 +size 7252 diff --git a/assets/voxygen/voxel/npc/tursus/male/jaw.vox b/assets/voxygen/voxel/npc/tursus/male/jaw.vox new file mode 100644 index 0000000000..d420dd0281 --- /dev/null +++ b/assets/voxygen/voxel/npc/tursus/male/jaw.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9fdf77ce45f70362f7738bd35615324b29103d47cc4a8a3930377e1cb1be7731 +size 2444 diff --git a/assets/voxygen/voxel/npc/tursus/male/leg_l.vox b/assets/voxygen/voxel/npc/tursus/male/leg_l.vox new file mode 100644 index 0000000000..855ed8caac --- /dev/null +++ b/assets/voxygen/voxel/npc/tursus/male/leg_l.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c405e85bbf7d47dd0a6dd2b24d571263d0d08d9c835f1138ddd355393a181f1 +size 2148 diff --git a/assets/voxygen/voxel/npc/tursus/male/leg_r.vox b/assets/voxygen/voxel/npc/tursus/male/leg_r.vox new file mode 100644 index 0000000000..9e02870650 --- /dev/null +++ b/assets/voxygen/voxel/npc/tursus/male/leg_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d87eb595a7282ae0bf8f5348007a7c4bad3e1ca588f824e04f511ecec12a0b3 +size 2148 diff --git a/assets/voxygen/voxel/npc/tursus/male/shoulder_l.vox b/assets/voxygen/voxel/npc/tursus/male/shoulder_l.vox new file mode 100644 index 0000000000..42e5b4e9fd --- /dev/null +++ b/assets/voxygen/voxel/npc/tursus/male/shoulder_l.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d90e94fc2941201a58d5727f175ac6b84c0bb7e15c3680b161c6c484ca901346 +size 2972 diff --git a/assets/voxygen/voxel/npc/tursus/male/shoulder_r.vox b/assets/voxygen/voxel/npc/tursus/male/shoulder_r.vox new file mode 100644 index 0000000000..b32d251b79 --- /dev/null +++ b/assets/voxygen/voxel/npc/tursus/male/shoulder_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1bda1184d32508b77ed8f5255c405ba40f997d8baf6b44aef4aef5e4f20fb0a +size 2972 diff --git a/assets/voxygen/voxel/npc/tursus/male/torso_lower.vox b/assets/voxygen/voxel/npc/tursus/male/torso_lower.vox new file mode 100644 index 0000000000..fc6a4335d3 --- /dev/null +++ b/assets/voxygen/voxel/npc/tursus/male/torso_lower.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:518f4237ff73d31d572557dd01427481d0151f12efbff2cee34518307e467c01 +size 4720 diff --git a/assets/voxygen/voxel/npc/tursus/male/torso_upper.vox b/assets/voxygen/voxel/npc/tursus/male/torso_upper.vox new file mode 100644 index 0000000000..13c5f862f8 --- /dev/null +++ b/assets/voxygen/voxel/npc/tursus/male/torso_upper.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb5cb12646865cc65f5221b024bbac81f66273f69f7b5bdd25e20c466f0307f6 +size 13752 diff --git a/assets/voxygen/voxel/quadruped_medium_central_manifest.ron b/assets/voxygen/voxel/quadruped_medium_central_manifest.ron index 58a87f3988..b2b591eb05 100644 --- a/assets/voxygen/voxel/quadruped_medium_central_manifest.ron +++ b/assets/voxygen/voxel/quadruped_medium_central_manifest.ron @@ -2099,4 +2099,64 @@ central: ("npc.akhlut.male.tail"), ), ), + (Bristleback, Male): ( + head: ( + offset: (-7.5, 0.0, -8.5), + central: ("npc.bristleback.male.head"), + ), + neck: ( + offset: (-3.5, -2.0, -6.5), + central: ("npc.bristleback.male.neck"), + ), + jaw: ( + offset: (-3.5, -3.5, -0.5), + central: ("npc.bristleback.male.jaw"), + ), + torso_front: ( + offset: (-6.5, -5.0, -6.0), + central: ("npc.bristleback.male.torso_front"), + ), + torso_back: ( + offset: (-3.5, -8.0, -6.0), + central: ("npc.bristleback.male.torso_back"), + ), + ears: ( + offset: (0.0, 0.0, 0.0), + central: ("armor.empty"), + ), + tail: ( + offset: (-1.5, -6.0, -4.5), + central: ("npc.bristleback.male.tail"), + ), + ), + (Bristleback, Female): ( + head: ( + offset: (-7.5, 0.0, -8.5), + central: ("npc.bristleback.male.head"), + ), + neck: ( + offset: (-3.5, -2.0, -6.5), + central: ("npc.bristleback.male.neck"), + ), + jaw: ( + offset: (-3.5, -3.5, -0.5), + central: ("npc.bristleback.male.jaw"), + ), + torso_front: ( + offset: (-6.5, -5.0, -6.0), + central: ("npc.bristleback.male.torso_front"), + ), + torso_back: ( + offset: (-3.5, -8.0, -6.0), + central: ("npc.bristleback.male.torso_back"), + ), + ears: ( + offset: (0.0, 0.0, 0.0), + central: ("armor.empty"), + ), + tail: ( + offset: (-1.5, -6.0, -4.5), + central: ("npc.bristleback.male.tail"), + ), + ), }) diff --git a/assets/voxygen/voxel/quadruped_medium_lateral_manifest.ron b/assets/voxygen/voxel/quadruped_medium_lateral_manifest.ron index f1a1bb3c90..e76adaed73 100644 --- a/assets/voxygen/voxel/quadruped_medium_lateral_manifest.ron +++ b/assets/voxygen/voxel/quadruped_medium_lateral_manifest.ron @@ -2379,4 +2379,72 @@ lateral: ("npc.akhlut.male.foot_br"), ), ), + (Bristleback, Male): ( + leg_fl: ( + offset: (-1.5, -2.0, -2.0), + lateral: ("npc.bristleback.male.leg_fr"), + ), + leg_fr: ( + offset: (-1.5, -2.0, -2.0), + lateral: ("npc.bristleback.male.leg_fr"), + ), + leg_bl: ( + offset: (-1.5, -2.0, -4.0), + lateral: ("npc.bristleback.male.leg_br"), + ), + leg_br: ( + offset: (-1.5, -2.0, -4.0), + lateral: ("npc.bristleback.male.leg_br"), + ), + foot_fl: ( + offset: (-1.5, -1.5, -5.0), + lateral: ("npc.bristleback.male.foot_fr"), + ), + foot_fr: ( + offset: (-1.5, -1.5, -5.0), + lateral: ("npc.bristleback.male.foot_fr"), + ), + foot_bl: ( + offset: (-1.0, -2.0, -5.0), + lateral: ("npc.bristleback.male.foot_br"), + ), + foot_br: ( + offset: (-1.0, -2.0, -5.0), + lateral: ("npc.bristleback.male.foot_br"), + ), + ), + (Bristleback, Female): ( + leg_fl: ( + offset: (-1.5, -2.0, -2.0), + lateral: ("npc.bristleback.male.leg_fr"), + ), + leg_fr: ( + offset: (-1.5, -2.0, -2.0), + lateral: ("npc.bristleback.male.leg_fr"), + ), + leg_bl: ( + offset: (-1.5, -2.0, -4.0), + lateral: ("npc.bristleback.male.leg_br"), + ), + leg_br: ( + offset: (-1.5, -2.0, -4.0), + lateral: ("npc.bristleback.male.leg_br"), + ), + foot_fl: ( + offset: (-1.5, -1.5, -5.0), + lateral: ("npc.bristleback.male.foot_fr"), + ), + foot_fr: ( + offset: (-1.5, -1.5, -5.0), + lateral: ("npc.bristleback.male.foot_fr"), + ), + foot_bl: ( + offset: (-1.0, -2.0, -5.0), + lateral: ("npc.bristleback.male.foot_br"), + ), + foot_br: ( + offset: (-1.0, -2.0, -5.0), + lateral: ("npc.bristleback.male.foot_br"), + ), + ), }) diff --git a/assets/voxygen/voxel/quadruped_small_central_manifest.ron b/assets/voxygen/voxel/quadruped_small_central_manifest.ron index 37a5fbfd8d..d8c3edfc19 100644 --- a/assets/voxygen/voxel/quadruped_small_central_manifest.ron +++ b/assets/voxygen/voxel/quadruped_small_central_manifest.ron @@ -727,4 +727,32 @@ central: ("npc.goat.male.tail"), ), ), + (Seal, Male):( + head: ( + offset: (-3.0, 0.0, -3.5), + central: ("npc.seal.male.head"), + ), + chest: ( + offset: (-4.0, -8.0, -4.0), + central: ("npc.seal.male.chest"), + ), + tail: ( + offset: (-1.5, -7.5, -2.5), + central: ("armor.empty"), + ), + ), + (Seal, Female):( + head: ( + offset: (-3.0, 0.0, -3.5), + central: ("npc.seal.male.head"), + ), + chest: ( + offset: (-4.0, -8.0, -4.0), + central: ("npc.seal.male.chest"), + ), + tail: ( + offset: (-1.5, -7.5, -2.5), + central: ("armor.empty"), + ), + ), }) \ No newline at end of file diff --git a/assets/voxygen/voxel/quadruped_small_lateral_manifest.ron b/assets/voxygen/voxel/quadruped_small_lateral_manifest.ron index 8313cb5233..89b82327b1 100644 --- a/assets/voxygen/voxel/quadruped_small_lateral_manifest.ron +++ b/assets/voxygen/voxel/quadruped_small_lateral_manifest.ron @@ -937,4 +937,40 @@ lateral: ("npc.goat.male.foot_br"), ), ), + (Seal, Male): ( + left_front: ( + offset: (-3.5, -2.0, -2.0), + lateral: ("npc.seal.male.foot_fr"), + ), + right_front: ( + offset: (-3.5, -2.0, -2.0), + lateral: ("npc.seal.male.foot_fr"), + ), + left_back: ( + offset: (-3.5, -2.0, -3.5), + lateral: ("npc.seal.male.foot_br"), + ), + right_back: ( + offset: (-3.5, -2.0, -3.5), + lateral: ("npc.seal.male.foot_br"), + ), + ), + (Seal, Female): ( + left_front: ( + offset: (-3.5, -2.0, -2.0), + lateral: ("npc.seal.male.foot_fr"), + ), + right_front: ( + offset: (-3.5, -2.0, -2.0), + lateral: ("npc.seal.male.foot_fr"), + ), + left_back: ( + offset: (-3.5, -2.0, -3.5), + lateral: ("npc.seal.male.foot_br"), + ), + right_back: ( + offset: (-3.5, -2.0, -3.5), + lateral: ("npc.seal.male.foot_br"), + ), + ), }) \ No newline at end of file diff --git a/assets/voxygen/voxel/theropod_central_manifest.ron b/assets/voxygen/voxel/theropod_central_manifest.ron index 4333c6e87c..f29c93c67d 100644 --- a/assets/voxygen/voxel/theropod_central_manifest.ron +++ b/assets/voxygen/voxel/theropod_central_manifest.ron @@ -539,4 +539,64 @@ central: ("npc.ntouka.male.tail_back"), ), ), + (Axebeak, Male): ( + head: ( + offset: (-2.5, -3.5, -3.0), + central: ("npc.axebeak.male.head"), + ), + jaw: ( + offset: (-1.5, 0.0, -1.5), + central: ("npc.axebeak.male.jaw"), + ), + neck: ( + offset: (-2.5, -0.5, -4.0), + central: ("npc.axebeak.male.neck"), + ), + chest_front: ( + offset: (-3.5, -4.0, -6.5), + central: ("npc.axebeak.male.chest_front"), + ), + chest_back: ( + offset: (-3.5, -6.0, -6.5), + central: ("npc.axebeak.male.chest_back"), + ), + tail_front: ( + offset: (-11.5, -19.0, -10.0), + central: ("npc.axebeak.male.tail_front"), + ), + tail_back: ( + offset: (-1.5, -30.0, -2.0), + central: ("armor.empty"), + ), + ), + (Axebeak, Female): ( + head: ( + offset: (-2.5, -3.5, -3.0), + central: ("npc.axebeak.male.head"), + ), + jaw: ( + offset: (-1.5, 0.0, -1.5), + central: ("npc.axebeak.male.jaw"), + ), + neck: ( + offset: (-2.5, -0.5, -4.0), + central: ("npc.axebeak.male.neck"), + ), + chest_front: ( + offset: (-3.5, -4.0, -6.5), + central: ("npc.axebeak.male.chest_front"), + ), + chest_back: ( + offset: (-3.5, -6.0, -6.5), + central: ("npc.axebeak.male.chest_back"), + ), + tail_front: ( + offset: (-11.5, -19.0, -10.0), + central: ("npc.axebeak.male.tail_front"), + ), + tail_back: ( + offset: (-1.5, -30.0, -2.0), + central: ("armor.empty"), + ), + ), }) diff --git a/assets/voxygen/voxel/theropod_lateral_manifest.ron b/assets/voxygen/voxel/theropod_lateral_manifest.ron index fdc46daeff..9892553494 100644 --- a/assets/voxygen/voxel/theropod_lateral_manifest.ron +++ b/assets/voxygen/voxel/theropod_lateral_manifest.ron @@ -467,4 +467,56 @@ lateral: ("npc.ntouka.male.foot_r"), ), ), + (Axebeak, Male): ( + hand_l: ( + offset: (-10.0, -4.0, -12.0), + lateral: ("npc.axebeak.male.hand_r"), + ), + hand_r: ( + offset: (0.0, -4.0, -12.0), + lateral: ("npc.axebeak.male.hand_r"), + ), + leg_l: ( + offset: (-5.0, -4.5, -6.5), + lateral: ("npc.axebeak.male.leg_r"), + ), + leg_r: ( + offset: (0.0, -4.5, -6.5), + lateral: ("npc.axebeak.male.leg_r"), + ), + foot_l: ( + offset: (-3.5, -7.0, -5.0), + lateral: ("npc.axebeak.male.foot_r"), + ), + foot_r: ( + offset: (-3.5, -7.0, -5.0), + lateral: ("npc.axebeak.male.foot_r"), + ), + ), + (Axebeak, Female): ( + hand_l: ( + offset: (-10.0, -4.0, -12.0), + lateral: ("npc.axebeak.male.hand_r"), + ), + hand_r: ( + offset: (0.0, -4.0, -12.0), + lateral: ("npc.axebeak.male.hand_r"), + ), + leg_l: ( + offset: (-5.0, -4.5, -6.5), + lateral: ("npc.axebeak.male.leg_r"), + ), + leg_r: ( + offset: (0.0, -4.5, -6.5), + lateral: ("npc.axebeak.male.leg_r"), + ), + foot_l: ( + offset: (-3.5, -7.0, -5.0), + lateral: ("npc.axebeak.male.foot_r"), + ), + foot_r: ( + offset: (-3.5, -7.0, -5.0), + lateral: ("npc.axebeak.male.foot_r"), + ), + ), }) diff --git a/assets/world/wildlife/spawn/arctic/ocean.ron b/assets/world/wildlife/spawn/arctic/ocean.ron index b47d668c8e..4d96c71c0d 100644 --- a/assets/world/wildlife/spawn/arctic/ocean.ron +++ b/assets/world/wildlife/spawn/arctic/ocean.ron @@ -12,6 +12,7 @@ SpawnEntry ( Pack( groups: [ (2, (4, 12, "common.entity.wild.peaceful.penguin")), + (2, (4, 8, "common.entity.wild.peaceful.seal")), ], spawn_mode: Ice, day_period: [Night, Morning, Noon, Evening], diff --git a/assets/world/wildlife/spawn/desert/hot.ron b/assets/world/wildlife/spawn/desert/hot.ron index 410f17d700..3bfc0d3c77 100644 --- a/assets/world/wildlife/spawn/desert/hot.ron +++ b/assets/world/wildlife/spawn/desert/hot.ron @@ -9,6 +9,7 @@ SpawnEntry ( (2, (1, 1, "common.entity.wild.peaceful.sand_hare")), (2, (1, 1, "common.entity.wild.peaceful.salamander")), (2, (1, 1, "common.entity.wild.peaceful.gecko")), + (2, (1, 1, "common.entity.wild.aggressive.axebeak")), // Rare (1, (1, 1, "common.entity.wild.peaceful.crawler_sand")), ], diff --git a/assets/world/wildlife/spawn/jungle/rainforest_area.ron b/assets/world/wildlife/spawn/jungle/rainforest_area.ron index 68790bb809..b60389f0c3 100644 --- a/assets/world/wildlife/spawn/jungle/rainforest_area.ron +++ b/assets/world/wildlife/spawn/jungle/rainforest_area.ron @@ -14,6 +14,7 @@ SpawnEntry ( (1, (1, 1, "common.entity.wild.aggressive.stag_beetle")), (1, (1, 1, "common.entity.wild.peaceful.crawler_moss")), (1, (1, 1, "common.entity.wild.aggressive.rootsnapper")), + (1, (1, 1, "common.entity.wild.aggressive.axebeak")), ], spawn_mode: Land, day_period: [Morning, Noon, Evening], diff --git a/assets/world/wildlife/spawn/temperate/rainforest.ron b/assets/world/wildlife/spawn/temperate/rainforest.ron index a2b02e709d..ed520b8547 100644 --- a/assets/world/wildlife/spawn/temperate/rainforest.ron +++ b/assets/world/wildlife/spawn/temperate/rainforest.ron @@ -42,6 +42,7 @@ SpawnEntry ( (1, (1, 1, "common.entity.wild.aggressive.batfox")), (5, (1, 1, "common.entity.wild.peaceful.forest_fox")), (5, (1, 1, "common.entity.wild.peaceful.raccoon")), + (3, (1, 1, "common.entity.wild.aggressive.bristleback")), // Pack (5, (1, 3, "common.entity.wild.peaceful.rat")), (5, (1, 3, "common.entity.wild.peaceful.squirrel")), diff --git a/assets/world/wildlife/spawn/tundra/snow.ron b/assets/world/wildlife/spawn/tundra/snow.ron index 186ee00e1b..9a3a26905e 100644 --- a/assets/world/wildlife/spawn/tundra/snow.ron +++ b/assets/world/wildlife/spawn/tundra/snow.ron @@ -10,6 +10,7 @@ SpawnEntry ( (1, (1, 3, "common.entity.wild.aggressive.snow_raptor")), (1, (1, 1, "common.entity.wild.aggressive.roshwalr")), (5, (5, 20, "common.entity.wild.peaceful.penguin")), + (5, (5, 10, "common.entity.wild.peaceful.seal")), ], spawn_mode: Land, day_period: [Night, Morning, Noon, Evening], diff --git a/common/src/comp/body.rs b/common/src/comp/body.rs index 67349a8ffa..26ea7db981 100644 --- a/common/src/comp/body.rs +++ b/common/src/comp/body.rs @@ -370,6 +370,7 @@ impl Body { quadruped_small::Species::Squirrel => 1.0, quadruped_small::Species::Truffler => 70.0, quadruped_small::Species::Turtle => 40.0, + quadruped_small::Species::Seal => 15.0, }, Body::Theropod(body) => match body.species { // for reference, elephants are in the range of 2.6-6.9 tons @@ -383,6 +384,7 @@ impl Body { theropod::Species::Sunlizard => 500.0, theropod::Species::Woodraptor => 500.0, theropod::Species::Yale => 1_000.0, + theropod::Species::Axebeak => 300.0, }, Body::Ship(ship) => ship.mass().0, Body::Arthropod(_) => 200.0, @@ -408,6 +410,7 @@ impl Body { biped_large::Species::Cultistwarlord => Vec3::new(3.0, 3.0, 4.5), biped_large::Species::Cultistwarlock => Vec3::new(3.0, 3.0, 3.5), biped_large::Species::Huskbrute => Vec3::new(4.6, 3.0, 5.0), + biped_large::Species::Tursus => Vec3::new(4.0, 3.0, 4.0), _ => Vec3::new(4.6, 3.0, 6.0), }, Body::BipedSmall(body) => match body.species { @@ -462,6 +465,7 @@ impl Body { quadruped_medium::Species::Horse => Vec3::new(2.0, 3.0, 2.4), quadruped_medium::Species::Lion => Vec3::new(2.0, 3.3, 2.0), quadruped_medium::Species::Moose => Vec3::new(2.0, 4.0, 2.5), + quadruped_medium::Species::Bristleback => Vec3::new(2.0, 3.0, 2.0), quadruped_medium::Species::Roshwalr => Vec3::new(2.0, 3.5, 2.2), quadruped_medium::Species::Saber => Vec3::new(2.0, 3.0, 2.0), quadruped_medium::Species::Tarasque => Vec3::new(2.0, 4.0, 2.6), @@ -516,6 +520,7 @@ impl Body { theropod::Species::Sunlizard => Vec3::new(2.0, 3.6, 2.5), theropod::Species::Woodraptor => Vec3::new(2.0, 3.0, 2.6), theropod::Species::Yale => Vec3::new(2.0, 3.2, 4.0), + theropod::Species::Axebeak => Vec3::new(2.0, 3.6, 3.0), }, Body::Arthropod(body) => match body.species { arthropod::Species::Tarantula => Vec3::new(4.0, 4.0, 1.8), @@ -683,6 +688,7 @@ impl Body { quadruped_small::Species::Beaver => 15, quadruped_small::Species::Dog => 30, quadruped_small::Species::Sheep => 30, + quadruped_small::Species::Seal => 15, _ => 20, }, Body::QuadrupedMedium(quadruped_medium) => match quadruped_medium.species { @@ -711,6 +717,7 @@ impl Body { quadruped_medium::Species::Panda => 90, quadruped_medium::Species::Bear => 90, quadruped_medium::Species::Moose => 80, + quadruped_medium::Species::Bristleback => 90, quadruped_medium::Species::Dreadhorn => 370, quadruped_medium::Species::Mammoth => 250, quadruped_medium::Species::Ngoubou => 290, @@ -977,6 +984,7 @@ impl Body { (quadruped_medium::Species::Bear, _) => [0.0, -0.4, 2.5], (quadruped_medium::Species::Dreadhorn, _) => [0.0, 0.2, 3.5], (quadruped_medium::Species::Moose, _) => [0.0, -0.6, 2.1], + (quadruped_medium::Species::Bristleback, _) => [0.0, -0.6, 2.1], (quadruped_medium::Species::Snowleopard, _) => [-0.5, -0.5, 1.4], (quadruped_medium::Species::Mammoth, _) => [0.0, 4.9, 7.2], (quadruped_medium::Species::Ngoubou, _) => [0.0, 0.3, 2.0], diff --git a/common/src/comp/body/biped_large.rs b/common/src/comp/body/biped_large.rs index 82dea641b7..5bbe9e53e0 100644 --- a/common/src/comp/body/biped_large.rs +++ b/common/src/comp/body/biped_large.rs @@ -55,6 +55,7 @@ make_case_elim!( Cultistwarlord = 18, Cultistwarlock = 19, Huskbrute = 20, + Tursus = 21, } ); @@ -84,6 +85,7 @@ pub struct AllSpecies { pub cultist_warlord: SpeciesMeta, pub cultist_warlock: SpeciesMeta, pub husk_brute: SpeciesMeta, + pub tursus: SpeciesMeta, } impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies { @@ -113,11 +115,12 @@ impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies Species::Cultistwarlord => &self.cultist_warlord, Species::Cultistwarlock => &self.cultist_warlock, Species::Huskbrute => &self.husk_brute, + Species::Tursus => &self.tursus, } } } -pub const ALL_SPECIES: [Species; 21] = [ +pub const ALL_SPECIES: [Species; 22] = [ Species::Ogre, Species::Cyclops, Species::Wendigo, @@ -139,6 +142,7 @@ pub const ALL_SPECIES: [Species; 21] = [ Species::Cultistwarlord, Species::Cultistwarlock, Species::Huskbrute, + Species::Tursus, ]; impl<'a, SpeciesMeta: 'a> IntoIterator for &'a AllSpecies { diff --git a/common/src/comp/body/quadruped_medium.rs b/common/src/comp/body/quadruped_medium.rs index 5dfaf2ade9..ea9c219309 100644 --- a/common/src/comp/body/quadruped_medium.rs +++ b/common/src/comp/body/quadruped_medium.rs @@ -70,6 +70,7 @@ pub enum Species { Llama = 34, Alpaca = 35, Akhlut = 36, + Bristleback = 37, } /// Data representing per-species generic data. @@ -112,6 +113,7 @@ pub struct AllSpecies { pub llama: SpeciesMeta, pub alpaca: SpeciesMeta, pub akhlut: SpeciesMeta, + pub bristleback: SpeciesMeta, } impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies { @@ -155,11 +157,12 @@ impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies Species::Llama => &self.llama, Species::Alpaca => &self.alpaca, Species::Akhlut => &self.akhlut, + Species::Bristleback => &self.bristleback, } } } -pub const ALL_SPECIES: [Species; 35] = [ +pub const ALL_SPECIES: [Species; 36] = [ Species::Grolgar, Species::Saber, Species::Tiger, @@ -195,6 +198,7 @@ pub const ALL_SPECIES: [Species; 35] = [ Species::Llama, Species::Alpaca, Species::Akhlut, + Species::Bristleback, ]; impl<'a, SpeciesMeta: 'a> IntoIterator for &'a AllSpecies { diff --git a/common/src/comp/body/quadruped_small.rs b/common/src/comp/body/quadruped_small.rs index 3a050dd00f..b324507add 100644 --- a/common/src/comp/body/quadruped_small.rs +++ b/common/src/comp/body/quadruped_small.rs @@ -61,6 +61,7 @@ pub enum Species { Beaver = 23, Hare = 24, Dog = 25, + Seal = 26, } /// Data representing per-species generic data. @@ -94,6 +95,7 @@ pub struct AllSpecies { pub hare: SpeciesMeta, pub dog: SpeciesMeta, pub goat: SpeciesMeta, + pub seal: SpeciesMeta, } impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies { @@ -128,11 +130,12 @@ impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies Species::Hare => &self.hare, Species::Dog => &self.dog, Species::Goat => &self.goat, + Species::Seal => &self.seal, } } } -pub const ALL_SPECIES: [Species; 26] = [ +pub const ALL_SPECIES: [Species; 27] = [ Species::Pig, Species::Fox, Species::Sheep, @@ -159,6 +162,7 @@ pub const ALL_SPECIES: [Species; 26] = [ Species::Hare, Species::Dog, Species::Goat, + Species::Seal, ]; impl<'a, SpeciesMeta: 'a> IntoIterator for &'a AllSpecies { diff --git a/common/src/comp/body/theropod.rs b/common/src/comp/body/theropod.rs index ddca7d7c0e..2bc193ac77 100644 --- a/common/src/comp/body/theropod.rs +++ b/common/src/comp/body/theropod.rs @@ -37,6 +37,7 @@ pub enum Species { Yale = 6, Ntouka = 7, Dodarock = 8, + Axebeak = 9, } /// Data representing per-species generic data. @@ -51,6 +52,7 @@ pub struct AllSpecies { pub yale: SpeciesMeta, pub dodarock: SpeciesMeta, pub ntouka: SpeciesMeta, + pub axebeak: SpeciesMeta, } impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies { @@ -68,11 +70,12 @@ impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies Species::Yale => &self.yale, Species::Dodarock => &self.dodarock, Species::Ntouka => &self.ntouka, + Species::Axebeak => &self.axebeak, } } } -pub const ALL_SPECIES: [Species; 9] = [ +pub const ALL_SPECIES: [Species; 10] = [ Species::Archaeos, Species::Odonto, Species::Sandraptor, @@ -82,6 +85,7 @@ pub const ALL_SPECIES: [Species; 9] = [ Species::Yale, Species::Dodarock, Species::Ntouka, + Species::Axebeak, ]; impl<'a, SpeciesMeta: 'a> IntoIterator for &'a AllSpecies { diff --git a/common/src/comp/inventory/loadout_builder.rs b/common/src/comp/inventory/loadout_builder.rs index 7e37e0e160..cb82c7ef29 100644 --- a/common/src/comp/inventory/loadout_builder.rs +++ b/common/src/comp/inventory/loadout_builder.rs @@ -613,7 +613,8 @@ fn default_main_tool(body: &Body) -> Item { Body::Theropod(theropod) => match theropod.species { theropod::Species::Sandraptor | theropod::Species::Snowraptor - | theropod::Species::Woodraptor => Some(Item::new_from_asset_expect( + | theropod::Species::Woodraptor + | theropod::Species::Axebeak => Some(Item::new_from_asset_expect( "common.items.npc_weapons.unique.theropodbird", )), theropod::Species::Yale => Some(Item::new_from_asset_expect( @@ -686,6 +687,9 @@ fn default_main_tool(body: &Body) -> Item { (biped_large::Species::Werewolf, _) => Some(Item::new_from_asset_expect( "common.items.npc_weapons.unique.beast_claws", )), + (biped_large::Species::Tursus, _) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.beast_claws", + )), (biped_large::Species::Cyclops, _) => Some(Item::new_from_asset_expect( "common.items.npc_weapons.hammer.cyclops_hammer", )), diff --git a/common/src/states/utils.rs b/common/src/states/utils.rs index acbc8b6b2b..fcc5727f55 100644 --- a/common/src/states/utils.rs +++ b/common/src/states/utils.rs @@ -89,6 +89,7 @@ impl Body { quadruped_medium::Species::Llama => 120.0, quadruped_medium::Species::Alpaca => 110.0, quadruped_medium::Species::Akhlut => 90.0, + quadruped_medium::Species::Bristleback => 135.0, }, Body::BipedLarge(body) => match body.species { biped_large::Species::Slysaurok => 100.0, diff --git a/voxygen/anim/src/biped_large/mod.rs b/voxygen/anim/src/biped_large/mod.rs index baba6bd0f5..6c22aa2920 100644 --- a/voxygen/anim/src/biped_large/mod.rs +++ b/voxygen/anim/src/biped_large/mod.rs @@ -248,6 +248,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Cultistwarlord, _) => (0.5, 14.5), (Cultistwarlock, _) => (0.5, 11.0), (Huskbrute, _) => (8.5, 4.0), + (Tursus, _) => (-4.5, -14.0), }, jaw: match (body.species, body.body_type) { (Ogre, _) => (0.0, 0.0), @@ -271,6 +272,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Cultistwarlord, _) => (0.0, 3.5), (Cultistwarlock, _) => (0.0, 3.5), (Huskbrute, _) => (-5.0, -5.0), + (Tursus, _) => (4.0, 10.5), }, upper_torso: match (body.species, body.body_type) { (Ogre, Male) => (0.0, 27.5), @@ -295,6 +297,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Cultistwarlord, _) => (-1.0, 18.5), (Cultistwarlock, _) => (-1.0, 17.5), (Huskbrute, _) => (-1.0, 23.5), + (Tursus, _) => (3.0, 26.0), }, lower_torso: match (body.species, body.body_type) { (Ogre, Male) => (1.0, -7.0), @@ -319,6 +322,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Cultistwarlord, _) => (0.0, -1.5), (Cultistwarlock, _) => (1.0, -2.5), (Huskbrute, _) => (-0.5, -7.0), + (Tursus, _) => (-5.0, -9.0), }, tail: match (body.species, body.body_type) { (Werewolf, _) => (-5.5, -2.0), @@ -351,6 +355,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Cultistwarlord, _) => (11.5, -1.0, 4.5), (Cultistwarlock, _) => (8.0, 0.0, 3.5), (Huskbrute, _) => (10.5, 0.0, -1.5), + (Tursus, _) => (12.5, -2.5, 1.0), }, hand: match (body.species, body.body_type) { (Ogre, Male) => (14.5, 0.0, -4.0), @@ -375,6 +380,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Cultistwarlord, _) => (11.5, -1.0, -1.0), (Cultistwarlock, _) => (9.5, -1.0, 1.0), (Huskbrute, _) => (13.0, 0.5, -4.0), + (Tursus, _) => (15.5, -2.5, -8.0), }, leg: match (body.species, body.body_type) { (Ogre, Male) => (0.0, 0.0, -4.0), @@ -399,6 +405,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Cultistwarlord, _) => (3.5, -1.0, -8.5), (Cultistwarlock, _) => (3.5, -1.0, -8.5), (Huskbrute, _) => (4.0, 0.0, -7.5), + (Tursus, _) => (4.5, 1.0, -9.0), }, foot: match (body.species, body.body_type) { (Ogre, Male) => (4.0, 1.0, -12.0), @@ -423,6 +430,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Cultistwarlord, _) => (3.5, 0.0, -12.5), (Cultistwarlock, _) => (3.5, 0.0, -10.5), (Huskbrute, _) => (4.5, 0.5, -12.5), + (Tursus, _) => (5.5, 3.0, -14.5), }, scaler: match (body.species, body.body_type) { (Ogre, Male) => 1.12, @@ -447,6 +455,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Cultistwarlord, _) => 1.0, (Cultistwarlock, _) => 1.0, (Huskbrute, _) => 1.2, + (Tursus, _) => 1.0, }, tempo: match (body.species, body.body_type) { (Ogre, Male) => 0.9, @@ -482,6 +491,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Cultistwarlord, _) => (8.0, 0.0), (Cultistwarlock, _) => (8.0, 0.0), (Huskbrute, _) => (12.5, 0.0), + (Tursus, _) => (13.0, 0.0), }, shl: match (body.species, body.body_type) { (Dullahan, _) => (-4.75, -11.0, 8.5, 1.47, -0.2, 0.0), diff --git a/voxygen/anim/src/quadruped_medium/mod.rs b/voxygen/anim/src/quadruped_medium/mod.rs index 03550d463c..9387ee5130 100644 --- a/voxygen/anim/src/quadruped_medium/mod.rs +++ b/voxygen/anim/src/quadruped_medium/mod.rs @@ -237,6 +237,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Llama, _) => (0.5, 10.0), (Alpaca, _) => (0.5, 7.5), (Akhlut, _) => (1.0, 3.5), + (Bristleback, _) => (-3.0, -2.0), }, neck: match (body.species, body.body_type) { (Grolgar, _) => (1.0, -1.0), @@ -276,6 +277,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Llama, _) => (2.5, 4.5), (Alpaca, _) => (-1.5, 3.0), (Akhlut, _) => (8.5, -1.0), + (Bristleback, _) => (6.0, 2.5), }, jaw: match (body.species, body.body_type) { (Grolgar, _) => (7.0, 2.0), @@ -316,6 +318,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Llama, _) => (4.0, -1.0), (Alpaca, _) => (3.0, -2.5), (Akhlut, _) => (0.0, -4.5), + (Bristleback, _) => (8.0, -6.0), }, tail: match (body.species, body.body_type) { (Grolgar, _) => (-11.5, -0.5), @@ -355,6 +358,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Llama, _) => (-9.0, 6.0), (Alpaca, _) => (-8.5, 3.5), (Akhlut, _) => (-14.0, -2.0), + (Bristleback, _) => (-7.0, -5.5), }, torso_front: match (body.species, body.body_type) { (Grolgar, _) => (10.0, 13.0), @@ -394,6 +398,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Llama, _) => (7.0, 15.0), (Alpaca, _) => (7.0, 11.5), (Akhlut, _) => (5.5, 14.5), + (Bristleback, _) => (1.5, 9.0), }, torso_back: match (body.species, body.body_type) { (Grolgar, _) => (-10.0, 1.5), @@ -433,6 +438,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Llama, _) => (-8.0, 0.0), (Alpaca, _) => (-6.0, 0.0), (Akhlut, _) => (-7.0, 1.0), + (Bristleback, _) => (-4.0, 2.0), }, ears: match (body.species, body.body_type) { (Grolgar, _) => (5.0, 8.0), @@ -473,6 +479,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Llama, _) => (1.0, 3.5), (Alpaca, _) => (1.0, 2.0), (Akhlut, _) => (12.0, -3.0), + (Bristleback, _) => (6.0, 1.0), }, leg_f: match (body.species, body.body_type) { (Grolgar, _) => (7.5, -5.5, -1.0), @@ -512,6 +519,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Llama, _) => (5.0, -1.5, -1.0), (Alpaca, _) => (3.5, -2.5, -0.5), (Akhlut, _) => (8.0, -2.0, 0.5), + (Bristleback, _) => (6.0, 1.0, -2.0), }, leg_b: match (body.species, body.body_type) { (Grolgar, _) => (6.0, -6.5, -4.0), @@ -551,6 +559,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Llama, _) => (5.0, -7.0, -2.0), (Alpaca, _) => (3.5, -7.0, 0.0), (Akhlut, _) => (6.0, -7.5, -2.0), + (Bristleback, _) => (4.5, -3.0, -2.0), }, feet_f: match (body.species, body.body_type) { (Grolgar, _) => (0.0, 0.0, -4.0), @@ -590,6 +599,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Llama, _) => (-0.5, 0.5, -6.0), (Alpaca, _) => (0.0, -0.5, -5.0), (Akhlut, _) => (0.0, 0.0, -5.0), + (Bristleback, _) => (0.0, -0.5, -2.0), }, feet_b: match (body.species, body.body_type) { (Grolgar, _) => (0.5, -1.5, -3.0), @@ -629,6 +639,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Llama, _) => (0.5, -1.5, -3.5), (Alpaca, _) => (-0.5, -0.5, -5.5), (Akhlut, _) => (1.5, -1.0, -4.5), + (Bristleback, _) => (-0.5, 0.0, -4.0), }, scaler: match (body.species, body.body_type) { (Grolgar, _) => 1.05, @@ -657,6 +668,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Mammoth, _) => 3.0, (Ngoubou, _) => 1.0, (Akhlut, _) => 1.4, + (Bristleback, _) => 1.1, _ => 0.9, }, startangle: match (body.species, body.body_type) { @@ -779,6 +791,7 @@ fn mount_point(body: &Body) -> Vec3 { (Llama, _) => (0.0, -6.0, 2.0), (Alpaca, _) => (0.0, -9.0, 0.0), (Akhlut, _) => (0.0, -6.0, 1.0), + (Bristleback, _) => (0.0, -9.0, 3.0), } .into() } diff --git a/voxygen/anim/src/quadruped_small/mod.rs b/voxygen/anim/src/quadruped_small/mod.rs index 475454210c..0ac92a7d21 100644 --- a/voxygen/anim/src/quadruped_small/mod.rs +++ b/voxygen/anim/src/quadruped_small/mod.rs @@ -153,6 +153,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Hare, Female) => (2.5, 3.0), (Dog, _) => (3.0, 4.5), (Goat, _) => (3.5, 4.0), + (Seal, _) => (4.0, 2.5), }, chest: match (body.species, body.body_type) { (Pig, _) => (0.0, 6.0), @@ -182,6 +183,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Hare, Female) => (-2.0, 6.0), (Dog, _) => (-2.0, 8.5), (Goat, _) => (2.0, 7.5), + (Seal, _) => (-2.0, 4.0), }, feet_f: match (body.species, body.body_type) { (Pig, _) => (4.5, 3.5, -1.0), @@ -211,6 +213,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Hare, Female) => (3.0, 0.5, -4.0), (Dog, _) => (3.5, 3.0, -2.5), (Goat, _) => (3.0, 2.5, -3.5), + (Seal, _) => (6.5, 3.0, -2.0), }, feet_b: match (body.species, body.body_type) { (Pig, _) => (3.5, -2.0, 0.0), @@ -240,6 +243,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Hare, Female) => (3.5, -3.0, -2.0), (Dog, _) => (3.0, -3.5, -2.5), (Goat, _) => (3.0, -4.0, -2.0), + (Seal, _) => (4.5, -6.0, -0.5), }, tail: match (body.species, body.body_type) { (Pig, _) => (-4.5, 2.5), @@ -269,6 +273,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Hare, Female) => (-4.0, 2.0), (Dog, _) => (-5.0, 0.5), (Goat, _) => (-7.0, 0.0), + (Seal, _) => (-1.0, 4.0), }, scaler: match (body.species, body.body_type) { (Pig, _) => 0.72, @@ -289,6 +294,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Fungome, _) => 0.72, (Porcupine, _) => 0.65, (Hare, _) => 0.65, + (Seal, _) => 0.9, _ => 0.8, }, tempo: match (body.species, body.body_type) { @@ -306,6 +312,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Porcupine, _) => 1.2, (Beaver, _) => 1.2, (Hare, _) => 1.15, + (Seal, _) => 2.5, _ => 1.0, }, maximize: match (body.species, body.body_type) { @@ -340,6 +347,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Beaver, _) => 0.9, (Hare, _) => 0.8, (Goat, _) => 0.8, + (Seal, _) => 0.7, _ => 1.0, }, spring: match (body.species, body.body_type) { @@ -364,6 +372,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Hare, Male) => 2.2, (Hare, Female) => 2.5, (Goat, _) => 1.2, + (Seal, _) => 0.7, _ => 1.0, }, feed: match (body.species, body.body_type) { @@ -421,6 +430,7 @@ fn mount_point(body: &Body) -> Vec3 { (Hare, Female) => (0.0, -4.0, -4.5), (Dog, _) => (0.0, -4.0, -2.5), (Goat, _) => (0.0, -4.0, -3.5), + (Seal, _) => (0.0, -2.0, -2.5), } .into() } diff --git a/voxygen/anim/src/theropod/mod.rs b/voxygen/anim/src/theropod/mod.rs index f8f96337b4..51e1e4b130 100644 --- a/voxygen/anim/src/theropod/mod.rs +++ b/voxygen/anim/src/theropod/mod.rs @@ -103,6 +103,7 @@ pub struct SkeletonAttr { leg: (f32, f32, f32), foot: (f32, f32, f32), scaler: f32, + steady_wings: bool, } impl<'a> TryFrom<&'a comp::Body> for SkeletonAttr { @@ -130,6 +131,7 @@ impl Default for SkeletonAttr { leg: (0.0, 0.0, 0.0), foot: (0.0, 0.0, 0.0), scaler: 0.0, + steady_wings: false, } } } @@ -148,6 +150,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Yale, _) => (7.0, 14.0), (Dodarock, _) => (2.0, 1.5), (Ntouka, _) => (2.0, 2.5), + (Axebeak, _) => (11.5, 8.5), }, jaw: match (body.species, body.body_type) { (Archaeos, _) => (1.0, -7.0), @@ -159,6 +162,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Yale, _) => (2.0, -9.5), (Dodarock, _) => (0.0, -5.0), (Ntouka, _) => (0.0, -4.0), + (Axebeak, _) => (2.5, -4.0), }, neck: match (body.species, body.body_type) { (Archaeos, _) => (4.5, -2.0), @@ -170,6 +174,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Yale, _) => (2.0, 4.0), (Dodarock, _) => (5.0, -1.0), (Ntouka, _) => (4.0, 0.0), + (Axebeak, _) => (-5.5, 0.0), }, chest_front: match (body.species, body.body_type) { (Archaeos, _) => (0.0, 20.0), @@ -181,6 +186,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Yale, _) => (0.0, 19.5), (Dodarock, _) => (0.0, 12.0), (Ntouka, _) => (0.0, 13.0), + (Axebeak, _) => (0.0, 12.0), }, chest_back: match (body.species, body.body_type) { (Archaeos, _) => (-5.5, -1.0), @@ -192,6 +198,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Yale, _) => (-3.0, -1.0), (Dodarock, _) => (-4.5, -2.0), (Ntouka, _) => (-4.5, 1.0), + (Axebeak, _) => (-5.0, 0.0), }, tail_front: match (body.species, body.body_type) { (Archaeos, _) => (-9.0, -1.5), @@ -203,6 +210,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Yale, _) => (-9.5, -4.0), (Dodarock, _) => (-4.5, -4.5), (Ntouka, _) => (-9.5, -3.5), + (Axebeak, _) => (-5.5, 4.5), }, tail_back: match (body.species, body.body_type) { (Archaeos, _) => (-8.0, -0.5), @@ -214,6 +222,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Yale, _) => (-5.0, -2.5), (Dodarock, _) => (-8.5, -2.0), (Ntouka, _) => (-9.5, -2.0), + (Axebeak, _) => (-10.0, 3.0), }, hand: match (body.species, body.body_type) { (Archaeos, _) => (3.0, 0.0, -4.0), @@ -225,6 +234,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Yale, _) => (3.0, 2.0, -0.5), (Dodarock, _) => (3.5, 3.0, -5.0), (Ntouka, _) => (3.5, 3.0, -4.0), + (Axebeak, _) => (1.5, -10.5, 9.5), }, leg: match (body.species, body.body_type) { (Archaeos, _) => (2.5, -3.0, -4.0), @@ -236,6 +246,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Yale, _) => (3.0, -3.5, -4.0), (Dodarock, _) => (3.5, 1.5, -4.0), (Ntouka, _) => (4.5, -5.5, -4.0), + (Axebeak, _) => (2.5, -0.5, 0.0), }, foot: match (body.species, body.body_type) { (Archaeos, _) => (3.0, -0.5, -7.0), @@ -247,6 +258,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Yale, _) => (1.5, 1.0, -3.5), (Dodarock, _) => (1.5, -1.0, -3.5), (Ntouka, _) => (1.5, -1.0, -2.5), + (Axebeak, _) => (2.5, 2.5, -7.0), }, scaler: match (body.species, body.body_type) { (Archaeos, _) => 2.93, @@ -258,7 +270,9 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Yale, _) => 1.26, (Dodarock, _) => 1.1, (Ntouka, _) => 2.93, + (Axebeak, _) => 1.1, }, + steady_wings: matches!((body.species, body.body_type), (Axebeak, _)), } } } diff --git a/voxygen/anim/src/theropod/run.rs b/voxygen/anim/src/theropod/run.rs index 3e480a1cdd..5e0f4db10e 100644 --- a/voxygen/anim/src/theropod/run.rs +++ b/voxygen/anim/src/theropod/run.rs @@ -103,13 +103,21 @@ impl Animation for RunAnimation { next.tail_back.position = Vec3::new(0.0, s_a.tail_back.0, s_a.tail_back.1); next.tail_back.orientation = Quaternion::rotation_x(0.2 + short * -0.1) * Quaternion::rotation_z(shortalt * -0.2 + tilt * 1.4); + if s_a.steady_wings { + next.hand_l.position = Vec3::new(-s_a.hand.0 - 8.0, s_a.hand.1, s_a.hand.2); + next.hand_l.orientation = + Quaternion::rotation_x(-0.2 * speednorm) * Quaternion::rotation_z(-0.6); - next.hand_l.position = Vec3::new(-s_a.hand.0, s_a.hand.1, s_a.hand.2); - next.hand_l.orientation = Quaternion::rotation_x(-0.2 * speednorm + foot2a * 0.3); - - next.hand_r.position = Vec3::new(s_a.hand.0, s_a.hand.1, s_a.hand.2); - next.hand_r.orientation = Quaternion::rotation_x(-0.2 * speednorm + foot1a * 0.3); + next.hand_r.position = Vec3::new(s_a.hand.0 + 8.0, s_a.hand.1, s_a.hand.2); + next.hand_r.orientation = + Quaternion::rotation_x(-0.2 * speednorm) * Quaternion::rotation_z(0.6); + } else { + next.hand_l.position = Vec3::new(-s_a.hand.0, s_a.hand.1, s_a.hand.2); + next.hand_l.orientation = Quaternion::rotation_x(-0.2 * speednorm + foot2a * 0.3); + next.hand_r.position = Vec3::new(s_a.hand.0, s_a.hand.1, s_a.hand.2); + next.hand_r.orientation = Quaternion::rotation_x(-0.2 * speednorm + foot1a * 0.3); + }; next.leg_l.position = Vec3::new( -s_a.leg.0 + speednorm * 1.5, s_a.leg.1 + foot1b * -1.3,