From 0895ddaffb23ed7fe4e12b163b500d4fa69c563b Mon Sep 17 00:00:00 2001 From: jshipsey Date: Sat, 29 Aug 2020 04:23:12 -0400 Subject: [PATCH] haul out the critter skele, add theropod --- assets/common/npc_names.json | 56 ++-- .../voxygen/voxel/critter_center_manifest.ron | 266 --------------- .../voxel/npc/archaeos/male/chest_back.vox | Bin 0 -> 3580 bytes .../voxel/npc/archaeos/male/chest_front.vox | Bin 0 -> 5608 bytes .../voxel/npc/archaeos/male/foot_l.vox | Bin 0 -> 2204 bytes .../voxel/npc/archaeos/male/foot_r.vox | Bin 0 -> 2204 bytes .../voxel/npc/archaeos/male/hand_l.vox | Bin 0 -> 1316 bytes .../voxel/npc/archaeos/male/hand_r.vox | Bin 0 -> 1316 bytes .../voxygen/voxel/npc/archaeos/male/head.vox | Bin 0 -> 2884 bytes .../voxygen/voxel/npc/archaeos/male/jaw.vox | Bin 0 -> 2300 bytes .../voxygen/voxel/npc/archaeos/male/leg_l.vox | Bin 0 -> 2540 bytes .../voxygen/voxel/npc/archaeos/male/leg_r.vox | Bin 0 -> 2540 bytes .../voxygen/voxel/npc/archaeos/male/neck.vox | Bin 0 -> 2836 bytes .../voxel/npc/archaeos/male/tail_back.vox | Bin 0 -> 2624 bytes .../voxel/npc/archaeos/male/tail_front.vox | Bin 0 -> 1960 bytes .../voxygen/voxel/npc/axolotl/male/chest.vox | Bin 1352 -> 3736 bytes .../voxygen/voxel/npc/axolotl/male/feet_b.vox | Bin 1128 -> 0 bytes .../voxygen/voxel/npc/axolotl/male/feet_f.vox | Bin 1128 -> 0 bytes .../feet_b.vox => axolotl/male/foot_bl.vox} | Bin .../feet_f.vox => axolotl/male/foot_br.vox} | Bin .../voxel/npc/axolotl/male/foot_fl.vox | Bin 0 -> 1128 bytes .../voxel/npc/axolotl/male/foot_fr.vox | Bin 0 -> 1128 bytes .../voxygen/voxel/npc/axolotl/male/head.vox | Bin 1420 -> 1376 bytes .../voxygen/voxel/npc/axolotl/male/tail.vox | Bin 1168 -> 1116 bytes .../voxygen/voxel/npc/fungome/male/chest.vox | Bin 2840 -> 3736 bytes .../voxygen/voxel/npc/fungome/male/feet_b.vox | Bin 1128 -> 0 bytes .../voxygen/voxel/npc/fungome/male/feet_f.vox | Bin 1128 -> 0 bytes .../voxel/npc/fungome/male/foot_bl.vox | Bin 0 -> 1128 bytes .../voxel/npc/fungome/male/foot_br.vox | Bin 0 -> 1128 bytes .../voxel/npc/fungome/male/foot_fl.vox | Bin 0 -> 1128 bytes .../voxel/npc/fungome/male/foot_fr.vox | Bin 0 -> 1128 bytes .../voxygen/voxel/npc/fungome/male/head.vox | Bin 1300 -> 1376 bytes .../voxygen/voxel/npc/fungome/male/tail.vox | Bin 1108 -> 1116 bytes assets/voxygen/voxel/npc/gecko/male/chest.vox | Bin 1268 -> 3736 bytes .../voxygen/voxel/npc/gecko/male/feet_b.vox | Bin 1112 -> 0 bytes .../voxygen/voxel/npc/gecko/male/feet_f.vox | Bin 1112 -> 0 bytes .../voxygen/voxel/npc/gecko/male/foot_bl.vox | Bin 0 -> 1128 bytes .../voxygen/voxel/npc/gecko/male/foot_br.vox | Bin 0 -> 1128 bytes .../voxygen/voxel/npc/gecko/male/foot_fl.vox | Bin 0 -> 1128 bytes .../voxygen/voxel/npc/gecko/male/foot_fr.vox | Bin 0 -> 1128 bytes assets/voxygen/voxel/npc/gecko/male/head.vox | Bin 1372 -> 1376 bytes assets/voxygen/voxel/npc/gecko/male/tail.vox | Bin 1124 -> 1116 bytes .../npc/odontotyrannos/Odontotyrannos-0.vox | Bin 0 -> 4416 bytes .../npc/odontotyrannos/Odontotyrannos-1.vox | Bin 0 -> 2788 bytes .../npc/odontotyrannos/Odontotyrannos-10.vox | Bin 0 -> 2952 bytes .../npc/odontotyrannos/Odontotyrannos-11.vox | Bin 0 -> 1228 bytes .../npc/odontotyrannos/Odontotyrannos-2.vox | Bin 0 -> 5624 bytes .../npc/odontotyrannos/Odontotyrannos-3.vox | Bin 0 -> 4244 bytes .../npc/odontotyrannos/Odontotyrannos-4.vox | Bin 0 -> 2952 bytes .../npc/odontotyrannos/Odontotyrannos-5.vox | Bin 0 -> 2476 bytes .../npc/odontotyrannos/Odontotyrannos-6.vox | Bin 0 -> 1228 bytes .../npc/odontotyrannos/Odontotyrannos-7.vox | Bin 0 -> 2272 bytes .../npc/odontotyrannos/Odontotyrannos-8.vox | Bin 0 -> 1932 bytes .../npc/odontotyrannos/Odontotyrannos-9.vox | Bin 0 -> 2476 bytes assets/voxygen/voxel/npc/rat/male/chest.vox | Bin 3636 -> 3736 bytes assets/voxygen/voxel/npc/rat/male/feet_b.vox | Bin 1168 -> 0 bytes assets/voxygen/voxel/npc/rat/male/feet_f.vox | Bin 1168 -> 0 bytes assets/voxygen/voxel/npc/rat/male/feet_r.vox | Bin 1168 -> 0 bytes assets/voxygen/voxel/npc/rat/male/foot_bl.vox | Bin 0 -> 1128 bytes assets/voxygen/voxel/npc/rat/male/foot_br.vox | Bin 0 -> 1128 bytes assets/voxygen/voxel/npc/rat/male/foot_fl.vox | Bin 0 -> 1128 bytes assets/voxygen/voxel/npc/rat/male/foot_fr.vox | Bin 0 -> 1128 bytes assets/voxygen/voxel/npc/rat/male/head.vox | Bin 1656 -> 1376 bytes assets/voxygen/voxel/npc/rat/male/tail.vox | Bin 1136 -> 1116 bytes .../voxygen/voxel/npc/squirrel/male/chest.vox | Bin 1212 -> 3736 bytes .../voxel/npc/squirrel/male/feet_b.vox | Bin 1112 -> 0 bytes .../voxel/npc/squirrel/male/feet_f.vox | Bin 1112 -> 0 bytes .../voxel/npc/squirrel/male/foot_bl.vox | Bin 0 -> 1128 bytes .../voxel/npc/squirrel/male/foot_br.vox | Bin 0 -> 1128 bytes .../voxel/npc/squirrel/male/foot_fl.vox | Bin 0 -> 1128 bytes .../voxel/npc/squirrel/male/foot_fr.vox | Bin 0 -> 1128 bytes .../voxygen/voxel/npc/squirrel/male/head.vox | Bin 1264 -> 1376 bytes .../voxygen/voxel/npc/squirrel/male/tail.vox | Bin 1208 -> 1116 bytes .../voxygen/voxel/npc/turtle/male/foot_bl.vox | Bin 0 -> 1128 bytes .../voxygen/voxel/npc/turtle/male/foot_br.vox | Bin 0 -> 1128 bytes .../voxygen/voxel/npc/turtle/male/foot_fl.vox | Bin 0 -> 1128 bytes .../voxygen/voxel/npc/turtle/male/foot_fr.vox | Bin 0 -> 1128 bytes .../quadruped_small_central_manifest.ron | 168 ++++++++++ .../quadruped_small_lateral_manifest.ron | 217 ++++++++++++- .../voxel/theropod_central_manifest.ron | 122 +++++++ .../voxel/theropod_lateral_manifest.ron | 106 ++++++ common/src/comp/agent.rs | 8 +- common/src/comp/body.rs | 26 +- common/src/comp/body/quadruped_small.rs | 69 ++-- common/src/comp/body/theropod.rs | 8 +- common/src/comp/mod.rs | 4 +- common/src/generation.rs | 2 +- common/src/loadout_builder.rs | 2 +- common/src/npc.rs | 12 +- common/src/states/utils.rs | 4 +- server/src/events/entity_manipulation.rs | 4 +- voxygen/src/anim/src/critter/idle.rs | 68 ---- voxygen/src/anim/src/critter/jump.rs | 48 --- voxygen/src/anim/src/critter/mod.rs | 136 -------- voxygen/src/anim/src/critter/run.rs | 59 ---- voxygen/src/anim/src/lib.rs | 2 +- voxygen/src/anim/src/quadruped_small/mod.rs | 66 ++++ voxygen/src/anim/src/theropod/idle.rs | 109 +++++++ voxygen/src/anim/src/theropod/jump.rs | 111 +++++++ voxygen/src/anim/src/theropod/mod.rs | 177 ++++++++++ voxygen/src/anim/src/theropod/run.rs | 114 +++++++ voxygen/src/scene/figure/cache.rs | 7 + voxygen/src/scene/figure/load.rs | 306 +++++++++++++++--- voxygen/src/scene/figure/mod.rs | 69 ++-- world/src/layer/mod.rs | 10 +- world/src/lib.rs | 6 +- 106 files changed, 1600 insertions(+), 762 deletions(-) delete mode 100644 assets/voxygen/voxel/critter_center_manifest.ron create mode 100644 assets/voxygen/voxel/npc/archaeos/male/chest_back.vox create mode 100644 assets/voxygen/voxel/npc/archaeos/male/chest_front.vox create mode 100644 assets/voxygen/voxel/npc/archaeos/male/foot_l.vox create mode 100644 assets/voxygen/voxel/npc/archaeos/male/foot_r.vox create mode 100644 assets/voxygen/voxel/npc/archaeos/male/hand_l.vox create mode 100644 assets/voxygen/voxel/npc/archaeos/male/hand_r.vox create mode 100644 assets/voxygen/voxel/npc/archaeos/male/head.vox create mode 100644 assets/voxygen/voxel/npc/archaeos/male/jaw.vox create mode 100644 assets/voxygen/voxel/npc/archaeos/male/leg_l.vox create mode 100644 assets/voxygen/voxel/npc/archaeos/male/leg_r.vox create mode 100644 assets/voxygen/voxel/npc/archaeos/male/neck.vox create mode 100644 assets/voxygen/voxel/npc/archaeos/male/tail_back.vox create mode 100644 assets/voxygen/voxel/npc/archaeos/male/tail_front.vox delete mode 100644 assets/voxygen/voxel/npc/axolotl/male/feet_b.vox delete mode 100644 assets/voxygen/voxel/npc/axolotl/male/feet_f.vox rename assets/voxygen/voxel/npc/{turtle/male/feet_b.vox => axolotl/male/foot_bl.vox} (100%) rename assets/voxygen/voxel/npc/{turtle/male/feet_f.vox => axolotl/male/foot_br.vox} (100%) create mode 100644 assets/voxygen/voxel/npc/axolotl/male/foot_fl.vox create mode 100644 assets/voxygen/voxel/npc/axolotl/male/foot_fr.vox delete mode 100644 assets/voxygen/voxel/npc/fungome/male/feet_b.vox delete mode 100644 assets/voxygen/voxel/npc/fungome/male/feet_f.vox create mode 100644 assets/voxygen/voxel/npc/fungome/male/foot_bl.vox create mode 100644 assets/voxygen/voxel/npc/fungome/male/foot_br.vox create mode 100644 assets/voxygen/voxel/npc/fungome/male/foot_fl.vox create mode 100644 assets/voxygen/voxel/npc/fungome/male/foot_fr.vox delete mode 100644 assets/voxygen/voxel/npc/gecko/male/feet_b.vox delete mode 100644 assets/voxygen/voxel/npc/gecko/male/feet_f.vox create mode 100644 assets/voxygen/voxel/npc/gecko/male/foot_bl.vox create mode 100644 assets/voxygen/voxel/npc/gecko/male/foot_br.vox create mode 100644 assets/voxygen/voxel/npc/gecko/male/foot_fl.vox create mode 100644 assets/voxygen/voxel/npc/gecko/male/foot_fr.vox create mode 100644 assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-0.vox create mode 100644 assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-1.vox create mode 100644 assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-10.vox create mode 100644 assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-11.vox create mode 100644 assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-2.vox create mode 100644 assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-3.vox create mode 100644 assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-4.vox create mode 100644 assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-5.vox create mode 100644 assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-6.vox create mode 100644 assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-7.vox create mode 100644 assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-8.vox create mode 100644 assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-9.vox delete mode 100644 assets/voxygen/voxel/npc/rat/male/feet_b.vox delete mode 100644 assets/voxygen/voxel/npc/rat/male/feet_f.vox delete mode 100644 assets/voxygen/voxel/npc/rat/male/feet_r.vox create mode 100644 assets/voxygen/voxel/npc/rat/male/foot_bl.vox create mode 100644 assets/voxygen/voxel/npc/rat/male/foot_br.vox create mode 100644 assets/voxygen/voxel/npc/rat/male/foot_fl.vox create mode 100644 assets/voxygen/voxel/npc/rat/male/foot_fr.vox delete mode 100644 assets/voxygen/voxel/npc/squirrel/male/feet_b.vox delete mode 100644 assets/voxygen/voxel/npc/squirrel/male/feet_f.vox create mode 100644 assets/voxygen/voxel/npc/squirrel/male/foot_bl.vox create mode 100644 assets/voxygen/voxel/npc/squirrel/male/foot_br.vox create mode 100644 assets/voxygen/voxel/npc/squirrel/male/foot_fl.vox create mode 100644 assets/voxygen/voxel/npc/squirrel/male/foot_fr.vox create mode 100644 assets/voxygen/voxel/npc/turtle/male/foot_bl.vox create mode 100644 assets/voxygen/voxel/npc/turtle/male/foot_br.vox create mode 100644 assets/voxygen/voxel/npc/turtle/male/foot_fl.vox create mode 100644 assets/voxygen/voxel/npc/turtle/male/foot_fr.vox create mode 100644 assets/voxygen/voxel/theropod_central_manifest.ron create mode 100644 assets/voxygen/voxel/theropod_lateral_manifest.ron delete mode 100644 voxygen/src/anim/src/critter/idle.rs delete mode 100644 voxygen/src/anim/src/critter/jump.rs delete mode 100644 voxygen/src/anim/src/critter/mod.rs delete mode 100644 voxygen/src/anim/src/critter/run.rs create mode 100644 voxygen/src/anim/src/theropod/idle.rs create mode 100644 voxygen/src/anim/src/theropod/jump.rs create mode 100644 voxygen/src/anim/src/theropod/mod.rs create mode 100644 voxygen/src/anim/src/theropod/run.rs diff --git a/assets/common/npc_names.json b/assets/common/npc_names.json index d24db1222a..d8d7b341f8 100644 --- a/assets/common/npc_names.json +++ b/assets/common/npc_names.json @@ -461,6 +461,30 @@ "frog": { "keyword": "frog", "generic": "Frog" + }, + "rat": { + "keyword": "rat", + "generic": "Rat" + }, + "axolotl": { + "keyword": "axolotl", + "generic": "Axolotl" + }, + "gecko": { + "keyword": "gecko", + "generic": "Gecko" + }, + "turtle": { + "keyword": "turtle", + "generic": "Turtle" + }, + "squirrel": { + "keyword": "squirrel", + "generic": "Squirrel" + }, + "fungome": { + "keyword": "fungome", + "generic": "Fungome" } } }, @@ -550,37 +574,21 @@ } } }, - "critter": { + "theropod": { "body": { - "keyword": "critter", + "keyword": "theropod", "names": [ "Remy" ] }, "species": { - "rat": { - "keyword": "rat", - "generic": "Rat" + "archaeos": { + "keyword": "archaeos", + "generic": "Archaeos" }, - "axolotl": { - "keyword": "axolotl", - "generic": "Axolotl" - }, - "gecko": { - "keyword": "gecko", - "generic": "Gecko" - }, - "turtle": { - "keyword": "turtle", - "generic": "Turtle" - }, - "squirrel": { - "keyword": "squirrel", - "generic": "Squirrel" - }, - "fungome": { - "keyword": "fungome", - "generic": "Fungome" + "odontotyrannos": { + "keyword": "odontotyrannos", + "generic": "Odontotyrannos" } } }, diff --git a/assets/voxygen/voxel/critter_center_manifest.ron b/assets/voxygen/voxel/critter_center_manifest.ron deleted file mode 100644 index 038fcfc611..0000000000 --- a/assets/voxygen/voxel/critter_center_manifest.ron +++ /dev/null @@ -1,266 +0,0 @@ -({ - (Rat, Male): ( - head: ( - offset: (-4.5, -4.0, -4.0), - center: ("npc.rat.male.head"), - ), - chest: ( - offset: (-4.5, -6.0, -4.0), - center: ("npc.rat.male.chest"), - ), - feet_f: ( - offset: (-4.0, -1.5, -1.0), - center: ("npc.rat.male.feet_f"), - ), - feet_b: ( - offset: (-4.0, -1.5, -1.0), - center: ("npc.rat.male.feet_b"), - ), - tail: ( - offset: (-0.5, -4.0, -1.5), - center: ("npc.rat.male.tail"), - ), - ), - (Rat, Female): ( - head: ( - offset: (-4.5, -4.0, -4.0), - center: ("npc.rat.male.head"), - ), - chest: ( - offset: (-4.5, -6.0, -4.0), - center: ("npc.rat.male.chest"), - ), - feet_f: ( - offset: (-4.0, -1.5, -1.0), - center: ("npc.rat.male.feet_f"), - ), - feet_b: ( - offset: (-4.0, -1.5, -1.0), - center: ("npc.rat.male.feet_b"), - ), - tail: ( - offset: (-0.5, -4.0, -1.5), - center: ("npc.rat.male.tail"), - ), - ), - (Axolotl, Male): ( - head: ( - offset: (-3.5, -4.0, -2.0), - center: ("npc.axolotl.male.head"), - ), - chest: ( - offset: (-2.5, -4.0, -1.5), - center: ("npc.axolotl.male.chest"), - ), - feet_f: ( - offset: (-3.0, -0.5, -1.0), - center: ("npc.axolotl.male.feet_f"), - ), - feet_b: ( - offset: (-3.0, -0.5, -1.0), - center: ("npc.axolotl.male.feet_b"), - ), - tail: ( - offset: (-1.5, -2.5, -1.5), - center: ("npc.axolotl.male.tail"), - ), - ), - (Axolotl, Female): ( - head: ( - offset: (-3.5, -4.0, -2.0), - center: ("npc.axolotl.male.head"), - ), - chest: ( - offset: (-2.5, -4.0, -1.5), - center: ("npc.axolotl.male.chest"), - ), - feet_f: ( - offset: (-3.0, -0.5, -1.0), - center: ("npc.axolotl.male.feet_f"), - ), - feet_b: ( - offset: (-3.0, -0.5, -1.0), - center: ("npc.axolotl.male.feet_b"), - ), - tail: ( - offset: (-1.5, -2.5, -1.5), - center: ("npc.axolotl.male.tail"), - ), - ), - (Gecko, Male): ( - head: ( - offset: (-2.5, -3.0, -2.0), - center: ("npc.gecko.male.head"), - ), - chest: ( - offset: (-1.5, -4.0, -2.0), - center: ("npc.gecko.male.chest"), - ), - feet_f: ( - offset: (-2.0, -0.5, -1.0), - center: ("npc.gecko.male.feet_f"), - ), - feet_b: ( - offset: (-2.0, -0.5, -1.0), - center: ("npc.gecko.male.feet_b"), - ), - tail: ( - offset: (-0.5, -2.5, -1.0), - center: ("npc.gecko.male.tail"), - ), - ), - (Gecko, Female): ( - head: ( - offset: (-2.5, -3.0, -2.0), - center: ("npc.gecko.male.head"), - ), - chest: ( - offset: (-1.5, -4.0, -1.5), - center: ("npc.gecko.male.chest"), - ), - feet_f: ( - offset: (-2.0, -0.5, -1.0), - center: ("npc.gecko.male.feet_f"), - ), - feet_b: ( - offset: (-2.0, -0.5, -1.0), - center: ("npc.gecko.male.feet_b"), - ), - tail: ( - offset: (-0.5, -2.5, -1.0), - center: ("npc.gecko.male.tail"), - ), - ), - (Turtle, Male): ( - head: ( - offset: (-2.5, -2.5, -2.5), - center: ("npc.turtle.male.head"), - ), - chest: ( - offset: (-6.0, -6.0, -4.0), - center: ("npc.turtle.male.chest"), - ), - feet_f: ( - offset: (-5.0, -0.5, -1.0), - center: ("npc.turtle.male.feet_f"), - ), - feet_b: ( - offset: (-5.0, -0.5, -1.0), - center: ("npc.turtle.male.feet_b"), - ), - tail: ( - offset: (-0.5, -2.0, -1.0), - center: ("npc.turtle.male.tail"), - ), - ), - (Turtle, Female): ( - head: ( - offset: (-2.5, -2.5, -2.5), - center: ("npc.turtle.male.head"), - ), - chest: ( - offset: (-6.0, -6.0, -4.0), - center: ("npc.turtle.male.chest"), - ), - feet_f: ( - offset: (-5.0, -0.5, -1.0), - center: ("npc.turtle.male.feet_f"), - ), - feet_b: ( - offset: (-5.0, -0.5, -1.0), - center: ("npc.turtle.male.feet_b"), - ), - tail: ( - offset: (-0.5, -2.0, -1.0), - center: ("npc.turtle.male.tail"), - ), - ), - (Squirrel, Male): ( - head: ( - offset: (-1.5, -2.0, -2.0), - center: ("npc.squirrel.male.head"), - ), - chest: ( - offset: (-1.5, -3.0, -1.5), - center: ("npc.squirrel.male.chest"), - ), - feet_f: ( - offset: (-2.0, -0.5, -1.0), - center: ("npc.squirrel.male.feet_f"), - ), - feet_b: ( - offset: (-2.0, -0.5, -1.0), - center: ("npc.squirrel.male.feet_b"), - ), - tail: ( - offset: (-1.5, -1.5, -3.0), - center: ("npc.squirrel.male.tail"), - ), - ), - (Squirrel, Female): ( - head: ( - offset: (-1.5, -2.0, -2.0), - center: ("npc.squirrel.male.head"), - ), - chest: ( - offset: (-1.5, -3.0, -1.5), - center: ("npc.squirrel.male.chest"), - ), - feet_f: ( - offset: (-2.0, -0.5, -1.0), - center: ("npc.squirrel.male.feet_f"), - ), - feet_b: ( - offset: (-2.0, -0.5, -1.0), - center: ("npc.squirrel.male.feet_b"), - ), - tail: ( - offset: (-1.5, -1.5, -3.0), - center: ("npc.squirrel.male.tail"), - ), - ), - (Fungome, Male): ( - head: ( - offset: (-2.5, -1.5, -2.0), - center: ("npc.fungome.male.head"), - ), - chest: ( - offset: (-6.0, -6.0, -4.0), - center: ("npc.fungome.male.chest"), - ), - feet_f: ( - offset: (-3.0, -0.5, -1.0), - center: ("npc.fungome.male.feet_f"), - ), - feet_b: ( - offset: (-3.0, -0.5, -1.0), - center: ("npc.fungome.male.feet_b"), - ), - tail: ( - offset: (-1.0, -0.5, -1.0), - center: ("npc.fungome.male.tail"), - ), - ), - (Fungome, Female): ( - head: ( - offset: (-2.5, -1.5, -2.0), - center: ("npc.fungome.male.head"), - ), - chest: ( - offset: (-6.0, -6.0, -4.0), - center: ("npc.fungome.male.chest"), - ), - feet_f: ( - offset: (-3.0, -0.5, -1.0), - center: ("npc.fungome.male.feet_f"), - ), - feet_b: ( - offset: (-3.0, -0.5, -1.0), - center: ("npc.fungome.male.feet_b"), - ), - tail: ( - offset: (-1.0, -0.5, -1.0), - center: ("npc.fungome.male.tail"), - ), - ), -}) diff --git a/assets/voxygen/voxel/npc/archaeos/male/chest_back.vox b/assets/voxygen/voxel/npc/archaeos/male/chest_back.vox new file mode 100644 index 0000000000000000000000000000000000000000..e11d51a00e89d7010135fcdd06f0425b4fdf78d5 GIT binary patch literal 3580 zcmXX|3yhV;6`na~UUwHNTWA^!F%@-L5!PmTb_Ib21mq>+@>X8DR32OJE6cqXQmKN7 zmPaIr+7usEfoc@HD6p*-BqdU9)ikw@qSZF3rY+T`jjft~{r+ulGMV{j&YW}RobP<+ zE||OM>-&r`vnS1%!^wQu*O>V;mQ3xFeejq2|M(K;MT?irIF@bjw?T~2Xsb?b%~?}b z$5~B9J@=fgs_;8WO*mXIHT9+zl2p7mRWG(0d|k9v>(Zh2NQO zQxVELp&rUkR#JZ*a^1V>wrYx?JXU|gh}JoWP} zo@c?+KJ`ZLIbu0@#)y6-`W&d=`&0}*6{1h{kM}veuj5&cBT&C`NFjO8Z@$Sho`F6E z#w##xoPCJ-5MnWgSV|#q&*x)sr4Xc;0(}Xg5Ci=Rj4#(dP=CnrocRl$=Q+yr&B5h; zV9bN$Q?D-OjQ2zEj1Ob4z8DkZ5>qLrSPU`ceeXJzl{gD2?uMEVh_JB3n+Im!|%i9SX8mU4x_;bV?>nU@$!iRUo|-VG%mX*Ur=*@*N% z3TNhxx;^#!#CRm;Bzn$)cnu{R>Z?hKL1NE@KGo!C*Ki2!N+?RGuS8{xh*OF6teadp zSzk(;;U*Q5W&T(LLHRyqj5U@m^(ggv^<{~5H3@Y!uOaVPi!Q6J-a3nU8~fDM+KRJ` z53%kYF__sW-n~oZ;P^JjxDZp(1!5+YOz2znE=Rm&`>Z)->{wG0`cwk#1)&{dYo2VBn_>KvaWsslVO*8* zRjI35#@jOPA~|wfC^{GNlHFx)Oy;}PRcw|s=1!!(W|&K5PL;V;=2)3)WzHS(~hV~BN2pM==A^wF{wg!+WFVOb->S`pTaBmddN z8e%O8Ys#{=EZ3H`W?6GCFy5>`7i>XTi!MmXv0hzp{Lc1s#0=xinpM`WvW8t?9zxC-jeH;obT9cl(sGVfTMrTGnVWNmieoy6Kzq%opW_{Y==`Ec=^KM))>i-&4+( zzBxx5e6thco4wJomXv+cvR^ur`Nmmd$+0IpOF7n`lN{xlWAngmmyu2s!)%m4IjCev?)dz5`t}tNt%MUjlpp! zhuEfIZKF>*Bp4auI4g%3X%cIPh}cF^+a!*|+a{Z&QGy*}BhQmIUO%mEl5zk04+s9< zIna&w*WHW77dPWyFTaL=Jb4^9j~<7A?mLX5GnV4R>TbNgq!Vw?-hltS_db45t>X25 zvv6QkEADIvUrcPnkFILPTc>-ld-_Ba zCy&LMt6S0DHX3gjgHQI}fumDK;`sK>_+-->Y@gMNyZQ(08W8ZEFMDjAJ{phRG!3ub z(2BzJ7JRzwO01pOga@x1iPNhl-kHb8Hx0sHH(rag8|UN4 z%f?{Agl7C*;|6|7u27BlAz#nM&Hm_6^CxO>k!?Cze4Jx||; zqh}w+&1)B-_UHs`JK2G27mr8Vis6{oISG5Z@5Al8HeukFt8wE~TQGXTI1JuA4+npH z9Bc0=VEBfaxaP)Lxb(hGYzj9(V*>&ioo9o;Zd+)7#K@!Ak0U5+l}> zaM}FDxM=%9ELdN}!c9A{=(%@r#qu&*cfEk-Wt}jq?!@Nf?_%D;b7(&F9_st`#|4*7 zM7nS|%(7=tKe7|G-EX3^{6jQeGz|?cTQO(u{kZs|cHFb&W!!f2gLr87DePGHBG%6O zK6Z5-#r*M0@!YOoV*iHc(AD-mjJt9Yt{r?MI$Abi@vznS_J}Q5IBOxgxAb7b6{E3m z=mgv}{yG#^cVgA$H(*2aQk-nriGwq$SkOEMzaO^)E5=-nFFyM_tMqgH^k*mV;>jNT z{1w{YRKhK5Zo&M;^D%esbX-4qJjRS0i`JG#oIiga=gyr&PfrgHA3luj+qa{us|)Sz T?U*uU3I-1zjE05=WDM|MHC2)p literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/archaeos/male/chest_front.vox b/assets/voxygen/voxel/npc/archaeos/male/chest_front.vox new file mode 100644 index 0000000000000000000000000000000000000000..233c141e2ef98b36db88abd8d15dc19119b55fbc GIT binary patch literal 5608 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 pw=py{gu%f8Jnz literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/archaeos/male/foot_r.vox b/assets/voxygen/voxel/npc/archaeos/male/foot_r.vox new file mode 100644 index 0000000000000000000000000000000000000000..ced71ccc7cd63e5c8bf56cb5d5d0599e57c4b56a GIT binary patch literal 2204 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 VRA4k3iHL~6)zuZ9PRI0L_dmxjbDaPH literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/archaeos/male/hand_r.vox b/assets/voxygen/voxel/npc/archaeos/male/hand_r.vox new file mode 100644 index 0000000000000000000000000000000000000000..f453374faff9b48e46cf45a8c1ec6d8d3c8d48c4 GIT binary patch literal 1316 zcmW-h2~5;S6vqF@F5nf}LQ^cnRMZs_)`q()2&_;*E)kboxfCkL*4<^ZfRL6dh-f(? zLDZ&rR0XP0ET}-M1xbliTQyB>qju#v2`i zAS6b{B`G90s|6u7E-QNW^g=O}0tW>%6=Y;)#obeQ+JdJCNvsl8LbWJ6y2&b`N|0om zAW1e+Et(~@R3WQHt0c)4vgl|Pr5SFbJi|?po!n%>!6vGl+$7P#B1w*BNm5wxNh;Ya zsU&5tHcO()CQ2%W)fJMYQsUGWNmlmdX`iE678MOyw#bT4Ry1TuWs^me6Vz5=x)-G`hRBzP zSB{Bdx4ZheU%H#j1v>t@bd|r353(^Rl)pQA8Hmf~VRb9lvP|4cEa$(w_xZTGnrqGp zbOq|!uJK{2r-zHhMKr{O)7P;FSC_eXyzYvJ`)hn1Vc^phdTx#l(;6FrbyW!CEAW;p*-&}VTlW&-<-~^W;2gBc<_7WY9=aE`79@xv~V3iwV7zi3gvN60|$%a z8QHAl?JJ_ax|}10LHyF5M{TMPw9A`EN8X{YGK!8u z9TU|)tO{`FxARR@8kcd}9z=&FjtA{47=PcF1Ez(TjLZ48-^|UyWVm)lQ&jy^k51XM#B|-UtC;gvaQLNzWyrm^FxSF@+P}LM`Frb>})HgwLhM=lUo>= zILOA547MH)r(vXs)tO-!@_b1#Mbg&4hxc1*aIag*`V(~orG?^In?m;wgOqHu;9DNg z+v^ipw8uolvAqa8%b1ZL%e;t5RWpk$G8#>F+U^je7=<-Nbd#kpmj#jT9nOZZHCPHw6f9jwxh|U#zh=7Qs!7uYb1$@syx^6*c=o6A zN}uz^mqT0_8Ro0YO8uG&HWhCoH8Yju~=dwqmihnC_Ftq(P%VGe{=r>ESYn( literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/archaeos/male/head.vox b/assets/voxygen/voxel/npc/archaeos/male/head.vox new file mode 100644 index 0000000000000000000000000000000000000000..94ce3f4386302afa2bca080908d4a29f698217cc GIT binary patch literal 2884 zcmXAq4Q!R=6~~|N=Y4N6(801f2$=|_0xhOM%Sua2DWm1P))q?n2Fon8dg;As@4b-O z@l~p$C6J1^43vSuBmyf6bc2CpM5ddXWp0t`a7(7y#&p@@24?^LUw4~d&bjA#-gEx% z^PF>Azj)a<`-Bh+XH_qv5f5hxQCq!y&XDK}KOu?y7+Kb^yjplV{9KVjNbi%%`J{A? z)+LQ|acNybSr<37($F_9sfnSlHRGClm212>h+}RQ+N2I` z+|a7PCUjtvCa`VN+l2BquDxyZtnH%u-cpNAc-D5*pd8noO?uXL)L4_#6-SiT(Xv6Owi9VNf$HJVVZqt;x42gnuHG+4@}$==Na=R?zK-l zXA&~XZ%x8l#*BHw5o=6RYM*kN&uEiS+~XB<5KDqska3c0(j=TcOzSz zlP%s$o)v8%6F#ILqaTyh&wN=j;j*IjD2HMW#WSTZ6?3qzRP04+P|CXq&oxa;Y~&mI zgo`|H`ovp4>$pZVwJ7RT)M=vq)G4V`QKzI%Nu7#1C3PBV)I?FI zp+-#c>gpx75O2-3!IKYK;7XH*cRjMWLvK2q!_;knNK(nJv%S@xb}51N4c*pG@x_NQU5 zYWAv%Ea%F^_#FFK5y`$bS^Ul(SHuVt*X(=6{x_Tj%~?>iGOEWJ(L@nROq5GA_T?;@ zxQh00#xzl!H%SaQc@&ZcsF7tc87mA65?e1lR+tH5VMc^uItasz55trX!nBCuoH0)Vo}K4;IucN$C(d)`T(ssh zKJbk5cfx5X_ep6}QrV2qHYE&UKH+RyDwk5M zC0R?buC|VAE~TkQ5KduAQlp|~X?#jq&wQSHd|EsDd^bU>`Ociyv>=k_AOfG_Fz0eu za=j#0=Wvj6I7s6;NI6pJTuEOVVu>{4r6$hgJTkXpmN5VSUkH9~9qz~NP0yg=fqeY? z^|$cPmo8#MVF~`#cM9jL8}V_v7jG|b#rq3e@ZS$_=q-X699ho==|NA@J#Ie8LS zHa20`+%lZ)+m8{$hho$>Mqt#)ui=;F75MRtV!U^K0KHY^Xq!D9H)a;2uA&g{2!YQI zY{&V^skqp+4WDh@h^__2*gf2#XN1Fdzhbeost`w4&BdFK7Gq0Q0X|bnG?%!ru%W+{p}v$dVs$VjK$5JA;wn5cyA(ww(@|WIgFAQbU~q5{0|Ns% fb?Owly1LNb-j2GuI#gCxV$7H^$j;72^b7DmCFm&l literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/archaeos/male/jaw.vox b/assets/voxygen/voxel/npc/archaeos/male/jaw.vox new file mode 100644 index 0000000000000000000000000000000000000000..47461bde48c994cc40d45a993ae5e077b6df9573 GIT binary patch literal 2300 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 literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/archaeos/male/leg_r.vox b/assets/voxygen/voxel/npc/archaeos/male/leg_r.vox new file mode 100644 index 0000000000000000000000000000000000000000..702d3e818ff50688ca41de5db7d59a1eb844e1c8 GIT binary patch literal 2540 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 X7oDA*m@#7pMvWSU+S*!Fe*yjvE_pL9 literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/archaeos/male/tail_back.vox b/assets/voxygen/voxel/npc/archaeos/male/tail_back.vox new file mode 100644 index 0000000000000000000000000000000000000000..cfc6561f4073e56fc98ed6ddf5a0d4e9b70d5a2c GIT binary patch literal 2624 zcmX9<3vd=cxOKxG6P6iAB&nKDvs)#=oBBwB1|s?(NgryW~h`t_{6GiT1(|3Bw^-~XR; z{@Xfl(bszo!W3_}W*mI=d? zVbhb5kSCKNS2|`|O3Rm=xiTI~YbkP4S!rAIyeu)(w&Fz@4Y{`DS=(Vb+h#>oVr6BF zVpE2z1utk$K1n0Z6)!L?Jf?)p9iEfgN^^%5Wg_HqiepmvvXtk!Ql3m39#`7sVcIVx zKIxDrY@Xwq7ldPF1>p-Vioy|DZi^fze62-Z+E!YoLava~wJBaxE=~JNN?(@nyeeTi z5r|fvP|8;nucRnyisz1UwL@!?{JzR9UFAq$k*^ATmB{LVcZ$v!vkEe17FEK^$pq<` zSrD`)QlYFYC4Mn8FC#23qE^;X($^`oC{tEe)4rxNXu1m-V+ECGXYzZVhbh}lEsNmP&{*w++Cc@)J<@)LrUNsDqSijRlNMIuxtQbtCljdGDT z%2d)Q6A{W44P`_$RIbPtNh2fTXEMr$dfTqQyo6$@n^o8CCtVE_Lg0R3(q>BH@f z&tmaImH79Y@8F*=U&6ZTTKuc`G%hqP#iw2m-d)m;59e&ge?PvBA9^0%jn2lAaW&Wx z8-+WkPT`I9ZP+!v9_M-wAeo3@@Yj+UJm>-ZvY`<_o>+qquJ@y7Mg#IwCg8@T8niT4 z<2}Q`7YDcF!ql<2)U^#?Y+aA8*)`am5ZIR#_->qI=ZtC`TQMDPKVE~}j4FJ&Y&14B zl;iOHvADiw3SM1Vi+jE8$TdwsUv?or+?&PcD+c3lTV~?smS+59*?6?pSK^QR+p%v+ zEj~ZB3rE+_!qq1!?)f$x^fu$z+G_my;3{lu9)%k_=i|`I5x9NA#m=QwxPN30aCrwl zdu9YaJN7M{+cFisYb$Zn8-*!j2jQ<5yRoHZB+hnJqc_)tPYzDRji)Q{Li@vLZyAlh z^kwnErM>uGTMb^@+k&4S>A>!`F}T{D0nQD=dxtU@I9`Fb4voQo-k6447hPQ5UxiO! zn~pE9HKM%g5p3E}gR>_W;cWMlxcl2Zz;%Vc_YcF(Gb=If;S!7+J{Z#~W2h^OVO)6% zFFiXRn^q0Ot}WxfszodkMl2e|y-yb4_wV%J%!`c}cz+^}A6B^LPzgm zv_1bKI&b_2V@_N|ct#^iT31ufmoa920mGXYV@TIYv~J2{;nr>}I)4izR~AvT?{!oz zYlpFB2ew`M2n$XQpz_qmaH0uBhBrVxSOH_%t8m7)!|!OOO1MKU#fabcTIKS^#IJEgZIvT%^+R>9SbLeukRc*!M zQETz-F`ZaAdm;Kd`%yo#8Vg6%V@2J3k# z67Jvq2Tkcc{OsqKaph`1e(@IJZ!O@7^-rLAaWm%4n}Nrs)M0$>1k_YzaOch)3=9mQ jzrP=+PoG9tR~I@uI?&S6f~ixdV(8GJh{a+EUV#4r@#7vc literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/archaeos/male/tail_front.vox b/assets/voxygen/voxel/npc/archaeos/male/tail_front.vox new file mode 100644 index 0000000000000000000000000000000000000000..086929c60133de9e740e1daa5abc6f7f1aa44ffe GIT binary patch literal 1960 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 diff --git a/assets/voxygen/voxel/npc/axolotl/male/feet_b.vox b/assets/voxygen/voxel/npc/axolotl/male/feet_b.vox deleted file mode 100644 index c84f6a90749dc3e4b7aad4c04ab9882ecf5b192a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1128 zcmW;K-Hp>g6b8_{XczIYFX;e9bZ{#G1)+TaBp_&^fZIY^NCil@g|v_sriHYS7R;Hk z^Evhx|D4SD_xIQL|03e+$Cq!u;@4xu&zHZSpXY()tvtvZdHwVE<%93JypyMRcz%=z zan`)Ve(2))Nq&6!^f4UFWn0UzZ7E4n&uZ8V{m>8n(9hFa-*#Hx`qs}&OJDkOQ2Nr( z+oeABsZT}feYVhtKJ=l-(a2m|N>cQG7&e1v@C=^8vv@p%XYdT3!L!IbgJbW$pk$4B%$$&)vp+Zw)6SCold9icsy>0!(rR+ L_uFo_b8f_c3kPOa diff --git a/assets/voxygen/voxel/npc/axolotl/male/feet_f.vox b/assets/voxygen/voxel/npc/axolotl/male/feet_f.vox deleted file mode 100644 index c84f6a90749dc3e4b7aad4c04ab9882ecf5b192a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1128 zcmW;K-Hp>g6b8_{XczIYFX;e9bZ{#G1)+TaBp_&^fZIY^NCil@g|v_sriHYS7R;Hk z^Evhx|D4SD_xIQL|03e+$Cq!u;@4xu&zHZSpXY()tvtvZdHwVE<%93JypyMRcz%=z zan`)Ve(2))Nq&6!^f4UFWn0UzZ7E4n&uZ8V{m>8n(9hFa-*#Hx`qs}&OJDkOQ2Nr( z+oeABsZT}feYVhtKJ=l-(a2m|N>cQG7&e1v@C=^8vv@p%XYdT3!L!IbgJbW$pk$4B%$$&)vp+Zw)6SCold9icsy>0!(rR+ L_uFo_b8f_c3kPOa diff --git a/assets/voxygen/voxel/npc/turtle/male/feet_b.vox b/assets/voxygen/voxel/npc/axolotl/male/foot_bl.vox similarity index 100% rename from assets/voxygen/voxel/npc/turtle/male/feet_b.vox rename to assets/voxygen/voxel/npc/axolotl/male/foot_bl.vox diff --git a/assets/voxygen/voxel/npc/turtle/male/feet_f.vox b/assets/voxygen/voxel/npc/axolotl/male/foot_br.vox similarity index 100% rename from assets/voxygen/voxel/npc/turtle/male/feet_f.vox rename to assets/voxygen/voxel/npc/axolotl/male/foot_br.vox diff --git a/assets/voxygen/voxel/npc/axolotl/male/foot_fl.vox b/assets/voxygen/voxel/npc/axolotl/male/foot_fl.vox new file mode 100644 index 0000000000000000000000000000000000000000..87a904a820c1c522fe40bcafb9595e812788bb56 GIT binary patch literal 1128 zcmW;K!L8Fk6a~=t5eqeH9h zr+yAM^g}=NLoxJTTj)a{`q1NOWbP#?L-c-VhvsRX=4qbA<7uAeX`bd;WS-_}p5|$u z^*4B$r+J#EdFEehp5|$u=4l?fB`L?^DW2k4Q@~RIv1vIaN%&$Pz)X~(en(R!83T&GM|{aN^@qW#?BKw!4o{e z6Fe>#Jx}liPw*I0^gO{6Ji+5OqUQ;o;0YMF7QF$(#o@$<@+Mcg$XQNul!NSLC-IP* zT;(EXImuBDvX`C2LvC`Fi=5>oM>)t|cH86e*lxGmcD-J=%jL42&*$xQI&H_}aXTCi O+kU^_cDtQ(BmM)LJ8en; literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/axolotl/male/foot_fr.vox b/assets/voxygen/voxel/npc/axolotl/male/foot_fr.vox new file mode 100644 index 0000000000000000000000000000000000000000..87a904a820c1c522fe40bcafb9595e812788bb56 GIT binary patch literal 1128 zcmW;K!L8Fk6a~=t5eqeH9h zr+yAM^g}=NLoxJTTj)a{`q1NOWbP#?L-c-VhvsRX=4qbA<7uAeX`bd;WS-_}p5|$u z^*4B$r+J#EdFEehp5|$u=4l?fB`L?^DW2k4Q@~RIv1vIaN%&$Pz)X~(en(R!83T&GM|{aN^@qW#?BKw!4o{e z6Fe>#Jx}liPw*I0^gO{6Ji+5OqUQ;o;0YMF7QF$(#o@$<@+Mcg$XQNul!NSLC-IP* zT;(EXImuBDvX`C2LvC`Fi=5>oM>)t|cH86e*lxGmcD-J=%jL42&*$xQI&H_}aXTCi O+kU^_cDtQ(BmM)LJ8en; literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/axolotl/male/head.vox b/assets/voxygen/voxel/npc/axolotl/male/head.vox index 1ea36d69364aa49607351fd0d098bfd8ab846b41..2b9a82f3e820cb9c1f41166de6dd63cbf165ca75 100644 GIT binary patch delta 352 zcmX|+F-}845JPRx(m;+t!Br?g`Vx==DGIqvH~=*l;X;(Vr+_yp@+He2Ydqfnb@zLF zKJ1SV-;!P*w>L;HH`4oddfN5C$9To@^w2b1sx?wJT=I&{o)^vx zFsPv8^E6^$j1Ibk;ZCMtDyHzoF1mu~#*XrPd+Gbf z%jy2x%$^>$XT-kB>}@+gjv zWn_*1>p?r=WjJ^b@D)PUj39%c#G`2LXb^0s*?bYRh21sTY;x+LUTE?+)9@G`!((_1 TkKr*qeBG>)JKy9#?>yiimkSdv diff --git a/assets/voxygen/voxel/npc/axolotl/male/tail.vox b/assets/voxygen/voxel/npc/axolotl/male/tail.vox index c5905e954a3a178af37ef3d2b7f0a3a1d0cfe058..593e3d138e499e7afd32e9391c7df9a4876e375d 100644 GIT binary patch delta 89 zcmbQhd50q)%s)b58Uq7^ucN0QkYey)VPFXMjB@1xae#mkh?#+y35X*iqdX;mGzhRl Xs22=Oj6lrr0;mv(8DDH{;b8#)S=kMR delta 142 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 diff --git a/assets/voxygen/voxel/npc/fungome/male/feet_b.vox b/assets/voxygen/voxel/npc/fungome/male/feet_b.vox deleted file mode 100644 index 5ce88d2a1330afad11589a81d3b34c5fb0e91945..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1128 zcmXBTF^?tTkH3t)Uq0Nu_#P4OZf@V(#pmmYPq+7Po{a;`6S$|?|yMCNj`tqUlr7!)s zH1(-Z2dPi}7_RA?zUiBy>HV#t4}IuEkE4;XmZUV%`=Z-)p3c*GI?v?sbe_)Bzv+1< znWyt~p3c*G=Fi~iJe{ZWbe{3kI#1{6Je{ZW&`n9%7EkdM&zu6D0w^~t1D8P_9)6k{ zJx}qJ`6-?`RXoL0JjGKybNYCSr+A8|c*c|#Pw^B_@f6RT<~cJ%Gu9@0^OHQulRU|j zJo9nzBu_%58>YeMBXUtXAsr-7^32D^lRU|jJjpX2W%49X@+434%*Q*Q(wLc{8LOVB z@id;s(|8)sd<}RSPvdDkjc2|ZJdLOEG?3<|^K~&;b76B*Q#2lbqUUKmji>RbWxO%t zDUF#K8Y@rm1W)h;Pw=>0^gO{6Ji%i~(engP@C47_Kfl)g`-j(6&l5ZWlA|1CAM2|n*5^B)x3ZDA$XQNul!NSLk)3R1vtBNj l^?W|Br_*UY9*^tca9H>I{kkm6y4&s6?RL9vHXG+g`~x_~YGwcc diff --git a/assets/voxygen/voxel/npc/fungome/male/feet_f.vox b/assets/voxygen/voxel/npc/fungome/male/feet_f.vox deleted file mode 100644 index 5ce88d2a1330afad11589a81d3b34c5fb0e91945..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1128 zcmXBTF^?tTkH3t)Uq0Nu_#P4OZf@V(#pmmYPq+7Po{a;`6S$|?|yMCNj`tqUlr7!)s zH1(-Z2dPi}7_RA?zUiBy>HV#t4}IuEkE4;XmZUV%`=Z-)p3c*GI?v?sbe_)Bzv+1< znWyt~p3c*G=Fi~iJe{ZWbe{3kI#1{6Je{ZW&`n9%7EkdM&zu6D0w^~t1D8P_9)6k{ zJx}qJ`6-?`RXoL0JjGKybNYCSr+A8|c*c|#Pw^B_@f6RT<~cJ%Gu9@0^OHQulRU|j zJo9nzBu_%58>YeMBXUtXAsr-7^32D^lRU|jJjpX2W%49X@+434%*Q*Q(wLc{8LOVB z@id;s(|8)sd<}RSPvdDkjc2|ZJdLOEG?3<|^K~&;b76B*Q#2lbqUUKmji>RbWxO%t zDUF#K8Y@rm1W)h;Pw=>0^gO{6Ji%i~(engP@C47_Kfl)g`-j(6&l5ZWlA|1CAM2|n*5^B)x3ZDA$XQNul!NSLk)3R1vtBNj l^?W|Br_*UY9*^tca9H>I{kkm6y4&s6?RL9vHXG+g`~x_~YGwcc diff --git a/assets/voxygen/voxel/npc/fungome/male/foot_bl.vox b/assets/voxygen/voxel/npc/fungome/male/foot_bl.vox new file mode 100644 index 0000000000000000000000000000000000000000..87a904a820c1c522fe40bcafb9595e812788bb56 GIT binary patch literal 1128 zcmW;K!L8Fk6a~=t5eqeH9h zr+yAM^g}=NLoxJTTj)a{`q1NOWbP#?L-c-VhvsRX=4qbA<7uAeX`bd;WS-_}p5|$u z^*4B$r+J#EdFEehp5|$u=4l?fB`L?^DW2k4Q@~RIv1vIaN%&$Pz)X~(en(R!83T&GM|{aN^@qW#?BKw!4o{e z6Fe>#Jx}liPw*I0^gO{6Ji+5OqUQ;o;0YMF7QF$(#o@$<@+Mcg$XQNul!NSLC-IP* zT;(EXImuBDvX`C2LvC`Fi=5>oM>)t|cH86e*lxGmcD-J=%jL42&*$xQI&H_}aXTCi O+kU^_cDtQ(BmM)LJ8en; literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/fungome/male/foot_br.vox b/assets/voxygen/voxel/npc/fungome/male/foot_br.vox new file mode 100644 index 0000000000000000000000000000000000000000..87a904a820c1c522fe40bcafb9595e812788bb56 GIT binary patch literal 1128 zcmW;K!L8Fk6a~=t5eqeH9h zr+yAM^g}=NLoxJTTj)a{`q1NOWbP#?L-c-VhvsRX=4qbA<7uAeX`bd;WS-_}p5|$u z^*4B$r+J#EdFEehp5|$u=4l?fB`L?^DW2k4Q@~RIv1vIaN%&$Pz)X~(en(R!83T&GM|{aN^@qW#?BKw!4o{e z6Fe>#Jx}liPw*I0^gO{6Ji+5OqUQ;o;0YMF7QF$(#o@$<@+Mcg$XQNul!NSLC-IP* zT;(EXImuBDvX`C2LvC`Fi=5>oM>)t|cH86e*lxGmcD-J=%jL42&*$xQI&H_}aXTCi O+kU^_cDtQ(BmM)LJ8en; literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/fungome/male/foot_fl.vox b/assets/voxygen/voxel/npc/fungome/male/foot_fl.vox new file mode 100644 index 0000000000000000000000000000000000000000..87a904a820c1c522fe40bcafb9595e812788bb56 GIT binary patch literal 1128 zcmW;K!L8Fk6a~=t5eqeH9h zr+yAM^g}=NLoxJTTj)a{`q1NOWbP#?L-c-VhvsRX=4qbA<7uAeX`bd;WS-_}p5|$u z^*4B$r+J#EdFEehp5|$u=4l?fB`L?^DW2k4Q@~RIv1vIaN%&$Pz)X~(en(R!83T&GM|{aN^@qW#?BKw!4o{e z6Fe>#Jx}liPw*I0^gO{6Ji+5OqUQ;o;0YMF7QF$(#o@$<@+Mcg$XQNul!NSLC-IP* zT;(EXImuBDvX`C2LvC`Fi=5>oM>)t|cH86e*lxGmcD-J=%jL42&*$xQI&H_}aXTCi O+kU^_cDtQ(BmM)LJ8en; literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/fungome/male/foot_fr.vox b/assets/voxygen/voxel/npc/fungome/male/foot_fr.vox new file mode 100644 index 0000000000000000000000000000000000000000..87a904a820c1c522fe40bcafb9595e812788bb56 GIT binary patch literal 1128 zcmW;K!L8Fk6a~=t5eqeH9h zr+yAM^g}=NLoxJTTj)a{`q1NOWbP#?L-c-VhvsRX=4qbA<7uAeX`bd;WS-_}p5|$u z^*4B$r+J#EdFEehp5|$u=4l?fB`L?^DW2k4Q@~RIv1vIaN%&$Pz)X~(en(R!83T&GM|{aN^@qW#?BKw!4o{e z6Fe>#Jx}liPw*I0^gO{6Ji+5OqUQ;o;0YMF7QF$(#o@$<@+Mcg$XQNul!NSLC-IP* zT;(EXImuBDvX`C2LvC`Fi=5>oM>)t|cH86e*lxGmcD-J=%jL42&*$xQI&H_}aXTCi O+kU^_cDtQ(BmM)LJ8en; literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/fungome/male/head.vox b/assets/voxygen/voxel/npc/fungome/male/head.vox index a594f85e5a546aae6e04896e0bf34e0ad2a821f7..2b9a82f3e820cb9c1f41166de6dd63cbf165ca75 100644 GIT binary patch delta 396 zcmWlUK}rK*4255kzbM^Rw=O(`#RGIBl&W1R)s2FPTTfumAR~o2hq&_yy@KFMW=;{m zEIwY6$;hIpP7$OnX5&&ww?9epS?xj=jV(6*n#Gmn(w<+d!Fb_+Uke&8Ro)MU+^n(I~afdX;hyUv*8Rl4O8knD%1&%Tkf0qBA6b zvw&0MGzs9`2^HfXXdJ*99>D1l=;bUB;P!Ght*_)^xt@-11L;Z6PP$3X9f@KzWSS=J jb*IZTwrAgL-rCl_^yufK&E5MUy@u7`B1%3^I(Ym8NUcri diff --git a/assets/voxygen/voxel/npc/fungome/male/tail.vox b/assets/voxygen/voxel/npc/fungome/male/tail.vox index 6941b0f8806fab7f480261a5eb95632afef48902..593e3d138e499e7afd32e9391c7df9a4876e375d 100644 GIT binary patch delta 110 zcmcb@afd@N%s)b58Uq7^ucN0QkYezdC@8GM3}i3?aYSU4rvyk82v{N13kD`eAZB>M zzzD*OFD822Wt=%#jj@h-=FI<_mowgFWM?q`|DVD5%;aw7R91#ihW`wczcR-I0O%we A&Hw-a delta 102 zcmcb^afL%L%s)b58Uq7^ucN0QkYaF{C@8GL1Z044L}Zkw07w)Fm?2as10w?vGlotK txXYM4S&y-fxuId{=Jkws8QCA6+Wh~__C=E?GpDj@g);o-oBWqK9smv*8WjKl diff --git a/assets/voxygen/voxel/npc/gecko/male/chest.vox b/assets/voxygen/voxel/npc/gecko/male/chest.vox index dab811c342a9372fbc44c8b8ed9485d5b799e74d..6782d48f39ae9ffb4c2802a163ef0e30090b970f 100644 GIT binary patch literal 3736 zcmXBW&u#R^83*9`KSQozKpg}+=E@2jC<-)+s_W+KR<@>>$gAt{=@OY*Ks@yzW@7= zZ@eEm0t;OA>1WBjXx@Y$&}N^93niu%Ygd=3hoN+YK5HIq{KoXE}xg-)dra`?Is zbNHM|&L=X1LZ{LQC463p%%q~9%%ISzG(y!+WF}SpWCn#!r4gEbA~UJ!Co?E?Dvi+P zCwBcL=M$Mhp;Kv?^sftX=qEX!$P5adN;{6FUmI~UpCl$SgF>g$h_gNt6PZDwQ)#4& zaq`9bQJi-wjnb_%HpJJ39OCDo(5W<{Jusj9z<4xHr_zWiU1ws7_CvHEqWuu?Q zp;Kvurk}`6YWm3x3Y|(Lbp1qTQrAyrQ0P<|Vdy6^lZJjWgF>g$h?DswF_9S*I+aE& z`8tzkePjlOPNf~kZl4iL(O<4*wD(TFSXT<2N;_U>`-9s0d!zbHXq1qyok}CebR85r zl}55BCNhIUr_zqswO>0i+dm{GGJ`^=(g-D8FGOY%6PZDwQ)z^%pU6yNA~Ps-Dvi+e z6PZa&WCn#!r4hP*A~T7J%%ISzG-9c)Td#5GCoz#36grhgnv9bf6grhgnvIhg6grj0 zoU^&j*K$#((vD-u)-78nM^ehxDO;y(o%GYGG*Yy$NUk-J8OL?$R2s=1oX89cok}Cr zY&~RRCNYs26grhgX!?oFBqlP0LZ{M*T_1^w%%ISzG}16mW>Dx<8fh|4W>Dx<+Hqbz z1LWB_g-)d%$BQF%cwVTnnCBu-dmj{Y-pQ$$Z_go}N;_UR&jl$L^X+{M3Y|(Ld4?x4 z<9MFwR2s2*&PhyU28B+g9mgUkvFRr3b{J+G$_xVz0<5U_sRr6VW9$6Pks_&gjBjx%&kr@;^HCOZL zxiqKqIj{PPJ_dzO_53zcHBPSXN1;<`q-LD#SsxTSl}75u$=x`GPNk8CaWaEKrw-#} zb3e$FaSEMEJC62dBgzupuh@H?>a)BttIz(9tYL`%Ir0b z&cFWgx1apac7EN?uifvBm4$G-9i`o`U42*I)pzxyZByTzZ0ei(rhdG2RbSOtFIM$c z{kYtszNjzii^8Jr=N8n1dQcDQA^iWge(!FyyXfu$yXG^BU%NcJJi9!*JZC(4c6oMr zc6oMr&dBoY^6c{L^6c`Qe}+7}Ji9!*Ji9!{pSH`h%d^X~%d^WP-I-+bdy{9AXOrig z0(mw8HaFW`cyp0+S`2PZHhDIAHhIpel4p}=lV_7>ljod1c{X`Ac{X`Ad5$UF%pFvkI}g;p*b&5_!|AVfA8_XO-t% zHhETgR(V!=R(X!4T;*BiS>;*fS>-vG_gtl8W{xz+xB9W<@+|T!@+|T!@|@d1o<*KT zo<*KTo^xx+v&gf^vk0=d>A788Z1KiL)1t7*;|Fzl7I_wV7I~C8cFeI#$IKjQd>>m) zo*++EQF zc4zOC&)~e@)YBV))grDXcza+Qo8_oHR8I8&S|6JDEKSu+u(H+!1bgxVg2A!{c_{;0 z^Tihx&XUQ~Asg+K=#gPaW|k-g^#Ki0!xa@ug$d7Oj+(a&_1FO&)LfyGR~EbdlBXP} To(@4fugmb^0(SV~Iv*c@eSkIz diff --git a/assets/voxygen/voxel/npc/gecko/male/feet_b.vox b/assets/voxygen/voxel/npc/gecko/male/feet_b.vox deleted file mode 100644 index 64048592f9ff7be790be82e13b04846e6a4fb063..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1112 zcmXZa!Hp9^5CzbJ<;cYn0U)Q)5iBx7djKSm(Xs(l3QoZhAXN%Z!6{S{m>7^ z(EDtm4}IuEAMx+Dw(Ul3&^ACjc~NYdr+J#Ec@~eSd77trnrD%Dnx}c1r+L=j;Ax)b zX`bepf310%r+J#EdFYm;Y>TIOif2s$PXUyhm4VA3Yg+tRz7$XK6wjI}p5iH<;whdr zeLTfeJjGKyb4rV+c#5ZZif2vpnwhDY?;-j*^*qUwJjs(hYdLt5Cn3@e)8K1~T$D~o z2g#E>YuR{`CwY=5dFE0kPx2&B@+8k%-nB||W~OGo^>fL22G8IbJcDOF20Vjj@C=^8 zvmOne!83RU$Z*s3xEO4>a5!lw29J;Ec?Qqm89Zv4Pt07UIWtq^Js&lm;0d1K2_Bb= zo+o&MCwL4gdY<43p5SpC(engP@C1xoi{60Y;&9?!d6TPLXL_Ey=g-fV&;KIg`_uCeA8~je@%#Dp>&JQE^+6uwoxJ>geg5QgzMK}1@$mK- z@#d>My#4z20BDMR#rXuIZVp5|$u#p7w7=4qbhS!AB(X`be3p7l3)nx}c1 zr+MaIYo6w5p5|#Dx+N+5;whfuSyRAM0Oe+7;4;XX7C)9R#Zx@Rv!;rtc#5ZZif2t9 zPw^B_@f6RT(&8ze;whfuS<}2`W@_d(L~nkQCwY=5d6H)>2T$@OM7m)bd@YfS(h2Dx zd6H)>8&C2iPx2(sT*~B0p5#fMcm~LD)AhI*Y`AbZX($Gdx9E8W&)^w6YMD>WT%|cPQ)A-^p5O_d;0Yd=i=HQV zf+u(kDSDpZ37+6_8`1LwPw)hcTZ`U+;o@-OU3rtMT;wb#Im$uyvXi*WO|Ej0vz+88 z2ieO`;x0G2%0eH9h zr+yAM^g}=NLoxJTTj)a{`q1NOWbP#?L-c-VhvsRX=4qbA<7uAeX`bd;WS-_}p5|$u z^*4B$r+J#EdFEehp5|$u=4l?fB`L?^DW2k4Q@~RIv1vIaN%&$Pz)X~(en(R!83T&GM|{aN^@qW#?BKw!4o{e z6Fe>#Jx}liPw*I0^gO{6Ji+5OqUQ;o;0YMF7QF$(#o@$<@+Mcg$XQNul!NSLC-IP* zT;(EXImuBDvX`C2LvC`Fi=5>oM>)t|cH86e*lxGmcD-J=%jL42&*$xQI&H_}aXTCi O+kU^_cDtQ(BmM)LJ8en; literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/gecko/male/foot_br.vox b/assets/voxygen/voxel/npc/gecko/male/foot_br.vox new file mode 100644 index 0000000000000000000000000000000000000000..87a904a820c1c522fe40bcafb9595e812788bb56 GIT binary patch literal 1128 zcmW;K!L8Fk6a~=t5eqeH9h zr+yAM^g}=NLoxJTTj)a{`q1NOWbP#?L-c-VhvsRX=4qbA<7uAeX`bd;WS-_}p5|$u z^*4B$r+J#EdFEehp5|$u=4l?fB`L?^DW2k4Q@~RIv1vIaN%&$Pz)X~(en(R!83T&GM|{aN^@qW#?BKw!4o{e z6Fe>#Jx}liPw*I0^gO{6Ji+5OqUQ;o;0YMF7QF$(#o@$<@+Mcg$XQNul!NSLC-IP* zT;(EXImuBDvX`C2LvC`Fi=5>oM>)t|cH86e*lxGmcD-J=%jL42&*$xQI&H_}aXTCi O+kU^_cDtQ(BmM)LJ8en; literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/gecko/male/foot_fl.vox b/assets/voxygen/voxel/npc/gecko/male/foot_fl.vox new file mode 100644 index 0000000000000000000000000000000000000000..87a904a820c1c522fe40bcafb9595e812788bb56 GIT binary patch literal 1128 zcmW;K!L8Fk6a~=t5eqeH9h zr+yAM^g}=NLoxJTTj)a{`q1NOWbP#?L-c-VhvsRX=4qbA<7uAeX`bd;WS-_}p5|$u z^*4B$r+J#EdFEehp5|$u=4l?fB`L?^DW2k4Q@~RIv1vIaN%&$Pz)X~(en(R!83T&GM|{aN^@qW#?BKw!4o{e z6Fe>#Jx}liPw*I0^gO{6Ji+5OqUQ;o;0YMF7QF$(#o@$<@+Mcg$XQNul!NSLC-IP* zT;(EXImuBDvX`C2LvC`Fi=5>oM>)t|cH86e*lxGmcD-J=%jL42&*$xQI&H_}aXTCi O+kU^_cDtQ(BmM)LJ8en; literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/gecko/male/foot_fr.vox b/assets/voxygen/voxel/npc/gecko/male/foot_fr.vox new file mode 100644 index 0000000000000000000000000000000000000000..87a904a820c1c522fe40bcafb9595e812788bb56 GIT binary patch literal 1128 zcmW;K!L8Fk6a~=t5eqeH9h zr+yAM^g}=NLoxJTTj)a{`q1NOWbP#?L-c-VhvsRX=4qbA<7uAeX`bd;WS-_}p5|$u z^*4B$r+J#EdFEehp5|$u=4l?fB`L?^DW2k4Q@~RIv1vIaN%&$Pz)X~(en(R!83T&GM|{aN^@qW#?BKw!4o{e z6Fe>#Jx}liPw*I0^gO{6Ji+5OqUQ;o;0YMF7QF$(#o@$<@+Mcg$XQNul!NSLC-IP* zT;(EXImuBDvX`C2LvC`Fi=5>oM>)t|cH86e*lxGmcD-J=%jL42&*$xQI&H_}aXTCi O+kU^_cDtQ(BmM)LJ8en; literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/gecko/male/head.vox b/assets/voxygen/voxel/npc/gecko/male/head.vox index 916d9989e681324c770dc731ae4b728cdb3cb17a..2b9a82f3e820cb9c1f41166de6dd63cbf165ca75 100644 GIT binary patch delta 337 zcmWlUF-`+f3`A$frio}GS_;m<4QP-eg@g(PE|W9Ra1pLULHYL-@LW8N?e%#6{_K8t z`?vGu;Y-rX)8T~Z__@Ek-cSse_m9K9XDmHKlx3*F)U9Q-R9mNPwB#)^d)}C=fT2PS zhNkcFd3@namQWIwoGVS?A7gEdF%uST9di}?SE%kM^pd+ delta 333 zcmWlUu}wrl5JPRx9Kng?L_$af^gw{b1wew(K{Hna360PW0ny(Q2;oieWbfbcj{nd8 zdw+O+KHYpudb~S6A$s^YT%9j44X3yFBD7^?7K zXwE&k)KawCSt_k4o02o3!c4I6BAmYz%TP~%N5oyRG%Ph*%>poJN;Cy`ljUI$nVKy3 lwPOx688j_&%nrJpb~K}v30e$j+L^yY!O)do!Pko~`yU2dNx=XB diff --git a/assets/voxygen/voxel/npc/gecko/male/tail.vox b/assets/voxygen/voxel/npc/gecko/male/tail.vox index e6be1ce75d02d668c7e4348fe07df4521d12e92c..593e3d138e499e7afd32e9391c7df9a4876e375d 100644 GIT binary patch delta 74 zcmaFDafd@N%s)b58Uq7^ucN0QkYezdC@8GM3}i3?aYSU4rvyk82v{N13kD`eAZB>M OzzD*OFE&Q-umAw^4h;eT delta 82 zcmcb^@q|M#%s)b58Uq7^ucN0QkYWg!C@5^g3S=+=aYSU4rvi`$0d^3tIF#`}YgD~UMjR8C?0AnEz+yDRo diff --git a/assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-0.vox b/assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-0.vox new file mode 100644 index 0000000000000000000000000000000000000000..1f1170ccb83fbf61138b0ebdf9e38ad102ae4aca GIT binary patch literal 4416 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 D_eNTx literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-11.vox b/assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-11.vox new file mode 100644 index 0000000000000000000000000000000000000000..218a9182f472f8a26565fcc3c185e22dbf173ad5 GIT binary patch literal 1228 zcmWlY4NTN^7{~wr{~c)4maMfh$tfvQgwq`ecpd@=$ore;9UP#%=~28~-V5D%!X_z* zXuJ$MQCs+u3Zzr)P+m#{*;u4yu4PWqv^I4XX{%Z4`t;|!efIr5zwP(^J=?R#n3=o4 zBM3rzY;uNd!hli`^vQV%v!@GL3K<`nnKHSiyyQmNr?pT<6n&~i$=51MGh}=mq9CJ` zY@$-Mi-NLR6cu(sQpm2fiIT!9Dtu*^&kCtpR7~Id+9lD)CMYDkq>vnvtn;TCdFWni)4I_27@k~{cBh8q+6RY6wc9&iCkWX1SPaW~Sn0Wq*T! z1#fX=Zv>S^i)e7Iq{I}=!z*b#y^+TAd)eH$(#omBIwr5J=GdWZE{sOY`60A>ve?lS zLZ5dl#l?}NW(1L6q9Q$e6}#IiX!WMjc4`a#6NlJTp3Al)(KL*hNijvCD+(do5=)!6 zo$W0(%&S|&hLd%K8?^+~X4C!CAmux3gjA)nR-Wmib_)&1_aW@A?lI` z?j%BQE5ftO1SUjb9y(9pu6knf4XnsB;u;+zqN0jpw|~XyIe>ZpVd}DPY_z>V6ooB{KjsKm3DG!n#etSi)Dq?Xj;yrDzG4w?4)+^Hrd^isCw=&YtE~@ zvN(pBb3+gcPBSaa!nW3HSgJoIaDF0w>UuIV_pxxkfjxDX*s|#W2U|yJs<=RT+Q+mw z`_V_`bGGGMI;+m&)P0C{c`PXb8!)SDFa?+LUT7UTX*qc7hKXJlPEJrX8>6zYm0BoS zx}GXkJ|pU8x|7`)RT2EGZK5b*4KJSkDR1d>zWi#4w$3hGwcFTI<6v{yX7naKnVCtf wi;E&c8;M38$kfynlarGS4-eDZ+e>3(BTlCigTX+2d^`aG0r>g(F}?r)1MQD@pa1{> literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-2.vox b/assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-2.vox new file mode 100644 index 0000000000000000000000000000000000000000..3cc0a510a22760e06b48384bdd16b8d9f9390370 GIT binary patch literal 5624 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 E2hzo|w*UYD literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-3.vox b/assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-3.vox new file mode 100644 index 0000000000000000000000000000000000000000..9a3066acff3fe988caf4736bcca5552422fb8e90 GIT binary patch literal 4244 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 D_eNTx literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-5.vox b/assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-5.vox new file mode 100644 index 0000000000000000000000000000000000000000..771bfd55c64cb60977c8910fc75e2c2d6caef470 GIT binary patch literal 2476 zcmX9;4Qy8B6@LHUYjl}pF&l#s?XXd3iz(P*DYO)j7Rpa8EtK+8ek=~?H}3uJT}y$) zjvq@^XalPSmw_S(Oro%&KsOyoLdIlcW*IY59d3ybH>S%LHZXhkTz8X`^WOK~_nhZE z=Q(fvoCWvy3L$1qu9{6J`tA~x_Ob9fa!Msi*~BQ5bxJ4F`Pg}%SfjJjsL&`MX&ppH+r%pV?}DswDiqel!kO6F zAZr!Z)^Sh8!l+mqoj7eGL2nq_X&XB4vYKAn)Kp}QjHOet)HYUVRvX4}ku;2**3JCR=vZ3A+KH1`Ou$+L z8>_%ZG9YepXamQ6A6seYb*zK5hn8Ffq4mV;9WfcM`Hy#z@jldCEAH#Shsyh`VqT+z zP+Q4(K9rJpq#|#QJf|3CR(Nt|1M){4#!wH`h-U6|k3BckiFQ6xv!@t7yhjv)+>Lv`_52Cm+7vQyXIE zTuH;e8^+e@UEmVIcft8qHlQv7a!5>!qZGNLPl9+P*H%)esn;~#W0o_f1SyYOD^&Z8^szzLI z@5beY8GJaa1^@l{8h+B=j?4E}W8b4C*fJy!H;){_JFA+pZF(7w_wK@H?XCFHjA=Ns zq6xn)ufR_yl;Fzw0d!ZEBRge0E=(#xT}2W0JpLHI*u5Dir;fwv&Q17Y<0^Dkm*Dy% z_u=nv=P z!yO?$UosqjYny?KZMFE>qGHsS72wZ38SGqGiqDU1!~Rt>arS#Wx2GAq+gos8MG-#T z-GoiGdAP83F8Y>^!nH%|v9+-fU+$X)oY{gK&yK>415e?2+f?+fD8R+`JWLrk41Yb< zg|@oUc%!uly-^iD**yUlp3cXMneQS~HwK^ehq!Wj2Y%RGf;V^6;ph8W@l5krobAd5 zjt|4{`f@RNFdx6_8;k$EGYwZyt;d<3LR^1yI&Ph-z(a)(W9{k^ym5E|KE3<{-2TIM z;Cz6;4~)dcV@omo+ux)O#qi<7>A!`X`@e&ipDV`Nrjgjz_9&J&;}pO0O=bFsNAAIJOGW7)Ftm^phC8kZMfR?TDB-m?bX z{WH;XY#mNs+>e#37huE7W!QGM88aFtqM|7uHJQoi>EDH?cW%V6j!9VjS_g{iOOdmw z28aK68ml))$Zwg6$Jx`7yE52z=mm)FYjM}IN(`M{j=Z=D;FT3%|$ML#J?0Wd*)gzl^U#sff03hw&Pu_Te%l6cArDnnzymK`p4MW zdJ?r08*yUiZ_w9r0<9I#qjbz<%*a`c=E99=$XkK$kL|$x>iOvJ7(m(RBFrCEh9wi{ zB3hBb@`vZ4rJxaK3wPjfRXgenit(q?E;JQS!k4%I!706iU;Oe6diwUEZPNy<+Zf}? zRZpU}p%!!IRN{##6H#0`9wmjjxOwv?1_uW*Fff3lM~|YjvlFeYt*EQ3!_=u$k&}~y LAwz~By#f9QxyBM} literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-6.vox b/assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-6.vox new file mode 100644 index 0000000000000000000000000000000000000000..47280bd4f0ac51f53972c330e5f0d07152d63762 GIT binary patch literal 1228 zcmWlY4NTN^7{~wr{~c)4maMfh$tfvQ(l?f+h^b3^V@#k=eIq3OzAlb z+=3va#u(CM69$!nkY&h?pY1JVDP(+PX3FH4a}6%py;>+Eias@> zUgP?DBLf>!XiU^{bYlXS*Xyt+YIvHzoU-U89LNY|yf~KA1ra=VTd^C$@z}Dt*<$1I zMt^>bXO%;>xFyZshAos}Fd(Q?1Dkov4(CK@y7 zDhT54@vSuGX?W3{3d1{jxF?8*N8h2pHV$`*nn`Ccv7z($ZLpbI<1)@Tw7BgC?scwa zV!Mii*0-@5m-EPDm{4_+_4m+yKWY)?vUDRQv>G(c`-4(o4l*rt)Xo9N?5xzT# z(AS3W>@tDzkywV$6S%99=sY7Ua!u5ZjT2U0$+6qN;&30pvi~p*6F(4ge303RdR{ga z$(bhzDXnI4mYMmk9!wQgWY;y5bM_X?3Tn``o=2T;MJV1${m^YPd!|tL-eK09S9xV| zG&AR_5b{qmE7Z!iwrf~xJ|%E|0)CoC($e>_aK4c}4VT!m=>P}Y#%M0TKv~Miv^oaJ zip=9|>$h}Op2ea6kcj0mBn521qN&3iT*7-H4P>We<7pTnYMGYopeQy*W?(O|QoM9M zmFhf3H7)cQoS4*M{2b9tVb~g8Jo{7L(&v2n)iCW{-PG1^V@q8%n@cy7WzHf!J&|>> uk%UErqtgU3Jw46T)D$BlBlPw4;c~ffI2;&_M&jb)2nYzk&(9C<{{IgJmUpHA literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-7.vox b/assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-7.vox new file mode 100644 index 0000000000000000000000000000000000000000..70430155fdc582b648fe0db240d96d34b65fbb56 GIT binary patch literal 2272 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 MmjFYybcN literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-9.vox b/assets/voxygen/voxel/npc/odontotyrannos/Odontotyrannos-9.vox new file mode 100644 index 0000000000000000000000000000000000000000..771bfd55c64cb60977c8910fc75e2c2d6caef470 GIT binary patch literal 2476 zcmX9;4Qy8B6@LHUYjl}pF&l#s?XXd3iz(P*DYO)j7Rpa8EtK+8ek=~?H}3uJT}y$) zjvq@^XalPSmw_S(Oro%&KsOyoLdIlcW*IY59d3ybH>S%LHZXhkTz8X`^WOK~_nhZE z=Q(fvoCWvy3L$1qu9{6J`tA~x_Ob9fa!Msi*~BQ5bxJ4F`Pg}%SfjJjsL&`MX&ppH+r%pV?}DswDiqel!kO6F zAZr!Z)^Sh8!l+mqoj7eGL2nq_X&XB4vYKAn)Kp}QjHOet)HYUVRvX4}ku;2**3JCR=vZ3A+KH1`Ou$+L z8>_%ZG9YepXamQ6A6seYb*zK5hn8Ffq4mV;9WfcM`Hy#z@jldCEAH#Shsyh`VqT+z zP+Q4(K9rJpq#|#QJf|3CR(Nt|1M){4#!wH`h-U6|k3BckiFQ6xv!@t7yhjv)+>Lv`_52Cm+7vQyXIE zTuH;e8^+e@UEmVIcft8qHlQv7a!5>!qZGNLPl9+P*H%)esn;~#W0o_f1SyYOD^&Z8^szzLI z@5beY8GJaa1^@l{8h+B=j?4E}W8b4C*fJy!H;){_JFA+pZF(7w_wK@H?XCFHjA=Ns zq6xn)ufR_yl;Fzw0d!ZEBRge0E=(#xT}2W0JpLHI*u5Dir;fwv&Q17Y<0^Dkm*Dy% z_u=nv=P z!yO?$UosqjYny?KZMFE>qGHsS72wZ38SGqGiqDU1!~Rt>arS#Wx2GAq+gos8MG-#T z-GoiGdAP83F8Y>^!nH%|v9+-fU+$X)oY{gK&yK>415e?2+f?+fD8R+`JWLrk41Yb< zg|@oUc%!uly-^iD**yUlp3cXMneQS~HwK^ehq!Wj2Y%RGf;V^6;ph8W@l5krobAd5 zjt|4{`f@RNFdx6_8;k$EGYwZyt;d<3LR^1yI&Ph-z(a)(W9{k^ym5E|KE3<{-2TIM z;Cz6;4~)dcV@omo+ux)O#qi<7>A!`X`@e&ipDV`Nrjgjz_9&J&;}pO0O=bFsNAAIJOGW7)Ftm^phC8kZMfR?TDB-m?bX z{WH;XY#mNs+>e#37huE7W!QGM88aFtqM|7uHJQoi>EDH?cW%V6j!9VjS_g{iOOdmw z28aK68ml))$Zwg6$Jx`7yE52z=mm)FYjM}IN(`M{j=Z=D;FT3%|$ML#J?0Wd*)gzl^U#sff03hw&Pu_Te%l6cArDnnzymK`p4MW zdJ?r08*yUiZ_w9r0<9I#qjbz<%*a`c=E99=$XkK$kL|$x>iOvJ7(m(RBFrCEh9wi{ zB3hBb@`vZ4rJxaK3wPjfRXgenit(q?E;JQS!k4%I!706iU;Oe6diwUEZPNy<+Zf}? zRZpU}p%!!IRN{##6H#0`9wmjjxOwv?1_uW*Fff3lM~|YjvlFeYt*EQ3!_=u$k&}~y LAwz~By#f9QxyBM} literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/rat/male/chest.vox b/assets/voxygen/voxel/npc/rat/male/chest.vox index 7b7dfbe310e6b576ac05e93ba5625deed59215f4..6782d48f39ae9ffb4c2802a163ef0e30090b970f 100644 GIT binary patch literal 3736 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 LttwN+{{Q~~P#jT7 diff --git a/assets/voxygen/voxel/npc/rat/male/feet_f.vox b/assets/voxygen/voxel/npc/rat/male/feet_f.vox deleted file mode 100644 index 3b1c60b692b8a55aa3639d8ac6237487a6e877ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1168 zcmajee@xVM7{Kx8DB(7KtOO+Qkh|_q@lH?VM;rn(u}Dr4L*mjCSzBj{{DC>(~ZA^*fbHCBJUdk(k$b3EH?&pw~;=lgv= zpXdAi`t}{Lc8kc~GH;b82|g}T{lPVstKECFr_%U6-Ku#4j_r_wU+SCR#TZMMXsfgF)_J6e_NKgFWpZ z{!U9H64^^ECMG7BoSbBOdYYM;8RqBbSzKIXX=!QsdV702ot>TZ_V&`>-_Ov{5W~a6 zgu`J*M@P{T7>!1flaonJO~tm(jKjK)Y`X>5dfST6&!{$$)nLOBbWs@E!BA5ZH=3LI z@%(unT)IR?o#1#&*xW6YjtTP8Dx}4Tbfq98X>@7*KJ}RjtFP4e>KFBg>N+i4?-U|~ z!mTfKyhG?O7jEts?j05UIzH_aIs!U>N_Zwq@K}W6r-hGnzPi9fL%EHX>Wy?C$s<_n zq5If#M9#jHXpgU_{w zh5|DecCF`P_%2i9R|s9MBQkWH#Kc6bR_n4{ zr;Wlb8z|0m((!gC*RR^Rd&|YW$xU3=nxO&V_Lsu%KM7S1p*CBna|y4yh2y!x>jipd zkML%RV0l9OyIOFi3tKaEzb5T-rm$0cP+?p7{HBzo70+L6F%u}sDkhV`kygxFIDM8==iF0gk z?PJf!W7OQ3;@1mW;88I(#m~J$^lBWxeY%Q;&yD;!lE_~-Q}}oEN%%VLq3^QbwiABH zhdbNhu5K<`1NZA6_2h^1Gp{ZGUkeKh%+1X)J3C7>8pZ4N;`8|k1On7*1M1aLbwZs{ LttwN+{{Q~~P#jT7 diff --git a/assets/voxygen/voxel/npc/rat/male/feet_r.vox b/assets/voxygen/voxel/npc/rat/male/feet_r.vox deleted file mode 100644 index 3b1c60b692b8a55aa3639d8ac6237487a6e877ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1168 zcmajee@xVM7{Kx8DB(7KtOO+Qkh|_q@lH?VM;rn(u}Dr4L*mjCSzBj{{DC>(~ZA^*fbHCBJUdk(k$b3EH?&pw~;=lgv= zpXdAi`t}{Lc8kc~GH;b82|g}T{lPVstKECFr_%U6-Ku#4j_r_wU+SCR#TZMMXsfgF)_J6e_NKgFWpZ z{!U9H64^^ECMG7BoSbBOdYYM;8RqBbSzKIXX=!QsdV702ot>TZ_V&`>-_Ov{5W~a6 zgu`J*M@P{T7>!1flaonJO~tm(jKjK)Y`X>5dfST6&!{$$)nLOBbWs@E!BA5ZH=3LI z@%(unT)IR?o#1#&*xW6YjtTP8Dx}4Tbfq98X>@7*KJ}RjtFP4e>KFBg>N+i4?-U|~ z!mTfKyhG?O7jEts?j05UIzH_aIs!U>N_Zwq@K}W6r-hGnzPi9fL%EHX>Wy?C$s<_n zq5If#M9#jHXpgU_{w zh5|DecCF`P_%2i9R|s9MBQkWH#Kc6bR_n4{ zr;Wlb8z|0m((!gC*RR^Rd&|YW$xU3=nxO&V_Lsu%KM7S1p*CBna|y4yh2y!x>jipd zkML%RV0l9OyIOFi3tKaEzb5T-rm$0cP+?p7{HBzo70+L6F%u}sDkhV`kygxFIDM8==iF0gk z?PJf!W7OQ3;@1mW;88I(#m~J$^lBWxeY%Q;&yD;!lE_~-Q}}oEN%%VLq3^QbwiABH zhdbNhu5K<`1NZA6_2h^1Gp{ZGUkeKh%+1X)J3C7>8pZ4N;`8|k1On7*1M1aLbwZs{ LttwN+{{Q~~P#jT7 diff --git a/assets/voxygen/voxel/npc/rat/male/foot_bl.vox b/assets/voxygen/voxel/npc/rat/male/foot_bl.vox new file mode 100644 index 0000000000000000000000000000000000000000..87a904a820c1c522fe40bcafb9595e812788bb56 GIT binary patch literal 1128 zcmW;K!L8Fk6a~=t5eqeH9h zr+yAM^g}=NLoxJTTj)a{`q1NOWbP#?L-c-VhvsRX=4qbA<7uAeX`bd;WS-_}p5|$u z^*4B$r+J#EdFEehp5|$u=4l?fB`L?^DW2k4Q@~RIv1vIaN%&$Pz)X~(en(R!83T&GM|{aN^@qW#?BKw!4o{e z6Fe>#Jx}liPw*I0^gO{6Ji+5OqUQ;o;0YMF7QF$(#o@$<@+Mcg$XQNul!NSLC-IP* zT;(EXImuBDvX`C2LvC`Fi=5>oM>)t|cH86e*lxGmcD-J=%jL42&*$xQI&H_}aXTCi O+kU^_cDtQ(BmM)LJ8en; literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/rat/male/foot_br.vox b/assets/voxygen/voxel/npc/rat/male/foot_br.vox new file mode 100644 index 0000000000000000000000000000000000000000..87a904a820c1c522fe40bcafb9595e812788bb56 GIT binary patch literal 1128 zcmW;K!L8Fk6a~=t5eqeH9h zr+yAM^g}=NLoxJTTj)a{`q1NOWbP#?L-c-VhvsRX=4qbA<7uAeX`bd;WS-_}p5|$u z^*4B$r+J#EdFEehp5|$u=4l?fB`L?^DW2k4Q@~RIv1vIaN%&$Pz)X~(en(R!83T&GM|{aN^@qW#?BKw!4o{e z6Fe>#Jx}liPw*I0^gO{6Ji+5OqUQ;o;0YMF7QF$(#o@$<@+Mcg$XQNul!NSLC-IP* zT;(EXImuBDvX`C2LvC`Fi=5>oM>)t|cH86e*lxGmcD-J=%jL42&*$xQI&H_}aXTCi O+kU^_cDtQ(BmM)LJ8en; literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/rat/male/foot_fl.vox b/assets/voxygen/voxel/npc/rat/male/foot_fl.vox new file mode 100644 index 0000000000000000000000000000000000000000..87a904a820c1c522fe40bcafb9595e812788bb56 GIT binary patch literal 1128 zcmW;K!L8Fk6a~=t5eqeH9h zr+yAM^g}=NLoxJTTj)a{`q1NOWbP#?L-c-VhvsRX=4qbA<7uAeX`bd;WS-_}p5|$u z^*4B$r+J#EdFEehp5|$u=4l?fB`L?^DW2k4Q@~RIv1vIaN%&$Pz)X~(en(R!83T&GM|{aN^@qW#?BKw!4o{e z6Fe>#Jx}liPw*I0^gO{6Ji+5OqUQ;o;0YMF7QF$(#o@$<@+Mcg$XQNul!NSLC-IP* zT;(EXImuBDvX`C2LvC`Fi=5>oM>)t|cH86e*lxGmcD-J=%jL42&*$xQI&H_}aXTCi O+kU^_cDtQ(BmM)LJ8en; literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/rat/male/foot_fr.vox b/assets/voxygen/voxel/npc/rat/male/foot_fr.vox new file mode 100644 index 0000000000000000000000000000000000000000..87a904a820c1c522fe40bcafb9595e812788bb56 GIT binary patch literal 1128 zcmW;K!L8Fk6a~=t5eqeH9h zr+yAM^g}=NLoxJTTj)a{`q1NOWbP#?L-c-VhvsRX=4qbA<7uAeX`bd;WS-_}p5|$u z^*4B$r+J#EdFEehp5|$u=4l?fB`L?^DW2k4Q@~RIv1vIaN%&$Pz)X~(en(R!83T&GM|{aN^@qW#?BKw!4o{e z6Fe>#Jx}liPw*I0^gO{6Ji+5OqUQ;o;0YMF7QF$(#o@$<@+Mcg$XQNul!NSLC-IP* zT;(EXImuBDvX`C2LvC`Fi=5>oM>)t|cH86e*lxGmcD-J=%jL42&*$xQI&H_}aXTCi O+kU^_cDtQ(BmM)LJ8en; literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/rat/male/head.vox b/assets/voxygen/voxel/npc/rat/male/head.vox index 44abdf5d46baa6f0f949f6d44d897590f65276db..2b9a82f3e820cb9c1f41166de6dd63cbf165ca75 100644 GIT binary patch literal 1376 zcmX}q&8-_Z6o%nL&UlxN_Fe>PffZasv2o%2010F`UIhrib#`h&6&PR(YC$f6Eod)o z)B^Kx3|MpDA?Lf~;XCAf`s4G@UnAnTm)GAl@#~w2zh1xm^3#0q^Z0|$e}8#>o3=RK zYjWg!!ZJzvYuuA|iRH28B_-_=>5(HDmmZRPM#7Tyk+6DR=e#uMWo7a`v{tx>Jk*M9 z-tv%|YpooQG}{#BB;%}=myxZRw9BGC5|%~n={8&Qat<}+bME~AY8+zD(dK22wGOg* ztJ;}Iwq9PczUOS6wCbpTqw7 zcZ`oO`toLclh3Ku_-a7)P~}xV%N2Q%7kLpBxxW$ekcT|v5#N_}?-uHcb_Ke@n~GcK z)A{r+=d3rs^bv~U>=hOLgKJ#@Ym{&!C zoOpTei`***f ztFt;qWLZU`nnLPbkyVM>%5kB>^AL&t$Lck;i4qlBMcRl~;#nnu5#(b}4e(2K@ zxSF#PmpRHfp36MN`K-$sUB*Tn#_}zWuwEF;SscS$L)%6bvy66?9jcnTOb_U+rad-v{`zpbqe9UUF$>gqywcQ<-^ zdT{F0DfIRAp})T$Y=LMriuCk!OqehMaW4}&SsrF&2gsWie_;K|D`M~);>c;qLuqOu zdYYPWdfPVqxOXpZ9Xf=`>jXJ(3TAf-%FhbqMGI+;LJo|F^k(1y`yVBrkv{Sj`JVhj z{vZc-2u^kg22Kbrd_jGopu19VW~JcjMnNt09Z5lZJ?+~CPx*qfKrrud!H2Z3D2bt= zGLGgIGts%B2rV^b=-l)S26n%MTgMwPD|-^kivlcpdL}j`%h33|pmjZG+9o*rzM#~P zA(5AZHN~@0SC)@t-Xt`XWMbdqY1qGXIx5QxvHZEYsC}UVjW1WDxv3WIZ#N=!;vEc~ zJA%~Vbr|T`jI^{gWMyTIQJ5P?>66njuP7JoZ%xI?V{u%$kcX>-vv8O_Q^y4tzZCrb zlb||BP%}fYE>G~v6N1f!g4as;<}$$>^98}f-0!1;yorK>$(%RFJx>)Z;ts0f4}O1a z{J00ce_oJ@`uRoJ`t02Q-``Z4iBw%aii?Z!LD^B{7j|R*o?V#IItAZ;EV#6m`_Ils zZf-6%WpBsQs$NKIGbV1Gh`xh@cQZ5bdMw8OA0Xq%VeV#!BmvFh{?e%;3g_d7#F__<3k zd`#iDPc242kK)hXG~78e9{=<|0(_lukMDfoVlMDQF>q-CaD~GSuL7>u-LLXJ`^c+f u-`D8qC~n-ifos>UVR(2Li9`a)WD@oD^{C+j>c~d2h3q7|Ncdfb-~YeGO=~~^ diff --git a/assets/voxygen/voxel/npc/rat/male/tail.vox b/assets/voxygen/voxel/npc/rat/male/tail.vox index 310c3afd6f4324f9d32be2354d04cdaca3fec79a..593e3d138e499e7afd32e9391c7df9a4876e375d 100644 GIT binary patch literal 1116 zcmXBS!Hp9^5CzcM1#Vn?MF28_JpdBO2sVI9!6`Tbq)NdlIE7BZ_dPj<;dL|P zKeoSTdY-%I*Z1G=|3<{u4^Q8`#h2F+KcAjIy`5id5AsSL<@cZGr+41x_U8ZFOFTYE zyf{%FUVeQ3_#uojw{301v85zMJ*(j`^g}=NLqAVzef!Y**0+9MTKdwLFQqU294_^# zPkky<@3n%?yrhumb+RfU)ZICrBerz9_r+J!ZO%+e`G*9z1 z&ze4-=4qbhX`VTy&C@*1(>%?yrg_cG)XY6aZ+?oWc#5ZZif1hcPw^B)xnUW6Es=}L z3FS-i6wg{Vp5iH<;whfFl*Lm##Zx@RvzB+Q(wv#8nY*4Rd6Fl2k|%lAW5AO<$&)7-O7kC*6qk|%kRM=kS-nX5EsW@_v_!4o{e6FkA=a?$ey zPw)hfAw|yOUUm|9xye;7a+Z@E z}9vz@AvI?yKUF&b-P?H+xdLnPN&m$JRY~h;jr!Z`)#+| HIXB`T_u^_$ literal 1136 zcmajee@xVM7{Kudl)S}{RUDFc$X$1*cqetok2nNoVv$@bhQy_atgSOe{=gh_db`zv zeyGDFVUSG2s}XE9F?M5aZLo`?+>8}Dvh5@+LjH+=YOMZx_Z)8h=Xkc)=dPnwgmy=I7^GTwG*nX=(X+dwV;bot^ad_7V<<85|sBXlRI$kr75mN6{rP7!0JQ zrjnkXj%~dehjl$Ub_=czwiV~ktTvI|Xu}b5Q54z6U~@CqT3Yz=>{;$zyhvuf;CM^O z?H0<$1bHb52^x^DG-TLFm#*KZK2sy=EA_qlMg5_=P6}5$h3J5A;|tBV3E>Li`d;DA zVWCd*lYXHipyMZmr?UmGMJRbf_)y2I3r#du*a%i{qWe%jp;|B9N1i2m`ep9*H?rBj zma=>cJD=IaA-|WV7lgKhx~CRl?7UEvZNleru)iRe2Co~xYb}k1X3p){z=d5KsVK{1 z&+}WTd$F9RSE>j$*U|A#6On;;nHs-L8eYg(*GL z%DT37eEYF*>wwnZZpZ0#a>RauU6sQ~Tab+78I1G@@0rcKVKV9e2a=*5R}SS-WvWuu zs)LZ)1g0S5oQA?4DDQ`=2pkxPQ#}K;eG=jQ;c-lB^!pz>!`9Y5c78NQ&9y0hJ*Nvi zD5j?PxmSo?N#wUrlUVrNz@Nj({B=Eze@7pMuZ{P8mkl?a@IwLI+6uRIbFmt@+wh>7 x?~l*CwtT-978aPBn`3r%mRKx?&*#JM_Y(*NsMP{AsKe@*I;C1wmWtp1{{Z#7PlNyf diff --git a/assets/voxygen/voxel/npc/squirrel/male/chest.vox b/assets/voxygen/voxel/npc/squirrel/male/chest.vox index 76bdafaa5cd42096c81d1a082c21881a5293950f..6782d48f39ae9ffb4c2802a163ef0e30090b970f 100644 GIT binary patch literal 3736 zcmXBW&u#R^83*9`KSQozKpg}+=E@2jC<-)+s_W+KR<@>>$gAt{=@OY*Ks@yzW@7= zZ@eEm0t;OA>1WBjXx@Y$&}N^93niu%Ygd=3hoN+YK5HIq{KoXE}xg-)dra`?Is zbNHM|&L=X1LZ{LQC463p%%q~9%%ISzG(y!+WF}SpWCn#!r4gEbA~UJ!Co?E?Dvi+P zCwBcL=M$Mhp;Kv?^sftX=qEX!$P5adN;{6FUmI~UpCl$SgF>g$h_gNt6PZDwQ)#4& zaq`9bQJi-wjnb_%HpJJ39OCDo(5W<{Jusj9z<4xHr_zWiU1ws7_CvHEqWuu?Q zp;Kvurk}`6YWm3x3Y|(Lbp1qTQrAyrQ0P<|Vdy6^lZJjWgF>g$h?DswF_9S*I+aE& z`8tzkePjlOPNf~kZl4iL(O<4*wD(TFSXT<2N;_U>`-9s0d!zbHXq1qyok}CebR85r zl}55BCNhIUr_zqswO>0i+dm{GGJ`^=(g-D8FGOY%6PZDwQ)z^%pU6yNA~Ps-Dvi+e z6PZa&WCn#!r4hP*A~T7J%%ISzG-9c)Td#5GCoz#36grhgnv9bf6grhgnvIhg6grj0 zoU^&j*K$#((vD-u)-78nM^ehxDO;y(o%GYGG*Yy$NUk-J8OL?$R2s=1oX89cok}Cr zY&~RRCNYs26grhgX!?oFBqlP0LZ{M*T_1^w%%ISzG}16mW>Dx<8fh|4W>Dx<+Hqbz z1LWB_g-)d%$BQF%cwVTnnCBu-dmj{Y-pQ$$Z_go}N;_UR&jl$L^X+{M3Y|(Ld4?x4 z<9MFwR2s2*&PhyU28B+g9mgUkvFRr3b{J+G$_xVz0<5U_sRr6VW9$6Pks_&gjBjx%&kr@;^HCOZL zxiqKqIj{PPJ_dzO_53zcHBPSXN1;<`q-LD#SsxTSl}75u$=x`GPNk8CaWaEKrw-#} zb3e$FaSEMEJC62dBgzupuh@H?>a)BttIz(9tYL`%Ir0b z&cFWgx1apac7EN?uifvBm4$G-9i`o`U42*I)pzxyZByTzZ0ei(rhdG2RbSOtFIM$c z{kYtszNjzii^8Jr=N8n1dQcDQA^iWge(!FyyXfu$yXG^BU%NcJJi9!*JZC(4c6oMr zc6oMr&dBoY^6c{L^6c`Qe}+7}Ji9!*Ji9!{pSH`h%d^X~%d^WP-I-+bdy{9AXOrig z0(mw8HaFW`cyp0+S`2PZHhDIAHhIpel4p}=lV_7>ljod1c{X`Ac{X`Ad5$UF%pFvkI}g;p*b&5_!|AVfA8_XO-t% zHhETgR(V!=R(X!4T;*BiS>;*fS>-vG_gtl8W{xz+xB9W<@+|T!@+|T!@|@d1o<*KT zo<*KTo^xx+v&gf^vk0=d>A788Z1KiL)1t7*;|Fzl7I_wV7I~C8cFeI#$IKjQd>>m) zo*++EQFHq)$ diff --git a/assets/voxygen/voxel/npc/squirrel/male/feet_b.vox b/assets/voxygen/voxel/npc/squirrel/male/feet_b.vox deleted file mode 100644 index c0dbbe7deac42f0a3181ac380cbfc52e8e8097c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1112 zcmXZa!Hp9^5Cza$;K;=i0U)Q)S1uqUv0ie8k~R#Lvg)&u`~}m&16FSMv1x`SG34`I^07UhH08 zuROf``10xF{~uyoueL8q8KRz5+qJ&+t#AE2t@Pzf=}TYwd1>lXpAJ%=`Z?Ut5B<;& z#n5|ip$~oNLm%<)w)X8tZO}GAJ9$y;nx}c1r+F5Sr+J#Ed75XDd77trnx}cz-{5JU z=4qbhnSZT$nx}c1r+Mg>r0k2Qc#3CD0Z##xo0WmfAZuFuSiTfb@f6RRDxTsgp5iH< zHGMqAQ#{2}JabBmr+A8|c#3CD^O~8dncEQkoO+(*NuK0Mp0yl2$&(Q2hH3D%L@r7v zq=V#1p0#W|$&)>TIWto;H~n04p20JC2G8JGj{(o%89ak$ z@T^CJXYdT30W#clJuU_tE*wr8ioxS8dY-{Ecm|JJ<`XklY0k{l*yf|g6Fk8aJi+5~ z(engP@C1(`Mb8sF!4o`gBYK|T37&v)Ytb7pTpUikD{pd@i=5>oM>)t|b`p2F$yF|L zj_vt_&!Ze0ie8k~R#Lvg)&u`~}m&16FSMv1x`SG34`I^07UhH08 zuROf``10xF{~uyoueL8q8KRz5+qJ&+t#AE2t@Pzf=}TYwd1>lXpAJ%=`Z?Ut5B<;& z#n5|ip$~oNLm%<)w)X8tZO}GAJ9$y;nx}c1r+F5Sr+J#Ed75XDd77trnx}cz-{5JU z=4qbhnSZT$nx}c1r+Mg>r0k2Qc#3CD0Z##xo0WmfAZuFuSiTfb@f6RRDxTsgp5iH< zHGMqAQ#{2}JabBmr+A8|c#3CD^O~8dncEQkoO+(*NuK0Mp0yl2$&(Q2hH3D%L@r7v zq=V#1p0#W|$&)>TIWto;H~n04p20JC2G8JGj{(o%89ak$ z@T^CJXYdT30W#clJuU_tE*wr8ioxS8dY-{Ecm|JJ<`XklY0k{l*yf|g6Fk8aJi+5~ z(engP@C1(`Mb8sF!4o`gBYK|T37&v)Ytb7pTpUikD{pd@i=5>oM>)t|b`p2F$yF|L zj_vt_&!ZeeH9h zr+yAM^g}=NLoxJTTj)a{`q1NOWbP#?L-c-VhvsRX=4qbA<7uAeX`bd;WS-_}p5|$u z^*4B$r+J#EdFEehp5|$u=4l?fB`L?^DW2k4Q@~RIv1vIaN%&$Pz)X~(en(R!83T&GM|{aN^@qW#?BKw!4o{e z6Fe>#Jx}liPw*I0^gO{6Ji+5OqUQ;o;0YMF7QF$(#o@$<@+Mcg$XQNul!NSLC-IP* zT;(EXImuBDvX`C2LvC`Fi=5>oM>)t|cH86e*lxGmcD-J=%jL42&*$xQI&H_}aXTCi O+kU^_cDtQ(BmM)LJ8en; literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/squirrel/male/foot_br.vox b/assets/voxygen/voxel/npc/squirrel/male/foot_br.vox new file mode 100644 index 0000000000000000000000000000000000000000..87a904a820c1c522fe40bcafb9595e812788bb56 GIT binary patch literal 1128 zcmW;K!L8Fk6a~=t5eqeH9h zr+yAM^g}=NLoxJTTj)a{`q1NOWbP#?L-c-VhvsRX=4qbA<7uAeX`bd;WS-_}p5|$u z^*4B$r+J#EdFEehp5|$u=4l?fB`L?^DW2k4Q@~RIv1vIaN%&$Pz)X~(en(R!83T&GM|{aN^@qW#?BKw!4o{e z6Fe>#Jx}liPw*I0^gO{6Ji+5OqUQ;o;0YMF7QF$(#o@$<@+Mcg$XQNul!NSLC-IP* zT;(EXImuBDvX`C2LvC`Fi=5>oM>)t|cH86e*lxGmcD-J=%jL42&*$xQI&H_}aXTCi O+kU^_cDtQ(BmM)LJ8en; literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/squirrel/male/foot_fl.vox b/assets/voxygen/voxel/npc/squirrel/male/foot_fl.vox new file mode 100644 index 0000000000000000000000000000000000000000..87a904a820c1c522fe40bcafb9595e812788bb56 GIT binary patch literal 1128 zcmW;K!L8Fk6a~=t5eqeH9h zr+yAM^g}=NLoxJTTj)a{`q1NOWbP#?L-c-VhvsRX=4qbA<7uAeX`bd;WS-_}p5|$u z^*4B$r+J#EdFEehp5|$u=4l?fB`L?^DW2k4Q@~RIv1vIaN%&$Pz)X~(en(R!83T&GM|{aN^@qW#?BKw!4o{e z6Fe>#Jx}liPw*I0^gO{6Ji+5OqUQ;o;0YMF7QF$(#o@$<@+Mcg$XQNul!NSLC-IP* zT;(EXImuBDvX`C2LvC`Fi=5>oM>)t|cH86e*lxGmcD-J=%jL42&*$xQI&H_}aXTCi O+kU^_cDtQ(BmM)LJ8en; literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/squirrel/male/foot_fr.vox b/assets/voxygen/voxel/npc/squirrel/male/foot_fr.vox new file mode 100644 index 0000000000000000000000000000000000000000..87a904a820c1c522fe40bcafb9595e812788bb56 GIT binary patch literal 1128 zcmW;K!L8Fk6a~=t5eqeH9h zr+yAM^g}=NLoxJTTj)a{`q1NOWbP#?L-c-VhvsRX=4qbA<7uAeX`bd;WS-_}p5|$u z^*4B$r+J#EdFEehp5|$u=4l?fB`L?^DW2k4Q@~RIv1vIaN%&$Pz)X~(en(R!83T&GM|{aN^@qW#?BKw!4o{e z6Fe>#Jx}liPw*I0^gO{6Ji+5OqUQ;o;0YMF7QF$(#o@$<@+Mcg$XQNul!NSLC-IP* zT;(EXImuBDvX`C2LvC`Fi=5>oM>)t|cH86e*lxGmcD-J=%jL42&*$xQI&H_}aXTCi O+kU^_cDtQ(BmM)LJ8en; literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/squirrel/male/head.vox b/assets/voxygen/voxel/npc/squirrel/male/head.vox index d7eed6248f109445fe6a5df63a58dea64039281a..2b9a82f3e820cb9c1f41166de6dd63cbf165ca75 100644 GIT binary patch delta 368 zcmX|+y-fr`6oYNQA>gM30(!U#2tZo#7a*OE6TMs)bU*=!HYkFCU?!u3<(muGk!6qd z{5<=6`h9lTKJBjFBt2X&kC5(9q~~RSb1^S`T>r6q*)Nwq+Pa0Jbc32Ox~Us3)o3Xj zE_p;|&I6|h7*x>lp&QXK+6;OI!=7}(RCM8sWjY3H;1Z@R8lG&CF>{oq)=+A=iUMFz z#qRmI$>b8T6W?3HbD%K@G(&J|4pRg|u(3QmBowBC<{paN(2YN9l%hd_kDu3^Z`OIV LZobyfyL$H@i$qa6 delta 282 zcmW-cy-hUqzU`?zPpr2EPx$NAPN!9Kp>pW z)*v|S!8Se*5yrzEgz%@2P3h4}cBm#4OgYBX;L>R1(u0Pu;mG)NG7MJfVo1`Xyfu_s mHm4phZ?Dg*<@5uV9;f)?Jb~-MtC)X0-H-jFM)>-fXa57*cRL9H diff --git a/assets/voxygen/voxel/npc/squirrel/male/tail.vox b/assets/voxygen/voxel/npc/squirrel/male/tail.vox index dd2a53444bdc7c7f54937f86ffc39aaf021ecfc9..593e3d138e499e7afd32e9391c7df9a4876e375d 100644 GIT binary patch delta 102 zcmdnNd50q)%s)b58Uq7^ucN0QkYey)VPFXMjB@1xae#mkh?#+y35X*iqdX;mGzhRl ls22=Oj6lrr0;mv(8DDH%bBBqY;s5{t4FAt;?q}9y1OQk<6yX2> delta 195 zcmXYqJqiLr4254ZKf8iQ5VWi}(CPdT~Q7s~#ST@Hh8mdSr0wa>9 ts<;XowEp_Q92OjS27<@|mtjYERD~vr!k>zg=W)=cUr#@Ih1b%}eH9h zr+yAM^g}=NLoxJTTj)a{`q1NOWbP#?L-c-VhvsRX=4qbA<7uAeX`bd;WS-_}p5|$u z^*4B$r+J#EdFEehp5|$u=4l?fB`L?^DW2k4Q@~RIv1vIaN%&$Pz)X~(en(R!83T&GM|{aN^@qW#?BKw!4o{e z6Fe>#Jx}liPw*I0^gO{6Ji+5OqUQ;o;0YMF7QF$(#o@$<@+Mcg$XQNul!NSLC-IP* zT;(EXImuBDvX`C2LvC`Fi=5>oM>)t|cH86e*lxGmcD-J=%jL42&*$xQI&H_}aXTCi O+kU^_cDtQ(BmM)LJ8en; literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/turtle/male/foot_br.vox b/assets/voxygen/voxel/npc/turtle/male/foot_br.vox new file mode 100644 index 0000000000000000000000000000000000000000..87a904a820c1c522fe40bcafb9595e812788bb56 GIT binary patch literal 1128 zcmW;K!L8Fk6a~=t5eqeH9h zr+yAM^g}=NLoxJTTj)a{`q1NOWbP#?L-c-VhvsRX=4qbA<7uAeX`bd;WS-_}p5|$u z^*4B$r+J#EdFEehp5|$u=4l?fB`L?^DW2k4Q@~RIv1vIaN%&$Pz)X~(en(R!83T&GM|{aN^@qW#?BKw!4o{e z6Fe>#Jx}liPw*I0^gO{6Ji+5OqUQ;o;0YMF7QF$(#o@$<@+Mcg$XQNul!NSLC-IP* zT;(EXImuBDvX`C2LvC`Fi=5>oM>)t|cH86e*lxGmcD-J=%jL42&*$xQI&H_}aXTCi O+kU^_cDtQ(BmM)LJ8en; literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/turtle/male/foot_fl.vox b/assets/voxygen/voxel/npc/turtle/male/foot_fl.vox new file mode 100644 index 0000000000000000000000000000000000000000..87a904a820c1c522fe40bcafb9595e812788bb56 GIT binary patch literal 1128 zcmW;K!L8Fk6a~=t5eqeH9h zr+yAM^g}=NLoxJTTj)a{`q1NOWbP#?L-c-VhvsRX=4qbA<7uAeX`bd;WS-_}p5|$u z^*4B$r+J#EdFEehp5|$u=4l?fB`L?^DW2k4Q@~RIv1vIaN%&$Pz)X~(en(R!83T&GM|{aN^@qW#?BKw!4o{e z6Fe>#Jx}liPw*I0^gO{6Ji+5OqUQ;o;0YMF7QF$(#o@$<@+Mcg$XQNul!NSLC-IP* zT;(EXImuBDvX`C2LvC`Fi=5>oM>)t|cH86e*lxGmcD-J=%jL42&*$xQI&H_}aXTCi O+kU^_cDtQ(BmM)LJ8en; literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/turtle/male/foot_fr.vox b/assets/voxygen/voxel/npc/turtle/male/foot_fr.vox new file mode 100644 index 0000000000000000000000000000000000000000..87a904a820c1c522fe40bcafb9595e812788bb56 GIT binary patch literal 1128 zcmW;K!L8Fk6a~=t5eqeH9h zr+yAM^g}=NLoxJTTj)a{`q1NOWbP#?L-c-VhvsRX=4qbA<7uAeX`bd;WS-_}p5|$u z^*4B$r+J#EdFEehp5|$u=4l?fB`L?^DW2k4Q@~RIv1vIaN%&$Pz)X~(en(R!83T&GM|{aN^@qW#?BKw!4o{e z6Fe>#Jx}liPw*I0^gO{6Ji+5OqUQ;o;0YMF7QF$(#o@$<@+Mcg$XQNul!NSLC-IP* zT;(EXImuBDvX`C2LvC`Fi=5>oM>)t|cH86e*lxGmcD-J=%jL42&*$xQI&H_}aXTCi O+kU^_cDtQ(BmM)LJ8en; literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/quadruped_small_central_manifest.ron b/assets/voxygen/voxel/quadruped_small_central_manifest.ron index d1d5628738..d8fdc201fe 100644 --- a/assets/voxygen/voxel/quadruped_small_central_manifest.ron +++ b/assets/voxygen/voxel/quadruped_small_central_manifest.ron @@ -462,4 +462,172 @@ central: ("armor.empty"), ), ), + (Rat, Male):( + head: ( + offset: (-3.5, 0.0, -3.0), + central: ("npc.frog.male.head"), + ), + chest: ( + offset: (-3.5, -5.0, -3.0), + central: ("npc.frog.male.chest"), + ), + tail: ( + offset: (0.0, 0.0, 0.0), + central: ("armor.empty"), + ), + ), + (Rat, Female):( + head: ( + offset: (-3.5, 0.0, -3.0), + central: ("npc.frog.male.head"), + ), + chest: ( + offset: (-3.5, -5.0, -3.0), + central: ("npc.frog.male.chest"), + ), + tail: ( + offset: (0.0, 0.0, 0.0), + central: ("armor.empty"), + ), + ), + (Axolotl, Male):( + head: ( + offset: (-3.5, 0.0, -3.0), + central: ("npc.frog.male.head"), + ), + chest: ( + offset: (-3.5, -5.0, -3.0), + central: ("npc.frog.male.chest"), + ), + tail: ( + offset: (0.0, 0.0, 0.0), + central: ("armor.empty"), + ), + ), + (Axolotl, Female):( + head: ( + offset: (-3.5, 0.0, -3.0), + central: ("npc.frog.male.head"), + ), + chest: ( + offset: (-3.5, -5.0, -3.0), + central: ("npc.frog.male.chest"), + ), + tail: ( + offset: (0.0, 0.0, 0.0), + central: ("armor.empty"), + ), + ), + (Gecko, Male):( + head: ( + offset: (-3.5, 0.0, -3.0), + central: ("npc.frog.male.head"), + ), + chest: ( + offset: (-3.5, -5.0, -3.0), + central: ("npc.frog.male.chest"), + ), + tail: ( + offset: (0.0, 0.0, 0.0), + central: ("armor.empty"), + ), + ), + (Gecko, Female):( + head: ( + offset: (-3.5, 0.0, -3.0), + central: ("npc.frog.male.head"), + ), + chest: ( + offset: (-3.5, -5.0, -3.0), + central: ("npc.gecko.male.chest"), + ), + tail: ( + offset: (0.0, 0.0, 0.0), + central: ("armor.empty"), + ), + ), + (Turtle, Male):( + head: ( + offset: (-3.5, 0.0, -3.0), + central: ("npc.turtle.male.head"), + ), + chest: ( + offset: (-3.5, -5.0, -3.0), + central: ("npc.turtle.male.chest"), + ), + tail: ( + offset: (0.0, 0.0, 0.0), + central: ("armor.empty"), + ), + ), + (Turtle, Female):( + head: ( + offset: (-3.5, 0.0, -3.0), + central: ("npc.turtle.male.head"), + ), + chest: ( + offset: (-3.5, -5.0, -3.0), + central: ("npc.turtle.male.chest"), + ), + tail: ( + offset: (0.0, 0.0, 0.0), + central: ("armor.empty"), + ), + ), + (Squirrel, Male):( + head: ( + offset: (-3.5, 0.0, -3.0), + central: ("npc.squirrel.male.head"), + ), + chest: ( + offset: (-3.5, -5.0, -3.0), + central: ("npc.squirrel.male.chest"), + ), + tail: ( + offset: (0.0, 0.0, 0.0), + central: ("armor.empty"), + ), + ), + (Squirrel, Female):( + head: ( + offset: (-3.5, 0.0, -3.0), + central: ("npc.squirrel.male.head"), + ), + chest: ( + offset: (-3.5, -5.0, -3.0), + central: ("npc.squirrel.male.chest"), + ), + tail: ( + offset: (0.0, 0.0, 0.0), + central: ("armor.empty"), + ), + ), + (Fungome, Male):( + head: ( + offset: (-3.5, 0.0, -3.0), + central: ("npc.fungome.male.head"), + ), + chest: ( + offset: (-3.5, -5.0, -3.0), + central: ("npc.fungome.male.chest"), + ), + tail: ( + offset: (0.0, 0.0, 0.0), + central: ("armor.empty"), + ), + ), + (Fungome, Female):( + head: ( + offset: (-3.5, 0.0, -3.0), + central: ("npc.fungome.male.head"), + ), + chest: ( + offset: (-3.5, -5.0, -3.0), + central: ("npc.fungome.male.chest"), + ), + tail: ( + offset: (0.0, 0.0, 0.0), + 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 d89037e22b..2d2399e6c0 100644 --- a/assets/voxygen/voxel/quadruped_small_lateral_manifest.ron +++ b/assets/voxygen/voxel/quadruped_small_lateral_manifest.ron @@ -575,7 +575,6 @@ lateral: ("npc.frog.male.foot_br"), ), ), - (Frog, Female): ( left_front: ( offset: (-2.5, -2.5, -4.0), @@ -594,4 +593,220 @@ lateral: ("npc.frog.male.foot_br"), ), ), + (Rat, Male): ( + left_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.rat.male.foot_fl"), + ), + right_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.rat.male.foot_fr"), + ), + left_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.rat.male.foot_bl"), + ), + right_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.rat.male.foot_br"), + ), + ), + (Rat, Female): ( + left_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.rat.male.foot_fl"), + ), + right_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.rat.male.foot_fr"), + ), + left_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.rat.male.foot_bl"), + ), + right_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.rat.male.foot_br"), + ), + ), + (Axolotl, Male): ( + left_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.axolotl.male.foot_fl"), + ), + right_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.axolotl.male.foot_fr"), + ), + left_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.axolotl.male.foot_bl"), + ), + right_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.axolotl.male.foot_br"), + ), + ), + (Axolotl, Female): ( + left_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.axolotl.male.foot_fl"), + ), + right_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.axolotl.male.foot_fr"), + ), + left_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.axolotl.male.foot_bl"), + ), + right_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.axolotl.male.foot_br"), + ), + ), + (Gecko, Male): ( + left_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.gecko.male.foot_fl"), + ), + right_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.gecko.male.foot_fr"), + ), + left_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.gecko.male.foot_bl"), + ), + right_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.gecko.male.foot_br"), + ), + ), + (Gecko, Female): ( + left_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.gecko.male.foot_fl"), + ), + right_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.gecko.male.foot_fr"), + ), + left_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.gecko.male.foot_bl"), + ), + right_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.gecko.male.foot_br"), + ), + ), + (Turtle, Male): ( + left_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.turtle.male.foot_fl"), + ), + right_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.turtle.male.foot_fr"), + ), + left_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.turtle.male.foot_bl"), + ), + right_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.turtle.male.foot_br"), + ), + ), + (Turtle, Female): ( + left_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.turtle.male.foot_fl"), + ), + right_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.turtle.male.foot_fr"), + ), + left_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.turtle.male.foot_bl"), + ), + right_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.turtle.male.foot_br"), + ), + ), + (Squirrel, Male): ( + left_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.squirrel.male.foot_fl"), + ), + right_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.squirrel.male.foot_fr"), + ), + left_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.squirrel.male.foot_bl"), + ), + right_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.squirrel.male.foot_br"), + ), + ), + (Squirrel, Female): ( + left_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.squirrel.male.foot_fl"), + ), + right_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.squirrel.male.foot_fr"), + ), + left_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.squirrel.male.foot_bl"), + ), + right_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.squirrel.male.foot_br"), + ), + ), + (Fungome, Male): ( + left_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.fungome.male.foot_fl"), + ), + right_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.fungome.male.foot_fr"), + ), + left_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.fungome.male.foot_bl"), + ), + right_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.fungome.male.foot_br"), + ), + ), + (Fungome, Female): ( + left_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.fungome.male.foot_fl"), + ), + right_front: ( + offset: (-2.5, -2.5, -4.0), + lateral: ("npc.fungome.male.foot_fr"), + ), + left_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.fungome.male.foot_bl"), + ), + right_back: ( + offset: (-2.5, -3.5, -4.0), + lateral: ("npc.fungome.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 new file mode 100644 index 0000000000..1b21ef0838 --- /dev/null +++ b/assets/voxygen/voxel/theropod_central_manifest.ron @@ -0,0 +1,122 @@ +({ + (Archaeos, Male): ( + head: ( + offset: (-4.5, 0.0, -5.0), + central: ("npc.archaeos.male.head"), + ), + jaw: ( + offset: (-4.5, -9.0, -3.0), + central: ("npc.archaeos.male.jaw"), + ), + neck: ( + offset: (-4.5, 0.0, -3.0), + central: ("npc.archaeos.male.neck"), + ), + chest_front: ( + offset: (-7.5, -5.5, -7.0), + central: ("npc.archaeos.male.chest_front"), + ), + chest_back: ( + offset: (-4.5, -9.0, -7.0), + central: ("npc.archaeos.male.chest_back"), + ), + tail_front: ( + offset: (-3.5, -8.0, -3.5), + central: ("npc.archaeos.male.tail_front"), + ), + tail_back: ( + offset: (-7.5, -11.0, -3.0), + central: ("npc.archaeos.male.tail_back"), + ), + ), + (Archaeos, Female): ( + head: ( + offset: (-4.5, 0.0, -5.0), + central: ("npc.archaeos.male.head"), + ), + jaw: ( + offset: (-4.5, -9.0, -3.0), + central: ("npc.archaeos.male.jaw"), + ), + neck: ( + offset: (-4.5, 0.0, -3.0), + central: ("npc.archaeos.male.neck"), + ), + chest_front: ( + offset: (-7.5, -5.5, -7.0), + central: ("npc.archaeos.male.chest_front"), + ), + chest_back: ( + offset: (-4.5, -9.0, -7.0), + central: ("npc.archaeos.male.chest_back"), + ), + tail_front: ( + offset: (-3.5, -8.0, -3.5), + central: ("npc.archaeos.male.tail_front"), + ), + tail_back: ( + offset: (-7.5, -11.0, -3.0), + central: ("npc.archaeos.male.tail_back"), + ), + ), + (Odontotyrannos, Male): ( + head: ( + offset: (-4.5, -4.0, -4.0), + central: ("npc.rat.male.head"), + ), + jaw: ( + offset: (-4.5, -6.0, -4.0), + central: ("npc.rat.male.chest"), + ), + neck: ( + offset: (-4.0, -1.5, -1.0), + central: ("npc.rat.male.chest"), + ), + chest_front: ( + offset: (-4.0, -1.5, -1.0), + central: ("npc.rat.male.chest"), + ), + chest_back: ( + offset: (-4.0, -1.5, -1.0), + central: ("npc.rat.male.chest"), + ), + tail_front: ( + offset: (-0.5, -4.0, -1.5), + central: ("npc.rat.male.chest"), + ), + tail_back: ( + offset: (-0.5, -4.0, -1.5), + central: ("npc.rat.male.chest"), + ), + ), + (Odontotyrannos, Female): ( + head: ( + offset: (-4.5, -4.0, -4.0), + central: ("npc.rat.male.head"), + ), + jaw: ( + offset: (-4.5, -6.0, -4.0), + central: ("npc.rat.male.chest"), + ), + neck: ( + offset: (-4.0, -1.5, -1.0), + central: ("npc.rat.male.chest"), + ), + chest_front: ( + offset: (-4.0, -1.5, -1.0), + central: ("npc.rat.male.chest"), + ), + chest_back: ( + offset: (-4.0, -1.5, -1.0), + central: ("npc.rat.male.chest"), + ), + tail_front: ( + offset: (-0.5, -4.0, -1.5), + central: ("npc.rat.male.chest"), + ), + tail_back: ( + offset: (-0.5, -4.0, -1.5), + central: ("npc.rat.male.chest"), + ), + ), +}) diff --git a/assets/voxygen/voxel/theropod_lateral_manifest.ron b/assets/voxygen/voxel/theropod_lateral_manifest.ron new file mode 100644 index 0000000000..67e48db670 --- /dev/null +++ b/assets/voxygen/voxel/theropod_lateral_manifest.ron @@ -0,0 +1,106 @@ +({ + (Archaeos, Male): ( + hand_l: ( + offset: (-4.0, 2.0, -9.0), + lateral: ("npc.archaeos.male.hand_l"), + ), + hand_r: ( + offset: (0.0, -2.0, -4.0), + lateral: ("npc.archaeos.male.hand_r"), + ), + leg_l: ( + offset: (-6.0, -4.5, -8.0), + lateral: ("npc.archaeos.male.leg_l"), + ), + leg_r: ( + offset: (0.0, -4.5, -8.0), + lateral: ("npc.archaeos.male.leg_r"), + ), + foot_l: ( + offset: (-11.0, -1.0, -8.0), + lateral: ("npc.archaeos.male.foot_l"), + ), + foot_r: ( + offset: (0.0, -1.0, -8.0), + lateral: ("npc.archaeos.male.foot_r"), + ), + ), + (Archaeos, Female): ( + hand_l: ( + offset: (-4.0, 2.0, -9.0), + lateral: ("npc.archaeos.male.hand_l"), + ), + hand_r: ( + offset: (0.0, -2.0, -4.0), + lateral: ("npc.archaeos.male.hand_r"), + ), + leg_l: ( + offset: (-6.0, -4.5, -8.0), + lateral: ("npc.archaeos.male.leg_l"), + ), + leg_r: ( + offset: (0.0, -4.5, -8.0), + lateral: ("npc.archaeos.male.leg_r"), + ), + foot_l: ( + offset: (-11.0, -1.0, -8.0), + lateral: ("npc.archaeos.male.foot_l"), + ), + foot_r: ( + offset: (0.0, -1.0, -8.0), + lateral: ("npc.archaeos.male.foot_r"), + ), + ), + (Odontotyrannos, Male): ( + hand_l: ( + offset: (-6.0, -3.5, -4.0), + lateral: ("npc.ogre.male.shoulder_l"), + ), + hand_r: ( + offset: (-6.0, -4.5, -4.0), + lateral: ("npc.ogre.male.shoulder_r"), + ), + leg_l: ( + offset: (-6.0, -3.5, -4.0), + lateral: ("npc.ogre.male.shoulder_l"), + ), + leg_r: ( + offset: (-6.0, -4.5, -4.0), + lateral: ("npc.ogre.male.shoulder_r"), + ), + foot_l: ( + offset: (-6.0, -3.5, -4.0), + lateral: ("npc.ogre.male.shoulder_l"), + ), + foot_r: ( + offset: (-6.0, -4.5, -4.0), + lateral: ("npc.ogre.male.shoulder_r"), + ), + ), + (Odontotyrannos, Female): ( + hand_l: ( + offset: (-6.0, -3.5, -4.0), + lateral: ("npc.ogre.male.shoulder_l"), + ), + hand_r: ( + offset: (-6.0, -4.5, -4.0), + lateral: ("npc.ogre.male.shoulder_r"), + ), + leg_l: ( + offset: (-6.0, -3.5, -4.0), + lateral: ("npc.ogre.male.shoulder_l"), + ), + leg_r: ( + offset: (-6.0, -4.5, -4.0), + lateral: ("npc.ogre.male.shoulder_r"), + ), + foot_l: ( + offset: (-6.0, -3.5, -4.0), + lateral: ("npc.ogre.male.shoulder_l"), + ), + foot_r: ( + offset: (-6.0, -4.5, -4.0), + lateral: ("npc.ogre.male.shoulder_r"), + ), + ), +}) diff --git a/common/src/comp/agent.rs b/common/src/comp/agent.rs index 218d12240d..1fc7b53371 100644 --- a/common/src/comp/agent.rs +++ b/common/src/comp/agent.rs @@ -1,5 +1,5 @@ use crate::{ - comp::{critter, humanoid, quadruped_low, quadruped_medium, quadruped_small, Body}, + comp::{humanoid, quadruped_low, quadruped_medium, quadruped_small, theropod, Body}, path::Chaser, sync::Uid, }; @@ -97,6 +97,7 @@ impl<'a> From<&'a Body> for Psyche { quadruped_small::Species::Rabbit => 0.1, quadruped_small::Species::Truffler => 0.8, quadruped_small::Species::Frog => 0.6, + _ => 1.0, }, Body::QuadrupedMedium(quadruped_medium) => match quadruped_medium.species { quadruped_medium::Species::Tuskram => 0.8, @@ -123,10 +124,7 @@ impl<'a> From<&'a Body> for Psyche { Body::BipedLarge(_) => 1.0, Body::Object(_) => 1.0, Body::Golem(_) => 1.0, - Body::Critter(critter) => match critter.species { - critter::Species::Axolotl => 1.0, - critter::Species::Turtle => 1.0, - critter::Species::Fungome => 1.0, + Body::Theropod(theropod) => match theropod.species { _ => 0.4, }, Body::Dragon(_) => 1.0, diff --git a/common/src/comp/body.rs b/common/src/comp/body.rs index ce9895893a..986bc6647d 100644 --- a/common/src/comp/body.rs +++ b/common/src/comp/body.rs @@ -1,7 +1,6 @@ pub mod biped_large; pub mod bird_medium; pub mod bird_small; -pub mod critter; pub mod dragon; pub mod fish_medium; pub mod fish_small; @@ -11,6 +10,7 @@ pub mod object; pub mod quadruped_low; pub mod quadruped_medium; pub mod quadruped_small; +pub mod theropod; use crate::{ assets::{self, Asset}, @@ -39,7 +39,7 @@ make_case_elim!( BipedLarge(body: biped_large::Body)= 8, Object(body: object::Body) = 9, Golem(body: golem::Body) = 10, - Critter(body: critter::Body) = 11, + Theropod(body: theropod::Body) = 11, QuadrupedLow(body: quadruped_low::Body) = 12, } ); @@ -72,7 +72,7 @@ pub struct AllBodies { pub biped_large: BodyData>, pub object: BodyData, pub golem: BodyData>, - pub critter: BodyData>, + pub theropod: BodyData>, pub quadruped_low: BodyData>, } @@ -89,7 +89,7 @@ impl core::ops::Index for AllBodies &self.bird_medium.body, NpcKind::Ogre => &self.biped_large.body, NpcKind::StoneGolem => &self.golem.body, - NpcKind::Rat => &self.critter.body, + NpcKind::Archaeos => &self.theropod.body, NpcKind::Reddragon => &self.dragon.body, NpcKind::Crocodile => &self.quadruped_low.body, } @@ -114,7 +114,7 @@ impl<'a, BodyMeta, SpeciesMeta> core::ops::Index<&'a Body> for AllBodies &self.biped_large.body, Body::Object(_) => &self.object.body, Body::Golem(_) => &self.golem.body, - Body::Critter(_) => &self.critter.body, + Body::Theropod(_) => &self.theropod.body, Body::QuadrupedLow(_) => &self.quadruped_low.body, } } @@ -158,7 +158,7 @@ impl Body { quadruped_low::Species::Pangolin => 1.3, _ => 1.6, }, - Body::Critter(_) => 0.3, + Body::Theropod(_) => 0.3, Body::BirdMedium(_) => 0.35, Body::FishMedium(_) => 0.35, Body::Dragon(_) => 8.0, @@ -198,7 +198,7 @@ impl Body { quadruped_low::Species::Maneater => 4.0, _ => 1.3, }, - Body::Critter(_) => 0.7, + Body::Theropod(_) => 0.7, Body::BirdMedium(body) => match body.species { bird_medium::Species::Cockatrice => 1.8, _ => 1.1, @@ -264,7 +264,7 @@ impl Body { }, Body::Object(_) => 10000, Body::Golem(_) => 1500, - Body::Critter(_) => 50, + Body::Theropod(_) => 50, Body::QuadrupedLow(quadruped_low) => match quadruped_low.species { quadruped_low::Species::Crocodile => 600, quadruped_low::Species::Alligator => 600, @@ -331,7 +331,7 @@ impl Body { }, Body::Object(_) => 10, Body::Golem(_) => 150, - Body::Critter(_) => 20, + Body::Theropod(_) => 20, Body::QuadrupedLow(quadruped_low) => match quadruped_low.species { quadruped_low::Species::Crocodile => 20, quadruped_low::Species::Alligator => 20, @@ -396,7 +396,7 @@ impl Body { }, Body::Object(_) => 1, Body::Golem(_) => 75, - Body::Critter(_) => 2, + Body::Theropod(_) => 2, Body::QuadrupedLow(quadruped_low) => match quadruped_low.species { quadruped_low::Species::Crocodile => 10, quadruped_low::Species::Alligator => 10, @@ -426,7 +426,7 @@ impl Body { Body::BipedLarge(_) => 2, Body::Object(_) => 0, Body::Golem(_) => 5, - Body::Critter(_) => 1, + Body::Theropod(_) => 1, Body::QuadrupedLow(_) => 1, } } @@ -473,7 +473,7 @@ impl Body { }, Body::Object(_) => 0, Body::Golem(_) => 250, - Body::Critter(_) => 10, + Body::Theropod(_) => 10, Body::QuadrupedLow(quadruped_low) => match quadruped_low.species { quadruped_low::Species::Crocodile => 50, quadruped_low::Species::Alligator => 50, @@ -502,7 +502,7 @@ impl Body { Body::BipedLarge(_) => 10.0, Body::Object(_) => 3.0, Body::Golem(_) => 7.5, - Body::Critter(_) => 3.0, + Body::Theropod(_) => 3.0, Body::QuadrupedLow(_) => 4.5, } } diff --git a/common/src/comp/body/quadruped_small.rs b/common/src/comp/body/quadruped_small.rs index b0829352f6..7844997cf3 100644 --- a/common/src/comp/body/quadruped_small.rs +++ b/common/src/comp/body/quadruped_small.rs @@ -29,29 +29,32 @@ impl From for super::Body { fn from(body: Body) -> Self { super::Body::QuadrupedSmall(body) } } -make_case_elim!( - species, - #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] - #[repr(u32)] - pub enum Species { - Pig = 0, - Fox = 1, - Sheep = 2, - Boar = 3, - Jackalope = 4, - Skunk = 5, - Cat = 6, - Batfox = 7, - Raccoon = 8, - Quokka = 9, - Dodarock = 10, - Holladon = 11, - Hyena = 12, - Rabbit = 13, - Truffler = 14, - Frog = 15, - } -); +#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[repr(u32)] +pub enum Species { + Pig = 0, + Fox = 1, + Sheep = 2, + Boar = 3, + Jackalope = 4, + Skunk = 5, + Cat = 6, + Batfox = 7, + Raccoon = 8, + Quokka = 9, + Dodarock = 10, + Holladon = 11, + Hyena = 12, + Rabbit = 13, + Truffler = 14, + Frog = 15, + Rat = 16, + Axolotl = 17, + Gecko = 18, + Turtle = 19, + Squirrel = 20, + Fungome = 21, +} /// Data representing per-species generic data. /// @@ -74,6 +77,12 @@ pub struct AllSpecies { pub rabbit: SpeciesMeta, pub truffler: SpeciesMeta, pub frog: SpeciesMeta, + pub rat: SpeciesMeta, + pub axolotl: SpeciesMeta, + pub gecko: SpeciesMeta, + pub turtle: SpeciesMeta, + pub squirrel: SpeciesMeta, + pub fungome: SpeciesMeta, } impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies { @@ -98,11 +107,17 @@ impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies Species::Rabbit => &self.rabbit, Species::Truffler => &self.truffler, Species::Frog => &self.frog, + Species::Rat => &self.rat, + Species::Axolotl => &self.axolotl, + Species::Gecko => &self.gecko, + Species::Turtle => &self.turtle, + Species::Squirrel => &self.squirrel, + Species::Fungome => &self.fungome, } } } -pub const ALL_SPECIES: [Species; 16] = [ +pub const ALL_SPECIES: [Species; 22] = [ Species::Pig, Species::Fox, Species::Sheep, @@ -119,6 +134,12 @@ pub const ALL_SPECIES: [Species; 16] = [ Species::Rabbit, Species::Truffler, Species::Frog, + Species::Rat, + Species::Axolotl, + Species::Gecko, + Species::Turtle, + Species::Squirrel, + Species::Fungome, ]; 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 cee07dd02d..446034a128 100644 --- a/common/src/comp/body/theropod.rs +++ b/common/src/comp/body/theropod.rs @@ -22,7 +22,7 @@ impl Body { } impl From for super::Body { - fn from(body: Body) -> Self { super::Body::Critter(body) } + fn from(body: Body) -> Self { super::Body::Theropod(body) } } #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] @@ -30,7 +30,6 @@ impl From for super::Body { pub enum Species { Archaeos = 0, Odontotyrannos = 1, - } /// Data representing per-species generic data. @@ -52,10 +51,7 @@ impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies } } -pub const ALL_SPECIES: [Species; 2] = [ - Species::Archaeos, - Species::Odontotyrannos, -]; +pub const ALL_SPECIES: [Species; 2] = [Species::Archaeos, Species::Odontotyrannos]; impl<'a, SpeciesMeta: 'a> IntoIterator for &'a AllSpecies { type IntoIter = std::iter::Copied>; diff --git a/common/src/comp/mod.rs b/common/src/comp/mod.rs index 6deb364dff..322d5025e7 100644 --- a/common/src/comp/mod.rs +++ b/common/src/comp/mod.rs @@ -25,8 +25,8 @@ pub use ability::{CharacterAbility, CharacterAbilityType, ItemConfig, Loadout}; pub use admin::{Admin, AdminList}; pub use agent::{Agent, Alignment}; pub use body::{ - biped_large, bird_medium, bird_small, critter, dragon, fish_medium, fish_small, golem, - humanoid, object, quadruped_low, quadruped_medium, quadruped_small, AllBodies, Body, BodyData, + biped_large, bird_medium, bird_small, dragon, fish_medium, fish_small, golem, humanoid, object, + quadruped_low, quadruped_medium, quadruped_small, theropod, AllBodies, Body, BodyData, }; pub use character_state::{Attacking, CharacterState, StateUpdate}; pub use chat::{ diff --git a/common/src/generation.rs b/common/src/generation.rs index e5d19437ab..65a70e6bf8 100644 --- a/common/src/generation.rs +++ b/common/src/generation.rs @@ -110,7 +110,7 @@ impl EntityInfo { Some(get_npc_name(&NPC_NAMES.quadruped_medium, body.species)) }, Body::BirdMedium(body) => Some(get_npc_name(&NPC_NAMES.bird_medium, body.species)), - Body::Critter(body) => Some(get_npc_name(&NPC_NAMES.critter, body.species)), + Body::Theropod(body) => Some(get_npc_name(&NPC_NAMES.theropod, body.species)), Body::QuadrupedSmall(body) => { Some(get_npc_name(&NPC_NAMES.quadruped_small, body.species)) }, diff --git a/common/src/loadout_builder.rs b/common/src/loadout_builder.rs index da149f4458..6ce34b0e8e 100644 --- a/common/src/loadout_builder.rs +++ b/common/src/loadout_builder.rs @@ -55,7 +55,7 @@ impl LoadoutBuilder { .lantern(Some(Item::new_from_asset_expect( "common.items.armor.starter.lantern", ))) - .glider(Some(assets::load_expect_cloned( + .glider(Some(ItemAsset::load_expect_cloned( "common.items.armor.starter.glider", ))) } diff --git a/common/src/npc.rs b/common/src/npc.rs index 815aa1e35f..881aea55fa 100644 --- a/common/src/npc.rs +++ b/common/src/npc.rs @@ -14,7 +14,7 @@ pub enum NpcKind { Pig, Duck, Ogre, - Rat, + Archaeos, StoneGolem, Reddragon, Crocodile, @@ -26,7 +26,7 @@ pub const ALL_NPCS: [NpcKind; 9] = [ NpcKind::Pig, NpcKind::Duck, NpcKind::Ogre, - NpcKind::Rat, + NpcKind::Archaeos, NpcKind::StoneGolem, NpcKind::Reddragon, NpcKind::Crocodile, @@ -94,7 +94,7 @@ pub fn kind_to_body(kind: NpcKind) -> Body { NpcKind::Wolf => comp::quadruped_medium::Body::random().into(), NpcKind::Duck => comp::bird_medium::Body::random().into(), NpcKind::Ogre => comp::biped_large::Body::random().into(), - NpcKind::Rat => comp::critter::Body::random().into(), + NpcKind::Archaeos => comp::theropod::Body::random().into(), NpcKind::StoneGolem => comp::golem::Body::random().into(), NpcKind::Reddragon => comp::dragon::Body::random().into(), NpcKind::Crocodile => comp::quadruped_low::Body::random().into(), @@ -206,9 +206,9 @@ impl NpcBody { .or_else(|| { parse( s, - NpcKind::Rat, - &npc_names.critter, - comp::critter::Body::random_with, + NpcKind::Archaeos, + &npc_names.theropod, + comp::theropod::Body::random_with, ) }) .or_else(|| { diff --git a/common/src/states/utils.rs b/common/src/states/utils.rs index 579b1becb8..02cd6ebfd4 100644 --- a/common/src/states/utils.rs +++ b/common/src/states/utils.rs @@ -41,7 +41,7 @@ impl Body { Body::BipedLarge(_) => 75.0, Body::Object(_) => 40.0, Body::Golem(_) => 60.0, - Body::Critter(_) => 85.0, + Body::Theropod(_) => 85.0, Body::QuadrupedLow(_) => 120.0, } } @@ -59,7 +59,7 @@ impl Body { Body::BipedLarge(_) => 12.0, Body::Object(_) => 5.0, Body::Golem(_) => 8.0, - Body::Critter(_) => 35.0, + Body::Theropod(_) => 35.0, Body::QuadrupedLow(_) => 12.0, } } diff --git a/server/src/events/entity_manipulation.rs b/server/src/events/entity_manipulation.rs index b499b3dd6f..cef530ce5d 100644 --- a/server/src/events/entity_manipulation.rs +++ b/server/src/events/entity_manipulation.rs @@ -317,9 +317,7 @@ pub fn handle_destroy(server: &mut Server, entity: EcsEntity, cause: HealthSourc 7 => "common.loot_tables.loot_table_weapon_rare", _ => "common.loot_tables.loot_table", }, - Some(common::comp::Body::Critter(_)) => { - "common.loot_tables.loot_table_animal_parts" - }, + Some(common::comp::Body::Theropod(_)) => "common.loot_tables.loot_table_animal_parts", Some(common::comp::Body::Dragon(_)) => "common.loot_tables.loot_table_weapon_rare", Some(common::comp::Body::QuadrupedLow(_)) => match rng.gen_range(0, 3) { 0 => "common.loot_tables.loot_table_food", diff --git a/voxygen/src/anim/src/critter/idle.rs b/voxygen/src/anim/src/critter/idle.rs deleted file mode 100644 index 192a89cab0..0000000000 --- a/voxygen/src/anim/src/critter/idle.rs +++ /dev/null @@ -1,68 +0,0 @@ -use super::{super::Animation, CritterAttr, CritterSkeleton}; -//use std::{f32::consts::PI, ops::Mul}; -use super::super::vek::*; -use std::{f32::consts::PI, ops::Mul}; - -pub struct IdleAnimation; - -impl Animation for IdleAnimation { - type Dependency = f64; - type Skeleton = CritterSkeleton; - - #[cfg(feature = "use-dyn-lib")] - const UPDATE_FN: &'static [u8] = b"critter_idle\0"; - - #[cfg_attr(feature = "be-dyn-lib", export_name = "critter_idle")] - fn update_skeleton_inner( - skeleton: &Self::Skeleton, - global_time: Self::Dependency, - anim_time: f64, - _rate: &mut f32, - skeleton_attr: &CritterAttr, - ) -> Self::Skeleton { - let mut next = (*skeleton).clone(); - - let wave = (anim_time as f32 * 10.0).sin(); - let wave_slow = (anim_time as f32 * 5.5 + PI).sin(); - - let rat_head_look = Vec2::new( - ((global_time + anim_time) as f32 / 3.0) - .floor() - .mul(7331.0) - .sin() - * 0.5, - ((global_time + anim_time) as f32 / 3.0) - .floor() - .mul(1337.0) - .sin() - * 0.25, - ); - next.head.position = Vec3::new(0.0, skeleton_attr.head.0, skeleton_attr.head.1); - next.head.orientation = Quaternion::rotation_z(rat_head_look.x) - * Quaternion::rotation_x(rat_head_look.y + wave * 0.03); - next.head.scale = Vec3::one(); - - next.chest.position = Vec3::new( - 0.0, - skeleton_attr.chest.0, - skeleton_attr.chest.1 + wave * 0.3, - ) / 18.0; - next.chest.orientation = Quaternion::rotation_y(wave_slow * 0.06); - next.chest.scale = Vec3::one() / 18.0; - - next.feet_f.position = Vec3::new(0.0, skeleton_attr.feet_f.0, skeleton_attr.feet_f.1); - next.feet_f.orientation = Quaternion::rotation_z(0.0); - next.feet_f.scale = Vec3::one(); - - next.feet_b.position = Vec3::new(0.0, skeleton_attr.feet_b.0, skeleton_attr.feet_b.1); - next.feet_b.orientation = Quaternion::rotation_x(0.0); - next.feet_b.scale = Vec3::one(); - - next.tail.position = - Vec3::new(0.0, skeleton_attr.tail.0 + wave * 0.2, skeleton_attr.tail.1); - next.tail.orientation = Quaternion::rotation_y(wave_slow * 0.05); - next.tail.scale = Vec3::one(); - - next - } -} diff --git a/voxygen/src/anim/src/critter/jump.rs b/voxygen/src/anim/src/critter/jump.rs deleted file mode 100644 index 7630744289..0000000000 --- a/voxygen/src/anim/src/critter/jump.rs +++ /dev/null @@ -1,48 +0,0 @@ -use super::{super::Animation, CritterAttr, CritterSkeleton}; -//use std::f32::consts::PI; -use super::super::vek::*; - -pub struct JumpAnimation; - -impl Animation for JumpAnimation { - type Dependency = (f32, f64); - type Skeleton = CritterSkeleton; - - #[cfg(feature = "use-dyn-lib")] - const UPDATE_FN: &'static [u8] = b"critter_jump\0"; - - #[cfg_attr(feature = "be-dyn-lib", export_name = "critter_jump")] - fn update_skeleton_inner( - skeleton: &Self::Skeleton, - _global_time: Self::Dependency, - _anim_time: f64, - _rate: &mut f32, - skeleton_attr: &CritterAttr, - ) -> Self::Skeleton { - let mut next = (*skeleton).clone(); - - let wave = (_anim_time as f32 * 1.0).sin(); - - next.head.position = Vec3::new(0.0, skeleton_attr.head.0, skeleton_attr.head.1); - next.head.orientation = Quaternion::rotation_z(0.8) * Quaternion::rotation_x(0.5); - next.head.scale = Vec3::one(); - - next.chest.position = Vec3::new(0.0, skeleton_attr.chest.0, skeleton_attr.chest.1) / 18.0; - next.chest.orientation = Quaternion::rotation_y(0.0); - next.chest.scale = Vec3::one() / 18.0; - - next.feet_f.position = Vec3::new(0.0, skeleton_attr.feet_f.0, skeleton_attr.feet_f.1); - next.feet_f.orientation = Quaternion::rotation_x(wave * 0.4); - next.feet_f.scale = Vec3::one(); - - next.feet_b.position = Vec3::new(0.0, skeleton_attr.feet_b.0, skeleton_attr.feet_b.1); - next.feet_b.orientation = Quaternion::rotation_x(wave * 0.4); - next.feet_b.scale = Vec3::one(); - - next.tail.position = Vec3::new(0.0, skeleton_attr.tail.0, skeleton_attr.tail.1); - next.tail.orientation = Quaternion::rotation_y(0.0); - next.tail.scale = Vec3::one(); - - next - } -} diff --git a/voxygen/src/anim/src/critter/mod.rs b/voxygen/src/anim/src/critter/mod.rs deleted file mode 100644 index f83461a23b..0000000000 --- a/voxygen/src/anim/src/critter/mod.rs +++ /dev/null @@ -1,136 +0,0 @@ -pub mod idle; -pub mod jump; -pub mod run; - -// Reexports -pub use self::{idle::IdleAnimation, jump::JumpAnimation, run::RunAnimation}; - -use super::{make_bone, vek::*, FigureBoneData, Skeleton}; -use common::comp::{self}; -use core::convert::TryFrom; - -pub type Body = comp::critter::Body; - -skeleton_impls!(struct CritterSkeleton { - + head, - + chest, - + feet_f, - + feet_b, - + tail, -}); - -pub struct CritterAttr { - head: (f32, f32), - chest: (f32, f32), - feet_f: (f32, f32), - feet_b: (f32, f32), - tail: (f32, f32), -} - -impl Skeleton for CritterSkeleton { - type Attr = CritterAttr; - type Body = Body; - - const BONE_COUNT: usize = 5; - #[cfg(feature = "use-dyn-lib")] - const COMPUTE_FN: &'static [u8] = b"critter_compute_mats\0"; - - #[cfg_attr(feature = "be-dyn-lib", export_name = "critter_compute_mats")] - - fn compute_matrices_inner( - &self, - base_mat: Mat4, - buf: &mut [FigureBoneData; super::MAX_BONE_COUNT], - ) -> Vec3 { - let chest_mat = base_mat * Mat4::::from(self.chest); - - *(<&mut [_; Self::BONE_COUNT]>::try_from(&mut buf[0..Self::BONE_COUNT]).unwrap()) = [ - make_bone(chest_mat * Mat4::::from(self.head)), - make_bone(chest_mat), - make_bone(chest_mat * Mat4::::from(self.feet_f)), - make_bone(chest_mat * Mat4::::from(self.feet_b)), - make_bone(chest_mat * Mat4::::from(self.tail)), - ]; - Vec3::default() - } -} - -impl<'a> std::convert::TryFrom<&'a comp::Body> for CritterAttr { - type Error = (); - - fn try_from(body: &'a comp::Body) -> Result { - match body { - comp::Body::Critter(body) => Ok(CritterAttr::from(body)), - _ => Err(()), - } - } -} - -impl CritterAttr { - #[allow(clippy::match_single_binding)] // TODO: Pending review in #587 - pub fn calculate_scale(body: &comp::critter::Body) -> f32 { - match (body.species, body.body_type) { - (_, _) => 0.0, - } - } -} - -impl Default for CritterAttr { - fn default() -> Self { - Self { - head: (0.0, 0.0), - chest: (0.0, 0.0), - feet_f: (0.0, 0.0), - feet_b: (0.0, 0.0), - tail: (0.0, 0.0), - } - } -} - -impl<'a> From<&'a Body> for CritterAttr { - fn from(body: &'a Body) -> Self { - use comp::critter::Species::*; - Self { - head: match (body.species, body.body_type) { - (Rat, _) => (6.5, 3.0), - (Axolotl, _) => (5.0, 1.0), - (Gecko, _) => (5.0, 0.0), - (Turtle, _) => (8.0, 3.0), - (Squirrel, _) => (5.0, 0.0), - (Fungome, _) => (4.0, 0.0), - }, - chest: match (body.species, body.body_type) { - (Rat, _) => (0.0, 6.0), - (Axolotl, _) => (-1.0, 3.0), - (Gecko, _) => (-2.0, 3.0), - (Turtle, _) => (0.0, 6.0), - (Squirrel, _) => (0.0, 3.0), - (Fungome, _) => (0.0, 5.0), - }, - feet_f: match (body.species, body.body_type) { - (Rat, _) => (2.0, -5.0), - (Axolotl, _) => (2.0, -5.0), - (Gecko, _) => (1.0, -2.0), - (Turtle, _) => (3.0, -5.0), - (Squirrel, _) => (1.0, -2.0), - (Fungome, _) => (1.0, -4.0), - }, - feet_b: match (body.species, body.body_type) { - (Rat, _) => (-2.0, -5.0), - (Axolotl, _) => (-2.0, -5.0), - (Gecko, _) => (-2.0, -2.0), - (Turtle, _) => (-2.0, -5.0), - (Squirrel, _) => (-1.0, -2.0), - (Fungome, _) => (-2.0, -4.0), - }, - tail: match (body.species, body.body_type) { - (Rat, _) => (-8.0, -1.0), - (Axolotl, _) => (-7.0, -1.0), - (Gecko, _) => (-6.5, -2.0), - (Turtle, _) => (-6.0, 0.0), - (Squirrel, _) => (-3.0, 0.0), - (Fungome, _) => (-6.0, -1.0), - }, - } - } -} diff --git a/voxygen/src/anim/src/critter/run.rs b/voxygen/src/anim/src/critter/run.rs deleted file mode 100644 index 2f342e28bd..0000000000 --- a/voxygen/src/anim/src/critter/run.rs +++ /dev/null @@ -1,59 +0,0 @@ -use super::{super::Animation, CritterAttr, CritterSkeleton}; -//use std::{f32::consts::PI, ops::Mul}; -use super::super::vek::*; -use std::f32::consts::PI; - -pub struct RunAnimation; - -impl Animation for RunAnimation { - type Dependency = (f32, f64); - type Skeleton = CritterSkeleton; - - #[cfg(feature = "use-dyn-lib")] - const UPDATE_FN: &'static [u8] = b"critter_run\0"; - - #[cfg_attr(feature = "be-dyn-lib", export_name = "critter_run")] - fn update_skeleton_inner( - skeleton: &Self::Skeleton, - (_velocity, _global_time): Self::Dependency, - anim_time: f64, - _rate: &mut f32, - skeleton_attr: &CritterAttr, - ) -> Self::Skeleton { - let mut next = (*skeleton).clone(); - - let wave = (anim_time as f32 * 8.0).sin(); - let wavealt = (anim_time as f32 * 8.0 + PI / 2.0).sin(); - let wave_slow = (anim_time as f32 * 6.5 + PI).sin(); - - next.head.position = Vec3::new(0.0, skeleton_attr.head.0, skeleton_attr.head.1); - next.head.orientation = - Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0 + wave * 0.03); - next.head.scale = Vec3::one(); - - next.chest.position = Vec3::new( - 0.0, - skeleton_attr.chest.0 + wave * 1.0, - skeleton_attr.chest.1, - ) / 18.0; - next.chest.orientation = Quaternion::rotation_x(wave * 0.1); - next.chest.scale = Vec3::one() / 18.0; - - next.feet_f.position = Vec3::new(0.0, skeleton_attr.feet_f.0, skeleton_attr.feet_f.1); - next.feet_f.orientation = - Quaternion::rotation_x(wave * 0.8) * Quaternion::rotation_z(wavealt / 6.0); - next.feet_f.scale = Vec3::one(); - - next.feet_b.position = Vec3::new(0.0, skeleton_attr.feet_b.0, skeleton_attr.feet_b.1); - next.feet_b.orientation = - Quaternion::rotation_x(wavealt * 0.8) * Quaternion::rotation_z(wavealt / 6.0); - next.feet_b.scale = Vec3::one(); - - next.tail.position = - Vec3::new(0.0, skeleton_attr.tail.0 + wave * 1.0, skeleton_attr.tail.1); - next.tail.orientation = Quaternion::rotation_y(wave_slow * 0.08); - next.tail.scale = Vec3::one(); - - next - } -} diff --git a/voxygen/src/anim/src/lib.rs b/voxygen/src/anim/src/lib.rs index 833227ae5f..ffe1380b00 100644 --- a/voxygen/src/anim/src/lib.rs +++ b/voxygen/src/anim/src/lib.rs @@ -43,7 +43,6 @@ pub mod biped_large; pub mod bird_medium; pub mod bird_small; pub mod character; -pub mod critter; pub mod dragon; #[cfg(feature = "use-dyn-lib")] pub mod dyn_lib; pub mod fish_medium; @@ -54,6 +53,7 @@ pub mod object; pub mod quadruped_low; pub mod quadruped_medium; pub mod quadruped_small; +pub mod theropod; pub mod vek; #[cfg(feature = "use-dyn-lib")] diff --git a/voxygen/src/anim/src/quadruped_small/mod.rs b/voxygen/src/anim/src/quadruped_small/mod.rs index 5d5de9e931..0c49563099 100644 --- a/voxygen/src/anim/src/quadruped_small/mod.rs +++ b/voxygen/src/anim/src/quadruped_small/mod.rs @@ -114,6 +114,12 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Rabbit, _) => (4.0, 3.0), (Truffler, _) => (7.5, -9.0), (Frog, _) => (4.0, 2.0), + (Rat, _) => (6.0, -2.0), + (Axolotl, _) => (7.0, 1.0), + (Gecko, _) => (7.5, 2.0), + (Turtle, _) => (4.0, 3.0), + (Squirrel, _) => (7.5, -9.0), + (Fungome, _) => (4.0, 2.0), }, chest: match (body.species, body.body_type) { (Pig, _) => (0.0, 6.0), @@ -132,6 +138,12 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Rabbit, _) => (-2.0, 6.0), (Truffler, _) => (-2.0, 16.0), (Frog, _) => (-2.0, 4.5), + (Rat, _) => (6.0, -2.0), + (Axolotl, _) => (7.0, 1.0), + (Gecko, _) => (7.5, 2.0), + (Turtle, _) => (4.0, 3.0), + (Squirrel, _) => (7.5, -9.0), + (Fungome, _) => (4.0, 2.0), }, feet_f: match (body.species, body.body_type) { (Pig, _) => (4.5, 3.5, -1.0), @@ -150,6 +162,12 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Rabbit, _) => (3.0, 3.0, -3.0), (Truffler, _) => (2.5, 5.0, -9.0), (Frog, _) => (4.5, 6.5, 0.0), + (Rat, _) => (6.0, -2.0, 0.0), + (Axolotl, _) => (7.0, 1.0, 0.0), + (Gecko, _) => (7.5, 2.0, 0.0), + (Turtle, _) => (4.0, 3.0, 0.0), + (Squirrel, _) => (7.5, -9.0, 0.0), + (Fungome, _) => (4.0, 2.0, 0.0), }, feet_b: match (body.species, body.body_type) { (Pig, _) => (3.5, -2.0, 0.0), @@ -168,6 +186,12 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Rabbit, _) => (3.5, -2.0, -1.0), (Truffler, _) => (3.0, -5.0, -9.5), (Frog, _) => (5.0, -3.5, 0.0), + (Rat, _) => (6.0, -2.0, 0.0), + (Axolotl, _) => (7.0, 1.0, 0.0), + (Gecko, _) => (7.5, 2.0, 0.0), + (Turtle, _) => (4.0, 3.0, 0.0), + (Squirrel, _) => (7.5, -9.0, 0.0), + (Fungome, _) => (4.0, 2.0, 0.0), }, tail: match (body.species, body.body_type) { (Pig, _) => (-4.5, 2.5), @@ -186,6 +210,12 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Rabbit, _) => (-4.0, -0.0), (Truffler, _) => (0.0, 0.0), (Frog, _) => (0.0, -0.0), + (Rat, _) => (6.0, -2.0), + (Axolotl, _) => (7.0, 1.0), + (Gecko, _) => (7.5, 2.0), + (Turtle, _) => (4.0, 3.0), + (Squirrel, _) => (7.5, -9.0), + (Fungome, _) => (4.0, 2.0), }, scaler: match (body.species, body.body_type) { (Pig, _) => (0.9), @@ -204,6 +234,12 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Rabbit, _) => (0.7), (Truffler, _) => (1.0), (Frog, _) => (0.7), + (Rat, _) => (6.0), + (Axolotl, _) => (7.0), + (Gecko, _) => (7.5), + (Turtle, _) => (4.0), + (Squirrel, _) => (7.5), + (Fungome, _) => (4.0), }, tempo: match (body.species, body.body_type) { (Pig, _) => (1.0), @@ -222,6 +258,12 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Rabbit, _) => (1.15), (Truffler, _) => (1.0), (Frog, _) => (1.15), + (Rat, _) => (6.0), + (Axolotl, _) => (7.0), + (Gecko, _) => (7.5), + (Turtle, _) => (4.0), + (Squirrel, _) => (7.5), + (Fungome, _) => (4.0), }, maximize: match (body.species, body.body_type) { (Pig, _) => (1.0), @@ -240,6 +282,12 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Rabbit, _) => (1.3), (Truffler, _) => (1.0), (Frog, _) => (1.3), + (Rat, _) => (0.1), + (Axolotl, _) => (0.1), + (Gecko, _) => (0.1), + (Turtle, _) => (0.1), + (Squirrel, _) => (0.1), + (Fungome, _) => (0.1), }, minimize: match (body.species, body.body_type) { (Pig, _) => (0.6), @@ -258,6 +306,12 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Rabbit, _) => (0.8), (Truffler, _) => (1.0), (Frog, _) => (0.8), + (Rat, _) => (0.1), + (Axolotl, _) => (0.1), + (Gecko, _) => (0.1), + (Turtle, _) => (0.1), + (Squirrel, _) => (0.1), + (Fungome, _) => (0.1), }, spring: match (body.species, body.body_type) { (Pig, _) => (1.0), @@ -276,6 +330,12 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Rabbit, _) => (2.5), (Truffler, _) => (0.8), (Frog, _) => (2.5), + (Rat, _) => (0.1), + (Axolotl, _) => (0.1), + (Gecko, _) => (0.1), + (Turtle, _) => (0.1), + (Squirrel, _) => (0.1), + (Fungome, _) => (0.1), }, feed: match (body.species, body.body_type) { (Pig, _) => (1.0), @@ -294,6 +354,12 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Rabbit, _) => (1.2), (Truffler, _) => (0.6), (Frog, _) => (0.7), + (Rat, _) => (0.1), + (Axolotl, _) => (0.1), + (Gecko, _) => (0.1), + (Turtle, _) => (0.1), + (Squirrel, _) => (0.1), + (Fungome, _) => (0.1), }, } } diff --git a/voxygen/src/anim/src/theropod/idle.rs b/voxygen/src/anim/src/theropod/idle.rs new file mode 100644 index 0000000000..f82a9575a1 --- /dev/null +++ b/voxygen/src/anim/src/theropod/idle.rs @@ -0,0 +1,109 @@ +use super::{super::Animation, SkeletonAttr, TheropodSkeleton}; +//use std::{f32::consts::PI, ops::Mul}; +use super::super::vek::*; +use std::{f32::consts::PI, ops::Mul}; + +pub struct IdleAnimation; + +impl Animation for IdleAnimation { + type Dependency = f64; + type Skeleton = TheropodSkeleton; + + #[cfg(feature = "use-dyn-lib")] + const UPDATE_FN: &'static [u8] = b"theropod_idle\0"; + + #[cfg_attr(feature = "be-dyn-lib", export_name = "theropod_idle")] + fn update_skeleton_inner( + skeleton: &Self::Skeleton, + global_time: Self::Dependency, + anim_time: f64, + _rate: &mut f32, + skeleton_attr: &SkeletonAttr, + ) -> Self::Skeleton { + let mut next = (*skeleton).clone(); + + next.head.position = Vec3::new(0.0, skeleton_attr.head.0, skeleton_attr.head.1); + next.head.orientation = Quaternion::rotation_z(0.0); + next.head.scale = Vec3::one(); + + next.jaw.position = Vec3::new(0.0, skeleton_attr.jaw.0, skeleton_attr.jaw.1); + next.jaw.orientation = Quaternion::rotation_z(0.0); + next.jaw.scale = Vec3::one(); + + next.neck.position = Vec3::new(0.0, skeleton_attr.neck.0, skeleton_attr.neck.1); + next.neck.orientation = Quaternion::rotation_z(0.0); + next.neck.scale = Vec3::one(); + + next.chest_front.position = Vec3::new( + 0.0, + skeleton_attr.chest_front.0, + skeleton_attr.chest_front.1, + ); + next.chest_front.orientation = Quaternion::rotation_z(0.0); + next.chest_front.scale = Vec3::one(); + + next.chest_back.position = + Vec3::new(0.0, skeleton_attr.chest_back.0, skeleton_attr.chest_back.1); + next.chest_back.orientation = Quaternion::rotation_z(0.0); + next.chest_back.scale = Vec3::one(); + + next.tail_front.position = + Vec3::new(0.0, skeleton_attr.tail_front.0, skeleton_attr.tail_front.1); + next.tail_front.orientation = Quaternion::rotation_z(0.0); + next.tail_front.scale = Vec3::one(); + + next.tail_back.position = + Vec3::new(0.0, skeleton_attr.tail_back.0, skeleton_attr.tail_back.1); + next.tail_back.orientation = Quaternion::rotation_z(0.0); + next.tail_back.scale = Vec3::one(); + + next.hand_l.position = Vec3::new( + skeleton_attr.hand_l.0, + skeleton_attr.hand_l.0, + skeleton_attr.hand_l.1, + ); + next.hand_l.orientation = Quaternion::rotation_z(0.0); + next.hand_l.scale = Vec3::one(); + + next.hand_r.position = Vec3::new( + skeleton_attr.hand_r.0, + skeleton_attr.hand_r.0, + skeleton_attr.hand_r.1, + ); + next.hand_r.orientation = Quaternion::rotation_z(0.0); + next.hand_l.scale = Vec3::one(); + + next.leg_l.position = Vec3::new( + skeleton_attr.leg_l.0, + skeleton_attr.leg_l.0, + skeleton_attr.leg_l.1, + ); + next.leg_l.orientation = Quaternion::rotation_z(0.0); + next.leg_l.scale = Vec3::one(); + + next.leg_r.position = Vec3::new( + skeleton_attr.leg_r.0, + skeleton_attr.leg_r.0, + skeleton_attr.leg_r.1, + ); + next.leg_r.orientation = Quaternion::rotation_z(0.0); + next.leg_r.scale = Vec3::one(); + + next.foot_l.position = Vec3::new( + skeleton_attr.foot_l.0, + skeleton_attr.foot_l.0, + skeleton_attr.foot_l.1, + ); + next.foot_l.orientation = Quaternion::rotation_z(0.0); + next.foot_l.scale = Vec3::one(); + + next.foot_r.position = Vec3::new( + skeleton_attr.foot_r.0, + skeleton_attr.foot_r.0, + skeleton_attr.foot_r.1, + ); + next.foot_r.orientation = Quaternion::rotation_z(0.0); + next.foot_r.scale = Vec3::one(); + next + } +} diff --git a/voxygen/src/anim/src/theropod/jump.rs b/voxygen/src/anim/src/theropod/jump.rs new file mode 100644 index 0000000000..a18778e6a6 --- /dev/null +++ b/voxygen/src/anim/src/theropod/jump.rs @@ -0,0 +1,111 @@ +use super::{super::Animation, SkeletonAttr, TheropodSkeleton}; +//use std::f32::consts::PI; +use super::super::vek::*; + +pub struct JumpAnimation; + +impl Animation for JumpAnimation { + type Dependency = (f32, f64); + type Skeleton = TheropodSkeleton; + + #[cfg(feature = "use-dyn-lib")] + const UPDATE_FN: &'static [u8] = b"theropod_jump\0"; + + #[cfg_attr(feature = "be-dyn-lib", export_name = "theropod_jump")] + fn update_skeleton_inner( + skeleton: &Self::Skeleton, + _global_time: Self::Dependency, + _anim_time: f64, + _rate: &mut f32, + skeleton_attr: &SkeletonAttr, + ) -> Self::Skeleton { + let mut next = (*skeleton).clone(); + + let wave = (_anim_time as f32 * 1.0).sin(); + + next.head.position = Vec3::new(0.0, skeleton_attr.head.0, skeleton_attr.head.1); + next.head.orientation = Quaternion::rotation_z(0.0); + next.head.scale = Vec3::one(); + + next.jaw.position = Vec3::new(0.0, skeleton_attr.jaw.0, skeleton_attr.jaw.1); + next.jaw.orientation = Quaternion::rotation_z(0.0); + next.jaw.scale = Vec3::one(); + + next.neck.position = Vec3::new(0.0, skeleton_attr.neck.0, skeleton_attr.neck.1); + next.neck.orientation = Quaternion::rotation_z(0.0); + next.neck.scale = Vec3::one(); + + next.chest_front.position = Vec3::new( + 0.0, + skeleton_attr.chest_front.0, + skeleton_attr.chest_front.1, + ); + next.chest_front.orientation = Quaternion::rotation_z(0.0); + next.chest_front.scale = Vec3::one(); + + next.chest_back.position = + Vec3::new(0.0, skeleton_attr.chest_back.0, skeleton_attr.chest_back.1); + next.chest_back.orientation = Quaternion::rotation_z(0.0); + next.chest_back.scale = Vec3::one(); + + next.tail_front.position = + Vec3::new(0.0, skeleton_attr.tail_front.0, skeleton_attr.tail_front.1); + next.tail_front.orientation = Quaternion::rotation_z(0.0); + next.tail_front.scale = Vec3::one(); + + next.tail_back.position = + Vec3::new(0.0, skeleton_attr.tail_back.0, skeleton_attr.tail_back.1); + next.tail_back.orientation = Quaternion::rotation_z(0.0); + next.tail_back.scale = Vec3::one(); + + next.hand_l.position = Vec3::new( + skeleton_attr.hand_l.0, + skeleton_attr.hand_l.0, + skeleton_attr.hand_l.1, + ); + next.hand_l.orientation = Quaternion::rotation_z(0.0); + next.hand_l.scale = Vec3::one(); + + next.hand_r.position = Vec3::new( + skeleton_attr.hand_r.0, + skeleton_attr.hand_r.0, + skeleton_attr.hand_r.1, + ); + next.hand_r.orientation = Quaternion::rotation_z(0.0); + next.hand_l.scale = Vec3::one(); + + next.leg_l.position = Vec3::new( + skeleton_attr.leg_l.0, + skeleton_attr.leg_l.0, + skeleton_attr.leg_l.1, + ); + next.leg_l.orientation = Quaternion::rotation_z(0.0); + next.leg_l.scale = Vec3::one(); + + next.leg_r.position = Vec3::new( + skeleton_attr.leg_r.0, + skeleton_attr.leg_r.0, + skeleton_attr.leg_r.1, + ); + next.leg_r.orientation = Quaternion::rotation_z(0.0); + next.leg_r.scale = Vec3::one(); + + next.foot_l.position = Vec3::new( + skeleton_attr.foot_l.0, + skeleton_attr.foot_l.0, + skeleton_attr.foot_l.1, + ); + next.foot_l.orientation = Quaternion::rotation_z(0.0); + next.foot_l.scale = Vec3::one(); + + next.foot_r.position = Vec3::new( + skeleton_attr.foot_r.0, + skeleton_attr.foot_r.0, + skeleton_attr.foot_r.1, + ); + next.foot_r.orientation = Quaternion::rotation_z(0.0); + next.foot_r.scale = Vec3::one(); + + next + } +} diff --git a/voxygen/src/anim/src/theropod/mod.rs b/voxygen/src/anim/src/theropod/mod.rs new file mode 100644 index 0000000000..4a024f8663 --- /dev/null +++ b/voxygen/src/anim/src/theropod/mod.rs @@ -0,0 +1,177 @@ +pub mod idle; +pub mod jump; +pub mod run; + +// Reexports +pub use self::{idle::IdleAnimation, jump::JumpAnimation, run::RunAnimation}; + +use super::{make_bone, vek::*, FigureBoneData, Skeleton}; +use common::comp::{self}; +use core::convert::TryFrom; + +pub type Body = comp::theropod::Body; + +skeleton_impls!(struct TheropodSkeleton { + + head, + + jaw, + + neck, + + chest_front, + + chest_back, + + tail_front, + + tail_back, + + hand_l, + + hand_r, + + leg_l, + + leg_r, + + foot_l, + + foot_r, +}); + +impl Skeleton for TheropodSkeleton { + type Attr = SkeletonAttr; + type Body = Body; + + const BONE_COUNT: usize = 13; + #[cfg(feature = "use-dyn-lib")] + const COMPUTE_FN: &'static [u8] = b"theropod_compute_mats\0"; + + #[cfg_attr(feature = "be-dyn-lib", export_name = "theropod_compute_mats")] + + fn compute_matrices_inner( + &self, + base_mat: Mat4, + buf: &mut [FigureBoneData; super::MAX_BONE_COUNT], + ) -> Vec3 { + let chest_front_mat = base_mat * Mat4::::from(self.chest_front); + let neck_mat = chest_front_mat * Mat4::::from(self.neck); + let head_mat = neck_mat * Mat4::::from(self.head); + let chest_back_mat = chest_front_mat * Mat4::::from(self.chest_back); + let tail_front_mat = chest_back_mat * Mat4::::from(self.tail_front); + let leg_l_mat = chest_front_mat * Mat4::::from(self.leg_l); + let leg_r_mat = chest_front_mat * Mat4::::from(self.leg_r); + + *(<&mut [_; Self::BONE_COUNT]>::try_from(&mut buf[0..Self::BONE_COUNT]).unwrap()) = [ + make_bone(head_mat), + make_bone(head_mat * Mat4::::from(self.jaw)), + make_bone(neck_mat), + make_bone(chest_front_mat), + make_bone(chest_back_mat), + make_bone(tail_front_mat), + make_bone(tail_front_mat * Mat4::::from(self.tail_back)), + make_bone(chest_front_mat * Mat4::::from(self.hand_l)), + make_bone(chest_front_mat * Mat4::::from(self.hand_r)), + make_bone(leg_l_mat), + make_bone(leg_r_mat), + make_bone(leg_l_mat * Mat4::::from(self.foot_l)), + make_bone(leg_r_mat * Mat4::::from(self.foot_r)), + ]; + Vec3::default() + } +} + +pub struct SkeletonAttr { + head: (f32, f32), + neck: (f32, f32), + jaw: (f32, f32), + chest_front: (f32, f32), + chest_back: (f32, f32), + tail_front: (f32, f32), + tail_back: (f32, f32), + hand_l: (f32, f32, f32), + hand_r: (f32, f32, f32), + leg_l: (f32, f32, f32), + leg_r: (f32, f32, f32), + foot_l: (f32, f32, f32), + foot_r: (f32, f32, f32), +} + +impl<'a> std::convert::TryFrom<&'a comp::Body> for SkeletonAttr { + type Error = (); + + fn try_from(body: &'a comp::Body) -> Result { + match body { + comp::Body::Theropod(body) => Ok(SkeletonAttr::from(body)), + _ => Err(()), + } + } +} + +impl Default for SkeletonAttr { + fn default() -> Self { + Self { + head: (0.0, 0.0), + neck: (0.0, 0.0), + jaw: (0.0, 0.0), + chest_front: (0.0, 0.0), + chest_back: (0.0, 0.0), + tail_front: (0.0, 0.0), + tail_back: (0.0, 0.0), + hand_l: (0.0, 0.0, 0.0), + hand_r: (0.0, 0.0, 0.0), + leg_l: (0.0, 0.0, 0.0), + leg_r: (0.0, 0.0, 0.0), + foot_l: (0.0, 0.0, 0.0), + foot_r: (0.0, 0.0, 0.0), + } + } +} + +impl<'a> From<&'a Body> for SkeletonAttr { + fn from(body: &'a Body) -> Self { + use comp::theropod::Species::*; + Self { + head: match (body.species, body.body_type) { + (Archaeos, _) => (6.5, 3.0), + (Odontotyrannos, _) => (5.0, 1.0), + }, + jaw: match (body.species, body.body_type) { + (Archaeos, _) => (0.0, 6.0), + (Odontotyrannos, _) => (-1.0, 3.0), + }, + neck: match (body.species, body.body_type) { + (Archaeos, _) => (0.0, 6.0), + (Odontotyrannos, _) => (-1.0, 3.0), + }, + chest_front: match (body.species, body.body_type) { + (Archaeos, _) => (0.0, 6.0), + (Odontotyrannos, _) => (-1.0, 3.0), + }, + chest_back: match (body.species, body.body_type) { + (Archaeos, _) => (0.0, 6.0), + (Odontotyrannos, _) => (-1.0, 3.0), + }, + tail_front: match (body.species, body.body_type) { + (Archaeos, _) => (-8.0, -1.0), + (Odontotyrannos, _) => (-7.0, -1.0), + }, + tail_back: match (body.species, body.body_type) { + (Archaeos, _) => (-8.0, -1.0), + (Odontotyrannos, _) => (-7.0, -1.0), + }, + hand_l: match (body.species, body.body_type) { + (Archaeos, _) => (-8.0, -1.0, 0.0), + (Odontotyrannos, _) => (-7.0, -1.0, 0.0), + }, + hand_r: match (body.species, body.body_type) { + (Archaeos, _) => (8.0, -1.0, 0.0), + (Odontotyrannos, _) => (7.0, -1.0, 0.0), + }, + leg_l: match (body.species, body.body_type) { + (Archaeos, _) => (-8.0, -1.0, 0.0), + (Odontotyrannos, _) => (-7.0, -1.0, 0.0), + }, + leg_r: match (body.species, body.body_type) { + (Archaeos, _) => (8.0, -1.0, 0.0), + (Odontotyrannos, _) => (7.0, -1.0, 0.0), + }, + foot_l: match (body.species, body.body_type) { + (Archaeos, _) => (-8.0, -1.0, 0.0), + (Odontotyrannos, _) => (-7.0, -1.0, 0.0), + }, + foot_r: match (body.species, body.body_type) { + (Archaeos, _) => (8.0, -1.0, 0.0), + (Odontotyrannos, _) => (7.0, -1.0, 0.0), + }, + } + } +} diff --git a/voxygen/src/anim/src/theropod/run.rs b/voxygen/src/anim/src/theropod/run.rs new file mode 100644 index 0000000000..4ca88632a4 --- /dev/null +++ b/voxygen/src/anim/src/theropod/run.rs @@ -0,0 +1,114 @@ +use super::{super::Animation, SkeletonAttr, TheropodSkeleton}; +//use std::{f32::consts::PI, ops::Mul}; +use super::super::vek::*; +use std::f32::consts::PI; + +pub struct RunAnimation; + +impl Animation for RunAnimation { + type Dependency = (f32, f64); + type Skeleton = TheropodSkeleton; + + #[cfg(feature = "use-dyn-lib")] + const UPDATE_FN: &'static [u8] = b"theropod_run\0"; + + #[cfg_attr(feature = "be-dyn-lib", export_name = "theropod_run")] + fn update_skeleton_inner( + skeleton: &Self::Skeleton, + (_velocity, _global_time): Self::Dependency, + anim_time: f64, + _rate: &mut f32, + skeleton_attr: &SkeletonAttr, + ) -> Self::Skeleton { + let mut next = (*skeleton).clone(); + + let wave = (anim_time as f32 * 8.0).sin(); + let wavealt = (anim_time as f32 * 8.0 + PI / 2.0).sin(); + let wave_slow = (anim_time as f32 * 6.5 + PI).sin(); + + next.head.position = Vec3::new(0.0, skeleton_attr.head.0, skeleton_attr.head.1); + next.head.orientation = Quaternion::rotation_z(0.0); + next.head.scale = Vec3::one(); + + next.jaw.position = Vec3::new(0.0, skeleton_attr.jaw.0, skeleton_attr.jaw.1); + next.jaw.orientation = Quaternion::rotation_z(0.0); + next.jaw.scale = Vec3::one(); + + next.neck.position = Vec3::new(0.0, skeleton_attr.neck.0, skeleton_attr.neck.1); + next.neck.orientation = Quaternion::rotation_z(0.0); + next.neck.scale = Vec3::one(); + + next.chest_front.position = Vec3::new( + 0.0, + skeleton_attr.chest_front.0, + skeleton_attr.chest_front.1, + ); + next.chest_front.orientation = Quaternion::rotation_z(0.0); + next.chest_front.scale = Vec3::one(); + + next.chest_back.position = + Vec3::new(0.0, skeleton_attr.chest_back.0, skeleton_attr.chest_back.1); + next.chest_back.orientation = Quaternion::rotation_z(0.0); + next.chest_back.scale = Vec3::one(); + + next.tail_front.position = + Vec3::new(0.0, skeleton_attr.tail_front.0, skeleton_attr.tail_front.1); + next.tail_front.orientation = Quaternion::rotation_z(0.0); + next.tail_front.scale = Vec3::one(); + + next.tail_back.position = + Vec3::new(0.0, skeleton_attr.tail_back.0, skeleton_attr.tail_back.1); + next.tail_back.orientation = Quaternion::rotation_z(0.0); + next.tail_back.scale = Vec3::one(); + + next.hand_l.position = Vec3::new( + skeleton_attr.hand_l.0, + skeleton_attr.hand_l.0, + skeleton_attr.hand_l.1, + ); + next.hand_l.orientation = Quaternion::rotation_z(0.0); + next.hand_l.scale = Vec3::one(); + + next.hand_r.position = Vec3::new( + skeleton_attr.hand_r.0, + skeleton_attr.hand_r.0, + skeleton_attr.hand_r.1, + ); + next.hand_r.orientation = Quaternion::rotation_z(0.0); + next.hand_l.scale = Vec3::one(); + + next.leg_l.position = Vec3::new( + skeleton_attr.leg_l.0, + skeleton_attr.leg_l.0, + skeleton_attr.leg_l.1, + ); + next.leg_l.orientation = Quaternion::rotation_z(0.0); + next.leg_l.scale = Vec3::one(); + + next.leg_r.position = Vec3::new( + skeleton_attr.leg_r.0, + skeleton_attr.leg_r.0, + skeleton_attr.leg_r.1, + ); + next.leg_r.orientation = Quaternion::rotation_z(0.0); + next.leg_r.scale = Vec3::one(); + + next.foot_l.position = Vec3::new( + skeleton_attr.foot_l.0, + skeleton_attr.foot_l.0, + skeleton_attr.foot_l.1, + ); + next.foot_l.orientation = Quaternion::rotation_z(0.0); + next.foot_l.scale = Vec3::one(); + + next.foot_r.position = Vec3::new( + skeleton_attr.foot_r.0, + skeleton_attr.foot_r.0, + skeleton_attr.foot_r.1, + ); + next.foot_r.orientation = Quaternion::rotation_z(0.0); + next.foot_r.scale = Vec3::one(); + + next + } +} diff --git a/voxygen/src/scene/figure/cache.rs b/voxygen/src/scene/figure/cache.rs index 60d723a4d5..421b3259eb 100644 --- a/voxygen/src/scene/figure/cache.rs +++ b/voxygen/src/scene/figure/cache.rs @@ -254,6 +254,7 @@ where manifest_indicator, } } + /// NOTE: Intended for render time (useful with systems like wgpu that /// expect data used by the rendering pipelines to be stable throughout /// the render pass). @@ -283,6 +284,12 @@ where }), }; + if let Some(((FigureModelEntryFuture::Done(model), _), _)) = self.models.get(&key) { + Some(model) + } else { + None + } + } pub fn get_or_create_model<'c>( &'c mut self, diff --git a/voxygen/src/scene/figure/load.rs b/voxygen/src/scene/figure/load.rs index 4fb0025440..09f0e40edc 100644 --- a/voxygen/src/scene/figure/load.rs +++ b/voxygen/src/scene/figure/load.rs @@ -5,7 +5,6 @@ use common::{ biped_large::{self, BodyType as BLBodyType, Species as BLSpecies}, bird_medium::{self, BodyType as BMBodyType, Species as BMSpecies}, bird_small, - critter::{self, BodyType as CBodyType, Species as CSpecies}, dragon::{self, BodyType as DBodyType, Species as DSpecies}, fish_medium, fish_small, golem::{self, BodyType as GBodyType, Species as GSpecies}, @@ -15,6 +14,7 @@ use common::{ quadruped_low::{self, BodyType as QLBodyType, Species as QLSpecies}, quadruped_medium::{self, BodyType as QMBodyType, Species as QMSpecies}, quadruped_small::{self, BodyType as QSBodyType, Species as QSSpecies}, + theropod::{self, BodyType as TBodyType, Species as TSpecies}, }, figure::{DynaUnionizer, MatSegment, Material, Segment}, }; @@ -1734,57 +1734,100 @@ impl BirdMediumLateralSpec { } //// #[derive(Deserialize)] -struct CritterCenterSpec(HashMap<(CSpecies, CBodyType), SidedCCenterVoxSpec>); +struct TheropodCentralSpec(HashMap<(TSpecies, TBodyType), SidedTCentralVoxSpec>); #[derive(Deserialize)] -struct SidedCCenterVoxSpec { - head: CritterCenterSubSpec, - chest: CritterCenterSubSpec, - feet_f: CritterCenterSubSpec, - feet_b: CritterCenterSubSpec, - tail: CritterCenterSubSpec, +struct SidedTCentralVoxSpec { + head: TheropodCentralSubSpec, + jaw: TheropodCentralSubSpec, + neck: TheropodCentralSubSpec, + chest_front: TheropodCentralSubSpec, + chest_back: TheropodCentralSubSpec, + tail_front: TheropodCentralSubSpec, + tail_back: TheropodCentralSubSpec, } #[derive(Deserialize)] -struct CritterCenterSubSpec { +struct TheropodCentralSubSpec { offset: [f32; 3], // Should be relative to initial origin - center: VoxSimple, + central: VoxSimple, } +#[derive(Deserialize)] +struct TheropodLateralSpec(HashMap<(TSpecies, TBodyType), SidedTLateralVoxSpec>); +#[derive(Deserialize)] +struct SidedTLateralVoxSpec { + hand_l: TheropodLateralSubSpec, + hand_r: TheropodLateralSubSpec, + leg_l: TheropodLateralSubSpec, + leg_r: TheropodLateralSubSpec, + foot_l: TheropodLateralSubSpec, + foot_r: TheropodLateralSubSpec, +} +#[derive(Deserialize)] +struct TheropodLateralSubSpec { + offset: [f32; 3], // Should be relative to initial origin + lateral: VoxSimple, +} make_vox_spec!( - critter::Body, - struct CritterSpec { - center: CritterCenterSpec = "voxygen.voxel.critter_center_manifest", + theropod::Body, + struct TheropodSpec { + central: TheropodCentralSpec = "voxygen.voxel.theropod_central_manifest", + lateral: TheropodLateralSpec = "voxygen.voxel.theropod_lateral_manifest", }, |FigureKey { body, .. }, spec| { [ - Some(spec.center.asset.mesh_head( + Some(spec.central.asset.mesh_head( body.species, body.body_type, )), - Some(spec.center.asset.mesh_chest( + Some(spec.central.asset.mesh_jaw( body.species, body.body_type, )), - Some(spec.center.asset.mesh_feet_f( + Some(spec.central.asset.mesh_neck( body.species, body.body_type, )), - Some(spec.center.asset.mesh_feet_b( + Some(spec.central.asset.mesh_chest_front( body.species, body.body_type, )), - Some(spec.center.asset.mesh_tail( + Some(spec.central.asset.mesh_chest_back( + body.species, + body.body_type, + )), + Some(spec.central.asset.mesh_tail_front( + body.species, + body.body_type, + )), + Some(spec.central.asset.mesh_tail_back( + body.species, + body.body_type, + )), + Some(spec.lateral.asset.mesh_hand_l( + body.species, + body.body_type, + )), + Some(spec.lateral.asset.mesh_hand_r( + body.species, + body.body_type, + )), + Some(spec.lateral.asset.mesh_leg_l( + body.species, + body.body_type, + )), + Some(spec.lateral.asset.mesh_leg_r( + body.species, + body.body_type, + )), + Some(spec.lateral.asset.mesh_foot_l( + body.species, + body.body_type, + )), + Some(spec.lateral.asset.mesh_foot_r( body.species, body.body_type, )), - None, - None, - None, - None, - None, - None, - None, - None, None, None, None, @@ -1792,8 +1835,8 @@ make_vox_spec!( }, ); -impl CritterCenterSpec { - fn mesh_head(&self, species: CSpecies, body_type: CBodyType) -> BoneMeshes { +impl TheropodCentralSpec { + fn mesh_head(&self, species: TSpecies, body_type: TBodyType) -> BoneMeshes { let spec = match self.0.get(&(species, body_type)) { Some(spec) => spec, None => { @@ -1804,73 +1847,234 @@ impl CritterCenterSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let center = graceful_load_segment(&spec.head.center.0); + let central = graceful_load_segment(&spec.head.central.0); - (center, Vec3::from(spec.head.offset)) + (central, Vec3::from(spec.head.offset)) } - fn mesh_chest(&self, species: CSpecies, body_type: CBodyType) -> BoneMeshes { + fn mesh_jaw(&self, species: TSpecies, body_type: TBodyType) -> BoneMeshes { let spec = match self.0.get(&(species, body_type)) { Some(spec) => spec, None => { error!( - "No chest specification exists for the combination of {:?} and {:?}", + "No jaw specification exists for the combination of {:?} and {:?}", species, body_type ); return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let center = graceful_load_segment(&spec.chest.center.0); + let central = graceful_load_segment(&spec.jaw.central.0); - (center, Vec3::from(spec.chest.offset)) + (central, Vec3::from(spec.jaw.offset)) } - fn mesh_feet_f(&self, species: CSpecies, body_type: CBodyType) -> BoneMeshes { + fn mesh_neck(&self, species: TSpecies, body_type: TBodyType) -> BoneMeshes { let spec = match self.0.get(&(species, body_type)) { Some(spec) => spec, None => { error!( - "No feet specification exists for the combination of {:?} and {:?}", + "No jaw specification exists for the combination of {:?} and {:?}", species, body_type ); return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let center = graceful_load_segment(&spec.feet_f.center.0); + let central = graceful_load_segment(&spec.neck.central.0); - (center, Vec3::from(spec.feet_f.offset)) + (central, Vec3::from(spec.neck.offset)) } - fn mesh_feet_b(&self, species: CSpecies, body_type: CBodyType) -> BoneMeshes { + fn mesh_chest_front(&self, species: TSpecies, body_type: TBodyType) -> BoneMeshes { let spec = match self.0.get(&(species, body_type)) { Some(spec) => spec, None => { error!( - "No feet specification exists for the combination of {:?} and {:?}", + "No front chest specification exists for the combination of {:?} and {:?}", species, body_type ); return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let center = graceful_load_segment(&spec.feet_b.center.0); + let central = graceful_load_segment(&spec.chest_front.central.0); - (center, Vec3::from(spec.feet_b.offset)) + (central, Vec3::from(spec.chest_front.offset)) } - fn mesh_tail(&self, species: CSpecies, body_type: CBodyType) -> BoneMeshes { + fn mesh_chest_back(&self, species: TSpecies, body_type: TBodyType) -> BoneMeshes { let spec = match self.0.get(&(species, body_type)) { Some(spec) => spec, None => { error!( - "No tail specification exists for the combination of {:?} and {:?}", + "No back chest specification exists for the combination of {:?} and {:?}", species, body_type ); return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let center = graceful_load_segment(&spec.tail.center.0); + let central = graceful_load_segment(&spec.chest_back.central.0); - (center, Vec3::from(spec.tail.offset)) + (central, Vec3::from(spec.chest_back.offset)) + } + + fn mesh_tail_front( + &self, + species: TSpecies, + body_type: TBodyType, + ) -> BoneMeshes { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No front tail specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + }, + }; + let central = graceful_load_segment(&spec.tail_front.central.0); + + (central, Vec3::from(spec.tail_front.offset)) + } + + fn mesh_tail_back( + &self, + species: TSpecies, + body_type: TBodyType, + ) -> BoneMeshes { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No back tail specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + }, + }; + let central = graceful_load_segment(&spec.tail_back.central.0); + + (central, Vec3::from(spec.tail_back.offset)) + } +} +impl TheropodLateralSpec { + fn mesh_hand_l( + &self, + species: TSpecies, + body_type: TBodyType, + ) -> BoneMeshes { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No left hand specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + }, + }; + let lateral = graceful_load_segment(&spec.hand_l.lateral.0); + + (lateral, Vec3::from(spec.hand_l.offset)) + } + + fn mesh_hand_r( + &self, + species: TSpecies, + body_type: TBodyType, + ) -> BoneMeshes { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No right hand specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + }, + }; + let lateral = graceful_load_segment(&spec.hand_r.lateral.0); + + (lateral, Vec3::from(spec.hand_r.offset)) + } + + fn mesh_leg_l( + &self, + species: TSpecies, + body_type: TBodyType, + ) -> BoneMeshes { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No left leg specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + }, + }; + let lateral = graceful_load_segment(&spec.leg_l.lateral.0); + + (lateral, Vec3::from(spec.leg_l.offset)) + } + + fn mesh_leg_r( + &self, + species: TSpecies, + body_type: TBodyType, + ) -> BoneMeshes { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No right leg specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + }, + }; + let lateral = graceful_load_segment(&spec.leg_r.lateral.0); + + (lateral, Vec3::from(spec.leg_r.offset)) + } + + fn mesh_foot_l( + &self, + species: TSpecies, + body_type: TBodyType, + ) -> BoneMeshes { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No left foot specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + }, + }; + let lateral = graceful_load_segment(&spec.foot_l.lateral.0); + + (lateral, Vec3::from(spec.foot_l.offset)) + } + + fn mesh_foot_r( + &self, + species: TSpecies, + body_type: TBodyType, + ) -> BoneMeshes { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No right foot specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + }, + }; + let lateral = graceful_load_segment(&spec.foot_r.lateral.0); + + (lateral, Vec3::from(spec.foot_r.offset)) } } //// @@ -2821,6 +3025,10 @@ make_vox_spec!( body.species, body.body_type, )), + Some(spec.center.asset.mesh_torso_lower( + body.species, + body.body_type, + )), Some(spec.lateral.asset.mesh_shoulder_l( body.species, body.body_type, @@ -2858,7 +3066,6 @@ make_vox_spec!( None, None, None, - None, ] }, ); @@ -2900,7 +3107,6 @@ impl GolemCenterSpec { &self, species: GSpecies, body_type: GBodyType, - generate_mesh: impl FnOnce(Segment, Vec3) -> BoneMeshes, ) -> BoneMeshes { let spec = match self.0.get(&(species, body_type)) { Some(spec) => spec, @@ -2909,12 +3115,12 @@ impl GolemCenterSpec { "No torso lower specification exists for the combination of {:?} and {:?}", species, body_type ); - return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5), generate_mesh); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; let center = graceful_load_segment(&spec.torso_lower.center.0); - generate_mesh(center, Vec3::from(spec.torso_lower.offset)) + (center, Vec3::from(spec.torso_lower.offset)) } } impl GolemLateralSpec { diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs index b6a16f0f9e..eda6fa8fb5 100644 --- a/voxygen/src/scene/figure/mod.rs +++ b/voxygen/src/scene/figure/mod.rs @@ -17,11 +17,11 @@ use crate::{ }; use anim::{ biped_large::BipedLargeSkeleton, bird_medium::BirdMediumSkeleton, - bird_small::BirdSmallSkeleton, character::CharacterSkeleton, critter::CritterSkeleton, - dragon::DragonSkeleton, fish_medium::FishMediumSkeleton, fish_small::FishSmallSkeleton, - golem::GolemSkeleton, object::ObjectSkeleton, quadruped_low::QuadrupedLowSkeleton, - quadruped_medium::QuadrupedMediumSkeleton, quadruped_small::QuadrupedSmallSkeleton, Animation, - Skeleton, + bird_small::BirdSmallSkeleton, character::CharacterSkeleton, dragon::DragonSkeleton, + fish_medium::FishMediumSkeleton, fish_small::FishSmallSkeleton, golem::GolemSkeleton, + object::ObjectSkeleton, quadruped_low::QuadrupedLowSkeleton, + quadruped_medium::QuadrupedMediumSkeleton, quadruped_small::QuadrupedSmallSkeleton, + theropod::TheropodSkeleton, Animation, Skeleton, }; use common::{ comp::{ @@ -87,7 +87,7 @@ struct FigureMgrStates { quadruped_low_states: HashMap>, bird_medium_states: HashMap>, fish_medium_states: HashMap>, - critter_states: HashMap>, + theropod_states: HashMap>, dragon_states: HashMap>, bird_small_states: HashMap>, fish_small_states: HashMap>, @@ -105,7 +105,7 @@ impl FigureMgrStates { quadruped_low_states: HashMap::new(), bird_medium_states: HashMap::new(), fish_medium_states: HashMap::new(), - critter_states: HashMap::new(), + theropod_states: HashMap::new(), dragon_states: HashMap::new(), bird_small_states: HashMap::new(), fish_small_states: HashMap::new(), @@ -149,8 +149,8 @@ impl FigureMgrStates { .fish_medium_states .get_mut(&entity) .map(DerefMut::deref_mut), - Body::Critter(_) => self - .critter_states + Body::Theropod(_) => self + .theropod_states .get_mut(&entity) .map(DerefMut::deref_mut), Body::Dragon(_) => self.dragon_states.get_mut(&entity).map(DerefMut::deref_mut), @@ -185,7 +185,7 @@ impl FigureMgrStates { Body::QuadrupedLow(_) => self.quadruped_low_states.remove(&entity).map(|e| e.meta), Body::BirdMedium(_) => self.bird_medium_states.remove(&entity).map(|e| e.meta), Body::FishMedium(_) => self.fish_medium_states.remove(&entity).map(|e| e.meta), - Body::Critter(_) => self.critter_states.remove(&entity).map(|e| e.meta), + Body::Theropod(_) => self.theropod_states.remove(&entity).map(|e| e.meta), Body::Dragon(_) => self.dragon_states.remove(&entity).map(|e| e.meta), Body::BirdSmall(_) => self.bird_small_states.remove(&entity).map(|e| e.meta), Body::FishSmall(_) => self.fish_small_states.remove(&entity).map(|e| e.meta), @@ -203,7 +203,7 @@ impl FigureMgrStates { self.quadruped_low_states.retain(|k, v| f(k, &mut *v)); self.bird_medium_states.retain(|k, v| f(k, &mut *v)); self.fish_medium_states.retain(|k, v| f(k, &mut *v)); - self.critter_states.retain(|k, v| f(k, &mut *v)); + self.theropod_states.retain(|k, v| f(k, &mut *v)); self.dragon_states.retain(|k, v| f(k, &mut *v)); self.bird_small_states.retain(|k, v| f(k, &mut *v)); self.fish_small_states.retain(|k, v| f(k, &mut *v)); @@ -220,7 +220,7 @@ impl FigureMgrStates { + self.quadruped_low_states.len() + self.bird_medium_states.len() + self.fish_medium_states.len() - + self.critter_states.len() + + self.theropod_states.len() + self.dragon_states.len() + self.bird_small_states.len() + self.fish_small_states.len() @@ -255,7 +255,7 @@ impl FigureMgrStates { .filter(|(_, c)| c.visible()) .count() + self - .critter_states + .theropod_states .iter() .filter(|(_, c)| c.visible()) .count() @@ -300,7 +300,7 @@ impl FigureMgrStates { pub struct FigureMgr { col_lights: FigureColLights, model_cache: FigureModelCache, - critter_model_cache: FigureModelCache, + theropod_model_cache: FigureModelCache, quadruped_small_model_cache: FigureModelCache, quadruped_medium_model_cache: FigureModelCache, quadruped_low_model_cache: FigureModelCache, @@ -320,7 +320,7 @@ impl FigureMgr { Self { col_lights: FigureColLights::new(renderer), model_cache: FigureModelCache::new(), - critter_model_cache: FigureModelCache::new(), + theropod_model_cache: FigureModelCache::new(), quadruped_small_model_cache: FigureModelCache::new(), quadruped_medium_model_cache: FigureModelCache::new(), quadruped_low_model_cache: FigureModelCache::new(), @@ -341,7 +341,7 @@ impl FigureMgr { pub fn clean(&mut self, tick: u64) { span!(_guard, "clean", "FigureManager::clean"); self.model_cache.clean(&mut self.col_lights, tick); - self.critter_model_cache.clean(&mut self.col_lights, tick); + self.theropod_model_cache.clean(&mut self.col_lights, tick); self.quadruped_small_model_cache .clean(&mut self.col_lights, tick); self.quadruped_medium_model_cache @@ -1636,8 +1636,8 @@ impl FigureMgr { &mut update_buf, ); }, - Body::Critter(body) => { - let (model, skeleton_attr) = self.critter_model_cache.get_or_create_model( + Body::Theropod(body) => { + let (model, skeleton_attr) = self.theropod_model_cache.get_or_create_model( renderer, &mut self.col_lights, *body, @@ -1648,10 +1648,11 @@ impl FigureMgr { scene_data.thread_pool, ); - let state = - self.states.critter_states.entry(entity).or_insert_with(|| { - FigureState::new(renderer, CritterSkeleton::default()) - }); + let state = self + .states + .theropod_states + .entry(entity) + .or_insert_with(|| FigureState::new(renderer, TheropodSkeleton::default())); let (character, last_character) = match (character, last_character) { (Some(c), Some(l)) => (c, l), @@ -1668,24 +1669,24 @@ impl FigureMgr { physics.in_fluid.is_some(), // In water ) { // Standing - (true, false, false) => anim::critter::IdleAnimation::update_skeleton( - &CritterSkeleton::default(), + (true, false, false) => anim::theropod::IdleAnimation::update_skeleton( + &TheropodSkeleton::default(), time, state.state_time, &mut state_animation_rate, skeleton_attr, ), // Running - (true, true, false) => anim::critter::RunAnimation::update_skeleton( - &CritterSkeleton::default(), + (true, true, false) => anim::theropod::RunAnimation::update_skeleton( + &TheropodSkeleton::default(), (vel.0.magnitude(), time), state.state_time, &mut state_animation_rate, skeleton_attr, ), // In air - (false, _, false) => anim::critter::JumpAnimation::update_skeleton( - &CritterSkeleton::default(), + (false, _, false) => anim::theropod::JumpAnimation::update_skeleton( + &TheropodSkeleton::default(), (vel.0.magnitude(), time), state.state_time, &mut state_animation_rate, @@ -1693,8 +1694,8 @@ impl FigureMgr { ), // TODO! - _ => anim::critter::IdleAnimation::update_skeleton( - &CritterSkeleton::default(), + _ => anim::theropod::IdleAnimation::update_skeleton( + &TheropodSkeleton::default(), time, state.state_time, &mut state_animation_rate, @@ -2321,7 +2322,7 @@ impl FigureMgr { let FigureMgr { col_lights: ref col_lights_, model_cache, - critter_model_cache, + theropod_model_cache, quadruped_small_model_cache, quadruped_medium_model_cache, quadruped_low_model_cache, @@ -2341,7 +2342,7 @@ impl FigureMgr { quadruped_low_states, bird_medium_states, fish_medium_states, - critter_states, + theropod_states, dragon_states, bird_small_states, fish_small_states, @@ -2454,14 +2455,14 @@ impl FigureMgr { ), ) }), - Body::Critter(body) => critter_states + Body::Theropod(body) => theropod_states .get(&entity) .filter(|state| filter_state(&*state)) .map(move |state| { ( state.locals(), state.bone_consts(), - critter_model_cache.get_model( + theropod_model_cache.get_model( col_lights, *body, loadout, diff --git a/world/src/layer/mod.rs b/world/src/layer/mod.rs index 4ab7406b02..1f56cb27b6 100644 --- a/world/src/layer/mod.rs +++ b/world/src/layer/mod.rs @@ -281,7 +281,7 @@ pub fn apply_caves_supplement<'a>( }; comp::quadruped_low::Body::random_with(rng, &species).into() }, - 3 => { + _ => { is_hostile = true; let species = match rng.gen_range(0, 8) { 0 => comp::biped_large::Species::Ogre, @@ -291,14 +291,6 @@ pub fn apply_caves_supplement<'a>( }; comp::biped_large::Body::random_with(rng, &species).into() }, - _ => { - is_hostile = false; - let species = match rng.gen_range(0, 5) { - 0 => comp::critter::Species::Fungome, - _ => comp::critter::Species::Rat, - }; - comp::critter::Body::random_with(rng, &species).into() - }, }) .with_alignment(if is_hostile { comp::Alignment::Enemy diff --git a/world/src/lib.rs b/world/src/lib.rs index a992cc9188..e698f714e8 100644 --- a/world/src/lib.rs +++ b/world/src/lib.rs @@ -35,7 +35,7 @@ use crate::{ util::{Grid, Sampler}, }; use common::{ - comp::{self, bird_medium, critter, quadruped_low, quadruped_medium, quadruped_small}, + comp::{self, bird_medium, quadruped_low, quadruped_medium, quadruped_small, theropod}, generation::{ChunkSupplement, EntityInfo}, msg::server::WorldMapMsg, terrain::{Block, BlockKind, TerrainChunk, TerrainChunkMeta, TerrainChunkSize}, @@ -256,8 +256,8 @@ impl World { comp::Body::BirdMedium(bird_medium::Body::random()) }, 2 => { - is_hostile = false; - comp::Body::Critter(critter::Body::random()) + is_hostile = true; + comp::Body::Theropod(theropod::Body::random()) }, 3 => { match quadlow {