Merge branch 'do-no-van/sword-rebalancing' into 'master'

sword ability rebalancing

See merge request veloren/veloren!4268
This commit is contained in:
Samuel Keiffer 2024-01-21 22:12:49 +00:00
commit 6c5e0a698e
54 changed files with 83 additions and 123 deletions

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 12,
damage: 11,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 5,
damage: 4,
poise: 5,
knockback: 0,
energy_regen: 0,
@ -20,7 +20,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 7,
damage: 6,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -4,7 +4,7 @@ RapidMelee(
recover_duration: 0.1,
melee_constructor: (
kind: Slash(
damage: 10,
damage: 6,
poise: 3,
knockback: 0,
energy_regen: 0,
@ -12,7 +12,7 @@ RapidMelee(
range: 6.0,
angle: 10.0,
),
energy_cost: 2.5,
energy_cost: 6,
max_strikes: Some(6),
move_modifier: 0.35,
ori_modifier: 0.25,

View File

@ -3,13 +3,13 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 8,
damage: 14,
poise: 5,
knockback: 0,
energy_regen: 0,
),
range: 3.0,
angle: 45.0,
angle: 90.0,
),
buildup_duration: 0.2,
swing_duration: 0.1,
@ -23,7 +23,7 @@ ComboMelee2(
ori_modifier: 0.6,
),
],
energy_cost_per_strike: 0,
energy_cost_per_strike: 5,
meta: (
init_event: Some(EnterStance(Sword(Agile))),
),

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 10,
damage: 9,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -4,7 +4,7 @@ RapidMelee(
recover_duration: 0.1,
melee_constructor: (
kind: Slash(
damage: 10,
damage: 8,
poise: 3,
knockback: 0,
energy_regen: 0,
@ -12,7 +12,7 @@ RapidMelee(
range: 6.0,
angle: 10.0,
),
energy_cost: 5,
energy_cost: 6,
max_strikes: Some(3),
move_modifier: 0.35,
ori_modifier: 0.25,

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 24,
damage: 19,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 16,
damage: 13,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 10,
damage: 7,
poise: 5,
knockback: 0,
energy_regen: 0,
@ -20,7 +20,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 14,
damage: 12,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 10,
damage: 9,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 20,
damage: 15,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Stab(
damage: 18,
damage: 15,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -4,7 +4,7 @@ RapidMelee(
recover_duration: 0.3,
melee_constructor: (
kind: Slash(
damage: 8,
damage: 10,
poise: 10,
knockback: 0,
energy_regen: 0,

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 24,
damage: 19,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 16,
damage: 13,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 10,
damage: 7,
poise: 5,
knockback: 0,
energy_regen: 0,
@ -21,7 +21,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 14,
damage: 12,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 10,
damage: 9,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -4,7 +4,7 @@ RapidMelee(
recover_duration: 0.4,
melee_constructor: (
kind: Slash(
damage: 10,
damage: 8,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -1,5 +1,5 @@
DiveMelee(
energy_cost: 5,
energy_cost: 15,
vertical_speed: 5,
buildup_duration: Some(0.1),
movement_duration: 5,

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 20,
damage: 15,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Stab(
damage: 18,
damage: 15,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -4,9 +4,9 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 30,
damage: 23,
poise: 20,
knockback: 10,
knockback: 20,
energy_regen: 0,
),
range: 4.0,
@ -20,7 +20,7 @@ ComboMelee2(
ori_modifier: 0.6,
),
],
energy_cost_per_strike: 25,
energy_cost_per_strike: 18,
meta: (
requirements: (stance: Some(Sword(Cleaving))),
),

View File

@ -4,7 +4,7 @@ RapidMelee(
recover_duration: 0.4,
melee_constructor: (
kind: Slash(
damage: 14,
damage: 11,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -3,10 +3,10 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 16,
damage: 12,
poise: 5,
knockback: 0,
energy_regen: 5,
energy_regen: 7,
),
range: 3.0,
angle: 45.0,
@ -15,11 +15,11 @@ ComboMelee2(
buildup_duration: 0.2,
swing_duration: 0.1,
hit_timing: 0.5,
recover_duration: 0.2,
recover_duration: 0.35,
ori_modifier: 0.6,
),
],
energy_cost_per_strike: 12,
energy_cost_per_strike: 15,
meta: (
requirements: (stance: Some(Sword(Crippling))),
),

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 20,
damage: 15,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 13,
damage: 12,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 7,
damage: 9,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 19,
damage: 14,
poise: 5,
knockback: 0,
energy_regen: 0,
@ -15,11 +15,11 @@ ComboMelee2(
buildup_duration: 0.2,
swing_duration: 0.15,
hit_timing: 0.5,
recover_duration: 0.2,
recover_duration: 0.35,
ori_modifier: 0.6,
),
],
energy_cost_per_strike: 17,
energy_cost_per_strike: 10,
meta: (
requirements: (stance: Some(Sword(Crippling))),
),

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 17,
damage: 14,
poise: 5,
knockback: 0,
energy_regen: 0,
@ -13,7 +13,7 @@ ComboMelee2(
damage_effect: Some(Buff((
kind: Bleeding,
dur_secs: 8.0,
strength: DamageFraction(0.25),
strength: DamageFraction(0.15),
chance: 1.0,
))),
),

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 16,
damage: 12,
poise: 5,
knockback: 0,
energy_regen: 0,
@ -12,8 +12,8 @@ ComboMelee2(
angle: 45.0,
damage_effect: Some(Buff((
kind: Bleeding,
dur_secs: 4.0,
strength: DamageFraction(0.4),
dur_secs: 5.0,
strength: DamageFraction(0.25),
chance: 1.0,
))),
),

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 16,
damage: 12,
poise: 5,
knockback: 0,
energy_regen: 0,
@ -12,7 +12,7 @@ ComboMelee2(
angle: 45.0,
damage_effect: Some(Buff((
kind: Crippled,
dur_secs: 15.0,
dur_secs: 10.0,
strength: Value(0.25),
chance: 1.0,
))),

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Stab(
damage: 15,
damage: 14,
poise: 5,
knockback: 0,
energy_regen: 0,
@ -13,7 +13,7 @@ ComboMelee2(
damage_effect: Some(Buff((
kind: Bleeding,
dur_secs: 8.0,
strength: DamageFraction(0.25),
strength: DamageFraction(0.15),
chance: 1.0,
))),
),

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 18,
damage: 16,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 6,
damage: 5,
poise: 5,
knockback: 0,
energy_regen: 0,
@ -21,7 +21,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 9,
damage: 8,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -3,12 +3,12 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 10,
poise: 5,
damage: 0,
poise: 0,
knockback: 0,
energy_regen: 0,
),
range: 6.0,
range: 4.0,
angle: 45.0,
),
buildup_duration: 0.05,
@ -26,6 +26,5 @@ ComboMelee2(
energy_cost_per_strike: 0,
meta: (
init_event: Some(EnterStance(Sword(Defensive))),
capabilities: ("BLOCKS"),
),
)

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 20,
damage: 15,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 30,
damage: 23,
poise: 15,
knockback: 0,
energy_regen: 0,

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 20,
damage: 17,
poise: 15,
knockback: 0,
energy_regen: 0,

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 12,
damage: 9,
poise: 5,
knockback: 0,
energy_regen: 0,
@ -21,7 +21,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 18,
damage: 14,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 12,
damage: 11,
poise: 5,
knockback: 0,
energy_regen: 0,

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 25,
damage: 19,
poise: 15,
knockback: 0,
energy_regen: 0,

View File

@ -7,7 +7,7 @@ DiveMelee(
recover_duration: 0.3,
melee_constructor: (
kind: Slash(
damage: 30,
damage: 25,
poise: 40,
knockback: 0,
energy_regen: 0,

View File

@ -8,9 +8,8 @@ ComboMelee2(
knockback: 0,
energy_regen: 0,
),
range: 1.0,
range: 1.5,
angle: 45.0,
damage_effect: Some(StunnedVulnerable(0.5)),
),
buildup_duration: 0.15,
swing_duration: 0.1,

View File

@ -3,7 +3,7 @@ ComboMelee2(
(
melee_constructor: (
kind: Stab(
damage: 23,
damage: 18,
poise: 15,
knockback: 0,
energy_regen: 0,

View File

@ -3,23 +3,23 @@ ComboMelee2(
(
melee_constructor: (
kind: Slash(
damage: 27,
damage: 21,
poise: 30,
knockback: 0,
energy_regen: 0,
),
range: 4.0,
angle: 90.0,
damage_effect: Some(StunnedVulnerable(0.5)),
damage_effect: Some(StunnedVulnerable(0.8)),
),
buildup_duration: 0.2,
buildup_duration: 0.3,
swing_duration: 0.2,
hit_timing: 0.5,
recover_duration: 0.3,
ori_modifier: 0.6,
),
],
energy_cost_per_strike: 5,
energy_cost_per_strike: 13,
meta: (
init_event: Some(EnterStance(Sword(Heavy))),
),

View File

@ -157,7 +157,7 @@ impl Attack {
let damage_reduction = (1.0 - attacker_penetration) * raw_damage_reduction;
let block_reduction =
if let (Some(char_state), Some(ori)) = (target.char_state, target.ori) {
if ori.look_vec().angle_between(-*dir) < char_state.block_angle() {
if ori.look_vec().angle_between(-dir.with_z(0.0)) < char_state.block_angle() {
if char_state.is_parry(source) {
emit_outcome(Outcome::Block {
parry: true,
@ -391,7 +391,6 @@ impl Attack {
time,
attacker.map(|a| a.uid),
target.stats,
target.health,
applied_damage,
strength_modifier,
)),
@ -611,7 +610,6 @@ impl Attack {
time,
attacker.map(|a| a.uid),
target.stats,
target.health,
accumulated_damage,
strength_modifier,
)),
@ -1179,7 +1177,6 @@ impl CombatBuff {
time: Time,
uid: Option<Uid>,
tgt_stats: Option<&Stats>,
tgt_health: Option<&Health>,
damage: f32,
strength_modifier: f32,
) -> Buff {
@ -1199,7 +1196,6 @@ impl CombatBuff {
source,
time,
tgt_stats,
tgt_health,
)
}
}

View File

@ -4,7 +4,7 @@ use crate::{
AttackEffect, CombatBuff, CombatBuffStrength, CombatEffect, CombatRequirement,
DamagedEffect,
},
comp::{aura::AuraKey, Health, Stats},
comp::{aura::AuraKey, Stats},
resources::{Secs, Time},
uid::Uid,
};
@ -70,12 +70,12 @@ pub enum BuffKind {
/// 50% increase, 1.0 is a 100% increase.
Hastened,
/// Increases resistance to incoming poise, and poise damage dealt as health
/// is lost from the time the buff activated.
/// is lost.
/// Strength scales the resistance non-linearly. 0.5 provides 50%, 1.0
/// provides 67%.
/// Strength scales the poise damage increase linearly, a strength of 1.0
/// and n health less from activation will cause poise damage to increase by
/// n%.
/// and n health less from maximum health will cause poise damage to
/// increase by n%.
Fortitude,
/// Increases both attack damage and vulnerability to damage.
/// Damage increases linearly with strength, 1.0 is a 100% increase.
@ -268,12 +268,7 @@ impl BuffKind {
/// only the strongest.
pub fn stacks(self) -> bool { matches!(self, BuffKind::PotionSickness) }
pub fn effects(
&self,
data: &BuffData,
stats: Option<&Stats>,
health: Option<&Health>,
) -> Vec<BuffEffect> {
pub fn effects(&self, data: &BuffData, stats: Option<&Stats>) -> Vec<BuffEffect> {
// Normalized nonlinear scaling
let nn_scaling = |a| a / (a + 0.5);
let instance = rand::random();
@ -392,10 +387,7 @@ impl BuffKind {
],
BuffKind::Fortitude => vec![
BuffEffect::PoiseReduction(nn_scaling(data.strength)),
BuffEffect::PoiseDamageFromLostHealth {
initial_health: health.map_or(0.0, |h| h.current()),
strength: data.strength,
},
BuffEffect::PoiseDamageFromLostHealth(data.strength),
],
BuffKind::Parried => vec![BuffEffect::AttackSpeed(0.5)],
//TODO: Handle potion sickness in a more general way.
@ -601,10 +593,7 @@ pub enum BuffEffect {
/// Reduces amount of speed increase by consumables
MoveSpeedReduction(f32),
/// Increases poise damage dealt when health is lost
PoiseDamageFromLostHealth {
initial_health: f32,
strength: f32,
},
PoiseDamageFromLostHealth(f32),
/// Modifier to the amount of damage dealt with attacks
AttackDamage(f32),
/// Overrides the precision multiplier applied to an attack
@ -679,9 +668,8 @@ impl Buff {
source: BuffSource,
time: Time,
stats: Option<&Stats>,
health: Option<&Health>,
) -> Self {
let effects = kind.effects(&data, stats, health);
let effects = kind.effects(&data, stats);
let cat_ids = kind.extend_cat_ids(cat_ids);
let start_time = Time(time.0 + data.delay.map_or(0.0, |delay| delay.0));
let end_time = if cat_ids
@ -941,7 +929,6 @@ pub mod tests {
BuffSource::Unknown,
time,
None,
None,
)
}

View File

@ -127,7 +127,6 @@ impl CharacterBehavior for Data {
BuffSource::Character { by: *data.uid },
*data.time,
Some(data.stats),
data.health,
);
output_events.emit_server(ServerEvent::Buff {
entity: data.entity,

View File

@ -232,7 +232,6 @@ fn activate_aura(
source,
*read_data.time,
stats,
Some(health),
)),
});
}

View File

@ -153,7 +153,6 @@ impl<'a> System<'a> for Sys {
BuffSource::World,
*read_data.time,
Some(&stat),
Some(health),
)),
});
}
@ -171,7 +170,6 @@ impl<'a> System<'a> for Sys {
BuffSource::World,
*read_data.time,
Some(&stat),
Some(health),
)),
});
}
@ -202,7 +200,6 @@ impl<'a> System<'a> for Sys {
BuffSource::World,
*read_data.time,
Some(&stat),
Some(health),
)),
});
}
@ -221,7 +218,6 @@ impl<'a> System<'a> for Sys {
BuffSource::World,
*read_data.time,
Some(&stat),
Some(health),
)),
});
}
@ -239,7 +235,6 @@ impl<'a> System<'a> for Sys {
BuffSource::World,
*read_data.time,
Some(&stat),
Some(health),
)),
});
}
@ -257,7 +252,6 @@ impl<'a> System<'a> for Sys {
BuffSource::World,
*read_data.time,
Some(&stat),
Some(health),
)),
});
// When standing on IceSpike also apply Frozen
@ -270,7 +264,6 @@ impl<'a> System<'a> for Sys {
BuffSource::World,
*read_data.time,
Some(&stat),
Some(health),
)),
});
}
@ -288,7 +281,6 @@ impl<'a> System<'a> for Sys {
BuffSource::World,
*read_data.time,
Some(&stat),
Some(health),
)),
});
}
@ -310,7 +302,6 @@ impl<'a> System<'a> for Sys {
BuffSource::World,
*read_data.time,
Some(&stat),
Some(health),
)),
});
} else if matches!(
@ -387,7 +378,6 @@ impl<'a> System<'a> for Sys {
buff.source,
*read_data.time,
Some(&stat),
Some(health),
)),
});
}
@ -701,11 +691,8 @@ fn execute_effect(
BuffEffect::MoveSpeedReduction(red) => {
stat.move_speed_multiplier *= 1.0 - *red;
},
BuffEffect::PoiseDamageFromLostHealth {
initial_health,
strength,
} => {
let lost_health = (*initial_health - health.current()).max(0.0);
BuffEffect::PoiseDamageFromLostHealth(strength) => {
let lost_health = health.maximum() - health.current();
stat.poise_damage_modifier *= lost_health / 100.0 * *strength;
},
BuffEffect::AttackDamage(dam) => {

View File

@ -713,7 +713,7 @@ impl<'a> AgentData<'a> {
},
Effect::Buff(BuffEffect { kind, data, .. }) => {
if let Some(duration) = data.duration {
for effect in kind.effects(data, self.stats, self.health) {
for effect in kind.effects(data, self.stats) {
match effect {
comp::BuffEffect::HealthChangeOverTime { rate, kind, .. } => {
let amount = match kind {

View File

@ -4287,7 +4287,6 @@ fn cast_buff(buffkind: BuffKind, data: BuffData, server: &mut Server, target: Ec
let ecs = &server.state.ecs();
let mut buffs_all = ecs.write_storage::<comp::Buffs>();
let stats = ecs.read_storage::<comp::Stats>();
let healths = ecs.read_storage::<comp::Health>();
let time = ecs.read_resource::<Time>();
if let Some(mut buffs) = buffs_all.get_mut(target) {
buffs.insert(
@ -4298,7 +4297,6 @@ fn cast_buff(buffkind: BuffKind, data: BuffData, server: &mut Server, target: Ec
BuffSource::Command,
*time,
stats.get(target),
healths.get(target),
),
*time,
);

View File

@ -1417,7 +1417,6 @@ pub fn handle_parry_hook(
};
let time = ecs.read_resource::<Time>();
let stats = ecs.read_storage::<comp::Stats>();
let healths = ecs.read_storage::<comp::Health>();
let buff = buff::Buff::new(
BuffKind::Parried,
data,
@ -1425,7 +1424,6 @@ pub fn handle_parry_hook(
source,
*time,
stats.get(attacker),
healths.get(attacker),
);
server_eventbus.emit_now(ServerEvent::Buff {
entity: attacker,

View File

@ -253,7 +253,6 @@ impl StateExt for State {
Effect::Buff(buff) => {
let time = self.ecs().read_resource::<Time>();
let stats = self.ecs().read_storage::<comp::Stats>();
let healths = self.ecs().read_storage::<comp::Health>();
self.ecs()
.write_storage::<comp::Buffs>()
.get_mut(entity)
@ -266,7 +265,6 @@ impl StateExt for State {
comp::BuffSource::Item,
*time,
stats.get(entity),
healths.get(entity),
),
*time,
)