make fortitude scale of difference from maximum health

This commit is contained in:
do-no-van 2024-01-21 20:15:24 +00:00
parent 8c5759cb5e
commit 646c57501f
9 changed files with 11 additions and 49 deletions

View File

@ -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,
)