From: TimePath Date: Tue, 10 Feb 2015 02:23:26 +0000 (+1100) Subject: Derive inferno buff burn time from an increasing exponential decay curve X-Git-Tag: xonotic-v0.8.1~18^2~29 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=a635af14a61722d533aef5a3aa02360424ac1d46;p=xonotic%2Fxonotic-data.pk3dir.git Derive inferno buff burn time from an increasing exponential decay curve --- diff --git a/mutators.cfg b/mutators.cfg index 4d051f83b..e99dafa86 100644 --- a/mutators.cfg +++ b/mutators.cfg @@ -318,5 +318,7 @@ set g_buffs_flight_gravity 0.3 "player gravity multiplier while holding flight b set g_buffs_invisible 1 "invisible buff: carrier becomes invisible" set g_buffs_invisible_alpha 0.4 "player invisibility multiplier while holding invisible buff" set g_buffs_inferno 1 "inferno buff: targets damaged by player carrying inferno buff will also receive burning damage" -set g_buffs_inferno_burntime 1.5 "burning time of damaged target" set g_buffs_inferno_damagemultiplier 0.25 "multiplier of damage dealt during burn" +set g_buffs_inferno_burntime_factor 2 "burn time logarithm base. 0 < x < 1: increasing, x > 1: increasing" +set g_buffs_inferno_burntime_target_damage 150 "damage required for g_buffs_inferno_burntime_target_time seconds of burn" +set g_buffs_inferno_burntime_target_time 5 "seconds of burn given g_buffs_inferno_burntime_target_damage damage" diff --git a/qcsrc/server/autocvars.qh b/qcsrc/server/autocvars.qh index 673d84dfd..77a6b1fe7 100644 --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@ -882,6 +882,8 @@ float autocvar_g_buffs_vampire_damage_steal; float autocvar_g_buffs_invisible_alpha; float autocvar_g_buffs_flight_gravity; float autocvar_g_buffs_jump_height; -float autocvar_g_buffs_inferno_burntime; +float autocvar_g_buffs_inferno_burntime_factor; +float autocvar_g_buffs_inferno_burntime_target_damage; +float autocvar_g_buffs_inferno_burntime_target_time; float autocvar_g_buffs_inferno_damagemultiplier; #endif diff --git a/qcsrc/server/mutators/mutator_buffs.qc b/qcsrc/server/mutators/mutator_buffs.qc index 2171e6ed3..73d60335e 100644 --- a/qcsrc/server/mutators/mutator_buffs.qc +++ b/qcsrc/server/mutators/mutator_buffs.qc @@ -373,6 +373,12 @@ void buff_Vengeance_DelayedDamage() return; } +float buff_Inferno_CalculateTime(float x, float offset_x, float offset_y, float intersect_x, float intersect_y, float base) +{ + float f = (x - offset_x) / intersect_x; + return offset_y + (intersect_y - offset_y) * logn((base - 1) * (f + 1), base); +} + MUTATOR_HOOKFUNCTION(buffs_PlayerDamage_Calculate) { if(frag_deathtype == DEATH_BUFF) { return false; } @@ -429,8 +435,16 @@ MUTATOR_HOOKFUNCTION(buffs_PlayerDamage_Calculate) } if(frag_attacker.buffs & BUFF_INFERNO) - if(frag_target != frag_attacker) - Fire_AddDamage(frag_target, frag_attacker, (frag_damage * autocvar_g_buffs_inferno_damagemultiplier) * autocvar_g_buffs_inferno_burntime, autocvar_g_buffs_inferno_burntime, DEATH_BUFF); + if(frag_target != frag_attacker) { + float time = buff_Inferno_CalculateTime( + frag_damage, + 0, 0, + autocvar_g_buffs_inferno_burntime_target_damage, + autocvar_g_buffs_inferno_burntime_target_time, + autocvar_g_buffs_inferno_burntime_factor + ); + Fire_AddDamage(frag_target, frag_attacker, (frag_damage * autocvar_g_buffs_inferno_damagemultiplier) * time, time, DEATH_BUFF); + } // this... is ridiculous (TODO: fix!) if(frag_attacker.buffs & BUFF_VAMPIRE) diff --git a/qcsrc/warpzonelib/mathlib.qc b/qcsrc/warpzonelib/mathlib.qc index d86af8a00..e70275626 100644 --- a/qcsrc/warpzonelib/mathlib.qc +++ b/qcsrc/warpzonelib/mathlib.qc @@ -95,6 +95,10 @@ float ldexp(float x, int e) { return x * pow(2, e); } +float logn(float x, float base) +{ + return log(x) / log(base); +} float log10(float x) { return log(x) * M_LOG10E; diff --git a/qcsrc/warpzonelib/mathlib.qh b/qcsrc/warpzonelib/mathlib.qh index a37ba63de..fb12956d6 100644 --- a/qcsrc/warpzonelib/mathlib.qh +++ b/qcsrc/warpzonelib/mathlib.qh @@ -41,6 +41,7 @@ vector frexp(float x); // returns mantissa as _x, exponent as _y int ilogb(float x); float ldexp(float x, int e); //float log(float x); +float logn(float x, float base); float log10(float x); float log1p(float x); float log2(float x);