From 9f9d204ad9f580c14cdacc09f9dba49cdb12791a Mon Sep 17 00:00:00 2001 From: KageIIte <58105793+msw7007@users.noreply.github.com> Date: Thu, 30 Jan 2025 22:32:21 +0300 Subject: [PATCH] Permadeath (#1034) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Что этот PR делает closes https://github.com/ss220club/BandaStation/issues/1032 Через запись конфига REVIVAL_BRAIN_LIFE при ее значение выше 0 позволяет изменить скорость разложения мозга. Так-же если это значение было изменено, это включает в себя перманентную смерть для игрока, в случае, если мозг умер (накладывает состояние DNR) ## Почему это хорошо для игры По запросу стримеров и для закрытия #1032 ## Изображения изменений ## Тестирование Локальный сервер ## Changelog :cl: balance: Теперь в игре на сервере можно настроить перманентную смерть /:cl: ## Summary by Sourcery Implement permanent death configurable via the `revival_brain_life` config setting. If set to a value greater than 0, the brain decay rate is modified and permanent death is enabled for the player if their brain dies (DNR status is applied). New Features: - Introduce a configurable permanent death option. Tests: - Test the permanent death functionality on a local server. --------- Co-authored-by: tgstation-server-ci[bot] <161980869+tgstation-server-ci[bot]@users.noreply.github.com> Co-authored-by: Gaxeer <44334376+Gaxeer@users.noreply.github.com> --- code/__DEFINES/mobs.dm | 1 + code/game/objects/items/defib.dm | 4 + code/modules/mob/living/carbon/carbon.dm | 21 +++- .../research/techweb/nodes/medbay_nodes.dm | 1 + code/modules/surgery/organs/_organ.dm | 6 ++ config/bandastation/bandastation_config.txt | 3 + modular_bandastation/balance/_balance.dme | 1 + modular_bandastation/balance/code/_brain.dm | 98 ++++++++++++++++++ .../balance/icons/bodybag.dmi | Bin 0 -> 1380 bytes 9 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 modular_bandastation/balance/code/_brain.dm create mode 100644 modular_bandastation/balance/icons/bodybag.dmi diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 7b4ec0bc36edc..17dd0fd3cbe5b 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -539,6 +539,7 @@ #define DEFIB_FAIL_NO_INTELLIGENCE (1<<8) #define DEFIB_FAIL_BLACKLISTED (1<<9) #define DEFIB_NOGRAB_AGHOST (1<<10) +#define DEFIB_FAIL_PERMANENTLY_DEAD (1<<11) // BANDASTATION ADDITION - PERMA-DEATH // Bit mask of possible return values by can_defib that would result in a revivable patient #define DEFIB_REVIVABLE_STATES (DEFIB_FAIL_NO_HEART | DEFIB_FAIL_FAILING_HEART | DEFIB_FAIL_HUSK | DEFIB_FAIL_TISSUE_DAMAGE | DEFIB_FAIL_FAILING_BRAIN | DEFIB_POSSIBLE) diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 70fb3bb6693c2..5c3d8665ab5bd 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -615,6 +615,10 @@ fail_reason = "Tissue damage too severe, repair and try again." if (DEFIB_FAIL_HUSK) fail_reason = "Patient's body is a mere husk, repair and try again." + // BANDASTATION EDIT START - PERMA-DEATH + if (DEFIB_FAIL_PERMANENTLY_DEAD) + fail_reason = "Patient's brain electomagnetic activity gone. It's too late for them..." + // BANDASTATION EDIT END - PERMA-DEATH if (DEFIB_FAIL_FAILING_BRAIN) fail_reason = "Patient's brain is too damaged, repair and try again." if (DEFIB_FAIL_NO_INTELLIGENCE) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index b7d240560daba..bf9d50c80ac83 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -962,14 +962,31 @@ return ..() /mob/living/carbon/can_be_revived() - if(!get_organ_by_type(/obj/item/organ/brain) && (!IS_CHANGELING(src)) || HAS_TRAIT(src, TRAIT_HUSK)) + // BANDASTATION EDIT START - PERMA-DEATH + var/obj/item/organ/brain/brain = get_organ_by_type(/obj/item/organ/brain) + var/brain_non_functional = isnull(brain) || (CONFIG_GET(flag/brain_permanent_death) && brain.organ_flags & ORGAN_FAILING) + if(brain_non_functional && !IS_CHANGELING(src) || HAS_TRAIT(src, TRAIT_HUSK)) return FALSE + // BANDASTATION EDIT END - PERMA-DEATH return ..() /mob/living/carbon/proc/can_defib() if (HAS_TRAIT(src, TRAIT_SUICIDED)) return DEFIB_FAIL_SUICIDE + // BANDASTATION EDIT START - PERMA-DEATH + var/obj/item/organ/brain/current_brain = get_organ_by_type(/obj/item/organ/brain) + + if (QDELETED(current_brain)) + return DEFIB_FAIL_NO_BRAIN + + if (current_brain.suicided || (current_brain.brainmob && HAS_TRAIT(current_brain.brainmob, TRAIT_SUICIDED))) + return DEFIB_FAIL_NO_INTELLIGENCE + + if (current_brain.organ_flags & ORGAN_FAILING) + return CONFIG_GET(flag/brain_permanent_death) ? DEFIB_FAIL_PERMANENTLY_DEAD : DEFIB_FAIL_FAILING_BRAIN + // BANDASTATION EDIT END - PERMA-DEATH + if (HAS_TRAIT(src, TRAIT_HUSK)) return DEFIB_FAIL_HUSK @@ -989,6 +1006,7 @@ if (heart.organ_flags & ORGAN_FAILING) return DEFIB_FAIL_FAILING_HEART + /* // BANDASTATION EDIT START - PERMA-DEATH var/obj/item/organ/brain/current_brain = get_organ_by_type(/obj/item/organ/brain) if (QDELETED(current_brain)) @@ -999,6 +1017,7 @@ if (current_brain.suicided || (current_brain.brainmob && HAS_TRAIT(current_brain.brainmob, TRAIT_SUICIDED))) return DEFIB_FAIL_NO_INTELLIGENCE + */ // BANDASTATION EDIT END - PERMA-DEATH if(key && key[1] == "@") // Adminghosts return DEFIB_NOGRAB_AGHOST diff --git a/code/modules/research/techweb/nodes/medbay_nodes.dm b/code/modules/research/techweb/nodes/medbay_nodes.dm index 897a2edf18e43..cfb79966b395e 100644 --- a/code/modules/research/techweb/nodes/medbay_nodes.dm +++ b/code/modules/research/techweb/nodes/medbay_nodes.dm @@ -93,6 +93,7 @@ "stasis", "cryo_grenade", "splitbeaker", + "stasisbodybag", // BANDASTATION ADDITION - PERMA-DEATH ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) discount_experiments = list(/datum/experiment/scanning/reagent/cryostylane = TECHWEB_TIER_4_POINTS) diff --git a/code/modules/surgery/organs/_organ.dm b/code/modules/surgery/organs/_organ.dm index 5a756d64a6090..ad9c6c1e10d91 100644 --- a/code/modules/surgery/organs/_organ.dm +++ b/code/modules/surgery/organs/_organ.dm @@ -225,11 +225,17 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) var/message = check_damage_thresholds(owner) prev_damage = damage + var/old_organ_flags = organ_flags // BANDASTATION ADD - PERMA-DEATH if(damage >= maxHealth) organ_flags |= ORGAN_FAILING else organ_flags &= ~ORGAN_FAILING + // BANDASTATION ADDITION START - PERMA-DEATH + if(old_organ_flags != organ_flags) + owner?.med_hud_set_status() + // BANDASTATION ADDITION END - PERMA-DEATH + if(message && owner && owner.stat <= SOFT_CRIT) to_chat(owner, message) diff --git a/config/bandastation/bandastation_config.txt b/config/bandastation/bandastation_config.txt index deddf40ab09c8..51d0906d8418a 100644 --- a/config/bandastation/bandastation_config.txt +++ b/config/bandastation/bandastation_config.txt @@ -46,3 +46,6 @@ ROUNDSTART_RACES vulpkanin ## List of ckeys, that bypass speech filter. # SPEECH_FILTER_BYPASS ckey # SPEECH_FILTER_BYPASS ckey + +## Boolean value to derminate is it posible to die permanently due death of brain or not (value true means it's enabled) +BRAIN_PERMANENT_DEATH \ No newline at end of file diff --git a/modular_bandastation/balance/_balance.dme b/modular_bandastation/balance/_balance.dme index 69ba9619aa58f..c2ed203a831f9 100644 --- a/modular_bandastation/balance/_balance.dme +++ b/modular_bandastation/balance/_balance.dme @@ -20,5 +20,6 @@ #include "code/station_traits.dm" #include "code/supply_packs.dm" #include "code/wounds/cranial_fissure.dm" +#include "code/_brain.dm" #include "code/~undefs.dm" diff --git a/modular_bandastation/balance/code/_brain.dm b/modular_bandastation/balance/code/_brain.dm new file mode 100644 index 0000000000000..00e56900f74ed --- /dev/null +++ b/modular_bandastation/balance/code/_brain.dm @@ -0,0 +1,98 @@ +/obj/item/organ/brain/Initialize(mapload) + . = ..() + if(CONFIG_GET(flag/brain_permanent_death)) + decay_factor = STANDARD_ORGAN_DECAY * 2 //7 минут до полной смерти (в 4 раза быстрее чем по умолчанию (30 минут)) + +/datum/surgery/brain_surgery/can_start(mob/user, mob/living/carbon/target) + . = ..() + if(!.) + return + + var/obj/item/organ/brain/brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) + return !(brain.organ_flags & ORGAN_FAILING) || !CONFIG_GET(flag/brain_permanent_death) + +/datum/config_entry/flag/brain_permanent_death + default = TRUE + +/datum/design/stasisbodybag + name = "Stasis Body Bag" + desc = "A folded bag designed for the storage and transportation of cadavers with portable stasis module and little space." + id = "stasisbodybag" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/plasma =SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SMALL_MATERIAL_AMOUNT*5) + build_path = /obj/item/bodybag/stasis + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_TOOLS_MEDICAL + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE + +/obj/item/bodybag/stasis + name = "Stasis body bag" + desc = "A folded bag designed for the storage and transportation of cadavers with portable stasis module and little space." + icon = 'modular_bandastation/balance/icons/bodybag.dmi' //на замену + icon_state = "stasisbag_folded" //на замену + // Stored path we use for spawning a new body bag entity when unfolded. + unfoldedbag_path = /obj/structure/closet/body_bag/stasis + color = "#11978c" + +/obj/item/bodybag/stasis/deploy_bodybag(mob/user, atom/location) + . = ..() + var/obj/structure/closet/body_bag/item_bag = . + item_bag.color = color + return item_bag + +/obj/structure/closet/body_bag/stasis + name = "stasis body bag" + desc = "A plastic bag designed for the storage and transportation of cadavers with portable stasis module and little space." + icon = 'modular_bandastation/balance/icons/bodybag.dmi' //на замену + icon_state = "stasisbag" + mob_storage_capacity = 1 + color = "#11978c" + open_sound = 'sound/effects/spray.ogg' + close_sound = 'sound/effects/spray.ogg' + foldedbag_path = /obj/item/bodybag/stasis + +//Добавить механизм добавления оверлея на предмет +/obj/structure/closet/body_bag/stasis/closet_update_overlays(list/new_overlays) + . = ..() + . = new_overlays + var/overlay_state = isnull(base_icon_state) ? initial(icon_state) : base_icon_state + if(opened && has_opened_overlay) + var/mutable_appearance/door_underlay = mutable_appearance(icon, "[overlay_state]_open_over", alpha = src.alpha) + . += door_underlay + door_underlay.color = "#6bd5ff" + door_underlay.overlays += emissive_blocker(door_underlay.icon, door_underlay.icon_state, src, alpha = door_underlay.alpha) // If we don't do this the door doesn't block emissives and it looks weird. + if(!opened && length(contents)) + var/mutable_appearance/door_underlay = mutable_appearance(icon, "[overlay_state]_over", alpha = src.alpha) + . += door_underlay + door_underlay.color = "#059900" + door_underlay.overlays += emissive_blocker(door_underlay.icon, door_underlay.icon_state, src, alpha = door_underlay.alpha) + return . + +/obj/structure/closet/body_bag/stasis/undeploy_bodybag(atom/fold_loc) + . = ..() + var/obj/item/bodybag/folding_bodybag = . + folding_bodybag.color = color + return folding_bodybag + +/obj/structure/closet/body_bag/stasis/close(mob/living/user) + . = ..() + for(var/mob/living/mob in contents) + mob.apply_status_effect(/datum/status_effect/grouped/stasis, STASIS_MACHINE_EFFECT) + ADD_TRAIT(mob, TRAIT_TUMOR_SUPPRESSED, TRAIT_GENERIC) + mob.extinguish_mob() + +/obj/structure/closet/body_bag/stasis/open(mob/living/user, force = FALSE, special_effects = TRUE) + for(var/mob/living/mob in contents) + mob.remove_status_effect(/datum/status_effect/grouped/stasis, STASIS_MACHINE_EFFECT) + REMOVE_TRAIT(mob, TRAIT_TUMOR_SUPPRESSED, TRAIT_GENERIC) + . = ..() + +/obj/item/reagent_containers/hypospray/medipen + list_reagents = list(/datum/reagent/medicine/epinephrine = 10, /datum/reagent/medicine/coagulant = 2) + +/obj/item/reagent_containers/hypospray/medipen/survival + list_reagents = list( /datum/reagent/medicine/epinephrine = 7, /datum/reagent/medicine/c2/aiuri = 7, /datum/reagent/medicine/c2/libital = 7, /datum/reagent/medicine/leporazine = 6, /datum/reagent/toxin/formaldehyde = 3) + +/obj/item/reagent_containers/hypospray/medipen/survival/luxury + list_reagents = list(/datum/reagent/medicine/salbutamol = 10, /datum/reagent/medicine/c2/penthrite = 10, /datum/reagent/medicine/oxandrolone = 10, /datum/reagent/medicine/sal_acid = 10 ,/datum/reagent/medicine/omnizine = 10 ,/datum/reagent/medicine/leporazine = 5, /datum/reagent/toxin/formaldehyde = 5) diff --git a/modular_bandastation/balance/icons/bodybag.dmi b/modular_bandastation/balance/icons/bodybag.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8a4c60af35cc64cea5b3d9fddfa939585c7826ef GIT binary patch literal 1380 zcmV-q1)KVbP)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm53CJkUEKW*Hk59|bNl8sn;^IunEGh;{8FF!^6(#1TLfDuZh*ue( zUyzzdigKVQNHiU<9%ThrKNoQ5003!xSZ%O`Cc*#!1er-hK~#90?VPb{8$l3;rI0*B zuv<52QmGRd(gc#)FW?t27~BMrGMF?5gI~ZepgMsx3x@4nrAgz~CeM&U(SP!P8m;bh zySIBDowOf_l~_>`L1~CNRFWKWmSlOa?`Nq!7U&$XZhfu*vY?`1o_sd1-jp z;7I5kT`o=a73V72NFfCK%MriH@Px-e2#Vk>K*$s{6#N((3&Pg5CG(B7rmR=$cc-pya>w6pzG{dxQ0A&5VWqp2=1_GKw-wMWa*p32x&wDJIJO=+yA)h-rkeOw1H zIl?%I)2>jdMQODV!$`fp{#LGpB^0L%F6T-Wz$5RqSqP2;uYG!b?yJK*Q5WbAztM$%BJ8 zl?JS&9>SUNf^e5JIjr=Fj}2qeR0pR7{M1&dw`yICl4v2wI-&E z>J$Rt$HW@j7qpWqH&6^~O^`>t#G_EY^nMx&Lbk*&p8YbN^(B;EPeUbgzkVGY`P=lb zbSgdI@bKM?uP*Alg5ju7?Bw21IsIKe8+^5u|IKSBa)66FOTvrwT79ZxXL3Ll(%?-` m#cQ#X9?&PU0Lo+ml=%;MN&Yf$`=C_-00008 literal 0 HcmV?d00001