Adlet abilities

This commit is contained in:
Sam 2023-03-20 21:34:18 -04:00
parent 715a0b7b20
commit 92e28f09fc
18 changed files with 202 additions and 26 deletions

View File

@ -745,4 +745,26 @@
secondary: Simple(None, "common.abilities.empty.basic"), secondary: Simple(None, "common.abilities.empty.basic"),
abilities: [], abilities: [],
), ),
// Adlets
// TODO: Do we want to eventually convert these to simple variants of weapons?
Custom("Adlet Hunter"): (
primary: "common.abilities.adlet.hunter.stab",
secondary: "common.abilities.adlet.hunter.throw",
abilities: [],
),
Custom("Adlet Icepicker"): (
primary: "common.abilities.adlet.icepicker.spike",
secondary: "common.abilities.adlet.icepicker.leap",
abilities: [],
),
Custom("Adlet Tracker"): (
primary: "common.abilities.adlet.tracker.arrow",
secondary: "common.abilities.adlet.tracker.trap",
abilities: [],
),
// Custom("Adlet Alpha"): (
// primary: "common.abilities.adlet.alpha",
// secondary: "common.abilities.adlet.alpha",
// abilities: [],
// ),
}) })

View File

@ -0,0 +1,17 @@
BasicMelee(
energy_cost: 0,
buildup_duration: 0.15,
swing_duration: 0.05,
recover_duration: 0.55,
melee_constructor: (
kind: Stab(
damage: 10,
poise: 5,
knockback: 0,
energy_regen: 0,
),
range: 5,
angle: 5,
),
ori_modifier: 1.0,
)

View File

@ -0,0 +1,15 @@
BasicRanged(
energy_cost: 0,
buildup_duration: 0.8,
recover_duration: 0.8,
projectile: Arrow(
damage: 16,
knockback: 0,
energy_regen: 0,
),
projectile_body: Object(AdletSpear),
projectile_light: None,
projectile_speed: 40.0,
num_projectiles: 1,
projectile_spread: 0.0,
)

View File

@ -0,0 +1,19 @@
LeapMelee(
energy_cost: 0.0,
buildup_duration: 0.6,
movement_duration: 0.2,
swing_duration: 0.1,
recover_duration: 0.3,
melee_constructor: (
kind: Stab(
damage: 20,
poise: 20,
knockback: 0,
energy_regen: 0,
),
range: 4,
angle: 30,
),
forward_leap_strength: 18,
vertical_leap_strength: 8,
)

View File

@ -0,0 +1,17 @@
BasicMelee(
energy_cost: 0,
buildup_duration: 0.4,
swing_duration: 0.1,
recover_duration: 0.45,
melee_constructor: (
kind: Stab(
damage: 12,
poise: 10,
knockback: 0,
energy_regen: 0,
),
range: 3,
angle: 15,
),
ori_modifier: 1.0,
)

View File

@ -0,0 +1,15 @@
BasicRanged(
energy_cost: 0,
buildup_duration: 0.6,
recover_duration: 0.4,
projectile: Arrow(
damage: 12,
knockback: 0,
energy_regen: 0,
),
projectile_body: Object(Arrow),
projectile_light: None,
projectile_speed: 100.0,
num_projectiles: 1,
projectile_spread: 0.0,
)

View File

@ -0,0 +1,12 @@
BasicRanged(
energy_cost: 0,
buildup_duration: 0.75,
recover_duration: 0.75,
projectile: Trap(
damage: 25,
),
projectile_body: Object(Snowball),
projectile_speed: 10.0,
num_projectiles: 1,
projectile_spread: 0.0,
)

View File

