new dungeon setups, new npcs, weapon specific loadouts, anims

This commit is contained in:
jshipsey 2021-01-23 17:37:38 -05:00
parent ac16a8900d
commit ca3248cc93
88 changed files with 1369 additions and 357 deletions

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Adlet",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Chest("Adlet"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Gnarling",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Chest("Gnarling"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Haniwa",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Chest("Haniwa"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Kappa",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Chest("Kappa"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Myrmidon",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Chest("Myrmidon"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Sahagin",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Chest("Sahagin"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Adlet",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Foot("Adlet"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Gnarling",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Foot("Gnarling"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Haniwa",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Foot("Haniwa"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Kappa",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Foot("Kappa"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Myrmidon",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Foot("Myrmidon"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Sahagin",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Foot("Sahagin"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Adlet",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Hand("Adlet"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Gnarling",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Hand("Gnarling"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Haniwa",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Hand("Haniwa"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Kappa",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Hand("Kappa"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Myrmidon",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Hand("Myrmidon"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Sahagin",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Hand("Sahagin"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Adlet",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Pants("Adlet"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Gnarling",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Pants("Gnarling"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Haniwa",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Pants("Haniwa"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Kappa",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Pants("Kappa"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Myrmidon",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Pants("Myrmidon"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,12 @@
ItemDef(
name: "Sahagin",
description: "Ceremonial attire used by members.",
kind: Armor(
(
kind: Pants("Sahagin"),
stats: (
protection: Normal(2.0)),
)
),
quality: Low,
)

View File

@ -0,0 +1,15 @@
ItemDef(
name: "Gnoll Staff",
description: "eekum bokum",
kind: Tool(
(
kind: Staff,
stats: (
equip_time_millis: 200,
power: 0.8,
speed: 1.0
),
)
),
quality: Low,
)

View File

@ -952,6 +952,22 @@
kappa: (
keyword: "kappa",
generic: "Kappa"
),
cactid: (
keyword: "cactid",
generic: "Cactid"
),
gnoll: (
keyword: "gnoll",
generic: "Gnoll"
),
haniwa: (
keyword: "haniwa",
generic: "Haniwa"
),
myrmidon: (
keyword: "myrmidon",
generic: "Myrmidon"
)
)
),

View File

@ -0,0 +1,37 @@
((
default: (
vox_spec: ("armor_none", (-5.0, -3.5, 1.0)),
),
map: {
"Gnome": (
vox_spec: ("npc.gnome.male.chest", (-5.0, -3.0, -2.5)),
),
"Sahagin": (
vox_spec: ("npc.sahagin.male.chest", (-4.5, -8.0, -8.0)),
),
"Adlet": (
vox_spec: ("npc.adlet.male.chest", (-5.0, -3.5, -2.0)),
),
"Gnarling": (
vox_spec: ("npc.gnarling.male.chest", (-4.5, -3.5, -2.5)),
),
"Mandragora": (
vox_spec: ("npc.mandragora.male.chest", (-11.0, -11.0, -6.5)),
),
"Kappa": (
vox_spec: ("npc.kappa.male.chest", (-6.5, -8.0, -7.0)),
),
"Cactid": (
vox_spec: ("npc.cactid.male.chest", (-3.0, -3.0, -2.5)),
),
"Gnoll": (
vox_spec: ("npc.gnoll.male.chest", (-5.0, -4.5, -6.0)),
),
"Haniwa": (
vox_spec: ("npc.haniwa.male.chest", (-6.5, -4.0, -3.0)),
),
"Myrmidon": (
vox_spec: ("npc.myrmidon.male.chest", (-5.5, -4.0, -3.0)),
),
},
))

View File

@ -0,0 +1,92 @@
((
default: (
left: (
vox_spec: ("armor.foot.foot_right_none", (-1.5, -2.0, -4.0)),
),
right: (
vox_spec: ("armor.foot.foot_right_none", (-1.5, -2.0, -4.0)),
)
),
map: {
"Gnome": (
left: (
vox_spec: ("npc.gnome.male.foot_r", (-1.5, -2.0, -4.0)),
),
right: (
vox_spec: ("npc.gnome.male.foot_r", (-1.5, -2.0, -4.0)),
)
),
"Sahagin": (
left: (
vox_spec: ("npc.sahagin.male.foot_r", (-2.5, -2.0, -8.0)),
),
right: (
vox_spec: ("npc.sahagin.male.foot_r", (-2.5, -2.0, -8.0)),
)
),
"Adlet": (
left: (
vox_spec: ("npc.adlet.male.foot_r", (-1.5, -3.0, -7.0)),
),
right: (
vox_spec: ("npc.adlet.male.foot_r", (-1.5, -3.0, -7.0)),
)
),
"Gnarling": (
left: (
vox_spec: ("npc.gnarling.male.foot_r", (-1.0, -2.0, -5.0)),
),
right: (
vox_spec: ("npc.gnarling.male.foot_r", (-1.0, -2.0, -5.0)),
)
),
"Mandragora": (
left: (
vox_spec: ("npc.mandragora.male.foot_r", (-1.0, -1.5, -4.0)),
),
right: (
vox_spec: ("npc.mandragora.male.foot_r", (-1.0, -1.5, -4.0)),
)
),
"Kappa": (
left: (
vox_spec: ("npc.kappa.male.foot_r", (-2.5, -3.0, -9.0)),
),
right: (
vox_spec: ("npc.kappa.male.foot_r", (-2.5, -3.0, -9.0)),
)
),
"Cactid": (
left: (
vox_spec: ("npc.cactid.male.foot_r", (-1.5, -2.0, -5.0)),
),
right: (
vox_spec: ("npc.cactid.male.foot_r", (-1.5, -2.0, -5.0)),
)
),
"Gnoll": (
left: (
vox_spec: ("npc.gnoll.male.foot_r", (-1.5, -3.0, -7.0)),
),
right: (
vox_spec: ("npc.gnoll.male.foot_r", (-1.5, -3.0, -7.0)),
)
),
"Haniwa": (
left: (
vox_spec: ("npc.haniwa.male.foot_r", (-2.0, -2.5, -8.0)),
),
right: (
vox_spec: ("npc.haniwa.male.foot_r", (-2.0, -2.5, -8.0)),
)
),
"Myrmidon": (
left: (
vox_spec: ("npc.myrmidon.male.foot_r", (-1.5, -2.5, -7.0)),
),
right: (
vox_spec: ("npc.myrmidon.male.foot_r", (-1.5, -2.5, -7.0)),
)
),
},
))

View File

@ -0,0 +1,92 @@
((
default: (
left: (
vox_spec: ("armor.hand.hand_reft_none", (-3.0, -2.0, -5.0)),
),
right: (
vox_spec: ("armor.hand.hand_right_none", (-3.0, -2.0, -5.0)),
)
),
map: {
"Gnome": (
left: (
vox_spec: ("npc.gnome.male.hand_r", (-4.0, -2.0, -5.0)),
),
right: (
vox_spec: ("npc.gnome.male.hand_r", (0.0, -2.0, -5.0)),
)
),
"Sahagin": (
left: (
vox_spec: ("npc.sahagin.male.hand_r", (-7.0, -4.0, -13.0)),
),
right: (
vox_spec: ("npc.sahagin.male.hand_r", (0.0, -4.0, -13.0)),
)
),
"Adlet": (
left: (
vox_spec: ("npc.adlet.male.hand_r", (-4.0, -2.0, -7.0)),
),
right: (
vox_spec: ("npc.adlet.male.hand_r", (0.0, -2.0, -7.0)),
)
),
"Gnarling": (
left: (
vox_spec: ("npc.gnarling.male.hand_r", (-3.0, -1.5, -7.0)),
),
right: (
vox_spec: ("npc.gnarling.male.hand_r", (0.0, -1.5, -7.0)),
)
),
"Mandragora": (
left: (
vox_spec: ("npc.mandragora.male.hand_r", (-4.0, -1.5, -7.0)),
),
right: (
vox_spec: ("npc.mandragora.male.hand_r", (0.0, -1.5, -7.0)),
)
),
"Kappa": (
left: (
vox_spec: ("npc.kappa.male.hand_r", (-6.0, -4.0, -12.0)),
),
right: (
vox_spec: ("npc.kappa.male.hand_r", (0.0, -4.0, -12.0)),
)
),
"Cactid": (
left: (
vox_spec: ("npc.cactid.male.hand_r", (-5.0, -1.5, -8.0)),
),
right: (
vox_spec: ("npc.cactid.male.hand_r", (0.0, -1.5, -2.5)),
)
),
"Gnoll": (
left: (
vox_spec: ("npc.gnoll.male.hand_r", (-6.0, -2.0, -9.0)),
),
right: (
vox_spec: ("npc.gnoll.male.hand_r", (0.0, -2.0, -9.0)),
)
),
"Haniwa": (
left: (
vox_spec: ("npc.haniwa.male.hand_r", (-4.0, -2.0, -8.0)),
),
right: (
vox_spec: ("npc.haniwa.male.hand_r", (0.0, -2.0, -8.0)),
)
),
"Myrmidon": (
left: (
vox_spec: ("npc.myrmidon.male.hand_r", (-5.0, -2.0, -9.0)),
),
right: (
vox_spec: ("npc.myrmidon.male.hand_r", (0.0, -2.0, -9.0)),
)
),
},
))

View File

@ -0,0 +1,37 @@
((
default: (
vox_spec: ("armor.pants.pants_none", (-5.0, -3.5, 1.0)),
),
map: {
"Gnome": (
vox_spec: ("npc.gnome.male.pants", (-4.0, -3.5, -2.5)),
),
"Sahagin": (
vox_spec: ("npc.sahagin.male.pants", (-2.5, -3.5, -2.0)),
),
"Adlet": (
vox_spec: ("npc.adlet.male.pants", (-5.0, -4.5, -3.0)),
),
"Gnarling": (
vox_spec: ("npc.gnarling.male.pants", (-3.5, -3.0, -2.5)),
),
"Mandragora": (
vox_spec: ("npc.mandragora.male.pants", (-3.0, -3.0, -1.0)),
),
"Kappa": (
vox_spec: ("npc.kappa.male.pants", (-3.5, -4.0, -1.5)),
),
"Cactid": (
vox_spec: ("npc.cactid.male.pants", (-3.0, -2.0, -1.0)),
),
"Gnoll": (
vox_spec: ("npc.gnoll.male.pants", (-5.0, -4.0, -3.0)),
),
"Haniwa": (
vox_spec: ("npc.haniwa.male.pants", (-4.5, -4.5, -1.5)),
),
"Myrmidon": (
vox_spec: ("npc.myrmidon.male.pants", (-4.5, -4.5, -1.5)),
),
},
))

View File

@ -215,4 +215,148 @@
central: ("npc.kappa.male.tail"),
),
),
(Cactid, Male): (
head: (
offset: (-8.0, -4.0, -7.5),
central: ("npc.cactid.male.head"),
),
chest: (
offset: (-3.0, -3.0, -2.5),
central: ("npc.cactid.male.chest"),
),
shorts: (
offset: (-3.0, -2.0, -1.0),
central: ("npc.cactid.male.shorts"),
),
tail: (
offset: (0.0, 0.0, 0.0),
central: ("armor.empty"),
),
),
(Cactid, Female): (
head: (
offset: (-8.0, -4.0, -7.5),
central: ("npc.cactid.male.head"),
),
chest: (
offset: (-3.0, -3.0, -2.5),
central: ("npc.cactid.male.chest"),
),
shorts: (
offset: (-3.0, -2.0, -1.0),
central: ("npc.cactid.male.shorts"),
),
tail: (
offset: (0.0, 0.0, 0.0),
central: ("armor.empty"),
),
),
(Gnoll, Male): (
head: (
offset: (-4.0, -1.5, -3.0),
central: ("npc.gnoll.male.head"),
),
chest: (
offset: (-5.0, -4.5, -6.0),
central: ("npc.gnoll.male.chest"),
),
shorts: (
offset: (-5.0, -4.0, -3.0),
central: ("npc.gnoll.male.shorts"),
),
tail: (
offset: (-1.0, -11.0, -1.0),
central: ("npc.gnoll.male.tail"),
),
),
(Gnoll, Female): (
head: (
offset: (-4.0, -1.5, -3.0),
central: ("npc.gnoll.male.head"),
),
chest: (
offset: (-5.0, -4.5, -6.0),
central: ("npc.gnoll.male.chest"),
),
shorts: (
offset: (-5.0, -4.0, -3.0),
central: ("npc.gnoll.male.shorts"),
),
tail: (
offset: (-1.0, -11.0, -1.0),
central: ("npc.gnoll.male.tail"),
),
),
(Haniwa, Male): (
head: (
offset: (-5.5, -5.5, -5.5),
central: ("npc.haniwa.male.head"),
),
chest: (
offset: (-6.5, -4.0, -3.0),
central: ("npc.haniwa.male.chest"),
),
shorts: (
offset: (-4.5, -4.5, -1.5),
central: ("npc.haniwa.male.shorts"),
),
tail: (
offset: (0.0, 0.0, 0.0),
central: ("armor.empty"),
),
),
(Haniwa, Female): (
head: (
offset: (-5.5, -5.5, -5.5),
central: ("npc.haniwa.male.head"),
),
chest: (
offset: (-6.5, -4.0, -3.0),
central: ("npc.haniwa.male.chest"),
),
shorts: (
offset: (-4.5, -4.5, -1.5),
central: ("npc.haniwa.male.shorts"),
),
tail: (
offset: (0.0, 0.0, 0.0),
central: ("armor.empty"),
),
),
(Myrmidon, Male): (
head: (
offset: (-4.5, -7.0, -6.5),
central: ("npc.myrmidon.male.head"),
),
chest: (
offset: (-5.5, -4.0, -3.0),
central: ("npc.myrmidon.male.chest"),
),
shorts: (
offset: (-2.5, -3.5, -2.0),
central: ("npc.myrmidon.male.shorts"),
),
tail: (
offset: (-2.5, -7.0, -2.5),
central: ("npc.myrmidon.male.tail"),
),
),
(Myrmidon, Female): (
head: (
offset: (-4.5, -7.0, -6.5),
central: ("npc.myrmidon.male.head"),
),
chest: (
offset: (-5.5, -4.0, -3.0),
central: ("npc.myrmidon.male.chest"),
),
shorts: (
offset: (-2.5, -3.5, -2.0),
central: ("npc.myrmidon.male.shorts"),
),
tail: (
offset: (-2.5, -7.0, -2.5),
central: ("npc.myrmidon.male.tail"),
),
),
})

View File

@ -1,13 +1,5 @@
({
(Gnome, Male): (
hand_l: (
offset: (-4.0, -2.0, -5.0),
lateral: ("npc.gnome.male.hand_l"),
),
hand_r: (
offset: (0.0, -2.0, -5.0),
lateral: ("npc.gnome.male.hand_r"),
),
foot_l: (
offset: (-1.5, -2.0, -4.0),
lateral: ("npc.gnome.male.foot_l"),
@ -18,14 +10,6 @@
),
),
(Gnome, Female): (
hand_l: (
offset: (-4.0, -2.0, -5.0),
lateral: ("npc.gnome.male.hand_l"),
),
hand_r: (
offset: (0.0, -2.0, -5.0),
lateral: ("npc.gnome.male.hand_r"),
),
foot_l: (
offset: (-1.5, -2.0, -4.0),
lateral: ("npc.gnome.male.foot_l"),
@ -36,14 +20,6 @@
),
),
(Sahagin, Male): (
hand_l: (
offset: (-7.0, -4.0, -13.0),
lateral: ("npc.sahagin.male.hand_l"),
),
hand_r: (
offset: (0.0, -4.0, -13.0),
lateral: ("npc.sahagin.male.hand_r"),
),
foot_l: (
offset: (-2.5, -2.0, -8.0),
lateral: ("npc.sahagin.male.foot_l"),
@ -54,14 +30,6 @@
),
),
(Sahagin, Female): (
hand_l: (
offset: (-7.0, -4.0, -13.0),
lateral: ("npc.sahagin.male.hand_l"),
),
hand_r: (
offset: (0.0, -4.0, -13.0),
lateral: ("npc.sahagin.male.hand_r"),
),
foot_l: (
offset: (-2.5, -2.0, -8.0),
lateral: ("npc.sahagin.male.foot_l"),
@ -72,14 +40,6 @@
),
),
(Adlet, Male): (
hand_l: (
offset: (-4.0, -2.0, -7.0),
lateral: ("npc.adlet.male.hand_l"),
),
hand_r: (
offset: (0.0, -2.0, -7.0),
lateral: ("npc.adlet.male.hand_r"),
),
foot_l: (
offset: (-1.5, -3.0, -7.0),
lateral: ("npc.adlet.male.foot_l"),
@ -90,14 +50,6 @@
),
),
(Adlet, Female): (
hand_l: (
offset: (-4.0, -2.0, -7.0),
lateral: ("npc.adlet.male.hand_l"),
),
hand_r: (
offset: (0.0, -2.0, -7.0),
lateral: ("npc.adlet.male.hand_r"),
),
foot_l: (
offset: (-1.5, -3.0, -7.0),
lateral: ("npc.adlet.male.foot_l"),
@ -108,14 +60,6 @@
),
),
(Gnarling, Male): (
hand_l: (
offset: (-3.0, -1.5, -7.0),
lateral: ("npc.gnarling.male.hand_l"),
),
hand_r: (
offset: (0.0, -1.5, -7.0),
lateral: ("npc.gnarling.male.hand_r"),
),
foot_l: (
offset: (-1.0, -2.0, -5.0),
lateral: ("npc.gnarling.male.foot_l"),
@ -126,14 +70,6 @@
),
),
(Gnarling, Female): (
hand_l: (
offset: (-3.0, -1.5, -7.0),
lateral: ("npc.gnarling.male.hand_l"),
),
hand_r: (
offset: (0.0, -1.5, -7.0),
lateral: ("npc.gnarling.male.hand_r"),
),
foot_l: (
offset: (-1.0, -2.0, -5.0),
lateral: ("npc.gnarling.male.foot_l"),
@ -144,14 +80,6 @@
),
),
(Mandragora, Male): (
hand_l: (
offset: (-4.0, -1.5, -7.0),
lateral: ("npc.mandragora.male.hand_l"),
),
hand_r: (
offset: (0.0, -1.5, -7.0),
lateral: ("npc.mandragora.male.hand_r"),
),
foot_l: (
offset: (-1.0, -1.5, -4.0),
lateral: ("npc.mandragora.male.foot_l"),
@ -162,14 +90,6 @@
),
),
(Mandragora, Female): (
hand_l: (
offset: (-4.0, -1.5, -7.0),
lateral: ("npc.mandragora.male.hand_l"),
),
hand_r: (
offset: (0.0, -1.5, -7.0),
lateral: ("npc.mandragora.male.hand_r"),
),
foot_l: (
offset: (-1.0, -1.5, -4.0),
lateral: ("npc.mandragora.male.foot_l"),
@ -180,14 +100,6 @@
),
),
(Kappa, Male): (
hand_l: (
offset: (-6.0, -4.0, -12.0),
lateral: ("npc.kappa.male.hand_l"),
),
hand_r: (
offset: (0.0, -4.0, -12.0),
lateral: ("npc.kappa.male.hand_r"),
),
foot_l: (
offset: (-2.5, -3.0, -9.0),
lateral: ("npc.kappa.male.foot_l"),
@ -198,14 +110,6 @@
),
),
(Kappa, Female): (
hand_l: (
offset: (-6.0, -4.0, -12.0),
lateral: ("npc.kappa.male.hand_l"),
),
hand_r: (
offset: (0.0, -4.0, -12.0),
lateral: ("npc.kappa.male.hand_r"),
),
foot_l: (
offset: (-2.5, -3.0, -9.0),
lateral: ("npc.kappa.male.foot_l"),
@ -215,4 +119,84 @@
lateral: ("npc.kappa.male.foot_r"),
),
),
(Cactid, Male): (
foot_l: (
offset: (-1.5, -2.0, -5.0),
lateral: ("npc.cactid.male.foot_l"),
),
foot_r: (
offset: (-1.5, -2.0, -5.0),
lateral: ("npc.cactid.male.foot_r"),
),
),
(Cactid, Female): (
foot_l: (
offset: (-1.5, -2.0, -5.0),
lateral: ("npc.cactid.male.foot_l"),
),
foot_r: (
offset: (-1.5, -2.0, -5.0),
lateral: ("npc.cactid.male.foot_r"),
),
),
(Gnoll, Male): (
foot_l: (
offset: (-1.5, -3.0, -7.0),
lateral: ("npc.gnoll.male.foot_l"),
),
foot_r: (
offset: (-1.5, -3.0, -7.0),
lateral: ("npc.gnoll.male.foot_r"),
),
),
(Gnoll, Female): (
foot_l: (
offset: (-1.5, -3.0, -7.0),
lateral: ("npc.gnoll.male.foot_l"),
),
foot_r: (
offset: (-1.5, -3.0, -7.0),
lateral: ("npc.gnoll.male.foot_r"),
),
),
(Haniwa, Male): (
foot_l: (
offset: (-2.0, -2.5, -8.0),
lateral: ("npc.haniwa.male.foot_l"),
),
foot_r: (
offset: (-2.0, -2.5, -8.0),
lateral: ("npc.haniwa.male.foot_r"),
),
),
(Haniwa, Female): (
foot_l: (
offset: (-2.0, -2.5, -8.0),
lateral: ("npc.haniwa.male.foot_l"),
),
foot_r: (
offset: (-2.0, -2.5, -8.0),
lateral: ("npc.haniwa.male.foot_r"),
),
),
(Myrmidon, Male): (
foot_l: (
offset: (-1.5, -2.5, -7.0),
lateral: ("npc.myrmidon.male.foot_l"),
),
foot_r: (
offset: (-1.5, -2.5, -7.0),
lateral: ("npc.myrmidon.male.foot_r"),
),
),
(Myrmidon, Female): (
foot_l: (
offset: (-1.5, -2.5, -7.0),
lateral: ("npc.myrmidon.male.foot_l"),
),
foot_r: (
offset: (-1.5, -2.5, -7.0),
lateral: ("npc.myrmidon.male.foot_r"),
),
),
})

View File

@ -11,4 +11,8 @@
vox_spec: ("weapon.bow.adlet", (-0.5, -5.5, -9.5)),
color: None
),
"common.items.npc_weapons.staff.gnoll": (
vox_spec: ("weapon.staff.gnoll", (-2.5, -3.0, -4.0)),
color: None
),
})

Binary file not shown.

Binary file not shown.

BIN
assets/voxygen/voxel/npc/cactid/male/chest.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/cactid/male/foot_r.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/cactid/male/hand_r.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/cactid/male/head.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/cactid/male/pants.vox (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
assets/voxygen/voxel/npc/gnoll/male/chest.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/gnoll/male/foot_r.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/gnoll/male/hand_r.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/gnoll/male/head.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/gnoll/male/pants.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/gnoll/male/tail.vox (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
assets/voxygen/voxel/npc/haniwa/male/HaniwaSoldier-7.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/haniwa/male/chest.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/haniwa/male/foot_r.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/haniwa/male/hand_r.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/haniwa/male/head.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/haniwa/male/pants.vox (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
assets/voxygen/voxel/npc/myrmidon/male/MyrmidonHoplite-5.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/myrmidon/male/chest.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/myrmidon/male/foot_r.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/myrmidon/male/hand_r.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/myrmidon/male/head.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/myrmidon/male/pants.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/myrmidon/male/tail.vox (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
assets/voxygen/voxel/weapon/staff/gnoll.vox (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -40,6 +40,10 @@ make_case_elim!(
Gnarling = 3,
Mandragora = 4,
Kappa = 5,
Cactid = 6,
Gnoll = 7,
Haniwa = 8,
Myrmidon = 9,
}
);
@ -54,6 +58,10 @@ pub struct AllSpecies<SpeciesMeta> {
pub gnarling: SpeciesMeta,
pub mandragora: SpeciesMeta,
pub kappa: SpeciesMeta,
pub cactid: SpeciesMeta,
pub gnoll: SpeciesMeta,
pub haniwa: SpeciesMeta,
pub myrmidon: SpeciesMeta,
}
impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies<SpeciesMeta> {
@ -68,17 +76,25 @@ impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies<SpeciesMeta>
Species::Gnarling => &self.gnarling,
Species::Mandragora => &self.mandragora,
Species::Kappa => &self.kappa,
Species::Cactid => &self.cactid,
Species::Gnoll => &self.gnoll,
Species::Haniwa => &self.haniwa,
Species::Myrmidon => &self.myrmidon,
}
}
}
pub const ALL_SPECIES: [Species; 6] = [
pub const ALL_SPECIES: [Species; 10] = [
Species::Gnome,
Species::Sahagin,
Species::Adlet,
Species::Gnarling,
Species::Mandragora,
Species::Kappa,
Species::Cactid,
Species::Gnoll,
Species::Haniwa,
Species::Myrmidon,
];
impl<'a, SpeciesMeta: 'a> IntoIterator for &'a AllSpecies<SpeciesMeta> {

View File

@ -4,7 +4,7 @@ use crate::comp::{
loadout::Loadout,
slot::{ArmorSlot, EquipSlot},
},
item::{Item, ItemKind},
item::{tool::ToolKind, Item, ItemKind},
object, quadruped_low, quadruped_medium, theropod, Body,
};
use rand::Rng;
@ -32,8 +32,11 @@ pub struct LoadoutBuilder(Loadout);
#[derive(Copy, Clone)]
pub enum LoadoutConfig {
AdletArcher,
AdletWarrior,
Adlet,
Gnarling,
Sahagin,
Haniwa,
Myrmidon,
Guard,
Villager,
Outcast,
@ -248,7 +251,7 @@ impl LoadoutBuilder {
{
(biped_small::Species::Gnome, _) => {
main_tool = Some(Item::new_from_asset_expect(
"common.items.npc_weapons.spear.wooden_spear",
"common.items.npc_weapons.staff.gnoll",
));
},
(biped_small::Species::Adlet, _) => {
@ -258,7 +261,7 @@ impl LoadoutBuilder {
},
_ => {
main_tool = Some(Item::new_from_asset_expect(
"common.items.npc_weapons.bow.adlet",
"common.items.npc_weapons.spear.wooden_spear",
));
},
},
@ -272,19 +275,96 @@ impl LoadoutBuilder {
} else {
Some(Item::empty())
};
let active_tool_kind = active_item.as_ref().and_then(|i| {
if let ItemKind::Tool(tool) = &i.kind() {
Some(tool.kind)
} else {
None
}
});
// Creates rest of loadout
let loadout = if let Some(config) = config {
use LoadoutConfig::*;
match config {
AdletArcher => LoadoutBuilder::new()
.active_item(Some(Item::new_from_asset_expect(
"common.items.npc_weapons.bow.adlet",
Adlet => match active_tool_kind {
Some(ToolKind::Bow) => LoadoutBuilder::new()
.active_item(active_item)
.hands(Some(Item::new_from_asset_expect(
"common.items.npc_armor.hand.adlet",
)))
.feet(Some(Item::new_from_asset_expect(
"common.items.npc_armor.foot.adlet",
)))
.chest(Some(Item::new_from_asset_expect(
"common.items.npc_armor.chest.adlet",
)))
.pants(Some(Item::new_from_asset_expect(
"common.items.npc_armor.pants.adlet",
)))
.build(),
_ => LoadoutBuilder::new().active_item(active_item).build(),
},
Gnarling => match active_tool_kind {
Some(ToolKind::Bow) => LoadoutBuilder::new()
.active_item(active_item)
.feet(Some(Item::new_from_asset_expect(
"common.items.npc_armor.foot.gnarling",
)))
.hands(Some(Item::new_from_asset_expect(
"common.items.npc_armor.hand.gnarling",
)))
.chest(Some(Item::new_from_asset_expect(
"common.items.npc_armor.chest.gnarling",
)))
.pants(Some(Item::new_from_asset_expect(
"common.items.npc_armor.pants.gnarling",
)))
.build(),
_ => LoadoutBuilder::new().active_item(active_item).build(),
},
Sahagin => LoadoutBuilder::new()
.active_item(active_item)
.hands(Some(Item::new_from_asset_expect(
"common.items.npc_armor.hand.sahagin",
)))
.feet(Some(Item::new_from_asset_expect(
"common.items.npc_armor.foot.sahagin",
)))
.chest(Some(Item::new_from_asset_expect(
"common.items.npc_armor.chest.sahagin",
)))
.pants(Some(Item::new_from_asset_expect(
"common.items.npc_armor.pants.sahagin",
)))
.build(),
AdletWarrior => LoadoutBuilder::new()
.active_item(Some(Item::new_from_asset_expect(
"common.items.npc_weapons.spear.wooden_spear",
Haniwa => LoadoutBuilder::new()
.active_item(active_item)
.hands(Some(Item::new_from_asset_expect(
"common.items.npc_armor.hand.haniwa",
)))
.feet(Some(Item::new_from_asset_expect(
"common.items.npc_armor.foot.haniwa",
)))
.chest(Some(Item::new_from_asset_expect(
"common.items.npc_armor.chest.haniwa",
)))
.pants(Some(Item::new_from_asset_expect(
"common.items.npc_armor.pants.haniwa",
)))
.build(),
Myrmidon => LoadoutBuilder::new()
.active_item(active_item)
.hands(Some(Item::new_from_asset_expect(
"common.items.npc_armor.hand.myrmidon",
)))
.feet(Some(Item::new_from_asset_expect(
"common.items.npc_armor.foot.myrmidon",
)))
.hands(Some(Item::new_from_asset_expect(
"common.items.npc_armor.chest.myrmidon",
)))
.feet(Some(Item::new_from_asset_expect(
"common.items.npc_armor.pants.myrmidon",
)))
.build(),
Guard => LoadoutBuilder::new()

View File

@ -8,6 +8,11 @@ use tracing::warn;
#[derive(Copy, Clone)]
pub enum SkillSetConfig {
Adlet,
Gnarling,
Sahagin,
Haniwa,
Myrmidon,
Guard,
Villager,
Outcast,
@ -38,6 +43,81 @@ impl SkillSetBuilder {
use SkillSetConfig::*;
match config {
Some(Adlet) => {
match active_item {
Some(ToolKind::Bow) => {
// Bow
Self::default()
.with_skill_group(SkillGroupKind::Weapon(ToolKind::Bow))
.with_skill(Skill::Bow(BowSkill::BDamage))
.with_skill(Skill::Bow(BowSkill::CDamage))
.with_skill(Skill::Bow(BowSkill::CKnockback))
.with_skill(Skill::Bow(BowSkill::CSpeed))
.with_skill(Skill::Bow(BowSkill::CMove))
},
_ => Self::default(),
}
},
Some(Gnarling) => {
match active_item {
Some(ToolKind::Bow) => {
// Bow
Self::default()
.with_skill_group(SkillGroupKind::Weapon(ToolKind::Bow))
.with_skill(Skill::Bow(BowSkill::BDamage))
.with_skill(Skill::Bow(BowSkill::CDamage))
.with_skill(Skill::Bow(BowSkill::CKnockback))
.with_skill(Skill::Bow(BowSkill::CSpeed))
.with_skill(Skill::Bow(BowSkill::CMove))
},
_ => Self::default(),
}
},
Some(Sahagin) => {
match active_item {
Some(ToolKind::Bow) => {
// Bow
Self::default()
.with_skill_group(SkillGroupKind::Weapon(ToolKind::Bow))
.with_skill(Skill::Bow(BowSkill::BDamage))
.with_skill(Skill::Bow(BowSkill::CDamage))
.with_skill(Skill::Bow(BowSkill::CKnockback))
.with_skill(Skill::Bow(BowSkill::CSpeed))
.with_skill(Skill::Bow(BowSkill::CMove))
},
_ => Self::default(),
}
},
Some(Haniwa) => {
match active_item {
Some(ToolKind::Bow) => {
// Bow
Self::default()
.with_skill_group(SkillGroupKind::Weapon(ToolKind::Bow))
.with_skill(Skill::Bow(BowSkill::BDamage))
.with_skill(Skill::Bow(BowSkill::CDamage))
.with_skill(Skill::Bow(BowSkill::CKnockback))
.with_skill(Skill::Bow(BowSkill::CSpeed))
.with_skill(Skill::Bow(BowSkill::CMove))
},
_ => Self::default(),
}
},
Some(Myrmidon) => {
match active_item {
Some(ToolKind::Bow) => {
// Bow
Self::default()
.with_skill_group(SkillGroupKind::Weapon(ToolKind::Bow))
.with_skill(Skill::Bow(BowSkill::BDamage))
.with_skill(Skill::Bow(BowSkill::CDamage))
.with_skill(Skill::Bow(BowSkill::CKnockback))
.with_skill(Skill::Bow(BowSkill::CSpeed))
.with_skill(Skill::Bow(BowSkill::CMove))
},
_ => Self::default(),
}
},
Some(Guard) => {
if let Some(ToolKind::Sword) = active_item {
// Sword

View File

@ -67,7 +67,7 @@ impl Body {
quadruped_medium::Species::Panda => 180.0,
quadruped_medium::Species::Bear => 180.0,
},
Body::BipedSmall(_) => 100.0,
Body::BipedSmall(_) => 80.0,
Body::BirdMedium(_) => 80.0,
Body::FishMedium(_) => 80.0,
Body::Dragon(_) => 250.0,

View File

@ -67,8 +67,8 @@ impl Animation for AlphaAnimation {
next.chest.position = Vec3::new(0.0, s_a.chest.0, s_a.chest.1) / 13.0;
next.chest.orientation = Quaternion::rotation_z(movement1abs * 0.5 + movement2abs * -0.6);
next.shorts.position = Vec3::new(0.0, s_a.shorts.0, s_a.shorts.1);
next.shorts.orientation = Quaternion::rotation_z(movement1abs * -0.2 + movement2abs * 0.2);
next.pants.position = Vec3::new(0.0, s_a.pants.0, s_a.pants.1);
next.pants.orientation = Quaternion::rotation_z(movement1abs * -0.2 + movement2abs * 0.2);
next.main.position = Vec3::new(0.0, 0.0, 0.0);
next.main.orientation = Quaternion::rotation_x(0.0);

View File

@ -33,7 +33,7 @@ impl Animation for IdleAnimation {
next.head.position = Vec3::new(0.0, s_a.head.0, s_a.head.1 + slow * -0.1);
next.chest.position = Vec3::new(0.0, s_a.chest.0, s_a.chest.1 + slow * 0.3) / 13.0;
next.shorts.position = Vec3::new(0.0, s_a.shorts.0, s_a.shorts.1);
next.pants.position = Vec3::new(0.0, s_a.pants.0, s_a.pants.1);
next.main.position = Vec3::new(2.0, -3.0, -3.0);
next.main.orientation = Quaternion::rotation_y(-0.5) * Quaternion::rotation_z(1.57);

View File

@ -19,7 +19,7 @@ pub type Body = comp::biped_small::Body;
skeleton_impls!(struct BipedSmallSkeleton {
+ head,
+ chest,
+ shorts,
+ pants,
+ tail,
+ main,
+ hand_l,
@ -47,15 +47,15 @@ impl Skeleton for BipedSmallSkeleton {
buf: &mut [FigureBoneData; super::MAX_BONE_COUNT],
) -> Vec3<f32> {
let chest_mat = base_mat * Mat4::<f32>::from(self.chest);
let shorts_mat = chest_mat * Mat4::<f32>::from(self.shorts);
let pants_mat = chest_mat * Mat4::<f32>::from(self.pants);
let control_mat = chest_mat * Mat4::<f32>::from(self.control);
let control_l_mat = Mat4::<f32>::from(self.control_l);
let control_r_mat = Mat4::<f32>::from(self.control_r);
*(<&mut [_; Self::BONE_COUNT]>::try_from(&mut buf[0..Self::BONE_COUNT]).unwrap()) = [
make_bone(chest_mat * Mat4::<f32>::from(self.head)),
make_bone(chest_mat),
make_bone(shorts_mat),
make_bone(shorts_mat * Mat4::<f32>::from(self.tail)),
make_bone(pants_mat),
make_bone(pants_mat * Mat4::<f32>::from(self.tail)),
make_bone(control_mat * Mat4::<f32>::from(self.main)),
make_bone(control_mat * control_l_mat * Mat4::<f32>::from(self.hand_l)),
make_bone(control_mat * control_r_mat * Mat4::<f32>::from(self.hand_r)),
@ -69,7 +69,7 @@ impl Skeleton for BipedSmallSkeleton {
pub struct SkeletonAttr {
head: (f32, f32),
chest: (f32, f32),
shorts: (f32, f32),
pants: (f32, f32),
tail: (f32, f32),
hand: (f32, f32, f32),
foot: (f32, f32, f32),
@ -92,7 +92,7 @@ impl Default for SkeletonAttr {
Self {
head: (0.0, 0.0),
chest: (0.0, 0.0),
shorts: (0.0, 0.0),
pants: (0.0, 0.0),
tail: (0.0, 0.0),
hand: (0.0, 0.0, 0.0),
foot: (0.0, 0.0, 0.0),
@ -112,6 +112,10 @@ impl<'a> From<&'a Body> for SkeletonAttr {
(Gnarling, _) => (0.0, 6.0),
(Mandragora, _) => (-1.0, 9.0),
(Kappa, _) => (8.0, 3.5),
(Cactid, _) => (0.0, 7.0),
(Gnoll, _) => (5.5, -1.0),
(Haniwa, _) => (0.0, 7.0),
(Myrmidon, _) => (0.0, 8.0),
},
chest: match (body.species, body.body_type) {
(Gnome, _) => (0.0, 9.0),
@ -120,14 +124,22 @@ impl<'a> From<&'a Body> for SkeletonAttr {
(Gnarling, _) => (0.0, 7.5),
(Mandragora, _) => (0.0, 10.5),
(Kappa, _) => (0.0, 14.5),
(Cactid, _) => (0.0, 7.0),
(Gnoll, _) => (0.0, 15.5),
(Haniwa, _) => (0.0, 11.0),
(Myrmidon, _) => (0.0, 11.0),
},
shorts: match (body.species, body.body_type) {
pants: match (body.species, body.body_type) {
(Gnome, _) => (0.0, -3.0),
(Sahagin, _) => (0.5, -7.0),
(Adlet, _) => (0.0, -3.0),
(Gnarling, _) => (0.0, -3.0),
(Mandragora, _) => (0.0, -6.5),
(Kappa, _) => (0.0, -3.0),
(Cactid, _) => (0.0, -3.0),
(Gnoll, _) => (0.5, -7.5),
(Haniwa, _) => (0.0, -3.5),
(Myrmidon, _) => (0.0, -3.0),
},
tail: match (body.species, body.body_type) {
(Gnome, _) => (0.0, 0.0),
@ -136,6 +148,10 @@ impl<'a> From<&'a Body> for SkeletonAttr {
(Gnarling, _) => (-2.0, 1.5),
(Mandragora, _) => (0.0, -1.0),
(Kappa, _) => (0.0, -4.0),
(Cactid, _) => (0.0, 0.0),
(Gnoll, _) => (-2.5, -2.0),
(Haniwa, _) => (-4.5, -2.0),
(Myrmidon, _) => (-2.5, -1.0),
},
hand: match (body.species, body.body_type) {
(Gnome, _) => (4.0, 0.5, -1.0),
@ -144,6 +160,10 @@ impl<'a> From<&'a Body> for SkeletonAttr {
(Gnarling, _) => (4.0, 0.0, 1.5),
(Mandragora, _) => (4.0, -0.5, -2.5),
(Kappa, _) => (4.0, 3.5, -0.5),
(Cactid, _) => (4.0, 0.5, -1.0),
(Gnoll, _) => (3.5, 0.5, -1.0),
(Haniwa, _) => (4.25, -1.0, 1.5),
(Myrmidon, _) => (3.5, 1.5, 2.0),
},
foot: match (body.species, body.body_type) {
(Gnome, _) => (3.0, 0.0, 4.0),
@ -152,6 +172,10 @@ impl<'a> From<&'a Body> for SkeletonAttr {
(Gnarling, _) => (2.5, 1.0, 5.0),
(Mandragora, _) => (3.0, 0.0, 4.0),
(Kappa, _) => (3.0, 3.0, 9.0),
(Cactid, _) => (3.0, 0.0, 5.0),
(Gnoll, _) => (3.0, 1.0, 7.0),
(Haniwa, _) => (3.0, 0.5, 8.0),
(Myrmidon, _) => (3.0, 0.5, 7.0),
},
grip: match (body.species, body.body_type) {
(Gnome, _) => (0.0, 0.0, 5.0),
@ -160,6 +184,10 @@ impl<'a> From<&'a Body> for SkeletonAttr {
(Gnarling, _) => (0.0, 0.0, 7.0),
(Mandragora, _) => (0.0, 0.0, 7.0),
(Kappa, _) => (0.75, 1.0, 12.0),
(Cactid, _) => (0.0, 0.0, 8.0),
(Gnoll, _) => (1.0, 0.0, 9.0),
(Haniwa, _) => (0.0, 0.5, 8.0),
(Myrmidon, _) => (0.0, 0.0, 8.0),
},
}
}

View File

@ -108,8 +108,8 @@ impl Animation for RunAnimation {
next.main.position = Vec3::new(2.0, -3.0, -3.0);
next.main.orientation = Quaternion::rotation_y(-0.5) * Quaternion::rotation_z(1.57);
next.shorts.position = Vec3::new(0.0, s_a.shorts.0, s_a.shorts.1);
next.shorts.orientation = Quaternion::rotation_x(0.1 * speednorm)
next.pants.position = Vec3::new(0.0, s_a.pants.0, s_a.pants.1);
next.pants.orientation = Quaternion::rotation_x(0.1 * speednorm)
* Quaternion::rotation_z(short * 0.25 + tilt * -1.5)
* Quaternion::rotation_y(tilt * 0.7);

View File

@ -48,10 +48,8 @@ impl Animation for ShootAnimation {
let mut next = (*skeleton).clone();
let speed = Vec2::<f32>::from(velocity).magnitude();
let fastacc = (acc_vel * 2.0).sin();
let fast = (anim_time as f32 * 10.0).sin();
let fastalt = (anim_time as f32 * 10.0 + PI / 2.0).sin();
let slow = (anim_time as f32 * 2.0).sin();
let speednorm = speed / 9.4;
let speednormcancel = 1.0 - speednorm;
@ -69,7 +67,7 @@ impl Animation for ShootAnimation {
s_a.chest.1 + fastalt * 0.4 * speednormcancel + speednormcancel * -0.5,
) / 13.0;
next.shorts.position = Vec3::new(0.0, s_a.shorts.0, s_a.shorts.1);
next.pants.position = Vec3::new(0.0, s_a.pants.0, s_a.pants.1);
next.tail.position = Vec3::new(0.0, s_a.tail.0, s_a.tail.1);
next.tail.orientation = Quaternion::rotation_x(0.05 * fastalt * speednormcancel)
@ -96,8 +94,6 @@ impl Animation for ShootAnimation {
let subtract = global_time - timer;
let check = subtract - subtract.trunc();
let mirror = (check - 0.5).signum() as f32;
let movement1 = mirror * movement1base * pullback;
let movement2 = mirror * movement2base * pullback;
let movement1abs = movement1base * pullback;
let movement2abs = movement2base * pullback;
next.control_l.position = Vec3::new(

View File

@ -57,7 +57,7 @@ impl Animation for WieldAnimation {
s_a.chest.1 + fastalt * 0.4 * speednormcancel + speednormcancel * -0.5,
) / 13.0;
next.shorts.position = Vec3::new(0.0, s_a.shorts.0, s_a.shorts.1);
next.pants.position = Vec3::new(0.0, s_a.pants.0, s_a.pants.1);
next.tail.position = Vec3::new(0.0, s_a.tail.0, s_a.tail.1);
next.tail.orientation = Quaternion::rotation_x(0.05 * fastalt * speednormcancel)
@ -118,6 +118,33 @@ impl Animation for WieldAnimation {
next.control.orientation = Quaternion::rotation_x(-0.3 + 0.5 * speednorm)
* Quaternion::rotation_y(0.5 * speednorm);
},
Some(ToolKind::Staff) => {
next.control_l.position = Vec3::new(2.0 - s_a.grip.0 * 2.0, 1.0, 3.0);
next.control_r.position =
Vec3::new(7.0 + s_a.grip.0 * 2.0, -4.0, 3.0 + speednorm * -3.0);
next.control.position = Vec3::new(
-5.0,
-1.0 + s_a.grip.2,
-2.0 + -s_a.grip.2 / 2.5
+ s_a.grip.0 * -2.0
+ fastacc * 1.5
+ fastalt * 0.5 * speednormcancel
+ speednorm * 2.0,
);
next.control_l.orientation = Quaternion::rotation_x(PI / 2.0 + slow * 0.1)
* Quaternion::rotation_y(-0.3)
* Quaternion::rotation_z(-0.3);
next.control_r.orientation =
Quaternion::rotation_x(PI / 2.0 + slow * 0.1 + s_a.grip.0 * 0.2)
* Quaternion::rotation_y(-0.4 + slow * 0.0 + s_a.grip.0 * 0.2)
* Quaternion::rotation_z(-0.0);
next.control.orientation = Quaternion::rotation_x(-0.3 + 0.2 * speednorm)
* Quaternion::rotation_y(-0.2 * speednorm)
* Quaternion::rotation_z(0.5);
},
_ => {},
}

View File

@ -2475,8 +2475,6 @@ struct BipedSmallCentralSpec(HashMap<(BSSpecies, BSBodyType), SidedBSCentralVoxS
#[derive(Deserialize)]
struct SidedBSCentralVoxSpec {
head: BipedSmallCentralSubSpec,
chest: BipedSmallCentralSubSpec,
shorts: BipedSmallCentralSubSpec,
tail: BipedSmallCentralSubSpec,
}
#[derive(Deserialize)]
@ -2484,30 +2482,27 @@ struct BipedSmallCentralSubSpec {
offset: [f32; 3], // Should be relative to initial origin
central: VoxSimple,
}
#[derive(Deserialize)]
struct BipedSmallLateralSpec(HashMap<(BSSpecies, BSBodyType), SidedBSLateralVoxSpec>);
#[derive(Deserialize)]
struct SidedBSLateralVoxSpec {
hand_l: BipedSmallLateralSubSpec,
hand_r: BipedSmallLateralSubSpec,
foot_l: BipedSmallLateralSubSpec,
foot_r: BipedSmallLateralSubSpec,
}
#[derive(Deserialize)]
struct BipedSmallLateralSubSpec {
offset: [f32; 3], // Should be relative to initial origin
lateral: VoxSimple,
}
#[derive(Deserialize)]
struct BipedSmallWeaponSpec(HashMap<String, ArmorVoxSpec>);
#[derive(Deserialize)]
struct BipedSmallArmorHandSpec(ArmorVoxSpecMap<String, SidedArmorVoxSpec>);
#[derive(Deserialize)]
struct BipedSmallArmorFootSpec(ArmorVoxSpecMap<String, SidedArmorVoxSpec>);
#[derive(Deserialize)]
struct BipedSmallArmorChestSpec(ArmorVoxSpecMap<String, ArmorVoxSpec>);
#[derive(Deserialize)]
struct BipedSmallArmorPantsSpec(ArmorVoxSpecMap<String, ArmorVoxSpec>);
make_vox_spec!(
biped_small::Body,
struct BipedSmallSpec {
central: BipedSmallCentralSpec = "voxygen.voxel.biped_small_central_manifest",
lateral: BipedSmallLateralSpec = "voxygen.voxel.biped_small_lateral_manifest",
armor_foot: BipedSmallArmorFootSpec = "voxygen.voxel.biped_small_armor_foot_manifest",
weapon: BipedSmallWeaponSpec = "voxygen.voxel.biped_small_weapon_manifest",
armor_hand: BipedSmallArmorHandSpec = "voxygen.voxel.biped_small_armor_hand_manifest",
armor_chest: BipedSmallArmorChestSpec = "voxygen.voxel.biped_small_armor_chest_manifest",
armor_pants: BipedSmallArmorPantsSpec = "voxygen.voxel.biped_small_armor_pants_manifest",
},
|FigureKey { body, extra }, spec| {
const DEFAULT_LOADOUT: super::cache::CharacterCacheKey = super::cache::CharacterCacheKey {
@ -2521,20 +2516,29 @@ make_vox_spec!(
// TODO: This is bad code, maybe this method should return Option<_>
let loadout = extra.as_deref().unwrap_or(&DEFAULT_LOADOUT);
let third_person = loadout.third_person.as_ref();
let tool = loadout.tool.as_ref();
let hand = loadout.hand.as_deref();
let foot = loadout.foot.as_deref();
[
Some(spec.central.read().0.mesh_head(
body.species,
body.body_type,
)),
Some(spec.central.read().0.mesh_chest(
body.species,
body.body_type,
)),
Some(spec.central.read().0.mesh_shorts(
body.species,
body.body_type,
)),
third_person.map(|loadout| {
spec.armor_chest.read().0.mesh_chest(
loadout.chest.as_deref(),
false,
)
}),
third_person.map(|loadout| {
spec.armor_pants.read().0.mesh_pants(
loadout.pants.as_deref(),
false,
)
}),
Some(spec.central.read().0.mesh_tail(
body.species,
body.body_type,
@ -2545,21 +2549,17 @@ make_vox_spec!(
false,
)
}),
Some(spec.lateral.read().0.mesh_hand_l(
body.species,
body.body_type,
Some(spec.armor_hand.read().0.mesh_left_hand(
hand,
)),
Some(spec.lateral.read().0.mesh_hand_r(
body.species,
body.body_type,
Some(spec.armor_hand.read().0.mesh_right_hand(
hand,
)),
Some(spec.lateral.read().0.mesh_foot_l(
body.species,
body.body_type,
Some(spec.armor_foot.read().0.mesh_left_foot(
foot,
)),
Some(spec.lateral.read().0.mesh_foot_r(
body.species,
body.body_type,
Some(spec.armor_foot.read().0.mesh_right_foot(
foot,
)),
None,
None,
@ -2589,38 +2589,6 @@ impl BipedSmallCentralSpec {
(central, Vec3::from(spec.head.offset))
}
fn mesh_chest(&self, species: BSSpecies, body_type: BSBodyType) -> BoneMeshes {
let spec = match self.0.get(&(species, body_type)) {
Some(spec) => spec,
None => {
error!(
"No 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 central = graceful_load_segment(&spec.chest.central.0);
(central, Vec3::from(spec.chest.offset))
}
fn mesh_shorts(&self, species: BSSpecies, body_type: BSBodyType) -> BoneMeshes {
let spec = match self.0.get(&(species, body_type)) {
Some(spec) => spec,
None => {
error!(
"No shorts 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.shorts.central.0);
(central, Vec3::from(spec.shorts.offset))
}
fn mesh_tail(&self, species: BSSpecies, body_type: BSBodyType) -> BoneMeshes {
let spec = match self.0.get(&(species, body_type)) {
Some(spec) => spec,
@ -2638,88 +2606,137 @@ impl BipedSmallCentralSpec {
}
}
impl BipedSmallLateralSpec {
fn mesh_hand_l(&self, species: BSSpecies, body_type: BSBodyType) -> BoneMeshes {
let spec = match self.0.get(&(species, body_type)) {
Some(spec) => spec,
None => {
error!(
"No hand specification exists for the combination of {:?} and {:?}",
species, body_type
);
return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5));
},
impl BipedSmallArmorChestSpec {
fn mesh_chest(&self, chest: Option<&str>, flipped: bool) -> BoneMeshes {
let spec = if let Some(chest) = chest {
match self.0.map.get(chest) {
Some(spec) => spec,
None => {
error!(?chest, "No chest specification exists");
return load_mesh("not_found", Vec3::new(-1.5, -1.5, -7.0));
},
}
} else {
&self.0.default
};
let lateral = graceful_load_segment(&spec.hand_l.lateral.0);
(lateral, Vec3::from(spec.hand_l.offset))
}
fn mesh_hand_r(&self, species: BSSpecies, body_type: BSBodyType) -> BoneMeshes {
let spec = match self.0.get(&(species, body_type)) {
Some(spec) => spec,
None => {
error!(
"No 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 chest_segment = if flipped {
graceful_load_segment_flipped(&spec.vox_spec.0)
} else {
graceful_load_segment(&spec.vox_spec.0)
};
let lateral = graceful_load_segment(&spec.hand_r.lateral.0);
(lateral, Vec3::from(spec.hand_r.offset))
}
fn mesh_foot_l(&self, species: BSSpecies, body_type: BSBodyType) -> BoneMeshes {
let spec = match self.0.get(&(species, body_type)) {
Some(spec) => spec,
None => {
error!(
"No 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 offset = Vec3::new(
if flipped {
0.0 - spec.vox_spec.1[0] - (chest_segment.sz.x as f32)
} else {
spec.vox_spec.1[0]
},
};
let lateral = graceful_load_segment(&spec.foot_l.lateral.0);
spec.vox_spec.1[1],
spec.vox_spec.1[2],
);
(lateral, Vec3::from(spec.foot_l.offset))
}
fn mesh_foot_r(&self, species: BSSpecies, body_type: BSBodyType) -> BoneMeshes {
let spec = match self.0.get(&(species, body_type)) {
Some(spec) => spec,
None => {
error!(
"No 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))
(chest_segment, offset)
}
}
/*impl BipedSmallWeaponSpec {
fn mesh_main(&self, species: BSSpecies, body_type: BSBodyType) -> BoneMeshes {
let spec = match self.0.get(&(species, body_type)) {
Some(spec) => spec,
None => {
error!(
"No main specification exists for the combination of {:?} and {:?}",
species, body_type
);
return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5));
},
impl BipedSmallArmorPantsSpec {
fn mesh_pants(&self, pants: Option<&str>, flipped: bool) -> BoneMeshes {
let spec = if let Some(pants) = pants {
match self.0.map.get(pants) {
Some(spec) => spec,
None => {
error!(?pants, "No pants specification exists");
return load_mesh("not_found", Vec3::new(-1.5, -1.5, -7.0));
},
}
} else {
&self.0.default
};
let weapon = graceful_load_segment(&spec.main.weapon.0);
(weapon, Vec3::from(spec.main.offset))
let pants_segment = if flipped {
graceful_load_segment_flipped(&spec.vox_spec.0)
} else {
graceful_load_segment(&spec.vox_spec.0)
};
let offset = Vec3::new(
if flipped {
0.0 - spec.vox_spec.1[0] - (pants_segment.sz.x as f32)
} else {
spec.vox_spec.1[0]
},
spec.vox_spec.1[1],
spec.vox_spec.1[2],
);
(pants_segment, offset)
}
*///}
}
impl BipedSmallArmorHandSpec {
fn mesh_hand(&self, hand: Option<&str>, flipped: bool) -> BoneMeshes {
let spec = if let Some(hand) = hand {
match self.0.map.get(hand) {
Some(spec) => spec,
None => {
error!(?hand, "No hand specification exists");
return load_mesh("not_found", Vec3::new(-1.5, -1.5, -7.0));
},
}
} else {
&self.0.default
};
let hand_segment = if flipped {
graceful_load_segment_flipped(&spec.left.vox_spec.0)
} else {
graceful_load_segment(&spec.right.vox_spec.0)
};
let offset = if flipped {
spec.left.vox_spec.1
} else {
spec.right.vox_spec.1
};
(hand_segment, Vec3::from(offset))
}
fn mesh_left_hand(&self, hand: Option<&str>) -> BoneMeshes { self.mesh_hand(hand, true) }
fn mesh_right_hand(&self, hand: Option<&str>) -> BoneMeshes { self.mesh_hand(hand, false) }
}
impl BipedSmallArmorFootSpec {
fn mesh_foot(&self, foot: Option<&str>, flipped: bool) -> BoneMeshes {
let spec = if let Some(foot) = foot {
match self.0.map.get(foot) {
Some(spec) => spec,
None => {
error!(?foot, "No foot specification exists");
return load_mesh("not_found", Vec3::new(-1.5, -1.5, -7.0));
},
}
} else {
&self.0.default
};
let foot_segment = if flipped {
graceful_load_segment_flipped(&spec.left.vox_spec.0)
} else {
graceful_load_segment(&spec.right.vox_spec.0)
};
let offset = if flipped {
spec.left.vox_spec.1
} else {
spec.right.vox_spec.1
};
(foot_segment, Vec3::from(offset))
}
fn mesh_left_foot(&self, foot: Option<&str>) -> BoneMeshes { self.mesh_foot(foot, true) }
fn mesh_right_foot(&self, foot: Option<&str>) -> BoneMeshes { self.mesh_foot(foot, false) }
}
impl BipedSmallWeaponSpec {
fn mesh_main(&self, item_definition_id: &str, flipped: bool) -> BoneMeshes {
let spec = match self.0.get(item_definition_id) {
@ -2738,8 +2755,6 @@ impl BipedSmallWeaponSpec {
let offset = Vec3::new(
if flipped {
//log::warn!("tool kind segment {:?}", );
//tool_kind_segment.;
0.0 - spec.vox_spec.1[0] - (tool_kind_segment.sz.x as f32)
} else {
spec.vox_spec.1[0]

View File

@ -2736,7 +2736,7 @@ impl FigureMgr {
Some(s.stage_section),
state.state_time,
),
state.state_time,
stage_progress,
&mut state_animation_rate,
skeleton_attr,
)
@ -2778,7 +2778,7 @@ impl FigureMgr {
Some(s.stage_section),
state.state_time,
),
state.state_time,
stage_progress,
&mut state_animation_rate,
skeleton_attr,
),
@ -2794,7 +2794,7 @@ impl FigureMgr {
Some(s.stage_section),
state.state_time,
),
state.state_time,
stage_progress,
&mut state_animation_rate,
skeleton_attr,
),

View File

@ -7,6 +7,7 @@ use crate::{
util::{attempt, Grid, RandomField, Sampler, CARDINALS, DIRS},
IndexRef,
};
use common::{
assets::{AssetExt, AssetHandle},
astar::Astar,
@ -598,7 +599,6 @@ impl Floor {
.map(|e| e as f32 / 16.0),
)
//.do_if(is_giant, |e| e.into_giant())
.with_body(comp::Body::Humanoid(comp::humanoid::Body::random()))
.with_alignment(comp::Alignment::Enemy)
.with_loadout_config(loadout_builder::LoadoutConfig::CultistAcolyte)
.with_skillset_config(common::skillset_builder::SkillSetConfig::CultistAcolyte)
@ -606,88 +606,110 @@ impl Floor {
.with_level(dynamic_rng.gen_range((room.difficulty as f32).powf(1.25) + 3.0..(room.difficulty as f32).powf(1.5) + 4.0).round() as u16);
let entity = match room.difficulty {
0 => entity
.with_name("Outcast")
.with_loadout_config(loadout_builder::LoadoutConfig::Outcast)
.with_body(comp::Body::BipedSmall(
comp::biped_small::Body::random_with(
dynamic_rng,
&comp::biped_small::Species::Gnarling,
),
))
.with_name("Gnarling")
.with_loadout_config(loadout_builder::LoadoutConfig::Gnarling)
.with_skillset_config(
common::skillset_builder::SkillSetConfig::Outcast,
common::skillset_builder::SkillSetConfig::Gnarling,
)
.with_loot_drop(comp::Item::new_from_asset_expect(chosen))
.with_main_tool(comp::Item::new_from_asset_expect(
match dynamic_rng.gen_range(0..6) {
0 => "common.items.weapons.axe.starter_axe",
1..=2 => "common.items.weapons.sword.starter",
3 => "common.items.weapons.hammer.starter_hammer",
4 => "common.items.weapons.staff.starter_staff",
_ => "common.items.weapons.bow.starter",
match dynamic_rng.gen_range(0, 3) {
0 => "common.items.npc_weapons.spear.wooden_spear",
1 => "common.items.npc_weapons.staff.gnoll",
_ => "common.items.npc_weapons.bow.adlet",
},
)),
1 => entity
.with_name("Highwayman")
.with_loadout_config(loadout_builder::LoadoutConfig::Highwayman)
.with_body(comp::Body::BipedSmall(
comp::biped_small::Body::random_with(
dynamic_rng,
&comp::biped_small::Species::Adlet,
),
))
.with_name("Adlet")
.with_loadout_config(loadout_builder::LoadoutConfig::Adlet)
.with_skillset_config(
common::skillset_builder::SkillSetConfig::Highwayman,
common::skillset_builder::SkillSetConfig::Adlet,
)
.with_loot_drop(comp::Item::new_from_asset_expect(chosen))
.with_main_tool(comp::Item::new_from_asset_expect(
match dynamic_rng.gen_range(0..6) {
0 => "common.items.weapons.axe.worn_iron_axe-0",
1..=2 => "common.items.weapons.sword.steel-8",
3 => "common.items.weapons.hammer.worn_iron_hammer-0",
4 => "common.items.weapons.staff.bone_staff",
_ => "common.items.weapons.bow.hardwood-3",
match dynamic_rng.gen_range(0, 3) {
0 => "common.items.npc_weapons.spear.wooden_spear",
1 => "common.items.npc_weapons.staff.gnoll",
_ => "common.items.npc_weapons.bow.adlet",
},
)),
2 => entity
.with_name("Bandit")
.with_loadout_config(loadout_builder::LoadoutConfig::Bandit)
.with_body(comp::Body::BipedSmall(
comp::biped_small::Body::random_with(
dynamic_rng,
&comp::biped_small::Species::Sahagin,
),
))
.with_name("Sahagin")
.with_loadout_config(loadout_builder::LoadoutConfig::Sahagin)
.with_skillset_config(
common::skillset_builder::SkillSetConfig::Bandit,
common::skillset_builder::SkillSetConfig::Sahagin,
)
.with_loot_drop(comp::Item::new_from_asset_expect(chosen))
.with_main_tool(comp::Item::new_from_asset_expect(
match dynamic_rng.gen_range(0..6) {
0 => "common.items.weapons.axe.bronze_axe-0",
1 => "common.items.weapons.sword.iron-4",
2 => "common.items.weapons.sword.cultist",
3 => "common.items.weapons.hammer.bronze_hammer-0",
4 => "common.items.weapons.staff.bone_staff",
_ => "common.items.weapons.bow.wood-3",
match dynamic_rng.gen_range(0, 3) {
0 => "common.items.npc_weapons.spear.wooden_spear",
1 => "common.items.npc_weapons.staff.gnoll",
_ => "common.items.npc_weapons.bow.adlet",
},
)),
3 => entity
.with_name("Cultist Novice")
.with_loadout_config(loadout_builder::LoadoutConfig::CultistNovice)
.with_body(comp::Body::BipedSmall(
comp::biped_small::Body::random_with(
dynamic_rng,
&comp::biped_small::Species::Haniwa,
),
))
.with_name("Haniwa")
.with_loadout_config(loadout_builder::LoadoutConfig::Haniwa)
.with_skillset_config(
common::skillset_builder::SkillSetConfig::CultistNovice,
common::skillset_builder::SkillSetConfig::Haniwa,
)
.with_loot_drop(comp::Item::new_from_asset_expect(chosen))
.with_main_tool(comp::Item::new_from_asset_expect(
match dynamic_rng.gen_range(0..6) {
0 => "common.items.weapons.axe.steel_axe-0",
1..=2 => "common.items.weapons.sword.steel-2",
3 => "common.items.weapons.hammer.cobalt_hammer-0",
4 => "common.items.weapons.staff.amethyst_staff",
_ => "common.items.weapons.bow.bone-1",
match dynamic_rng.gen_range(0, 3) {
0 => "common.items.npc_weapons.spear.wooden_spear",
1 => "common.items.npc_weapons.staff.gnoll",
_ => "common.items.npc_weapons.bow.adlet",
},
)),
4 => entity
.with_name("Cultist Acolyte")
.with_loadout_config(loadout_builder::LoadoutConfig::CultistAcolyte)
.with_body(comp::Body::BipedSmall(
comp::biped_small::Body::random_with(
dynamic_rng,
&comp::biped_small::Species::Myrmidon,
),
))
.with_name("Myrmidon")
.with_loadout_config(loadout_builder::LoadoutConfig::Myrmidon)
.with_skillset_config(
common::skillset_builder::SkillSetConfig::CultistAcolyte,
common::skillset_builder::SkillSetConfig::Myrmidon,
)
.with_loot_drop(comp::Item::new_from_asset_expect(chosen))
.with_main_tool(comp::Item::new_from_asset_expect(
match dynamic_rng.gen_range(0..6) {
0 => "common.items.weapons.axe.malachite_axe-0",
1..=2 => "common.items.weapons.sword.cultist",
3 => "common.items.weapons.hammer.cultist_purp_2h-0",
4 => "common.items.weapons.staff.cultist_staff",
_ => "common.items.weapons.bow.bone-1",
match dynamic_rng.gen_range(0, 3) {
0 => "common.items.npc_weapons.spear.wooden_spear",
1 => "common.items.npc_weapons.staff.gnoll",
_ => "common.items.npc_weapons.bow.adlet",
},
)),
5 => match dynamic_rng.gen_range(0..6) {
0 => entity
.with_body(comp::Body::BipedSmall(
comp::biped_small::Body::random(),
))
.with_name("Cultist Warlock")
.with_loadout_config(loadout_builder::LoadoutConfig::Warlock)
.with_skillset_config(