more gnarling weapons

This commit is contained in:
jshipsey 2021-12-21 02:10:39 -05:00
parent 7f928d0bc0
commit 1fac6359de
32 changed files with 430 additions and 96 deletions

View File

@ -65,7 +65,12 @@
), ),
Custom("Axe Simple"): ( Custom("Axe Simple"): (
primary: "common.abilities.axesimple.doublestrike", primary: "common.abilities.axesimple.doublestrike",
secondary: "common.abilities.axesimple.dash", secondary: "common.abilities.axesimple.doublestrike",
abilities: [],
),
Custom("Dagger Simple"): (
primary: "common.abilities.daggersimple.singlestrike",
secondary: "common.abilities.daggersimple.singlestrike",
abilities: [], abilities: [],
), ),
Custom("Sword Simple"): ( Custom("Sword Simple"): (
@ -84,6 +89,12 @@
abilities: [ abilities: [
], ],
), ),
Tool(Blowgun): (
primary: "common.abilities.blowgun.basic",
secondary: "common.abilities.blowgun.basic",
abilities: [
],
),
Tool(Dagger): ( Tool(Dagger): (
primary: "common.abilities.dagger.tempbasic", primary: "common.abilities.dagger.tempbasic",
secondary: "common.abilities.dagger.tempbasic", secondary: "common.abilities.dagger.tempbasic",
@ -268,6 +279,11 @@
(None, "common.abilities.custom.harvester.explodingpumpkin"), (None, "common.abilities.custom.harvester.explodingpumpkin"),
], ],
), ),
Custom("Oni"): (
primary: "common.abilities.custom.oni.dash",
secondary: "common.abilities.custom.oni.doublestrike",
abilities: [],
),
Custom("Bird Large Breathe"): ( Custom("Bird Large Breathe"): (
primary: "common.abilities.custom.birdlargebreathe.firebomb", primary: "common.abilities.custom.birdlargebreathe.firebomb",
secondary: "common.abilities.custom.birdlargebreathe.triplestrike", secondary: "common.abilities.custom.birdlargebreathe.triplestrike",

View File

@ -2,18 +2,18 @@ ComboMelee(
stage_data: [ stage_data: [
( (
stage: 1, stage: 1,
base_damage: 9.0, base_damage: 8.0,
damage_increase: 1.0, damage_increase: 1.0,
base_poise_damage: 0, base_poise_damage: 15,
poise_damage_increase: 0, poise_damage_increase: 0,
knockback: 4.0, knockback: 8.0,
range: 3.5, range: 3.5,
angle: 50.0, angle: 50.0,
base_buildup_duration: 0.6, base_buildup_duration: 0.4,
base_swing_duration: 0.12, base_swing_duration: 0.08,
hit_timing: 0.5, hit_timing: 0.5,
base_recover_duration: 0.6, base_recover_duration: 0.5,
forward_movement: 3.5, forward_movement: 2.5,
damage_kind: Slashing, damage_kind: Slashing,
damage_effect: Some(Buff(( damage_effect: Some(Buff((
kind: Bleeding, kind: Bleeding,
@ -24,18 +24,18 @@ ComboMelee(
), ),
( (
stage: 2, stage: 2,
base_damage: 13.0, base_damage: 10.0,
damage_increase: 1.5, damage_increase: 1.5,
base_poise_damage: 0, base_poise_damage: 20,
poise_damage_increase: 0, poise_damage_increase: 0,
knockback: 16.0, knockback: 12.0,
range: 5.5, range: 3.5,
angle: 15.0, angle: 30.0,
base_buildup_duration: 0.5, base_buildup_duration: 0.7,
base_swing_duration: 0.15, base_swing_duration: 0.1,
hit_timing: 0.5, hit_timing: 0.5,
base_recover_duration: 1.2, base_recover_duration: 0.7,
forward_movement: 4.5, forward_movement: 2.0,
damage_kind: Slashing, damage_kind: Slashing,
damage_effect: Some(Buff(( damage_effect: Some(Buff((
kind: Bleeding, kind: Bleeding,
@ -52,5 +52,5 @@ ComboMelee(
max_speed_increase: 0.0, max_speed_increase: 0.0,
scales_from_combo: 0, scales_from_combo: 0,
is_interruptible: false, is_interruptible: false,
ori_modifier: 0.6, ori_modifier: 0.7,
) )

View File

@ -0,0 +1,15 @@
BasicRanged(
energy_cost: 0,
buildup_duration: 0.5,
recover_duration: 0.3,
projectile: Arrow(
damage: 3.5,
knockback: 5.0,
energy_regen: 4.0,
),
projectile_body: Object(Arrow),
projectile_light: None,
projectile_speed: 100.0,
num_projectiles: 1,
projectile_spread: 0.0,
)

View File

@ -0,0 +1,56 @@
ComboMelee(
stage_data: [
(
stage: 1,
base_damage: 9.0,
damage_increase: 1.0,
base_poise_damage: 0,
poise_damage_increase: 0,
knockback: 4.0,
range: 3.5,
angle: 50.0,
base_buildup_duration: 0.6,
base_swing_duration: 0.12,
hit_timing: 0.5,
base_recover_duration: 0.6,
forward_movement: 3.5,
damage_kind: Slashing,
damage_effect: Some(Buff((
kind: Bleeding,
dur_secs: 10.0,
strength: DamageFraction(0.1),
chance: 0.1,
))),
),
(
stage: 2,
base_damage: 13.0,
damage_increase: 1.5,
base_poise_damage: 0,
poise_damage_increase: 0,
knockback: 16.0,
range: 5.5,
angle: 15.0,
base_buildup_duration: 0.5,
base_swing_duration: 0.15,
hit_timing: 0.5,
base_recover_duration: 1.2,
forward_movement: 4.5,
damage_kind: Slashing,
damage_effect: Some(Buff((
kind: Bleeding,
dur_secs: 10.0,
strength: DamageFraction(0.1),
chance: 0.1,
))),
),
],
initial_energy_gain: 0,
max_energy_gain: 0,
energy_increase: 0,
speed_increase: 0.0,
max_speed_increase: 0.0,
scales_from_combo: 0,
is_interruptible: false,
ori_modifier: 0.6,
)

View File

@ -0,0 +1,34 @@
ComboMelee(
stage_data: [
(
stage: 1,
base_damage: 2.0,
damage_increase: 1.0,
base_poise_damage: 8,
poise_damage_increase: 0,
knockback: 8.0,
range: 3.5,
angle: 50.0,
base_buildup_duration: 0.1,
base_swing_duration: 0.05,
hit_timing: 0.5,
base_recover_duration: 0.05,
forward_movement: 1.0,
damage_kind: Slashing,
damage_effect: Some(Buff((
kind: Bleeding,
dur_secs: 10.0,
strength: DamageFraction(0.1),
chance: 0.1,
))),
),
],
initial_energy_gain: 0,
max_energy_gain: 0,
energy_increase: 0,
speed_increase: 0.0,
max_speed_increase: 0.0,
scales_from_combo: 0,
is_interruptible: false,
ori_modifier: 0.7,
)

View File

@ -5,7 +5,7 @@ EntityConfig (
loot: LootTable("common.loot_tables.dungeon.tier-0.enemy"), loot: LootTable("common.loot_tables.dungeon.tier-0.enemy"),
hands: TwoHanded(Item("common.items.npc_weapons.biped_small.gnarling.adlet_bow")), hands: TwoHanded(Item("common.items.npc_weapons.biped_small.gnarling.axe")),
meta: [ meta: [
LoadoutAsset("common.loadout.dungeon.tier-0.logger"), LoadoutAsset("common.loadout.dungeon.tier-0.logger"),

View File

@ -5,7 +5,7 @@ EntityConfig (
loot: LootTable("common.loot_tables.dungeon.tier-0.enemy"), loot: LootTable("common.loot_tables.dungeon.tier-0.enemy"),
hands: TwoHanded(Item("common.items.npc_weapons.biped_small.gnarling.wooden_spear")), hands: TwoHanded(Item("common.items.npc_weapons.biped_small.gnarling.dagger")),
meta: [ meta: [
LoadoutAsset("common.loadout.dungeon.tier-0.mugger"), LoadoutAsset("common.loadout.dungeon.tier-0.mugger"),

View File

@ -17,5 +17,5 @@ ItemDef(
)), )),
quality: Low, quality: Low,
tags: [], tags: [],
ability_spec: Some(Custom("Axe Simple")), ability_spec: Some(Custom("Oni")),
) )

View File

@ -1,21 +0,0 @@
ItemDef(
name: "Adlet Bow",
description: "Strips of leather are wrapped around the handle.",
kind: Tool((
kind: Bow,
hands: Two,
stats: Direct((
equip_time_secs: 0.0,
power: 0.3,
effect_power: 0.8,
speed: 0.5,
crit_chance: 0.13541667,
range: 1.0,
energy_efficiency: 1.0,
buff_strength: 1.0,
)),
)),
quality: Moderate,
tags: [],
ability_spec: None,
)

View File

@ -1,8 +1,8 @@
ItemDef( ItemDef(
name: "Wooden Spear", name: "Gnarling Logger Axe",
description: "Testing", description: "Testing",
kind: Tool(( kind: Tool((
kind: Spear, kind: Axe,
hands: Two, hands: Two,
stats: Direct(( stats: Direct((
equip_time_secs: 0.0, equip_time_secs: 0.0,
@ -17,5 +17,5 @@ ItemDef(
)), )),
quality: Low, quality: Low,
tags: [], tags: [],
ability_spec: None, ability_spec: Some(Custom("Axe Simple")),
) )

View File

@ -1,15 +1,15 @@
ItemDef( ItemDef(
name: "Gnoll Staff", name: "Gnarling Mugger Dagger",
description: "eekum bokum", description: "Testing",
kind: Tool(( kind: Tool((
kind: Staff, kind: Dagger,
hands: Two, hands: Two,
stats: Direct(( stats: Direct((
equip_time_secs: 0.0, equip_time_secs: 0.0,
power: 0.3, power: 0.3,
effect_power: 0.8, effect_power: 1.0,
speed: 0.6, speed: 1.0,
crit_chance: 0.26764706, crit_chance: 0.12037037,
range: 1.0, range: 1.0,
energy_efficiency: 1.0, energy_efficiency: 1.0,
buff_strength: 1.0, buff_strength: 1.0,
@ -17,5 +17,5 @@ ItemDef(
)), )),
quality: Low, quality: Low,
tags: [], tags: [],
ability_spec: Some(Custom("Staff Simple")), ability_spec: Some(Custom("Dagger Simple")),
) )

View File

@ -820,6 +820,10 @@
keyword: "parrot", keyword: "parrot",
generic: "Parrot" generic: "Parrot"
), ),
penguin: (
keyword: "penguin",
generic: "Penguin"
),
) )
), ),
biped_large: ( biped_large: (

View File

@ -1112,7 +1112,15 @@
color: None color: None
), ),
"common.items.npc_weapons.biped_small.gnarling.blowgun": ( "common.items.npc_weapons.biped_small.gnarling.blowgun": (
vox_spec: ("weapon.biped_small.blowgun", (-2.5, -2.5, -4.0)), vox_spec: ("weapon.biped_small.blowgun", (-2.5, -2.5, -1.5)),
color: None
),
"common.items.npc_weapons.biped_small.gnarling.axe": (
vox_spec: ("weapon.biped_small.axe.axe", (-0.5, -3.0, -4.0)),
color: None
),
"common.items.npc_weapons.biped_small.gnarling.dagger": (
vox_spec: ("weapon.biped_small.dagger", (-0.5, -4.5, -0.0)),
color: None color: None
), ),
"common.items.npc_weapons.biped_small.adlet.gnoll_staff": ( "common.items.npc_weapons.biped_small.adlet.gnoll_staff": (

View File

@ -191,8 +191,36 @@
central: ("npc.parrot.male.torso"), central: ("npc.parrot.male.torso"),
), ),
tail: ( tail: (
offset: (-1.5, -4.5, -1.5), offset: (-2.5, -4.5, -1.5),
central: ("npc.parrot.male.tail"), central: ("npc.parrot.male.tail"),
) )
), ),
(Penguin, Male): (
head: (
offset: (-1.5, -2.0, -2.0),
central: ("npc.penguin.male.head"),
),
torso: (
offset: (-3.5, -4.0, -5.5),
central: ("npc.penguin.male.torso"),
),
tail: (
offset: (-2.5, -4.5, -1.5),
central: ("npc.penguin.male.tail"),
)
),
(Penguin, Female): (
head: (
offset: (-1.5, -2.0, -2.0),
central: ("npc.penguin.male.head"),
),
torso: (
offset: (-3.5, -4.0, -5.5),
central: ("npc.penguin.male.torso"),
),
tail: (
offset: (-2.5, -4.5, -1.5),
central: ("npc.penguin.male.tail"),
)
),
}) })

View File

@ -251,4 +251,40 @@
lateral: ("npc.parrot.male.leg_r"), lateral: ("npc.parrot.male.leg_r"),
) )
), ),
(Penguin, Male): (
wing_l: (
offset: (-0.5, -1.5, -8.0),
lateral: ("npc.penguin.male.wing"),
),
wing_r: (
offset: (-0.5, -1.5, -8.0),
lateral: ("npc.penguin.male.wing"),
),
foot_l: (
offset: (-2.5, 0.0, -6.0),
lateral: ("npc.penguin.male.leg_r"),
),
foot_r: (
offset: (-2.5, 0.0, -6.0),
lateral: ("npc.penguin.male.leg_r"),
)
),
(Penguin, Female): (
wing_l: (
offset: (-0.5, -1.5, -8.0),
lateral: ("npc.penguin.male.wing"),
),
wing_r: (
offset: (-0.5, -1.5, -8.0),
lateral: ("npc.penguin.male.wing"),
),
foot_l: (
offset: (-2.5, 0.0, -6.0),
lateral: ("npc.penguin.male.leg_r"),
),
foot_r: (
offset: (-2.5, 0.0, -6.0),
lateral: ("npc.penguin.male.leg_r"),
)
),
}) })

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

View File

@ -198,6 +198,7 @@ impl Body {
bird_medium::Species::Goose => 3.5, // ~✅ Swan geese are 2.8-3.5 kg bird_medium::Species::Goose => 3.5, // ~✅ Swan geese are 2.8-3.5 kg
bird_medium::Species::Owl => 2.0, bird_medium::Species::Owl => 2.0,
bird_medium::Species::Parrot => 2.0, bird_medium::Species::Parrot => 2.0,
bird_medium::Species::Penguin => 8.0,
bird_medium::Species::Peacock => 5.0, bird_medium::Species::Peacock => 5.0,
}, },
Body::BirdLarge(_) => 100.0, Body::BirdLarge(_) => 100.0,
@ -692,6 +693,7 @@ impl Body {
bird_medium::Species::Duck => 1, bird_medium::Species::Duck => 1,
bird_medium::Species::Goose => 1, bird_medium::Species::Goose => 1,
bird_medium::Species::Parrot => 1, bird_medium::Species::Parrot => 1,
bird_medium::Species::Penguin => 1,
bird_medium::Species::Peacock => 1, bird_medium::Species::Peacock => 1,
bird_medium::Species::Eagle => 1, bird_medium::Species::Eagle => 1,
_ => 2, _ => 2,

View File

@ -41,6 +41,7 @@ make_case_elim!(
Eagle = 4, Eagle = 4,
Owl = 5, Owl = 5,
Parrot = 6, Parrot = 6,
Penguin = 7,
} }
); );
@ -56,6 +57,7 @@ pub struct AllSpecies<SpeciesMeta> {
pub eagle: SpeciesMeta, pub eagle: SpeciesMeta,
pub owl: SpeciesMeta, pub owl: SpeciesMeta,
pub parrot: SpeciesMeta, pub parrot: SpeciesMeta,
pub penguin: SpeciesMeta,
} }
impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies<SpeciesMeta> { impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies<SpeciesMeta> {
@ -71,11 +73,12 @@ impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies<SpeciesMeta>
Species::Eagle => &self.eagle, Species::Eagle => &self.eagle,
Species::Owl => &self.owl, Species::Owl => &self.owl,
Species::Parrot => &self.parrot, Species::Parrot => &self.parrot,
Species::Penguin => &self.penguin,
} }
} }
} }
pub const ALL_SPECIES: [Species; 7] = [ pub const ALL_SPECIES: [Species; 8] = [
Species::Duck, Species::Duck,
Species::Chicken, Species::Chicken,
Species::Goose, Species::Goose,
@ -83,6 +86,7 @@ pub const ALL_SPECIES: [Species; 7] = [
Species::Eagle, Species::Eagle,
Species::Owl, Species::Owl,
Species::Parrot, Species::Parrot,
Species::Penguin,
]; ];
impl<'a, SpeciesMeta: 'a> IntoIterator for &'a AllSpecies<SpeciesMeta> { impl<'a, SpeciesMeta: 'a> IntoIterator for &'a AllSpecies<SpeciesMeta> {

View File

@ -34,6 +34,14 @@ pub enum RtSimEntityKind {
Merchant, Merchant,
} }
const BIRD_MEDIUM_ROSTER: &[comp::bird_medium::Species] = &[
// Disallows flightless birds
comp::bird_medium::Species::Duck,
comp::bird_medium::Species::Goose,
comp::bird_medium::Species::Parrot,
comp::bird_medium::Species::Eagle,
];
const BIRD_LARGE_ROSTER: &[comp::bird_large::Species] = &[ const BIRD_LARGE_ROSTER: &[comp::bird_large::Species] = &[
// Flame Wyvern not incuded until proper introduction // Flame Wyvern not incuded until proper introduction
comp::bird_large::Species::Phoenix, comp::bird_large::Species::Phoenix,
@ -60,7 +68,7 @@ impl Entity {
// we want 5% airships, 45% birds, 50% humans // we want 5% airships, 45% birds, 50% humans
x if x < 0.05 => comp::ship::Body::random_with(&mut self.rng(PERM_BODY)).into(), x if x < 0.05 => comp::ship::Body::random_with(&mut self.rng(PERM_BODY)).into(),
x if x < 0.45 => { x if x < 0.45 => {
let species = *(&comp::bird_medium::ALL_SPECIES) let species = *BIRD_MEDIUM_ROSTER
.choose(&mut self.rng(PERM_SPECIES)) .choose(&mut self.rng(PERM_SPECIES))
.unwrap(); .unwrap();
comp::bird_medium::Body::random_with(&mut self.rng(PERM_BODY), &species) comp::bird_medium::Body::random_with(&mut self.rng(PERM_BODY), &species)
@ -782,6 +790,7 @@ fn bird_medium_config(body: comp::bird_medium::Body) -> &'static str {
comp::bird_medium::Species::Eagle => "common.entity.wild.peaceful.eagle", comp::bird_medium::Species::Eagle => "common.entity.wild.peaceful.eagle",
comp::bird_medium::Species::Owl => "common.entity.wild.peaceful.owl", comp::bird_medium::Species::Owl => "common.entity.wild.peaceful.owl",
comp::bird_medium::Species::Parrot => "common.entity.wild.peaceful.parrot", comp::bird_medium::Species::Parrot => "common.entity.wild.peaceful.parrot",
_ => unimplemented!(),
} }
} }
@ -826,7 +835,7 @@ mod tests {
std::mem::drop(EntityInfo::at(dummy_pos).with_asset_expect(male_config)); std::mem::drop(EntityInfo::at(dummy_pos).with_asset_expect(male_config));
} }
// Bird Medium test // Bird Medium test
for bird_med_species in comp::bird_medium::ALL_SPECIES { for bird_med_species in BIRD_MEDIUM_ROSTER {
let female_body = comp::bird_medium::Body { let female_body = comp::bird_medium::Body {
species: bird_med_species, species: bird_med_species,
body_type: comp::bird_medium::BodyType::Female, body_type: comp::bird_medium::BodyType::Female,

View File

@ -1743,7 +1743,7 @@ impl<'a> AgentData<'a> {
if let Some(ability_spec) = item.ability_spec() { if let Some(ability_spec) = item.ability_spec() {
match ability_spec { match ability_spec {
AbilitySpec::Custom(spec) => match spec.as_str() { AbilitySpec::Custom(spec) => match spec.as_str() {
"Axe Simple" | "Sword Simple" => Tactic::Sword, "Axe Simple" | "Oni" | "Sword Simple" => Tactic::Sword,
"Staff Simple" => Tactic::Staff, "Staff Simple" => Tactic::Staff,
"Bow Simple" => Tactic::Bow, "Bow Simple" => Tactic::Bow,
"Stone Golem" => Tactic::StoneGolem, "Stone Golem" => Tactic::StoneGolem,

View File

@ -64,10 +64,15 @@ impl Animation for AlphaAnimation {
let subtract = global_time - timer; let subtract = global_time - timer;
let check = subtract - subtract.trunc(); let check = subtract - subtract.trunc();
let mirror = (check - 0.5).signum(); let mirror = (check - 0.5).signum();
let move1 = move1base * pullback * mirror; let _move1 = move1base * pullback * mirror;
let move2 = move2base * pullback * mirror;
let move1abs = move1base * pullback; let move1abs = move1base * pullback;
let move2abs = move2base * pullback; let move2abs = move2base * pullback;
next.hand_l.position = Vec3::new(s_a.grip.0 * 4.0, 0.0, s_a.grip.2);
next.hand_r.position = Vec3::new(-s_a.grip.0 * 4.0, 0.0, s_a.grip.2);
next.main.position = Vec3::new(0.0, 0.0, 0.0);
next.main.orientation = Quaternion::rotation_x(0.0);
next.hand_l.orientation = Quaternion::rotation_x(0.0);
next.hand_r.orientation = Quaternion::rotation_x(0.0);
match active_tool_kind { match active_tool_kind {
Some(ToolKind::Spear) => { Some(ToolKind::Spear) => {
next.head.position = Vec3::new(0.0, s_a.head.0, s_a.head.1); next.head.position = Vec3::new(0.0, s_a.head.0, s_a.head.1);
@ -82,15 +87,6 @@ impl Animation for AlphaAnimation {
next.pants.orientation = Quaternion::rotation_x(move1abs * 0.2 + move2abs * -0.3) next.pants.orientation = Quaternion::rotation_x(move1abs * 0.2 + move2abs * -0.3)
* Quaternion::rotation_z(move1abs * -0.2 + move2abs * 0.2); * Quaternion::rotation_z(move1abs * -0.2 + move2abs * 0.2);
next.main.position = Vec3::new(0.0, 0.0, 0.0);
next.main.orientation = Quaternion::rotation_x(0.0);
next.hand_l.position = Vec3::new(s_a.grip.0 * 4.0, 0.0, s_a.grip.2);
next.hand_r.position = Vec3::new(-s_a.grip.0 * 4.0, 0.0, s_a.grip.2);
next.hand_l.orientation = Quaternion::rotation_x(0.0);
next.hand_r.orientation = Quaternion::rotation_x(0.0);
next.control_l.position = Vec3::new(1.0 - s_a.grip.0 * 2.0, 2.0, -2.0); next.control_l.position = Vec3::new(1.0 - s_a.grip.0 * 2.0, 2.0, -2.0);
next.control_r.position = Vec3::new(-1.0 + s_a.grip.0 * 2.0, 2.0, 2.0); next.control_r.position = Vec3::new(-1.0 + s_a.grip.0 * 2.0, 2.0, 2.0);
@ -116,24 +112,60 @@ impl Animation for AlphaAnimation {
next.tail.orientation = Quaternion::rotation_x(0.05 * fastalt * speednormcancel) next.tail.orientation = Quaternion::rotation_x(0.05 * fastalt * speednormcancel)
* Quaternion::rotation_z(fast * 0.15 * speednormcancel); * Quaternion::rotation_z(fast * 0.15 * speednormcancel);
}, },
Some(ToolKind::Natural) => { Some(ToolKind::Axe) => {
next.hand_l.position = Vec3::new( next.head.orientation = Quaternion::rotation_z(move1abs * 0.3 + move2abs * -0.6);
-s_a.hand.0, next.control_l.position = Vec3::new(2.0 - s_a.grip.0 * 2.0, 1.0, 3.0);
s_a.hand.1 + move1abs * 3.0 + move2abs * 3.0, next.control_r.position = Vec3::new(
s_a.hand.2 + move1abs * 1.5, 9.0 + move1abs * -10.0 + s_a.grip.0 * 2.0,
); -1.0 + move1abs * 2.0,
next.hand_r.position = Vec3::new( move1abs * 3.0 - 2.0,
s_a.hand.0,
s_a.hand.1 + move1abs * 3.0 + move2abs * 3.0,
s_a.hand.2 + move1abs * 1.5,
); );
next.hand_l.orientation = Quaternion::rotation_x(1.7 + move1 * 1.3 + move2 * -2.4) next.control.position = Vec3::new(
* Quaternion::rotation_y(-0.3 + move1abs * -0.35 + move2abs * 0.6); -5.0 + move1abs * 5.0,
next.hand_r.orientation = Quaternion::rotation_x(1.7 - move1 * 1.3 + move2 * 2.4) -1.0 + s_a.grip.2,
* Quaternion::rotation_y(0.3 + move1abs * -0.35 + move2abs * 0.6); -1.0 + move1abs * 3.0 + -s_a.grip.2 / 2.5 + s_a.grip.0 * -2.0,
next.head.orientation = Quaternion::rotation_x(move1abs * 0.1 + move2abs * -0.2) );
* Quaternion::rotation_y(move1 * 0.3 + move2 * -0.4);
next.control_l.orientation = Quaternion::rotation_x(PI / 2.0 + move2abs * 1.0)
* Quaternion::rotation_y(-0.0)
* Quaternion::rotation_z(-0.0);
next.control_r.orientation =
Quaternion::rotation_x(0.5 + move1abs * 1.5 + s_a.grip.0 * 0.2)
* Quaternion::rotation_y(0.2 + s_a.grip.0 * 0.2)
* Quaternion::rotation_z(-0.0);
next.control.orientation = Quaternion::rotation_x(-0.3 + move2abs * -1.0)
* Quaternion::rotation_y(move1abs * -0.9 + move2abs * 2.0)
* Quaternion::rotation_z(-0.3);
},
Some(ToolKind::Dagger) => {
next.head.orientation = Quaternion::rotation_x(move1abs * 0.15 + move2abs * -0.15)
* Quaternion::rotation_z(move1abs * 0.15 + move2abs * -0.3);
next.control_l.position = Vec3::new(2.0 - s_a.grip.0 * 2.0, 1.0, 3.0);
next.control_r.position = Vec3::new(
9.0 + move1abs * -7.0 + s_a.grip.0 * 2.0,
-1.0 + move1abs * 6.0,
-2.0,
);
next.control.position = Vec3::new(
-5.0 + move1abs * 5.0 + move2abs * 9.0,
-1.0 + move2abs * -3.0 + s_a.grip.2,
-1.0 + move1abs * 3.0 + -s_a.grip.2 / 2.5 + s_a.grip.0 * -2.0,
);
next.control_l.orientation = Quaternion::rotation_x(PI / 2.0)
* Quaternion::rotation_y(-0.0)
* Quaternion::rotation_z(-0.0);
next.control_r.orientation =
Quaternion::rotation_x(0.5 + move1abs * 1.5 + s_a.grip.0 * 0.2)
* Quaternion::rotation_y(0.2 + s_a.grip.0 * 0.2)
* Quaternion::rotation_z(-0.0);
next.control.orientation = Quaternion::rotation_x(-0.3 + move2abs * -1.0)
* Quaternion::rotation_y(move1abs * -0.4 + move2abs * 1.0)
* Quaternion::rotation_z(-0.3 + move2abs * -2.2);
}, },
_ => {}, _ => {},
} }

View File

@ -110,6 +110,37 @@ impl Animation for ShootAnimation {
next.control.orientation = Quaternion::rotation_x(-0.3 + move1abs * 0.4) next.control.orientation = Quaternion::rotation_x(-0.3 + move1abs * 0.4)
* Quaternion::rotation_y(0.5 * speednorm); * Quaternion::rotation_y(0.5 * speednorm);
}, },
Some(ToolKind::Blowgun) => {
let (move1base, move2base, move3) = match stage_section {
Some(StageSection::Buildup) => (anim_time, 0.0, 0.0),
Some(StageSection::Action) => (1.0, anim_time.powf(0.25), 0.0),
Some(StageSection::Recover) => (1.0, 1.0, anim_time),
_ => (0.0, 0.0, 0.0),
};
let pullback = 1.0 - move3;
let move1abs = move1base * pullback;
let move2abs = move2base * pullback;
next.head.orientation = Quaternion::rotation_x(move1abs * 0.5 + move2abs * -0.7);
next.control_l.position = Vec3::new(1.0 - s_a.grip.0 * 2.0, 0.0, 3.0);
next.control_r.position = Vec3::new(-1.0 + s_a.grip.0 * 2.0, 0.0, 4.0);
next.control.position = Vec3::new(
0.0,
move1abs * -2.0 + move2abs * 1.0 + s_a.grip.2,
move1abs * 3.5 + move2abs * -2.0 + 4.0 - s_a.grip.2 / 2.5 + s_a.grip.0 * -2.0,
);
next.control_l.orientation =
Quaternion::rotation_x(3.8 + move1abs * 0.4 + move2abs * -0.5)
* Quaternion::rotation_y(-0.3);
next.control_r.orientation = Quaternion::rotation_x(
3.5 + move1abs * 0.4 + move2abs * -0.5 + s_a.grip.0 * 0.2,
) * Quaternion::rotation_y(0.5 + s_a.grip.0 * 0.2);
next.control.orientation = Quaternion::rotation_x(
-2.2 + move1abs * 0.7 + move2abs * -0.2 + 0.5 * speednorm,
);
},
Some(ToolKind::Staff) => { Some(ToolKind::Staff) => {
let (move1base, _move2base, move3) = match stage_section { let (move1base, _move2base, move3) = match stage_section {
Some(StageSection::Buildup) => (anim_time.powf(0.25), 0.0, 0.0), Some(StageSection::Buildup) => (anim_time.powf(0.25), 0.0, 0.0),

View File

@ -60,7 +60,7 @@ impl Animation for WieldAnimation {
* Quaternion::rotation_z(fast * 0.15 * speednormcancel); * Quaternion::rotation_z(fast * 0.15 * speednormcancel);
next.main.position = Vec3::new(0.0, 0.0, 0.0); next.main.position = Vec3::new(0.0, 0.0, 0.0);
next.main.orientation = Quaternion::rotation_x(0.0); next.main.orientation = Quaternion::rotation_z(0.0);
next.hand_l.position = Vec3::new(s_a.grip.0 * 4.0, 0.0, s_a.grip.2); next.hand_l.position = Vec3::new(s_a.grip.0 * 4.0, 0.0, s_a.grip.2);
next.hand_r.position = Vec3::new(-s_a.grip.0 * 4.0, 0.0, s_a.grip.2); next.hand_r.position = Vec3::new(-s_a.grip.0 * 4.0, 0.0, s_a.grip.2);
@ -95,7 +95,28 @@ impl Animation for WieldAnimation {
next.control.orientation = Quaternion::rotation_x(-1.35 + 0.5 * speednorm); next.control.orientation = Quaternion::rotation_x(-1.35 + 0.5 * speednorm);
}, },
Some(ToolKind::Blowgun) => {
next.control_l.position = Vec3::new(1.0 - s_a.grip.0 * 2.0, 0.0, 3.0);
next.control_r.position = Vec3::new(-1.0 + s_a.grip.0 * 2.0, 0.0, 4.0);
next.control.position = Vec3::new(
0.0,
s_a.grip.2,
4.0 - s_a.grip.2 / 2.5
+ s_a.grip.0 * -2.0
+ fastacc * 0.5
+ fastalt * 0.1 * speednormcancel
+ speednorm * 4.0,
);
next.control_l.orientation =
Quaternion::rotation_x(3.8 + slow * 0.1) * Quaternion::rotation_y(-0.3);
next.control_r.orientation =
Quaternion::rotation_x(3.5 + slow * 0.1 + s_a.grip.0 * 0.2)
* Quaternion::rotation_y(0.5 + slow * 0.0 + s_a.grip.0 * 0.2);
next.control.orientation = Quaternion::rotation_x(-2.2 + 0.5 * speednorm);
},
Some(ToolKind::Bow) => { Some(ToolKind::Bow) => {
next.control_l.position = Vec3::new(1.0 - s_a.grip.0 * 2.0, 0.0, 0.0); next.control_l.position = Vec3::new(1.0 - s_a.grip.0 * 2.0, 0.0, 0.0);
next.control_r.position = Vec3::new(-1.0 + s_a.grip.0 * 2.0, 6.0, -2.0); next.control_r.position = Vec3::new(-1.0 + s_a.grip.0 * 2.0, 6.0, -2.0);
@ -146,13 +167,51 @@ impl Animation for WieldAnimation {
* Quaternion::rotation_y(-0.2 * speednorm) * Quaternion::rotation_y(-0.2 * speednorm)
* Quaternion::rotation_z(0.5); * Quaternion::rotation_z(0.5);
}, },
Some(ToolKind::Natural) => { Some(ToolKind::Axe) => {
next.hand_l.position = Vec3::new(-s_a.hand.0, s_a.hand.1, s_a.hand.2); next.control_l.position = Vec3::new(2.0 - s_a.grip.0 * 2.0, 1.0, 3.0);
next.hand_r.position = Vec3::new(s_a.hand.0, s_a.hand.1, s_a.hand.2); next.control_r.position =
Vec3::new(9.0 + s_a.grip.0 * 2.0, -1.0, -2.0 + speednorm * -3.0);
next.hand_l.orientation = next.control.position = Vec3::new(
Quaternion::rotation_x(1.7) * Quaternion::rotation_y(-0.3); -5.0,
next.hand_r.orientation = Quaternion::rotation_x(1.7) * Quaternion::rotation_y(0.3); -1.0 + s_a.grip.2,
-1.0 + -s_a.grip.2 / 2.5 + s_a.grip.0 * -2.0 + speednorm * 2.0,
);
next.control_l.orientation = Quaternion::rotation_x(PI / 2.0 + slow * 0.1)
* Quaternion::rotation_y(-0.0)
* Quaternion::rotation_z(-0.0);
next.control_r.orientation =
Quaternion::rotation_x(0.5 + slow * 0.1 + s_a.grip.0 * 0.2)
* Quaternion::rotation_y(0.2 + 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.3);
},
Some(ToolKind::Dagger) => {
next.control_l.position = Vec3::new(2.0 - s_a.grip.0 * 2.0, 1.0, 3.0);
next.control_r.position =
Vec3::new(9.0 + s_a.grip.0 * 2.0, -1.0, -2.0 + speednorm * -3.0);
next.control.position = Vec3::new(
-5.0,
-1.0 + s_a.grip.2,
-1.0 + -s_a.grip.2 / 2.5 + s_a.grip.0 * -2.0 + speednorm * 2.0,
);
next.control_l.orientation = Quaternion::rotation_x(PI / 2.0 + slow * 0.1)
* Quaternion::rotation_y(-0.0)
* Quaternion::rotation_z(-0.0);
next.control_r.orientation =
Quaternion::rotation_x(0.5 + slow * 0.1 + s_a.grip.0 * 0.2)
* Quaternion::rotation_y(0.2 + 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.3);
}, },
_ => {}, _ => {},
} }

View File

@ -111,6 +111,7 @@ impl<'a> From<&'a Body> for SkeletonAttr {
(Owl, Male) => (2.5, 5.0), (Owl, Male) => (2.5, 5.0),
(Owl, Female) => (2.5, 7.0), (Owl, Female) => (2.5, 7.0),
(Parrot, _) => (0.5, 4.5), (Parrot, _) => (0.5, 4.5),
(Penguin, _) => (1.5, 6.0),
}, },
chest: match (body.species, body.body_type) { chest: match (body.species, body.body_type) {
(Duck, _) => (0.0, 6.0), (Duck, _) => (0.0, 6.0),
@ -122,6 +123,7 @@ impl<'a> From<&'a Body> for SkeletonAttr {
(Owl, Male) => (0.0, 4.5), (Owl, Male) => (0.0, 4.5),
(Owl, Female) => (0.0, 4.5), (Owl, Female) => (0.0, 4.5),
(Parrot, _) => (0.0, 5.0), (Parrot, _) => (0.0, 5.0),
(Penguin, _) => (0.0, 8.0),
}, },
tail: match (body.species, body.body_type) { tail: match (body.species, body.body_type) {
(Duck, _) => (-5.0, 1.0), (Duck, _) => (-5.0, 1.0),
@ -133,6 +135,7 @@ impl<'a> From<&'a Body> for SkeletonAttr {
(Owl, Male) => (-6.0, -2.0), (Owl, Male) => (-6.0, -2.0),
(Owl, Female) => (-6.0, -2.5), (Owl, Female) => (-6.0, -2.5),
(Parrot, _) => (-8.0, -2.0), (Parrot, _) => (-8.0, -2.0),
(Penguin, _) => (-3.0, -4.0),
}, },
wing: match (body.species, body.body_type) { wing: match (body.species, body.body_type) {
(Duck, _) => (3.5, -0.5, 2.0), (Duck, _) => (3.5, -0.5, 2.0),
@ -144,6 +147,7 @@ impl<'a> From<&'a Body> for SkeletonAttr {
(Owl, Male) => (3.5, -5.5, 4.0), (Owl, Male) => (3.5, -5.5, 4.0),
(Owl, Female) => (3.5, -6.0, 3.5), (Owl, Female) => (3.5, -6.0, 3.5),
(Parrot, _) => (2.0, -4.5, 3.0), (Parrot, _) => (2.0, -4.5, 3.0),
(Penguin, _) => (4.0, 0.5, 1.0),
}, },
foot: match (body.species, body.body_type) { foot: match (body.species, body.body_type) {
(Duck, _) => (2.5, -2.0, 4.0), (Duck, _) => (2.5, -2.0, 4.0),
@ -155,6 +159,7 @@ impl<'a> From<&'a Body> for SkeletonAttr {
(Owl, Male) => (1.5, -2.5, 7.0), (Owl, Male) => (1.5, -2.5, 7.0),
(Owl, Female) => (1.5, -3.0, 6.5), (Owl, Female) => (1.5, -3.0, 6.5),
(Parrot, _) => (1.5, -3.0, 3.0), (Parrot, _) => (1.5, -3.0, 3.0),
(Penguin, _) => (2.5, -2.0, 6.0),
}, },
feed: match (body.species, body.body_type) { feed: match (body.species, body.body_type) {
(Chicken, _) => 1.2, (Chicken, _) => 1.2,
@ -162,6 +167,7 @@ impl<'a> From<&'a Body> for SkeletonAttr {
(Peacock, _) => 1.6, (Peacock, _) => 1.6,
(Eagle, _) => 1.2, (Eagle, _) => 1.2,
(Parrot, _) => 1.2, (Parrot, _) => 1.2,
(Penguin, _) => 1.2,
_ => 1.0, _ => 1.0,
}, },
} }

View File

@ -474,10 +474,10 @@ pub fn apply_spots_to(canvas: &mut Canvas, _dynamic_rng: &mut impl Rng) {
base_structures: Some("spots_grasslands.gnarling_totem"), base_structures: Some("spots_grasslands.gnarling_totem"),
entity_radius: 30.0, entity_radius: 30.0,
entities: &[ entities: &[
(15..20, "common.entity.dungeon.tier-0.mugger"), (2..4, "common.entity.dungeon.tier-0.mugger"),
(15..20, "common.entity.dungeon.tier-0.stalker"), (2..4, "common.entity.dungeon.tier-0.stalker"),
(15..20, "common.entity.dungeon.tier-0.logger"), (2..4, "common.entity.dungeon.tier-0.logger"),
(15..20, "common.entity.dungeon.tier-0.chieftain"), (1..2, "common.entity.dungeon.tier-0.chieftain"),
], ],
}, },
Spot::GnarlingTree => SpotConfig { Spot::GnarlingTree => SpotConfig {