@ -5,11 +5,11 @@ ItemDef(
kind: Spear, kind: Spear,
hands: Two, hands: Two,
stats: ( stats: (
equip_time_secs: 0.0, equip_time_secs: 0.1,
power: 1.05, power: 1.0,
effect_power: 1.0, effect_power: 1.0,
speed: 0.75, speed: 1.0,
crit_chance: 0.07589286, crit_chance: 0.1,
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: None, ability_spec: Some(Custom("Adlet Hunter")),
) )

View File

@ -1,15 +1,15 @@
ItemDef( ItemDef(
name: "Icepicker Axe", name: "Icepicker Pick",
description: "", description: "",
kind: Tool(( kind: Tool((
kind: Axe, kind: Pick,
hands: Two, hands: Two,
stats: ( stats: (
equip_time_secs: 0.0, equip_time_secs: 0.1,
power: 0.7, power: 1.0,
effect_power: 0.8, effect_power: 1.0,
speed: 0.7, speed: 1.0,
crit_chance: 0.05059524, crit_chance: 0.1,
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("Axe Simple")), ability_spec: Some(Custom("Adlet Icepicker")),
) )

View File

@ -6,16 +6,16 @@ ItemDef(
hands: Two, hands: Two,
stats: ( stats: (
equip_time_secs: 0.0, equip_time_secs: 0.0,
power: 1.05, power: 1.0,
effect_power: 0.8, effect_power: 1.0,
speed: 0.4, speed: 1.0,
crit_chance: 0.08406594, crit_chance: 0.1,
range: 1.0, range: 1.0,
energy_efficiency: 1.0, energy_efficiency: 1.0,
buff_strength: 1.0, buff_strength: 1.0,
), ),
)), )),
quality: Moderate, quality: Low,
tags: [], tags: [],
ability_spec: Some(Custom("Bow Simple")), ability_spec: Some(Custom("Adlet Tracker")),
) )

View File

@ -919,4 +919,14 @@
central: ("armor.empty"), central: ("armor.empty"),
) )
), ),
AdletSpear: (
bone0: (
offset: (-12.5, -12.5, 0.0),
central: ("weapon.projectile.adlet-spear"),
),
bone1: (
offset: (0.0, 0.0, 0.0),
central: ("armor.empty"),
)
),
}) })

BIN
assets/voxygen/voxel/weapon/projectile/adlet-spear.vox (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -104,6 +104,7 @@ make_case_elim!(
SpectralSwordSmall = 89, SpectralSwordSmall = 89,
SpectralSwordLarge = 90, SpectralSwordLarge = 90,
LaserBeam = 91, LaserBeam = 91,
AdletSpear = 92,
} }
); );
@ -114,7 +115,7 @@ impl Body {
} }
} }
pub const ALL_OBJECTS: [Body; 92] = [ pub const ALL_OBJECTS: [Body; 93] = [
Body::Arrow, Body::Arrow,
Body::Bomb, Body::Bomb,
Body::Scarecrow, Body::Scarecrow,
@ -207,6 +208,7 @@ pub const ALL_OBJECTS: [Body; 92] = [
Body::BarrelOrgan, Body::BarrelOrgan,
Body::IceBomb, Body::IceBomb,
Body::LaserBeam, Body::LaserBeam,
Body::AdletSpear,
]; ];
impl From<Body> for super::Body { impl From<Body> for super::Body {
@ -308,6 +310,7 @@ impl Body {
Body::SpectralSwordSmall => "spectral_sword_small", Body::SpectralSwordSmall => "spectral_sword_small",
Body::SpectralSwordLarge => "spectral_sword_large", Body::SpectralSwordLarge => "spectral_sword_large",
Body::LaserBeam => "laser_beam", Body::LaserBeam => "laser_beam",
Body::AdletSpear => "adlet_spear",
} }
} }
@ -332,7 +335,8 @@ impl Body {
| Body::Dart | Body::Dart
| Body::DagonBomb | Body::DagonBomb
| Body::SpectralSwordSmall | Body::SpectralSwordSmall
| Body::SpectralSwordLarge => 500.0, | Body::SpectralSwordLarge
| Body::AdletSpear => 500.0,
Body::Bomb => 2000.0, // I have no idea what it's supposed to be Body::Bomb => 2000.0, // I have no idea what it's supposed to be
Body::Crate => 300.0, // let's say it's a lot of wood and maybe some contents Body::Crate => 300.0, // let's say it's a lot of wood and maybe some contents
Body::Scarecrow => 900.0, Body::Scarecrow => 900.0,
@ -427,6 +431,7 @@ impl Body {
Body::GnarlingTotemRed | Body::GnarlingTotemGreen | Body::GnarlingTotemWhite => 100.0, Body::GnarlingTotemRed | Body::GnarlingTotemGreen | Body::GnarlingTotemWhite => 100.0,
Body::IceBomb => 12298.0, // 2.5 m diamter but ice Body::IceBomb => 12298.0, // 2.5 m diamter but ice
Body::LaserBeam => 80000.0, Body::LaserBeam => 80000.0,
Body::AdletSpear => 1.5,
}; };
Mass(m) Mass(m)
@ -434,9 +439,12 @@ impl Body {
pub fn dimensions(&self) -> Vec3<f32> { pub fn dimensions(&self) -> Vec3<f32> {
match self { match self {
Body::Arrow | Body::ArrowSnake | Body::MultiArrow | Body::ArrowTurret | Body::Dart => { Body::Arrow
Vec3::new(0.01, 0.8, 0.01) | Body::ArrowSnake
}, | Body::MultiArrow
| Body::ArrowTurret
| Body::Dart
| Body::AdletSpear => Vec3::new(0.01, 0.8, 0.01),
Body::BoltFire => Vec3::new(0.1, 0.1, 0.1), Body::BoltFire => Vec3::new(0.1, 0.1, 0.1),
Body::SpectralSwordSmall => Vec3::new(0.2, 0.9, 0.1), Body::SpectralSwordSmall => Vec3::new(0.2, 0.9, 0.1),
Body::SpectralSwordLarge => Vec3::new(0.2, 1.5, 0.1), Body::SpectralSwordLarge => Vec3::new(0.2, 1.5, 0.1),

View File

@ -125,6 +125,9 @@ pub enum ProjectileConstructor {
knockback: f32, knockback: f32,
min_falloff: f32, min_falloff: f32,
}, },
Trap {
damage: f32,
},
} }
impl ProjectileConstructor { impl ProjectileConstructor {
@ -790,6 +793,29 @@ impl ProjectileConstructor {
is_point: true, is_point: true,
} }
}, },
Trap { damage } => {
let damage = AttackDamage::new(
Damage {
source: DamageSource::Explosion,
kind: DamageKind::Piercing,
value: damage,
},
Some(GroupTarget::OutOfGroup),
instance,
);
let attack = Attack::default()
.with_damage(damage)
.with_crit(crit_chance, crit_mult);
Projectile {
hit_solid: vec![],
hit_entity: vec![Effect::Attack(attack), Effect::Vanish],
time_left: Duration::from_secs(300),
owner,
ignore_group: true,
is_sticky: true,
is_point: false,
}
},
} }
} }
@ -913,6 +939,9 @@ impl ProjectileConstructor {
*damage *= power; *damage *= power;
*radius *= range; *radius *= range;
}, },
Trap { ref mut damage } => {
*damage *= power;
},
} }
self self
} }
@ -935,6 +964,7 @@ impl ProjectileConstructor {
WindBomb { .. } => true, WindBomb { .. } => true,
IceBomb { .. } => true, IceBomb { .. } => true,
LaserBeam { .. } => true, LaserBeam { .. } => true,
Trap { .. } => false,
} }
} }
} }

