diff --git a/assets/common/npc_names.ron b/assets/common/npc_names.ron index 0339622c22..2056193f41 100644 --- a/assets/common/npc_names.ron +++ b/assets/common/npc_names.ron @@ -1120,6 +1120,10 @@ keyword: "roc", generic: "Roc" ), + wyvern_flame: ( + keyword: "wyvern_flame", + generic: "Flame Wyvern" + ), ) ), quadruped_low: ( diff --git a/assets/voxygen/voxel/bird_large_central_manifest.ron b/assets/voxygen/voxel/bird_large_central_manifest.ron index a706aa79cf..6617997b69 100644 --- a/assets/voxygen/voxel/bird_large_central_manifest.ron +++ b/assets/voxygen/voxel/bird_large_central_manifest.ron @@ -155,4 +155,56 @@ central: ("npc.roc.male.tail_rear"), ) ), + (FlameWyvern, Male): ( + head: ( + offset: (-5.5, -5.0, 0.0), + central: ("npc.wyvern_flame.male.head"), + ), + beak: ( + offset: (-2.5, 0.0, -5.0), + central: ("npc.wyvern_flame.male.beak"), + ), + neck: ( + offset: (-2.5, 0.0, -3.5), + central: ("npc.wyvern_flame.male.neck"), + ), + chest: ( + offset: (-6.5, -12.0, -9.0), + central: ("npc.wyvern_flame.male.chest"), + ), + tail_front: ( + offset: (-2.5, -12.0, -7.0), + central: ("npc.wyvern_flame.male.tail_front"), + ), + tail_rear: ( + offset: (-4.5, -29.0, -8.0), + central: ("npc.wyvern_flame.male.tail_rear"), + ) + ), + (FlameWyvern, Female): ( + head: ( + offset: (-5.5, -5.0, 0.0), + central: ("npc.wyvern_flame.male.head"), + ), + beak: ( + offset: (-2.5, 0.0, -5.0), + central: ("npc.wyvern_flame.male.beak"), + ), + neck: ( + offset: (-2.5, 0.0, -3.5), + central: ("npc.wyvern_flame.male.neck"), + ), + chest: ( + offset: (-6.5, -12.0, -9.0), + central: ("npc.wyvern_flame.male.chest"), + ), + tail_front: ( + offset: (-2.5, -12.0, -7.0), + central: ("npc.wyvern_flame.male.tail_front"), + ), + tail_rear: ( + offset: (-4.5, -29.0, -8.0), + central: ("npc.wyvern_flame.male.tail_rear"), + ) + ), }) diff --git a/assets/voxygen/voxel/bird_large_lateral_manifest.ron b/assets/voxygen/voxel/bird_large_lateral_manifest.ron index fadf7ddb56..e0de44612f 100644 --- a/assets/voxygen/voxel/bird_large_lateral_manifest.ron +++ b/assets/voxygen/voxel/bird_large_lateral_manifest.ron @@ -251,4 +251,88 @@ lateral: ("npc.roc.male.foot_r"), ) ), + (FlameWyvern, Male): ( + wing_in_l: ( + offset: (-24.0, -9.0, -4.0), + lateral: ("npc.wyvern_flame.male.wing_in_r"), + ), + wing_in_r: ( + offset: (0.0, -9.0, -4.0), + lateral: ("npc.wyvern_flame.male.wing_in_r"), + ), + wing_mid_l: ( + offset: (-17.0, -27.0, -2.0), + lateral: ("npc.wyvern_flame.male.wing_mid_r"), + ), + wing_mid_r: ( + offset: (0.0, -27.0, -2.0), + lateral: ("npc.wyvern_flame.male.wing_mid_r"), + ), + wing_out_l: ( + offset: (-33.0, -31.0, -2.0), + lateral: ("npc.wyvern_flame.male.wing_out_r"), + ), + wing_out_r: ( + offset: (0.0, -31.0, -2.0), + lateral: ("npc.wyvern_flame.male.wing_out_r"), + ), + leg_l: ( + offset: (-3.0, -4.5, -5.5), + lateral: ("npc.wyvern_flame.male.leg_r"), + ), + leg_r: ( + offset: (-3.0, -4.5, -5.5), + lateral: ("npc.wyvern_flame.male.leg_r"), + ), + foot_l: ( + offset: (-3.5, -6.5, -13.0), + lateral: ("npc.wyvern_flame.male.foot_r"), + ), + foot_r: ( + offset: (-3.5, -6.5, -13.0), + lateral: ("npc.wyvern_flame.male.foot_r"), + ) + ), + (FlameWyvern, Female): ( + wing_in_l: ( + offset: (-24.0, -9.0, -4.0), + lateral: ("npc.wyvern_flame.male.wing_in_r"), + ), + wing_in_r: ( + offset: (0.0, -9.0, -4.0), + lateral: ("npc.wyvern_flame.male.wing_in_r"), + ), + wing_mid_l: ( + offset: (-17.0, -27.0, -2.0), + lateral: ("npc.wyvern_flame.male.wing_mid_r"), + ), + wing_mid_r: ( + offset: (0.0, -27.0, -2.0), + lateral: ("npc.wyvern_flame.male.wing_mid_r"), + ), + wing_out_l: ( + offset: (-33.0, -31.0, -2.0), + lateral: ("npc.wyvern_flame.male.wing_out_r"), + ), + wing_out_r: ( + offset: (0.0, -31.0, -2.0), + lateral: ("npc.wyvern_flame.male.wing_out_r"), + ), + leg_l: ( + offset: (-3.0, -4.5, -5.5), + lateral: ("npc.wyvern_flame.male.leg_r"), + ), + leg_r: ( + offset: (-3.0, -4.5, -5.5), + lateral: ("npc.wyvern_flame.male.leg_r"), + ), + foot_l: ( + offset: (-3.5, -6.5, -13.0), + lateral: ("npc.wyvern_flame.male.foot_r"), + ), + foot_r: ( + offset: (-3.5, -6.5, -13.0), + lateral: ("npc.wyvern_flame.male.foot_r"), + ) + ), }) \ No newline at end of file diff --git a/assets/voxygen/voxel/npc/wyvern_flame/male/beak.vox b/assets/voxygen/voxel/npc/wyvern_flame/male/beak.vox new file mode 100644 index 0000000000..63c35a0b70 Binary files /dev/null and b/assets/voxygen/voxel/npc/wyvern_flame/male/beak.vox differ diff --git a/assets/voxygen/voxel/npc/wyvern_flame/male/chest.vox b/assets/voxygen/voxel/npc/wyvern_flame/male/chest.vox new file mode 100644 index 0000000000..d8db7a4efe Binary files /dev/null and b/assets/voxygen/voxel/npc/wyvern_flame/male/chest.vox differ diff --git a/assets/voxygen/voxel/npc/wyvern_flame/male/foot_r.vox b/assets/voxygen/voxel/npc/wyvern_flame/male/foot_r.vox new file mode 100644 index 0000000000..eb019aae7f Binary files /dev/null and b/assets/voxygen/voxel/npc/wyvern_flame/male/foot_r.vox differ diff --git a/assets/voxygen/voxel/npc/wyvern_flame/male/head.vox b/assets/voxygen/voxel/npc/wyvern_flame/male/head.vox new file mode 100644 index 0000000000..db59b238e1 Binary files /dev/null and b/assets/voxygen/voxel/npc/wyvern_flame/male/head.vox differ diff --git a/assets/voxygen/voxel/npc/wyvern_flame/male/leg_r.vox b/assets/voxygen/voxel/npc/wyvern_flame/male/leg_r.vox new file mode 100644 index 0000000000..6038ee9e9e Binary files /dev/null and b/assets/voxygen/voxel/npc/wyvern_flame/male/leg_r.vox differ diff --git a/assets/voxygen/voxel/npc/wyvern_flame/male/neck.vox b/assets/voxygen/voxel/npc/wyvern_flame/male/neck.vox new file mode 100644 index 0000000000..f3f9e8bcea Binary files /dev/null and b/assets/voxygen/voxel/npc/wyvern_flame/male/neck.vox differ diff --git a/assets/voxygen/voxel/npc/wyvern_flame/male/tail_front.vox b/assets/voxygen/voxel/npc/wyvern_flame/male/tail_front.vox new file mode 100644 index 0000000000..50f9a47e85 Binary files /dev/null and b/assets/voxygen/voxel/npc/wyvern_flame/male/tail_front.vox differ diff --git a/assets/voxygen/voxel/npc/wyvern_flame/male/tail_rear.vox b/assets/voxygen/voxel/npc/wyvern_flame/male/tail_rear.vox new file mode 100644 index 0000000000..87053840e6 Binary files /dev/null and b/assets/voxygen/voxel/npc/wyvern_flame/male/tail_rear.vox differ diff --git a/assets/voxygen/voxel/npc/wyvern_flame/male/wing_in_r.vox b/assets/voxygen/voxel/npc/wyvern_flame/male/wing_in_r.vox new file mode 100644 index 0000000000..f8a5e13b09 Binary files /dev/null and b/assets/voxygen/voxel/npc/wyvern_flame/male/wing_in_r.vox differ diff --git a/assets/voxygen/voxel/npc/wyvern_flame/male/wing_mid_r.vox b/assets/voxygen/voxel/npc/wyvern_flame/male/wing_mid_r.vox new file mode 100644 index 0000000000..ef3a046698 Binary files /dev/null and b/assets/voxygen/voxel/npc/wyvern_flame/male/wing_mid_r.vox differ diff --git a/assets/voxygen/voxel/npc/wyvern_flame/male/wing_out_r.vox b/assets/voxygen/voxel/npc/wyvern_flame/male/wing_out_r.vox new file mode 100644 index 0000000000..d93fe5c6c3 Binary files /dev/null and b/assets/voxygen/voxel/npc/wyvern_flame/male/wing_out_r.vox differ diff --git a/common/src/comp/body.rs b/common/src/comp/body.rs index fe2243bd0d..ecc6bc3ac2 100644 --- a/common/src/comp/body.rs +++ b/common/src/comp/body.rs @@ -492,6 +492,7 @@ impl Body { bird_large::Species::Cockatrice => 4000, bird_large::Species::Phoenix => 6000, bird_large::Species::Roc => 5000, + bird_large::Species::FlameWyvern => 6000, }, Body::Humanoid(_) => 750, _ => 1000, @@ -746,7 +747,9 @@ impl Body { Body::QuadrupedLow(q) => matches!(q.species, quadruped_low::Species::Lavadrake), Body::BirdLarge(b) => matches!( b.species, - bird_large::Species::Phoenix | bird_large::Species::Cockatrice + bird_large::Species::Phoenix + | bird_large::Species::Cockatrice + | bird_large::Species::FlameWyvern ), _ => false, }, diff --git a/common/src/comp/body/bird_large.rs b/common/src/comp/body/bird_large.rs index 8d282c0480..361f87263b 100644 --- a/common/src/comp/body/bird_large.rs +++ b/common/src/comp/body/bird_large.rs @@ -37,6 +37,7 @@ make_case_elim!( Phoenix = 0, Cockatrice = 1, Roc = 2, + FlameWyvern = 3, } ); @@ -48,6 +49,7 @@ pub struct AllSpecies<SpeciesMeta> { pub phoenix: SpeciesMeta, pub cockatrice: SpeciesMeta, pub roc: SpeciesMeta, + pub wyvern_flame: SpeciesMeta, } impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies<SpeciesMeta> { @@ -59,11 +61,17 @@ impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies<SpeciesMeta> Species::Phoenix => &self.phoenix, Species::Cockatrice => &self.cockatrice, Species::Roc => &self.roc, + Species::FlameWyvern => &self.wyvern_flame, } } } -pub const ALL_SPECIES: [Species; 3] = [Species::Phoenix, Species::Cockatrice, Species::Roc]; +pub const ALL_SPECIES: [Species; 3] = [ + Species::Phoenix, + Species::Cockatrice, + Species::Roc, + Species::FlameWyvern, + ]; impl<'a, SpeciesMeta: 'a> IntoIterator for &'a AllSpecies<SpeciesMeta> { type IntoIter = std::iter::Copied<std::slice::Iter<'static, Self::Item>>; diff --git a/common/src/comp/inventory/loadout_builder.rs b/common/src/comp/inventory/loadout_builder.rs index 052cbb467a..773482a097 100644 --- a/common/src/comp/inventory/loadout_builder.rs +++ b/common/src/comp/inventory/loadout_builder.rs @@ -447,6 +447,28 @@ impl LoadoutBuilder { quadruped_low::Species::Tortoise => { Some("common.items.npc_armor.quadruped_low.shell") }, + Body::BirdLarge(bird_large) => match (bird_large.species, bird_large.body_type) { + (bird_large::Species::Cockatrice, _) => { + main_tool = Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.birdlargebreathe", + )); + }, + (bird_large::Species::Phoenix, _) => { + main_tool = Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.birdlargefire", + )); + }, + (bird_large::Species::Roc, _) => { + main_tool = Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.birdlargebasic", + )); + }, + (bird_large::Species::FlameWyvern, _) => { + main_tool = Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.birdlargebreathe", + )); + }, + }, _ => None, }, Body::Theropod(body) => match body.species { diff --git a/voxygen/anim/src/bird_large/fly.rs b/voxygen/anim/src/bird_large/fly.rs index acb32f23f0..a3dc9384f6 100644 --- a/voxygen/anim/src/bird_large/fly.rs +++ b/voxygen/anim/src/bird_large/fly.rs @@ -98,8 +98,8 @@ impl Animation for FlyAnimation { next.wing_out_l.position = Vec3::new(-s_a.wing_out.0, s_a.wing_out.1, s_a.wing_out.2); next.wing_out_r.position = Vec3::new(s_a.wing_out.0, s_a.wing_out.1, s_a.wing_out.2); - next.wing_out_l.orientation = Quaternion::rotation_y(-flap3 * 1.2 - 0.3); - next.wing_out_r.orientation = Quaternion::rotation_y(flap3 * 1.2 + 0.3); + next.wing_out_l.orientation = Quaternion::rotation_y(-flap3 * 0.6 - 0.3) * Quaternion::rotation_x(-flap2 * 1.4); + next.wing_out_r.orientation = Quaternion::rotation_y(flap3 * 0.6 + 0.3) * Quaternion::rotation_x(-flap2 * 1.4); next.tail_front.position = Vec3::new(0.0, s_a.tail_front.0, s_a.tail_front.1); next.tail_front.orientation = diff --git a/voxygen/anim/src/bird_large/idle.rs b/voxygen/anim/src/bird_large/idle.rs index c48f0fcf8f..7030506ad5 100644 --- a/voxygen/anim/src/bird_large/idle.rs +++ b/voxygen/anim/src/bird_large/idle.rs @@ -48,37 +48,23 @@ impl Animation for IdleAnimation { next.chest.orientation = Quaternion::rotation_x(0.0); next.neck.position = Vec3::new(0.0, s_a.neck.0, s_a.neck.1); - next.neck.orientation = Quaternion::rotation_x(0.0); next.head.position = Vec3::new(0.0, s_a.head.0, s_a.head.1); - next.head.orientation = Quaternion::rotation_z(duck_head_look.x) - * Quaternion::rotation_x(-duck_head_look.y.abs() + wave_slow_cos * 0.01); next.beak.position = Vec3::new(0.0, s_a.beak.0, s_a.beak.1); - next.beak.orientation = Quaternion::rotation_x(wave_slow_cos * -0.02 - 0.02); next.tail_front.position = Vec3::new(0.0, s_a.tail_front.0, s_a.tail_front.1); - next.tail_front.orientation = Quaternion::rotation_x(0.6); + next.tail_rear.position = Vec3::new(0.0, s_a.tail_rear.0, s_a.tail_rear.1); - next.tail_rear.orientation = Quaternion::rotation_x(-0.2); next.wing_in_l.position = Vec3::new(-s_a.wing_in.0, s_a.wing_in.1, s_a.wing_in.2); next.wing_in_r.position = Vec3::new(s_a.wing_in.0, s_a.wing_in.1, s_a.wing_in.2); - next.wing_in_l.orientation = - Quaternion::rotation_y(-0.8 + wave_slow_cos * 0.06) * Quaternion::rotation_z(0.2); - next.wing_in_r.orientation = - Quaternion::rotation_y(0.8 - wave_slow_cos * 0.06) * Quaternion::rotation_z(-0.2); - next.wing_mid_l.position = Vec3::new(-s_a.wing_mid.0, s_a.wing_mid.1, s_a.wing_mid.2); next.wing_mid_r.position = Vec3::new(s_a.wing_mid.0, s_a.wing_mid.1, s_a.wing_mid.2); - next.wing_mid_l.orientation = Quaternion::rotation_y(-0.1) * Quaternion::rotation_z(0.7); - next.wing_mid_r.orientation = Quaternion::rotation_y(0.1) * Quaternion::rotation_z(-0.7); next.wing_out_l.position = Vec3::new(-s_a.wing_out.0, s_a.wing_out.1, s_a.wing_out.2); next.wing_out_r.position = Vec3::new(s_a.wing_out.0, s_a.wing_out.1, s_a.wing_out.2); - next.wing_out_l.orientation = Quaternion::rotation_y(-0.4) * Quaternion::rotation_z(0.2); - next.wing_out_r.orientation = Quaternion::rotation_y(0.4) * Quaternion::rotation_z(-0.2); next.leg_l.position = Vec3::new(-s_a.leg.0, s_a.leg.1, s_a.leg.2); next.leg_l.orientation = Quaternion::rotation_x(0.0); @@ -86,9 +72,9 @@ impl Animation for IdleAnimation { next.leg_r.orientation = Quaternion::rotation_x(0.0); next.foot_l.position = Vec3::new(-s_a.foot.0, s_a.foot.1, s_a.foot.2); - next.foot_l.orientation = Quaternion::rotation_x(0.0); + next.foot_r.position = Vec3::new(s_a.foot.0, s_a.foot.1, s_a.foot.2); - next.foot_r.orientation = Quaternion::rotation_x(0.0); + next } diff --git a/voxygen/anim/src/bird_large/mod.rs b/voxygen/anim/src/bird_large/mod.rs index 432cd57338..46903e43c3 100644 --- a/voxygen/anim/src/bird_large/mod.rs +++ b/voxygen/anim/src/bird_large/mod.rs @@ -165,66 +165,79 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Phoenix, _) => (2.5, 16.0), (Cockatrice, _) => (2.5, 16.0), (Roc, _) => (2.5, 27.5), + (FlameWyvern, _) => (2.5, 23.0), }, neck: match (body.species, body.body_type) { (Phoenix, _) => (2.5, -5.5), (Cockatrice, _) => (5.0, -1.5), (Roc, _) => (9.5, -1.5), + (FlameWyvern, _) => (11.0, -0.5), }, head: match (body.species, body.body_type) { (Phoenix, _) => (6.0, 12.0), (Cockatrice, _) => (8.0, 4.5), (Roc, _) => (17.0, -3.5), + (FlameWyvern, _) => (10.0, -1.5), }, beak: match (body.species, body.body_type) { (Phoenix, _) => (5.0, 3.0), (Cockatrice, _) => (2.0, -3.0), (Roc, _) => (0.0, -3.0), + (FlameWyvern, _) => (-1.0, 2.0), }, tail_front: match (body.species, body.body_type) { (Phoenix, _) => (-9.5, -1.0), (Cockatrice, _) => (-5.0, -2.5), (Roc, _) => (-7.5, -3.5), + (FlameWyvern, _) => (-10.0, -5.0), }, tail_rear: match (body.species, body.body_type) { (Phoenix, _) => (-11.0, 0.0), (Cockatrice, _) => (-8.0, -3.0), (Roc, _) => (-8.0, -3.0), + (FlameWyvern, _) => (-11.0, -1.0), }, wing_in: match (body.species, body.body_type) { (Phoenix, _) => (3.0, 2.5, 2.0), (Cockatrice, _) => (3.5, 7.0, 3.5), (Roc, _) => (5.5, 7.5, -1.0), + (FlameWyvern, _) => (5.5, 5.0, -2.0), }, wing_mid: match (body.species, body.body_type) { (Phoenix, _) => (10.0, 1.0, 0.0), (Cockatrice, _) => (6.0, 0.0, 0.0), (Roc, _) => (12.0, 1.0, -0.5), + (FlameWyvern, _) => (19.0, 15.0, -1.0), }, wing_out: match (body.species, body.body_type) { (Phoenix, _) => (7.0, 2.0, 1.5), (Cockatrice, _) => (4.0, -1.0, 1.0), (Roc, _) => (10.0, -2.0, 0.0), + (FlameWyvern, _) => (1.0, 1.0, 0.0), }, leg: match (body.species, body.body_type) { (Phoenix, _) => (4.0, 1.5, 12.0), (Cockatrice, _) => (3.5, 2.5, 13.0), (Roc, _) => (5.5, -1.5, 17.5), + (FlameWyvern, _) => (5.5, -2.0, 15.5), }, foot: match (body.species, body.body_type) { (Phoenix, _) => (0.5, -0.5, -2.5), (Cockatrice, _) => (0.5, -3.0, -3.0), (Roc, _) => (2.5, -2.5, -5.5), + (FlameWyvern, _) => (0.5, 0.0, -3.5), }, scaler: match (body.species, body.body_type) { (Phoenix, _) => (1.0), (Cockatrice, _) => (1.0), (Roc, _) => (1.0), + (FlameWyvern, _) => (1.0), }, feed: match (body.species, body.body_type) { (Phoenix, _) => (-0.65), (Cockatrice, _) => (-0.5), (Roc, _) => (-0.4), + (FlameWyvern, _) => (-0.65), }, } }