diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 8b20184b38ab0..de072a3eeb9bf 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -130,7 +130,7 @@ var/modded_time = time * speed_mod - fail_prob = min(max(0, modded_time - (time * SURGERY_SLOWDOWN_CAP_MULTIPLIER)),99)//if modded_time > time * modifier, then fail_prob = modded_time - time*modifier. starts at 0, caps at 99 + fail_prob = get_failure_probability(user, target, tool, modded_time) //BANDASTATION EDIT - было: if modded_time > time * modifier, then fail_prob = modded_time - time*modifier. starts at 0, caps at 99 // BANDASTATION EDIT modded_time = min(modded_time, time * SURGERY_SLOWDOWN_CAP_MULTIPLIER)//also if that, then cap modded_time at time*modifier if(iscyborg(user))//any immunities to surgery slowdown should go in this check. diff --git a/modular_bandastation/medical/_medical.dme b/modular_bandastation/medical/_medical.dme index 3783e0393c8c7..7c801faa1c429 100644 --- a/modular_bandastation/medical/_medical.dme +++ b/modular_bandastation/medical/_medical.dme @@ -1,3 +1,4 @@ #include "_medical.dm" #include "code/surgery/vocal_cords.dm" +#include "code/surgery/surgery_fail_chance.dm" diff --git a/modular_bandastation/medical/code/surgery/surgery_fail_chance.dm b/modular_bandastation/medical/code/surgery/surgery_fail_chance.dm new file mode 100644 index 0000000000000..33b0bca522838 --- /dev/null +++ b/modular_bandastation/medical/code/surgery/surgery_fail_chance.dm @@ -0,0 +1,33 @@ +#define SURGFAIL_LIGHT_AMOUNT_REQUERED 0.6 +#define SURGFAIL_LIGHT_AMOUNT_MULTIPLIER 20 +#define SURGFAIL_NO_PAINKILLER 80 +#define BASIC_SURGERY_SUCCESS_CHANCE 100 +#define CRITICAL_SUCCESS_CHANCE 100 + + +/datum/surgery_step/proc/get_failure_probability(mob/living/user, mob/living/target, obj/item/tool, var/modded_time) + var/success_prob = implement_type ? implements[implement_type] : BASIC_SURGERY_SUCCESS_CHANCE + var/turf/user_turf = get_turf(user) + var/light_amount = user_turf.get_lumcount() + if (light_amount < SURGFAIL_LIGHT_AMOUNT_REQUERED) + success_prob -= (SURGFAIL_LIGHT_AMOUNT_REQUERED - clamp(light_amount, 0, SURGFAIL_LIGHT_AMOUNT_REQUERED)) * SURGFAIL_LIGHT_AMOUNT_MULTIPLIER + if ((!(target.stat == UNCONSCIOUS || target.IsSleeping()) && target.stat != DEAD) && !HAS_TRAIT(target, TRAIT_ANALGESIA)) + success_prob -= SURGFAIL_NO_PAINKILLER + var/fail_prob = CRITICAL_SUCCESS_CHANCE - success_prob + fail_prob *= modded_time / time + + return fail_prob + +#undef SURGFAIL_LIGHT_AMOUNT_REQUERED +#undef SURGFAIL_LIGHT_AMOUNT_MULTIPLIER +#undef SURGFAIL_NO_PAINKILLER +#undef BASIC_SURGERY_SUCCESS_CHANCE +#undef CRITICAL_SUCCESS_CHANCE + +/datum/status_effect/grouped/stasis/on_apply() + . = ..() + add_traits(list(TRAIT_ANALGESIA), TRAIT_STATUS_EFFECT(id)) + +/datum/status_effect/grouped/stasis/on_remove() + . = ..() + remove_traits(list(TRAIT_ANALGESIA), TRAIT_STATUS_EFFECT(id))