View File

@ -212,6 +212,9 @@ impl<'a> System<'a> for Sys {
BuffData::new(20.0, None, None), BuffData::new(20.0, None, None),
Vec::new(), Vec::new(),
BuffSource::World, BuffSource::World,
*read_data.time,
Some(&stat),
Some(health),
)), )),
}); });
} }

View File

@ -27,7 +27,10 @@ impl Site {
| SiteKind::DesertCity(_) | SiteKind::DesertCity(_)
| SiteKind::SavannahPit(_) => Some(true), | SiteKind::SavannahPit(_) => Some(true),
// Evil // Evil
SiteKind::Dungeon(_) | SiteKind::ChapelSite(_) | SiteKind::Gnarling(_) => Some(false), SiteKind::Dungeon(_)
| SiteKind::ChapelSite(_)
| SiteKind::Gnarling(_)
| SiteKind::Adlet(_) => Some(false),
// Neutral // Neutral
SiteKind::Settlement(_) SiteKind::Settlement(_)
| SiteKind::Castle(_) | SiteKind::Castle(_)

View File

@ -73,7 +73,8 @@ fn path_in_site(start: Vec2<i32>, end: Vec2<i32>, site: &site2::Site) -> PathRes
| TileKind::Tower(_) | TileKind::Tower(_)
| TileKind::Keep(_) | TileKind::Keep(_)
| TileKind::Gate | TileKind::Gate
| TileKind::GnarlingFortification => 5.0, | TileKind::GnarlingFortification
| TileKind::AdletStronghold => 5.0,
}; };
let is_door_tile = |plot: Id<site2::Plot>, tile: Vec2<i32>| match site.plot(plot).kind() { let is_door_tile = |plot: Id<site2::Plot>, tile: Vec2<i32>| match site.plot(plot).kind() {
site2::PlotKind::House(house) => house.door_tile == tile, site2::PlotKind::House(house) => house.door_tile == tile,

View File

@ -336,6 +336,7 @@ impl Site {
SiteKind::GiantTree(site2) => Some(site2), SiteKind::GiantTree(site2) => Some(site2),
SiteKind::Gnarling(site2) => Some(site2), SiteKind::Gnarling(site2) => Some(site2),
SiteKind::Bridge(site2) => Some(site2), SiteKind::Bridge(site2) => Some(site2),
SiteKind::Adlet(site2) => Some(site2),
} }
} }
} }