From 720f7437c3940f5e42f9e772d274338cf7e339f4 Mon Sep 17 00:00:00 2001 From: Lucy Date: Fri, 14 Jun 2024 18:15:28 -0400 Subject: [PATCH 01/13] Regenerative slime extract rework --- .../~monkestation/dcs/signals/signals_mob.dm | 2 + code/__HELPERS/~monkestation-helpers/cmp.dm | 3 + code/modules/mob/living/carbon/carbon.dm | 2 +- .../crossbreeding/regenerative/_cooldown.dm | 23 +++++++ .../crossbreeding/regenerative/_effect.dm | 64 +++++++++++++++++++ .../crossbreeding/regenerative/colors.dm | 12 ++++ tgstation.dme | 3 + 7 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 monkestation/code/modules/slimecore/crossbreeding/regenerative/_cooldown.dm create mode 100644 monkestation/code/modules/slimecore/crossbreeding/regenerative/_effect.dm create mode 100644 monkestation/code/modules/slimecore/crossbreeding/regenerative/colors.dm diff --git a/code/__DEFINES/~monkestation/dcs/signals/signals_mob.dm b/code/__DEFINES/~monkestation/dcs/signals/signals_mob.dm index 2030e073340f96..97350562fb5dfa 100644 --- a/code/__DEFINES/~monkestation/dcs/signals/signals_mob.dm +++ b/code/__DEFINES/~monkestation/dcs/signals/signals_mob.dm @@ -23,3 +23,5 @@ #define COMSIG_STACK_MOVE "stack_move" #define COMSIG_CHECK_CAN_ADD_NEW_STACK "check_stack_add" #define COMSIG_MOBSTACKER_DESTROY "mobstack_destroy_stack" + +#define COMSIG_SLIME_REGEN_CALC "slime_regen_calc" diff --git a/code/__HELPERS/~monkestation-helpers/cmp.dm b/code/__HELPERS/~monkestation-helpers/cmp.dm index eea5c3be71a72f..5aa9c5bbb06360 100644 --- a/code/__HELPERS/~monkestation-helpers/cmp.dm +++ b/code/__HELPERS/~monkestation-helpers/cmp.dm @@ -3,3 +3,6 @@ /proc/cmp_mob_playtime_dsc(mob/a, mob/b) return cmp_numeric_dsc(a?.client?.get_exp_living(TRUE), b?.client?.get_exp_living(TRUE)) + +/proc/cmp_wound_severity_dsc(datum/wound/a, datum/wound/b) + return cmp_numeric_dsc(a.severity, b.severity) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index ad10167adec121..40f1546a0c6b77 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -885,7 +885,7 @@ set_handcuffed(null) update_handcuffed() - stamina.adjust(stamina.maximum, TRUE) + stamina.revitalize(forced = TRUE) return ..() /mob/living/carbon/can_be_revived() diff --git a/monkestation/code/modules/slimecore/crossbreeding/regenerative/_cooldown.dm b/monkestation/code/modules/slimecore/crossbreeding/regenerative/_cooldown.dm new file mode 100644 index 00000000000000..eeaab8aec70752 --- /dev/null +++ b/monkestation/code/modules/slimecore/crossbreeding/regenerative/_cooldown.dm @@ -0,0 +1,23 @@ +/datum/status_effect/slime_regen_cooldown + id = "slime_regen_cooldown" + status_type = STATUS_EFFECT_MULTIPLE + tick_interval = -1 + alert_type = null + remove_on_fullheal = TRUE + var/multiplier = 1 + +/datum/status_effect/slime_regen_cooldown/on_creation(mob/living/new_owner, multiplier = 1, duration = 45 SECONDS) + src.multiplier = multiplier + src.duration = duration + return ..() + +/datum/status_effect/slime_regen_cooldown/on_apply() + RegisterSignal(owner, COMSIG_SLIME_REGEN_CALC, PROC_REF(apply_multiplier)) + return TRUE + +/datum/status_effect/slime_regen_cooldown/on_remove() + UnregisterSignal(owner, COMSIG_SLIME_REGEN_CALC) + +/datum/status_effect/slime_regen_cooldown/proc/apply_multiplier(datum/source, multiplier_ptr) + SIGNAL_HANDLER + *multiplier_ptr *= multiplier diff --git a/monkestation/code/modules/slimecore/crossbreeding/regenerative/_effect.dm b/monkestation/code/modules/slimecore/crossbreeding/regenerative/_effect.dm new file mode 100644 index 00000000000000..8a692c1d2f5bfb --- /dev/null +++ b/monkestation/code/modules/slimecore/crossbreeding/regenerative/_effect.dm @@ -0,0 +1,64 @@ +/datum/status_effect/regenerative_extract + id = "Slime Regeneration" + status_type = STATUS_EFFECT_UNIQUE + duration = 15 SECONDS + tick_interval = 0.5 SECONDS + alert_type = null + var/base_healing_amt = 2 + var/multiplier = 1 + var/diminishing_multiplier = 0.75 + var/diminish_time = 45 SECONDS + var/nutrition_heal_cap = NUTRITION_LEVEL_FED - 50 + var/list/given_traits = list(TRAIT_ANALGESIA, TRAIT_NOCRITDAMAGE) + +/datum/status_effect/regenerative_extract/on_apply() + SEND_SIGNAL(owner, COMSIG_SLIME_REGEN_CALC, &multiplier) + owner.add_traits(given_traits, id) + return TRUE + +/datum/status_effect/regenerative_extract/on_remove() + owner.remove_traits(given_traits, id) + owner.apply_status_effect(/datum/status_effect/slime_regen_cooldown, diminishing_multiplier, diminish_time) + +/datum/status_effect/regenerative_extract/tick(seconds_per_tick, times_fired) + var/heal_amt = base_healing_amt * seconds_per_tick * multiplier + heal_act(heal_amt) + owner.updatehealth() + +/datum/status_effect/regenerative_extract/proc/heal_act(heal_amt) + if(!heal_amt) + return + heal_damage(heal_amt) + heal_misc(heal_amt) + if(iscarbon(owner)) + heal_organs(heal_amt) + heal_wounds() + +/datum/status_effect/regenerative_extract/proc/heal_damage(heal_amt) + owner.heal_overall_damage(brute = heal_amt, burn = heal_amt, updating_health = FALSE) + owner.stamina?.adjust(-heal_amt, forced = TRUE) + owner.adjustOxyLoss(-heal_amt, updating_health = FALSE) + owner.adjustToxLoss(-heal_amt, updating_health = FALSE, forced = TRUE) + owner.adjustCloneLoss(-heal_amt, updating_health = FALSE) + +/datum/status_effect/regenerative_extract/proc/heal_misc(heal_amt) + owner.adjust_disgust(-heal_amt) + if(owner.blood_volume < BLOOD_VOLUME_NORMAL) + owner.blood_volume = min(owner.blood_volume + heal_amt, BLOOD_VOLUME_NORMAL) + if((owner.nutrition < nutrition_heal_cap) && !HAS_TRAIT(owner, TRAIT_NOHUNGER)) + owner.nutrition = min(owner.nutrition + heal_amt, nutrition_heal_cap) + +/datum/status_effect/regenerative_extract/proc/heal_organs(heal_amt) + var/mob/living/carbon/carbon_owner = owner + for(var/obj/item/organ/organ in carbon_owner.organs) + organ.apply_organ_damage(-heal_amt) + carbon_owner.cure_trauma_type(resilience = TRAUMA_RESILIENCE_MAGIC) + +/datum/status_effect/regenerative_extract/proc/heal_wounds() + var/mob/living/carbon/carbon_owner = owner + if(length(carbon_owner.all_wounds)) + var/list/datum/wound/ordered_wounds = sort_list(carbon_owner.all_wounds, GLOBAL_PROC_REF(cmp_wound_severity_dsc)) + ordered_wounds[1]?.remove_wound() + +/datum/status_effect/regenerative_extract/get_examine_text() + return "[owner.p_They()] have a subtle, gentle glow to [owner.p_their()] skin, with slime soothing [owner.p_their()] wounds." diff --git a/monkestation/code/modules/slimecore/crossbreeding/regenerative/colors.dm b/monkestation/code/modules/slimecore/crossbreeding/regenerative/colors.dm new file mode 100644 index 00000000000000..8b0c2d33cf2ba6 --- /dev/null +++ b/monkestation/code/modules/slimecore/crossbreeding/regenerative/colors.dm @@ -0,0 +1,12 @@ +/datum/status_effect/regenerative_extract/purple + base_healing_amt = 4 + diminishing_multiplier = 0.5 + diminish_time = 1.5 MINUTES + given_traits = list(TRAIT_ANALGESIA, TRAIT_NOCRITDAMAGE, TRAIT_NOCRITOVERLAY, TRAIT_NOSOFTCRIT) + +/datum/status_effect/regenerative_extract/silver + base_healing_amt = 1.5 + nutrition_heal_cap = NUTRITION_LEVEL_WELL_FED + 50 + diminishing_multiplier = 0.8 + diminish_time = 30 SECONDS + given_traits = list(TRAIT_ANALGESIA, TRAIT_NOCRITDAMAGE, TRAIT_NOCRITOVERLAY, TRAIT_NOFAT) diff --git a/tgstation.dme b/tgstation.dme index 86d1803b041b2c..2653d06e3fd484 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7044,6 +7044,9 @@ #include "monkestation\code\modules\slimecore\corral\upgrades\human_docility_upgrade.dm" #include "monkestation\code\modules\slimecore\corral\upgrades\obliteration_upgrade.dm" #include "monkestation\code\modules\slimecore\crossbreeding\industrial.dm" +#include "monkestation\code\modules\slimecore\crossbreeding\regenerative\_cooldown.dm" +#include "monkestation\code\modules\slimecore\crossbreeding\regenerative\_effect.dm" +#include "monkestation\code\modules\slimecore\crossbreeding\regenerative\colors.dm" #include "monkestation\code\modules\slimecore\items\crossbreeds.dm" #include "monkestation\code\modules\slimecore\items\mutation_syringe.dm" #include "monkestation\code\modules\slimecore\items\vacuum_pack.dm" From 599390f7653ca4518232d8c3b82fdc54ba8a0e3a Mon Sep 17 00:00:00 2001 From: Lucy Date: Mon, 24 Jun 2024 22:38:27 -0400 Subject: [PATCH 02/13] It all works! --- .../xenobiology/crossbreeding/regenerative.dm | 7 +-- .../crossbreeding/regenerative/colors.dm | 31 ++++++++++-- .../{_cooldown.dm => cooldown.dm} | 1 + .../regenerative/{_effect.dm => effect.dm} | 20 ++++++-- .../crossbreeding/regenerative/extract.dm | 48 +++++++++++++++++++ tgstation.dme | 5 +- 6 files changed, 98 insertions(+), 14 deletions(-) rename monkestation/code/modules/slimecore/crossbreeding/regenerative/{_cooldown.dm => cooldown.dm} (95%) rename monkestation/code/modules/slimecore/crossbreeding/regenerative/{_effect.dm => effect.dm} (77%) create mode 100644 monkestation/code/modules/slimecore/crossbreeding/regenerative/extract.dm diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index fb0e886f699512..021ac0c5852190 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -14,6 +14,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/proc/core_effect_before(mob/living/carbon/human/target, mob/user) return +/* monkestation edit: overriden in [monkestation\code\modules\slimecore\crossbreeding\regenerative\extract.dm] /obj/item/slimecross/regenerative/afterattack(atom/target,mob/user,prox) . = ..() if(!prox || !isliving(target)) @@ -29,10 +30,10 @@ Regenerative extracts: user.visible_message(span_notice("[user] crushes [src] over [user.p_them()]self, the milky goo quickly regenerating all of [user.p_their()] injuries!"), span_notice("You squeeze [src], and it bursts in your hand, splashing you with milky goo which quickly regenerates your injuries!")) core_effect_before(H, user) - H.revive(HEAL_ALL) core_effect(H, user) playsound(target, 'sound/effects/splat.ogg', 40, TRUE) qdel(src) +*/ /obj/item/slimecross/regenerative/grey colour = "grey" //Has no bonus effect. @@ -192,7 +193,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/green colour = "green" - effect_desc = "Fully heals the target and changes the spieces or color of a slime or jellyperson." + effect_desc = "Fully heals the target and changes the species or color of a slime or jellyperson." /obj/item/slimecross/regenerative/green/core_effect(mob/living/target, mob/user) if(isslime(target)) @@ -200,7 +201,7 @@ Regenerative extracts: var/mob/living/basic/slime/S = target S.start_mutating(TRUE) if(isjellyperson(target)) - target.reagents.add_reagent(/datum/reagent/mutationtoxin/jelly,5) + target.reagents.add_reagent(/datum/reagent/mutationtoxin/jelly, 5) /obj/item/slimecross/regenerative/pink diff --git a/monkestation/code/modules/slimecore/crossbreeding/regenerative/colors.dm b/monkestation/code/modules/slimecore/crossbreeding/regenerative/colors.dm index 8b0c2d33cf2ba6..9a60f6c3424112 100644 --- a/monkestation/code/modules/slimecore/crossbreeding/regenerative/colors.dm +++ b/monkestation/code/modules/slimecore/crossbreeding/regenerative/colors.dm @@ -1,12 +1,35 @@ /datum/status_effect/regenerative_extract/purple - base_healing_amt = 4 + base_healing_amt = 10 diminishing_multiplier = 0.5 diminish_time = 1.5 MINUTES - given_traits = list(TRAIT_ANALGESIA, TRAIT_NOCRITDAMAGE, TRAIT_NOCRITOVERLAY, TRAIT_NOSOFTCRIT) + extra_traits = list(TRAIT_NOCRITOVERLAY, TRAIT_NOSOFTCRIT) /datum/status_effect/regenerative_extract/silver - base_healing_amt = 1.5 + base_healing_amt = 4 nutrition_heal_cap = NUTRITION_LEVEL_WELL_FED + 50 diminishing_multiplier = 0.8 diminish_time = 30 SECONDS - given_traits = list(TRAIT_ANALGESIA, TRAIT_NOCRITDAMAGE, TRAIT_NOCRITOVERLAY, TRAIT_NOFAT) + extra_traits = list(TRAIT_NOFAT) + +/datum/status_effect/regenerative_extract/yellow + extra_traits = list(TRAIT_SHOCKIMMUNE, TRAIT_TESLA_SHOCKIMMUNE, TRAIT_AIRLOCK_SHOCKIMMUNE) + +/datum/status_effect/regenerative_extract/adamantine + extra_traits = list(TRAIT_FEARLESS, TRAIT_HARDLY_WOUNDED) + +// rainbow extracts are similar to old regen extract effects, albeit it won't replace your organs, and won't heal limbs (unless you're an oozeling) +#define RAINBOW_HEAL_FLAGS ~(HEAL_ADMIN | HEAL_RESTRAINTS | HEAL_LIMBS | HEAL_REFRESH_ORGANS) + +/datum/status_effect/regenerative_extract/rainbow + alert_type = null + diminishing_multiplier = 0 // you can't use other extracts at all during this time + tick_interval = -1 + +/datum/status_effect/regenerative_extract/rainbow/on_apply() + var/heal_flags = RAINBOW_HEAL_FLAGS + if(isoozeling(owner)) // have some mercy on oozelings + heal_flags |= HEAL_LIMBS + owner.revive(heal_flags) + return FALSE // return false so we immediately clear the effect and start the cooldown + +#undef RAINBOW_HEAL_FLAGS diff --git a/monkestation/code/modules/slimecore/crossbreeding/regenerative/_cooldown.dm b/monkestation/code/modules/slimecore/crossbreeding/regenerative/cooldown.dm similarity index 95% rename from monkestation/code/modules/slimecore/crossbreeding/regenerative/_cooldown.dm rename to monkestation/code/modules/slimecore/crossbreeding/regenerative/cooldown.dm index eeaab8aec70752..2b301a3a23900d 100644 --- a/monkestation/code/modules/slimecore/crossbreeding/regenerative/_cooldown.dm +++ b/monkestation/code/modules/slimecore/crossbreeding/regenerative/cooldown.dm @@ -4,6 +4,7 @@ tick_interval = -1 alert_type = null remove_on_fullheal = TRUE + heal_flag_necessary = HEAL_ADMIN var/multiplier = 1 /datum/status_effect/slime_regen_cooldown/on_creation(mob/living/new_owner, multiplier = 1, duration = 45 SECONDS) diff --git a/monkestation/code/modules/slimecore/crossbreeding/regenerative/_effect.dm b/monkestation/code/modules/slimecore/crossbreeding/regenerative/effect.dm similarity index 77% rename from monkestation/code/modules/slimecore/crossbreeding/regenerative/_effect.dm rename to monkestation/code/modules/slimecore/crossbreeding/regenerative/effect.dm index 8a692c1d2f5bfb..7358b039551eb2 100644 --- a/monkestation/code/modules/slimecore/crossbreeding/regenerative/_effect.dm +++ b/monkestation/code/modules/slimecore/crossbreeding/regenerative/effect.dm @@ -2,22 +2,27 @@ id = "Slime Regeneration" status_type = STATUS_EFFECT_UNIQUE duration = 15 SECONDS - tick_interval = 0.5 SECONDS - alert_type = null - var/base_healing_amt = 2 + tick_interval = 0.2 SECONDS + alert_type = /atom/movable/screen/alert/status_effect/regen_extract + var/base_healing_amt = 5 var/multiplier = 1 var/diminishing_multiplier = 0.75 var/diminish_time = 45 SECONDS var/nutrition_heal_cap = NUTRITION_LEVEL_FED - 50 + /// Base traits given to the owner. var/list/given_traits = list(TRAIT_ANALGESIA, TRAIT_NOCRITDAMAGE) + /// Extra traits given to the owner, added to the base traits. + var/list/extra_traits = list() /datum/status_effect/regenerative_extract/on_apply() SEND_SIGNAL(owner, COMSIG_SLIME_REGEN_CALC, &multiplier) - owner.add_traits(given_traits, id) + if(multiplier < 1) + to_chat(owner, span_warning("The previous regenerative goo hasn't fully evaporated yet, weakening the new regenerative effect!")) + owner.add_traits(given_traits + extra_traits, id) return TRUE /datum/status_effect/regenerative_extract/on_remove() - owner.remove_traits(given_traits, id) + owner.remove_traits(given_traits + extra_traits, id) owner.apply_status_effect(/datum/status_effect/slime_regen_cooldown, diminishing_multiplier, diminish_time) /datum/status_effect/regenerative_extract/tick(seconds_per_tick, times_fired) @@ -62,3 +67,8 @@ /datum/status_effect/regenerative_extract/get_examine_text() return "[owner.p_They()] have a subtle, gentle glow to [owner.p_their()] skin, with slime soothing [owner.p_their()] wounds." + +/atom/movable/screen/alert/status_effect/regen_extract + name = "Slime Regeneration" + desc = "A milky slime covers your skin, soothing and regenerating your injuries!" + icon_state = "regenerative_core" diff --git a/monkestation/code/modules/slimecore/crossbreeding/regenerative/extract.dm b/monkestation/code/modules/slimecore/crossbreeding/regenerative/extract.dm new file mode 100644 index 00000000000000..b8a6b506a83119 --- /dev/null +++ b/monkestation/code/modules/slimecore/crossbreeding/regenerative/extract.dm @@ -0,0 +1,48 @@ +/// Returns the typepath to the status effect that should be applied to the target when this extract is used on them. +/obj/item/slimecross/regenerative/proc/get_status_path() + var/color_path = text2path("/datum/status_effect/regenerative_extract/[colour]") + if(ispath(color_path, /datum/status_effect/regenerative_extract)) + return color_path + return /datum/status_effect/regenerative_extract + +/obj/item/slimecross/regenerative/proc/can_use(mob/living/target, mob/living/user) + if(target.stat == DEAD) + to_chat(user, span_warning("[src] will not work on the dead!")) + return FALSE + if(target.has_status_effect(/datum/status_effect/regenerative_extract)) + to_chat(user, span_warning("[target == user ? "You are" : "[target] is"] already being healed by a regenerative extract!")) + return FALSE + return TRUE + +/obj/item/slimecross/regenerative/afterattack(mob/living/target, mob/user, prox) + . = ..() + if(!prox || !isliving(target) || !can_use(target, user)) + return + if(target != user) + user.visible_message(span_notice("[user] crushes [src] over [target], the milky goo coating [target.p_their()] injuries!"), + span_notice("You squeeze [src], and it bursts over [target], the milky goo beginning to regenerate [target.p_their()] injuries.")) + else + user.visible_message(span_notice("[user] crushes [src] over [user.p_them()]self, the milky goo quickly regenerating all of [user.p_their()] injuries!"), + span_notice("You squeeze [src], and it bursts in your hand, splashing you with milky goo which quickly regenerates your injuries!")) + core_effect_before(target, user) + apply_effect(target) + core_effect(target, user) + playsound(target, 'sound/effects/splat.ogg', vol = 40, vary = TRUE) + qdel(src) + +/obj/item/slimecross/regenerative/proc/apply_effect(mob/living/target) + target.apply_status_effect(get_status_path()) + +/obj/item/slimecross/regenerative/silver/core_effect(mob/living/target, mob/user) + return // handled by the status effect + +/obj/item/slimecross/regenerative/lightpink/core_effect(mob/living/target, mob/living/user) + if(!isliving(user)) + return + if(target == user) + return + if(!user.has_status_effect(/datum/status_effect/regenerative_extract)) + apply_effect(user) + to_chat(user, span_notice("Some of the milky goo sprays onto you, as well!")) + else + to_chat(user, span_warning("Some of the milky goo sprays onto you, but slides off due to the regenerative effect...")) diff --git a/tgstation.dme b/tgstation.dme index a3864d7bcd2af6..cc84be2875a0d7 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7273,9 +7273,10 @@ #include "monkestation\code\modules\slimecore\corral\upgrades\human_docility_upgrade.dm" #include "monkestation\code\modules\slimecore\corral\upgrades\obliteration_upgrade.dm" #include "monkestation\code\modules\slimecore\crossbreeding\industrial.dm" -#include "monkestation\code\modules\slimecore\crossbreeding\regenerative\_cooldown.dm" -#include "monkestation\code\modules\slimecore\crossbreeding\regenerative\_effect.dm" #include "monkestation\code\modules\slimecore\crossbreeding\regenerative\colors.dm" +#include "monkestation\code\modules\slimecore\crossbreeding\regenerative\cooldown.dm" +#include "monkestation\code\modules\slimecore\crossbreeding\regenerative\effect.dm" +#include "monkestation\code\modules\slimecore\crossbreeding\regenerative\extract.dm" #include "monkestation\code\modules\slimecore\items\crossbreeds.dm" #include "monkestation\code\modules\slimecore\items\mutation_syringe.dm" #include "monkestation\code\modules\slimecore\items\vacuum_pack.dm" From b7c773310b8ebdd5dd65acfc95fa8e9ba47531d1 Mon Sep 17 00:00:00 2001 From: Lucy Date: Mon, 24 Jun 2024 22:52:05 -0400 Subject: [PATCH 03/13] Updated effect descriptions to reflect new effects. --- .../xenobiology/crossbreeding/regenerative.dm | 50 ++++++++++--------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index 021ac0c5852190..fb5e0f7029a460 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -2,6 +2,8 @@ Regenerative extracts: Work like a legion regenerative core. Has a unique additional effect. + + HEAVILY REWORKED BY MONKESTATION, SEE [monkestation\code\modules\slimecore\crossbreeding\regenerative] */ /obj/item/slimecross/regenerative name = "regenerative extract" @@ -37,27 +39,27 @@ Regenerative extracts: /obj/item/slimecross/regenerative/grey colour = "grey" //Has no bonus effect. - effect_desc = "Fully heals the target and does nothing else." + effect_desc = "Rapidly heals the target and does nothing else." // monkestation edit: updates effect_desc to reflect the rework /obj/item/slimecross/regenerative/orange colour = "orange" /obj/item/slimecross/regenerative/orange/core_effect_before(mob/living/target, mob/user) - target.visible_message(span_warning("The [src] boils over!")) + target.visible_message(span_warning("\The [src] boils over!")) for(var/turf/targetturf in RANGE_TURFS(1,target)) if(!locate(/obj/effect/hotspot) in targetturf) new /obj/effect/hotspot(targetturf) /obj/item/slimecross/regenerative/purple colour = "purple" - effect_desc = "Fully heals the target and injects them with some regen jelly." + effect_desc = "Rapidly heals the target at an even greater rate, and injects them with some regenerative jelly." // monkestation edit: updates effect_desc to reflect the rework /obj/item/slimecross/regenerative/purple/core_effect(mob/living/target, mob/user) target.reagents.add_reagent(/datum/reagent/medicine/regen_jelly,10) /obj/item/slimecross/regenerative/blue colour = "blue" - effect_desc = "Fully heals the target and makes the floor wet." + effect_desc = "Rapidly heals the target and makes the floor wet." // monkestation edit: updates effect_desc to reflect the rework /obj/item/slimecross/regenerative/blue/core_effect(mob/living/target, mob/user) if(isturf(target.loc)) @@ -67,7 +69,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/metal colour = "metal" - effect_desc = "Fully heals the target and encases the target in a locker." + effect_desc = "Rapidly heals the target and encases the target in a locker." // monkestation edit: updates effect_desc to reflect the rework /obj/item/slimecross/regenerative/metal/core_effect(mob/living/target, mob/user) target.visible_message(span_warning("The milky goo hardens and reshapes itself, encasing [target]!")) @@ -78,7 +80,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/yellow colour = "yellow" - effect_desc = "Fully heals the target and fully recharges a single item on the target." + effect_desc = "Rapidly heals the target and fully recharges a single item on the target." // monkestation edit: updates effect_desc to reflect the rework /obj/item/slimecross/regenerative/yellow/core_effect(mob/living/target, mob/user) var/list/batteries = list() @@ -92,7 +94,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/darkpurple colour = "dark purple" - effect_desc = "Fully heals the target and gives them purple clothing if they are naked." + effect_desc = "Rapidly heals the target and gives them purple clothing if they are naked." // monkestation edit: updates effect_desc to reflect the rework /obj/item/slimecross/regenerative/darkpurple/core_effect(mob/living/target, mob/user) var/equipped = 0 @@ -105,7 +107,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/darkblue colour = "dark blue" - effect_desc = "Fully heals the target and fireproofs their clothes." + effect_desc = "Rapidly heals the target and fireproofs their clothes." // monkestation edit: updates effect_desc to reflect the rework /obj/item/slimecross/regenerative/darkblue/core_effect(mob/living/target, mob/user) if(!ishuman(target)) @@ -133,15 +135,17 @@ Regenerative extracts: /obj/item/slimecross/regenerative/silver colour = "silver" - effect_desc = "Fully heals the target and makes their belly feel round and full." + effect_desc = "Rapidly heals the target, regenerating their nutrition at a far greater rate than normal" // monkestation edit: updates effect_desc to reflect the rework +/* monkestation edit: replaced in [monkestation\code\modules\slimecore\crossbreeding\regenerative\extract.dm] /obj/item/slimecross/regenerative/silver/core_effect(mob/living/target, mob/user) target.set_nutrition(NUTRITION_LEVEL_FULL - 1) to_chat(target, span_notice("You feel satiated.")) +*/ /obj/item/slimecross/regenerative/bluespace colour = "bluespace" - effect_desc = "Fully heals the target and teleports them to where this core was created." + effect_desc = "Rapidly heals the target and teleports them to where this core was created." // monkestation edit: updates effect_desc to reflect the rework var/turf/open/T /obj/item/slimecross/regenerative/bluespace/core_effect(mob/living/target, mob/user) @@ -157,7 +161,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/sepia colour = "sepia" - effect_desc = "Fully heals the target. After 10 seconds, relocate the target to the initial position the core was used with their previous health status." + effect_desc = "Rapidly heals the target. After 10 seconds, relocate the target to the initial position the core was used with their previous health status." // monkestation edit: updates effect_desc to reflect the rework /obj/item/slimecross/regenerative/sepia/core_effect_before(mob/living/target, mob/user) to_chat(target, span_notice("You try to forget how you feel.")) @@ -165,11 +169,11 @@ Regenerative extracts: /obj/item/slimecross/regenerative/cerulean colour = "cerulean" - effect_desc = "Fully heals the target and makes a second regenerative core with no special effects." + effect_desc = "Rapidly heals the target and makes a second regenerative core with no special effects." // monkestation edit: updates effect_desc to reflect the rework /obj/item/slimecross/regenerative/cerulean/core_effect(mob/living/target, mob/user) src.forceMove(user.loc) - var/obj/item/slimecross/X = new /obj/item/slimecross/regenerative(user.loc) + var/obj/item/slimecross/X = new /obj/item/slimecross/regenerative(user.drop_location()) X.name = name X.desc = desc user.put_in_active_hand(X) @@ -177,7 +181,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/pyrite colour = "pyrite" - effect_desc = "Fully heals and randomly colors the target." + effect_desc = "Rapidly heals and randomly colors the target." // monkestation edit: updates effect_desc to reflect the rework /obj/item/slimecross/regenerative/pyrite/core_effect(mob/living/target, mob/user) target.visible_message(span_warning("The milky goo coating [target] leaves [target.p_them()] a different color!")) @@ -185,7 +189,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/red colour = "red" - effect_desc = "Fully heals the target and injects them with some ephedrine." + effect_desc = "Rapidly heals the target and injects them with some ephedrine." // monkestation edit: updates effect_desc to reflect the rework /obj/item/slimecross/regenerative/red/core_effect(mob/living/target, mob/user) to_chat(target, span_notice("You feel... faster.")) @@ -193,11 +197,11 @@ Regenerative extracts: /obj/item/slimecross/regenerative/green colour = "green" - effect_desc = "Fully heals the target and changes the species or color of a slime or jellyperson." + effect_desc = "Rapidly heals the target and changes the species or color of a slime or jellyperson." // monkestation edit: updates effect_desc to reflect the rework /obj/item/slimecross/regenerative/green/core_effect(mob/living/target, mob/user) if(isslime(target)) - target.visible_message(span_warning("The [target] suddenly changes color!")) + target.visible_message(span_warning("\The [target] suddenly changes color!")) var/mob/living/basic/slime/S = target S.start_mutating(TRUE) if(isjellyperson(target)) @@ -206,7 +210,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/pink colour = "pink" - effect_desc = "Fully heals the target and injects them with some krokodil." + effect_desc = "Rapidly heals the target and injects them with some krokodil." // monkestation edit: updates effect_desc to reflect the rework /obj/item/slimecross/regenerative/pink/core_effect(mob/living/target, mob/user) to_chat(target, span_notice("You feel more calm.")) @@ -214,7 +218,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/gold colour = "gold" - effect_desc = "Fully heals the target and produces a random coin." + effect_desc = "Rapidly heals the target and produces a random coin." // monkestation edit: updates effect_desc to reflect the rework /obj/item/slimecross/regenerative/gold/core_effect(mob/living/target, mob/user) var/newcoin = pick(/obj/item/coin/silver, /obj/item/coin/iron, /obj/item/coin/gold, /obj/item/coin/diamond, /obj/item/coin/plasma, /obj/item/coin/uranium) @@ -224,7 +228,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/oil colour = "oil" - effect_desc = "Fully heals the target and flashes everyone in sight." + effect_desc = "Rapidly heals the target and flashes everyone in sight." // monkestation edit: updates effect_desc to reflect the rework /obj/item/slimecross/regenerative/oil/core_effect(mob/living/target, mob/user) playsound(src, 'sound/weapons/flash.ogg', 100, TRUE) @@ -233,7 +237,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/black colour = "black" - effect_desc = "Fully heals the target and creates an imperfect duplicate of them made of slime, that fakes their death." + effect_desc = "Rapidly heals the target and creates an imperfect duplicate of them made of slime, that fakes their death." // monkestation edit: updates effect_desc to reflect the rework /obj/item/slimecross/regenerative/black/core_effect_before(mob/living/target, mob/user) var/dummytype = target.type @@ -256,7 +260,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/lightpink colour = "light pink" - effect_desc = "Fully heals the target and also heals the user." + effect_desc = "Rapidly heals the target and also heals the user." // monkestation edit: updates effect_desc to reflect the rework /obj/item/slimecross/regenerative/lightpink/core_effect(mob/living/target, mob/user) if(!isliving(user)) @@ -269,7 +273,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/adamantine colour = "adamantine" - effect_desc = "Fully heals the target and boosts their armor." + effect_desc = "Rapidly heals the target, while boosts their armor and general resilience." // monkestation edit: updates effect_desc to reflect the rework /obj/item/slimecross/regenerative/adamantine/core_effect(mob/living/target, mob/user) //WIP - Find out why this doesn't work. target.apply_status_effect(/datum/status_effect/slimeskin) From b48781e6b3cacd0cd8f23762dca6bab9eb9575f1 Mon Sep 17 00:00:00 2001 From: Lucy Date: Tue, 25 Jun 2024 01:12:19 -0400 Subject: [PATCH 04/13] Documentation! --- .../slimecore/crossbreeding/regenerative/cooldown.dm | 2 ++ .../slimecore/crossbreeding/regenerative/effect.dm | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/monkestation/code/modules/slimecore/crossbreeding/regenerative/cooldown.dm b/monkestation/code/modules/slimecore/crossbreeding/regenerative/cooldown.dm index 2b301a3a23900d..0614d914d11685 100644 --- a/monkestation/code/modules/slimecore/crossbreeding/regenerative/cooldown.dm +++ b/monkestation/code/modules/slimecore/crossbreeding/regenerative/cooldown.dm @@ -5,6 +5,8 @@ alert_type = null remove_on_fullheal = TRUE heal_flag_necessary = HEAL_ADMIN + /// The multiplier applied to the effect of a regen extract while this cooldown is active. + /// As multiple cooldowns can be active at the same time, these multipliers stack, resulting in exponentially diminishing returns. var/multiplier = 1 /datum/status_effect/slime_regen_cooldown/on_creation(mob/living/new_owner, multiplier = 1, duration = 45 SECONDS) diff --git a/monkestation/code/modules/slimecore/crossbreeding/regenerative/effect.dm b/monkestation/code/modules/slimecore/crossbreeding/regenerative/effect.dm index 7358b039551eb2..9b4debb1682250 100644 --- a/monkestation/code/modules/slimecore/crossbreeding/regenerative/effect.dm +++ b/monkestation/code/modules/slimecore/crossbreeding/regenerative/effect.dm @@ -4,10 +4,17 @@ duration = 15 SECONDS tick_interval = 0.2 SECONDS alert_type = /atom/movable/screen/alert/status_effect/regen_extract + /// The damage healed (for each type) per tick. + /// This is multipled against the multiplier derived from cooldowns. var/base_healing_amt = 5 + /// The number multiplied against the base healing amount, + /// used for the "diminishing returns" cooldown effect. var/multiplier = 1 + /// The multiplier that the cooldown applied after the effect ends will use. var/diminishing_multiplier = 0.75 + /// How long the subsequent cooldown effect will last. var/diminish_time = 45 SECONDS + /// The maximum nutrition level this regenerative extract can heal up to. var/nutrition_heal_cap = NUTRITION_LEVEL_FED - 50 /// Base traits given to the owner. var/list/given_traits = list(TRAIT_ANALGESIA, TRAIT_NOCRITDAMAGE) @@ -15,6 +22,9 @@ var/list/extra_traits = list() /datum/status_effect/regenerative_extract/on_apply() + // So this seems weird, but this allows us to have multiple things affect the regen multiplier, + // without doing something like hardcoding a `for(var/datum/status_effect/slime_regen_cooldown/cooldown in owner.status_effects)` + // Instead, cooldown effects register the [COMSIG_SLIME_REGEN_CALC] signal, and can affect our multiplier via the pointer we pass. SEND_SIGNAL(owner, COMSIG_SLIME_REGEN_CALC, &multiplier) if(multiplier < 1) to_chat(owner, span_warning("The previous regenerative goo hasn't fully evaporated yet, weakening the new regenerative effect!")) From 086713631962fdbc4cafe7aa446da2c6fb4a64b6 Mon Sep 17 00:00:00 2001 From: Lucy Date: Tue, 25 Jun 2024 01:15:48 -0400 Subject: [PATCH 05/13] Don't allow rainbow regen spamming --- .../modules/slimecore/crossbreeding/regenerative/extract.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/monkestation/code/modules/slimecore/crossbreeding/regenerative/extract.dm b/monkestation/code/modules/slimecore/crossbreeding/regenerative/extract.dm index b8a6b506a83119..96b292669ee135 100644 --- a/monkestation/code/modules/slimecore/crossbreeding/regenerative/extract.dm +++ b/monkestation/code/modules/slimecore/crossbreeding/regenerative/extract.dm @@ -46,3 +46,9 @@ to_chat(user, span_notice("Some of the milky goo sprays onto you, as well!")) else to_chat(user, span_warning("Some of the milky goo sprays onto you, but slides off due to the regenerative effect...")) + +/obj/item/slimecross/regenerative/rainbow/can_use(mob/living/target, mob/living/user) + if(target.has_status_effect(/datum/status_effect/slime_regen_cooldown)) + to_chat(user, span_warning("[target == user ? "You are" : "[target] is"] still recovering from the last regenerative extract!")) + return FALSE + return ..() From 6831054d9a466925abfd15f51d019375d7b719b9 Mon Sep 17 00:00:00 2001 From: Lucy Date: Tue, 25 Jun 2024 01:58:32 -0400 Subject: [PATCH 06/13] apply review stuff --- .../research/xenobiology/crossbreeding/regenerative.dm | 3 ++- .../slimecore/crossbreeding/regenerative/effect.dm | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index fb5e0f7029a460..758fb7dcf086a7 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -32,6 +32,7 @@ Regenerative extracts: user.visible_message(span_notice("[user] crushes [src] over [user.p_them()]self, the milky goo quickly regenerating all of [user.p_their()] injuries!"), span_notice("You squeeze [src], and it bursts in your hand, splashing you with milky goo which quickly regenerates your injuries!")) core_effect_before(H, user) + H.revive(HEAL_ALL) core_effect(H, user) playsound(target, 'sound/effects/splat.ogg', 40, TRUE) qdel(src) @@ -273,7 +274,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/adamantine colour = "adamantine" - effect_desc = "Rapidly heals the target, while boosts their armor and general resilience." // monkestation edit: updates effect_desc to reflect the rework + effect_desc = "Rapidly heals the target, while boosting their armor and general resilience." // monkestation edit: updates effect_desc to reflect the rework, also a typo fix /obj/item/slimecross/regenerative/adamantine/core_effect(mob/living/target, mob/user) //WIP - Find out why this doesn't work. target.apply_status_effect(/datum/status_effect/slimeskin) diff --git a/monkestation/code/modules/slimecore/crossbreeding/regenerative/effect.dm b/monkestation/code/modules/slimecore/crossbreeding/regenerative/effect.dm index 9b4debb1682250..eee77feb7f3b58 100644 --- a/monkestation/code/modules/slimecore/crossbreeding/regenerative/effect.dm +++ b/monkestation/code/modules/slimecore/crossbreeding/regenerative/effect.dm @@ -17,9 +17,9 @@ /// The maximum nutrition level this regenerative extract can heal up to. var/nutrition_heal_cap = NUTRITION_LEVEL_FED - 50 /// Base traits given to the owner. - var/list/given_traits = list(TRAIT_ANALGESIA, TRAIT_NOCRITDAMAGE) + var/static/list/given_traits = list(TRAIT_ANALGESIA, TRAIT_NOCRITDAMAGE) /// Extra traits given to the owner, added to the base traits. - var/list/extra_traits = list() + var/list/extra_traits /datum/status_effect/regenerative_extract/on_apply() // So this seems weird, but this allows us to have multiple things affect the regen multiplier, @@ -28,11 +28,11 @@ SEND_SIGNAL(owner, COMSIG_SLIME_REGEN_CALC, &multiplier) if(multiplier < 1) to_chat(owner, span_warning("The previous regenerative goo hasn't fully evaporated yet, weakening the new regenerative effect!")) - owner.add_traits(given_traits + extra_traits, id) + owner.add_traits(islist(extra_traits) ? given_traits + extra_traits : given_traits, id) return TRUE /datum/status_effect/regenerative_extract/on_remove() - owner.remove_traits(given_traits + extra_traits, id) + owner.remove_traits(islist(extra_traits) ? given_traits + extra_traits : given_traits, id) owner.apply_status_effect(/datum/status_effect/slime_regen_cooldown, diminishing_multiplier, diminish_time) /datum/status_effect/regenerative_extract/tick(seconds_per_tick, times_fired) From 8bf36562d34e9d729a35eda2f6b2c4585be16728 Mon Sep 17 00:00:00 2001 From: Lucy Date: Tue, 25 Jun 2024 02:14:58 -0400 Subject: [PATCH 07/13] Document `cmp_wound_severity_dsc` --- code/__HELPERS/~monkestation-helpers/cmp.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/__HELPERS/~monkestation-helpers/cmp.dm b/code/__HELPERS/~monkestation-helpers/cmp.dm index 5aa9c5bbb06360..c87af6cd520231 100644 --- a/code/__HELPERS/~monkestation-helpers/cmp.dm +++ b/code/__HELPERS/~monkestation-helpers/cmp.dm @@ -4,5 +4,7 @@ /proc/cmp_mob_playtime_dsc(mob/a, mob/b) return cmp_numeric_dsc(a?.client?.get_exp_living(TRUE), b?.client?.get_exp_living(TRUE)) +/// Sorts between two wounds, descending by their severity. +/// Use when you want a list of most to least severe wounds. /proc/cmp_wound_severity_dsc(datum/wound/a, datum/wound/b) return cmp_numeric_dsc(a.severity, b.severity) From 9e3f90d31b95d695193aceca61ef776b7934f068 Mon Sep 17 00:00:00 2001 From: Lucy Date: Tue, 25 Jun 2024 12:29:54 -0400 Subject: [PATCH 08/13] Overly verbose extract descriptions. --- .../research/xenobiology/crossbreeding/regenerative.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index 758fb7dcf086a7..94531d651714f7 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -53,7 +53,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/purple colour = "purple" - effect_desc = "Rapidly heals the target at an even greater rate, and injects them with some regenerative jelly." // monkestation edit: updates effect_desc to reflect the rework + effect_desc = "Rapidly heals the target at an even greater rate, and injects them with some regenerative jelly. Prevents softcrit while active." // monkestation edit: updates effect_desc to reflect the rework /obj/item/slimecross/regenerative/purple/core_effect(mob/living/target, mob/user) target.reagents.add_reagent(/datum/reagent/medicine/regen_jelly,10) @@ -81,7 +81,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/yellow colour = "yellow" - effect_desc = "Rapidly heals the target and fully recharges a single item on the target." // monkestation edit: updates effect_desc to reflect the rework + effect_desc = "Rapidly heals the target and fully recharges a single item on the target. Provides shock immunity while active." // monkestation edit: updates effect_desc to reflect the rework /obj/item/slimecross/regenerative/yellow/core_effect(mob/living/target, mob/user) var/list/batteries = list() @@ -281,7 +281,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/rainbow colour = "rainbow" - effect_desc = "Fully heals the target and temporarily makes them immortal, but pacifistic." + effect_desc = "Fully heals the target, including all forms of damage, wounds, brain traumas, sickness, blood loss, and unsafe body temperature. Does not regrow limbs (except for oozelings) or refresh organs. Temporarily makes them immortal, but pacifistic." // monkestation edit: updates effect_desc to reflect the rework, also a typo fix /obj/item/slimecross/regenerative/rainbow/core_effect(mob/living/target, mob/user) target.apply_status_effect(/datum/status_effect/rainbow_protection) From ab4d7ee21d9fc7459fd923f39b540f846693e7b8 Mon Sep 17 00:00:00 2001 From: Lucy Date: Fri, 28 Jun 2024 08:58:29 -0400 Subject: [PATCH 09/13] regen purple adjustments --- code/datums/dna.dm | 3 ++- .../research/xenobiology/crossbreeding/regenerative.dm | 4 +++- .../slimecore/crossbreeding/regenerative/colors.dm | 8 ++++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 26aa1fbf046a82..3440839745a4de 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -507,7 +507,8 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) update_mutations_overlay()// no lizard with human hulk overlay please. -/mob/proc/has_dna() +/mob/proc/has_dna() as /datum/dna + RETURN_TYPE(/datum/dna) return /mob/living/carbon/has_dna() diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index 94531d651714f7..98821ff7176fef 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -53,10 +53,12 @@ Regenerative extracts: /obj/item/slimecross/regenerative/purple colour = "purple" - effect_desc = "Rapidly heals the target at an even greater rate, and injects them with some regenerative jelly. Prevents softcrit while active." // monkestation edit: updates effect_desc to reflect the rework + effect_desc = "Rapidly heals the target at an even greater rate, and injects them with some regenerative jelly afterwards. Prevents softcrit while active." // monkestation edit: updates effect_desc to reflect the rework +/* monkestation edit: moved functionality to status effect /obj/item/slimecross/regenerative/purple/core_effect(mob/living/target, mob/user) target.reagents.add_reagent(/datum/reagent/medicine/regen_jelly,10) +*/ /obj/item/slimecross/regenerative/blue colour = "blue" diff --git a/monkestation/code/modules/slimecore/crossbreeding/regenerative/colors.dm b/monkestation/code/modules/slimecore/crossbreeding/regenerative/colors.dm index 9a60f6c3424112..bc662c56d4af63 100644 --- a/monkestation/code/modules/slimecore/crossbreeding/regenerative/colors.dm +++ b/monkestation/code/modules/slimecore/crossbreeding/regenerative/colors.dm @@ -4,6 +4,14 @@ diminish_time = 1.5 MINUTES extra_traits = list(TRAIT_NOCRITOVERLAY, TRAIT_NOSOFTCRIT) +/datum/status_effect/regenerative_extract/purple/on_remove() + . = ..() + if(owner.has_dna()?.species?.reagent_tag & PROCESS_ORGANIC) // won't work during cooldown, and won't waste effort injecting into IPCs + var/inject_amt = round(10 * multiplier) + if(inject_amt >= 1) + owner.reagents?.add_reagent(/datum/reagent/medicine/regen_jelly, inject_amt) + + /datum/status_effect/regenerative_extract/silver base_healing_amt = 4 nutrition_heal_cap = NUTRITION_LEVEL_WELL_FED + 50 From abff5d9bd7c6eb474e3dee893fe9aa7d5b94ee51 Mon Sep 17 00:00:00 2001 From: Lucy Date: Sat, 29 Jun 2024 22:36:32 -0400 Subject: [PATCH 10/13] Adjustments to stabilized rainbow to ensure they work to their fullest extent --- .../crossbreeding/_status_effects.dm | 10 +++++- .../crossbreeding/regenerative/colors.dm | 1 + .../slimecore/crossbreeding/stabilized.dm | 35 +++++++++++++++++++ tgstation.dme | 1 + 4 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 monkestation/code/modules/slimecore/crossbreeding/stabilized.dm diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index d289de904a6c61..181e64b70c4be1 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -445,12 +445,18 @@ /// Colour of the extract providing the buff var/colour = "null" +/datum/status_effect/stabilized/Destroy() + if(linked_extract?.linked_effect == src) + linked_extract.linked_effect = null + linked_extract = null + return ..() + /datum/status_effect/stabilized/on_creation(mob/living/new_owner, obj/item/slimecross/stabilized/linked_extract) src.linked_extract = linked_extract return ..() /datum/status_effect/stabilized/tick() - if(isnull(linked_extract)) + if(QDELETED(linked_extract)) qdel(src) return if(linked_extract.get_held_mob() == owner) @@ -1070,6 +1076,7 @@ id = "stabilizedrainbow" colour = "rainbow" +/* monkestation edit: replaced in [monkestation\code\modules\slimecore\crossbreeding\stabilized.dm] /datum/status_effect/stabilized/rainbow/tick() if(owner.health <= 0) var/obj/item/slimecross/stabilized/rainbow/X = linked_extract @@ -1081,3 +1088,4 @@ qdel(src) qdel(linked_extract) return ..() +*/ diff --git a/monkestation/code/modules/slimecore/crossbreeding/regenerative/colors.dm b/monkestation/code/modules/slimecore/crossbreeding/regenerative/colors.dm index bc662c56d4af63..7c279e461d5528 100644 --- a/monkestation/code/modules/slimecore/crossbreeding/regenerative/colors.dm +++ b/monkestation/code/modules/slimecore/crossbreeding/regenerative/colors.dm @@ -40,4 +40,5 @@ owner.revive(heal_flags) return FALSE // return false so we immediately clear the effect and start the cooldown + #undef RAINBOW_HEAL_FLAGS diff --git a/monkestation/code/modules/slimecore/crossbreeding/stabilized.dm b/monkestation/code/modules/slimecore/crossbreeding/stabilized.dm new file mode 100644 index 00000000000000..4480cbe0a33cdf --- /dev/null +++ b/monkestation/code/modules/slimecore/crossbreeding/stabilized.dm @@ -0,0 +1,35 @@ +/obj/item/slimecross/stabilized/rainbow/Destroy() + if(!QDELETED(regencore)) + regencore.forceMove(drop_location()) + regencore = null + return ..() + +/datum/status_effect/stabilized/rainbow/on_apply() + RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_CRITICAL_CONDITION), PROC_REF(on_owner_crit)) + return TRUE + +/datum/status_effect/stabilized/rainbow/on_remove() + UnregisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_CRITICAL_CONDITION)) + +/datum/status_effect/stabilized/rainbow/proc/on_owner_crit() + SIGNAL_HANDLER + if(owner.health < 0 || owner.stat == DEAD) + return + var/obj/item/slimecross/stabilized/rainbow/extract = linked_extract + if(!istype(extract) || QDELING(extract) || QDELETED(extract.regencore)) + return + // bypasses cooldowns, but also removes any existing regen effects + owner.remove_status_effect(/datum/status_effect/regenerative_extract) + owner.remove_status_effect(/datum/status_effect/slime_regen_cooldown) + owner.visible_message(span_hypnophrase("[owner] flashes a rainbow of colors, and [owner.p_their()] skin is coated in a milky regenerative goo!")) + playsound(owner, 'sound/effects/splat.ogg', vol = 40, vary = TRUE) + apply_regen(extract.regencore) + QDEL_NULL(linked_extract) + qdel(src) + +/datum/status_effect/stabilized/rainbow/proc/apply_regen(obj/item/slimecross/regenerative/regen_core) + regen_core.core_effect_before(owner, owner) + regen_core.apply_effect(owner) + regen_core.core_effect(owner, owner) + qdel(regen_core) + diff --git a/tgstation.dme b/tgstation.dme index cc84be2875a0d7..63de1f62fe27f2 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7273,6 +7273,7 @@ #include "monkestation\code\modules\slimecore\corral\upgrades\human_docility_upgrade.dm" #include "monkestation\code\modules\slimecore\corral\upgrades\obliteration_upgrade.dm" #include "monkestation\code\modules\slimecore\crossbreeding\industrial.dm" +#include "monkestation\code\modules\slimecore\crossbreeding\stabilized.dm" #include "monkestation\code\modules\slimecore\crossbreeding\regenerative\colors.dm" #include "monkestation\code\modules\slimecore\crossbreeding\regenerative\cooldown.dm" #include "monkestation\code\modules\slimecore\crossbreeding\regenerative\effect.dm" From c7fbf5d753faf9b674b6bfdb72c6b577d865f326 Mon Sep 17 00:00:00 2001 From: Lucy Date: Wed, 3 Jul 2024 03:08:03 -0400 Subject: [PATCH 11/13] Fix stabilized rainbows --- .../slimecore/crossbreeding/stabilized.dm | 36 ++++++++----------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/monkestation/code/modules/slimecore/crossbreeding/stabilized.dm b/monkestation/code/modules/slimecore/crossbreeding/stabilized.dm index 4480cbe0a33cdf..71ac69cbcd8587 100644 --- a/monkestation/code/modules/slimecore/crossbreeding/stabilized.dm +++ b/monkestation/code/modules/slimecore/crossbreeding/stabilized.dm @@ -4,28 +4,22 @@ regencore = null return ..() -/datum/status_effect/stabilized/rainbow/on_apply() - RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_CRITICAL_CONDITION), PROC_REF(on_owner_crit)) - return TRUE - -/datum/status_effect/stabilized/rainbow/on_remove() - UnregisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_CRITICAL_CONDITION)) - -/datum/status_effect/stabilized/rainbow/proc/on_owner_crit() - SIGNAL_HANDLER - if(owner.health < 0 || owner.stat == DEAD) - return - var/obj/item/slimecross/stabilized/rainbow/extract = linked_extract - if(!istype(extract) || QDELING(extract) || QDELETED(extract.regencore)) +/datum/status_effect/stabilized/rainbow/tick() + if(owner.health <= 0) + var/obj/item/slimecross/stabilized/rainbow/extract = linked_extract + if(!istype(extract) || QDELING(extract) || QDELETED(extract.regencore)) + return + // bypasses cooldowns, but also removes any existing regen effects + owner.remove_status_effect(/datum/status_effect/regenerative_extract) + owner.remove_status_effect(/datum/status_effect/slime_regen_cooldown) + owner.visible_message(span_hypnophrase("[owner] flashes a rainbow of colors, and [owner.p_their()] skin is coated in a milky regenerative goo!")) + playsound(owner, 'sound/effects/splat.ogg', vol = 40, vary = TRUE) + apply_regen(extract.regencore) + QDEL_NULL(linked_extract) + qdel(src) return - // bypasses cooldowns, but also removes any existing regen effects - owner.remove_status_effect(/datum/status_effect/regenerative_extract) - owner.remove_status_effect(/datum/status_effect/slime_regen_cooldown) - owner.visible_message(span_hypnophrase("[owner] flashes a rainbow of colors, and [owner.p_their()] skin is coated in a milky regenerative goo!")) - playsound(owner, 'sound/effects/splat.ogg', vol = 40, vary = TRUE) - apply_regen(extract.regencore) - QDEL_NULL(linked_extract) - qdel(src) + return ..() + /datum/status_effect/stabilized/rainbow/proc/apply_regen(obj/item/slimecross/regenerative/regen_core) regen_core.core_effect_before(owner, owner) From 2597afd13de990cdfeff445f1b1379c1697ae5c5 Mon Sep 17 00:00:00 2001 From: Lucy Date: Sat, 6 Jul 2024 11:25:21 -0400 Subject: [PATCH 12/13] no curing antag traumas --- .../crossbreeding/regenerative/effect.dm | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/monkestation/code/modules/slimecore/crossbreeding/regenerative/effect.dm b/monkestation/code/modules/slimecore/crossbreeding/regenerative/effect.dm index eee77feb7f3b58..e07734d009112a 100644 --- a/monkestation/code/modules/slimecore/crossbreeding/regenerative/effect.dm +++ b/monkestation/code/modules/slimecore/crossbreeding/regenerative/effect.dm @@ -28,11 +28,11 @@ SEND_SIGNAL(owner, COMSIG_SLIME_REGEN_CALC, &multiplier) if(multiplier < 1) to_chat(owner, span_warning("The previous regenerative goo hasn't fully evaporated yet, weakening the new regenerative effect!")) - owner.add_traits(islist(extra_traits) ? given_traits + extra_traits : given_traits, id) + owner.add_traits(islist(extra_traits) ? (given_traits + extra_traits) : given_traits, id) return TRUE /datum/status_effect/regenerative_extract/on_remove() - owner.remove_traits(islist(extra_traits) ? given_traits + extra_traits : given_traits, id) + owner.remove_traits(islist(extra_traits) ? (given_traits + extra_traits) : given_traits, id) owner.apply_status_effect(/datum/status_effect/slime_regen_cooldown, diminishing_multiplier, diminish_time) /datum/status_effect/regenerative_extract/tick(seconds_per_tick, times_fired) @@ -64,10 +64,21 @@ owner.nutrition = min(owner.nutrition + heal_amt, nutrition_heal_cap) /datum/status_effect/regenerative_extract/proc/heal_organs(heal_amt) + var/static/list/ignored_traumas + if(!ignored_traumas) + ignored_traumas = typecacheof(list( + /datum/brain_trauma/hypnosis, + /datum/brain_trauma/special/obsessed, + /datum/brain_trauma/severe/split_personality/brainwashing, + )) var/mob/living/carbon/carbon_owner = owner for(var/obj/item/organ/organ in carbon_owner.organs) organ.apply_organ_damage(-heal_amt) - carbon_owner.cure_trauma_type(resilience = TRAUMA_RESILIENCE_MAGIC) + // stupid manual trauma curing code, so you can't just remove trauma-based antags with one click + var/obj/item/organ/internal/brain/brain = carbon_owner.get_organ_slot(ORGAN_SLOT_BRAIN) + for(var/datum/brain_trauma/trauma as anything in shuffle(brain?.traumas)) + if(!is_type_in_typecache(trauma, ignored_traumas) && trauma.resilience <= TRAUMA_RESILIENCE_MAGIC) + qdel(trauma) /datum/status_effect/regenerative_extract/proc/heal_wounds() var/mob/living/carbon/carbon_owner = owner From 7b80034e4f8afc6a27dd4fe66b4b3604803c52da Mon Sep 17 00:00:00 2001 From: Lucy Date: Sat, 6 Jul 2024 11:26:02 -0400 Subject: [PATCH 13/13] weh --- .../code/modules/slimecore/crossbreeding/regenerative/effect.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/monkestation/code/modules/slimecore/crossbreeding/regenerative/effect.dm b/monkestation/code/modules/slimecore/crossbreeding/regenerative/effect.dm index e07734d009112a..6c03f1a7eba8ea 100644 --- a/monkestation/code/modules/slimecore/crossbreeding/regenerative/effect.dm +++ b/monkestation/code/modules/slimecore/crossbreeding/regenerative/effect.dm @@ -79,6 +79,7 @@ for(var/datum/brain_trauma/trauma as anything in shuffle(brain?.traumas)) if(!is_type_in_typecache(trauma, ignored_traumas) && trauma.resilience <= TRAUMA_RESILIENCE_MAGIC) qdel(trauma) + return /datum/status_effect/regenerative_extract/proc/heal_wounds() var/mob/living/carbon/carbon_owner = owner