diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 336e76b4d70c2f..629b67769dc2f7 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,)//if modded_time > time * modifier, then fail_prob = modded_time - time*modifier. starts at 0, caps at 99 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 3783e0393c8c7a..7c801faa1c429b 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 00000000000000..356b98716d7c88 --- /dev/null +++ b/modular_bandastation/medical/code/surgery/surgery_fail_chance.dm @@ -0,0 +1,25 @@ +#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