Files
MrMelbertandGitHub 596b785ec5 More medical larp: Stasis bodybags and triage cards (#94709)
## About The Pull Request

1. Adds stasis bodybags, unlocked with cryogenics tech 

These bodybags are portable forms of stasis. However, they wear down
with use, only being able to keep someone in stasis for about 2, 3
minutes before falling apart.

Bodyparts and organs put in the bodybag are also frozen, allowing you to
maintain parts of gibbed people.

You can med scan through the walls of the stasis bag as well. Also you
can med scan through holographics bodybags.

2. Adds triage cards to the medical vendor

Triage cards are small pieces of paper you can write on and stick to
people. They're color coded according to severity, and are intended to
be used in mass casualty events for prioritizing patients.

3. You can pin paper to bodybags

You can pin a sheet of paper to bodybags that people can read, be it
autopsy or whatever.

4. Updates paper interaction code slightly

We have new procs for allowing interactions rather that snowflakes

5. Other forms of stasis apply tumor suppression

Oversight?

## Why It's Good For The Game

I made these a while back to just give medical doctors a few more tools
to play around with beyond the meta tools. Just to get more immersed
into the larp.

Otherwise, stasis bodybags gives Paramedics a tangible upgrade(if you
can call it that), offering a safer way to retrieve patients

## Changelog

🆑 Melbert
add: Adds stasis bodybags, unlocked with cryo tech. They put its
occupants (organ or mobs) in stasis, but wear down over time.
add: Adds triage cards to the medical vendor, a flavor item docs can use
during mass casualty events.
qol: You can pin papers to closed bodybags. Keep organized with your
autopsies.
qol: You can interact with papers in folders and on clipboards
qol: All forms of stasis stop brain tumors
/🆑
2026-01-17 10:37:49 -07:00

154 lines
6.6 KiB
Plaintext

/obj/item/bodybag
name = "body bag"
desc = "A folded bag designed for the storage and transportation of cadavers."
icon = 'icons/obj/medical/bodybag.dmi'
icon_state = "bodybag_folded"
w_class = WEIGHT_CLASS_SMALL
///Stored path we use for spawning a new body bag entity when unfolded.
var/unfoldedbag_path = /obj/structure/closet/body_bag
/obj/item/bodybag/attack_self(mob/user)
if(user.is_holding(src))
deploy_bodybag(user, get_turf(user))
else
deploy_bodybag(user, get_turf(src))
/obj/item/bodybag/interact_with_atom(atom/interacting_with, mob/living/user, flags)
if(isopenturf(interacting_with))
deploy_bodybag(user, interacting_with)
return ITEM_INTERACT_SUCCESS
return NONE
/obj/item/bodybag/attempt_pickup(mob/user)
// can't pick ourselves up if we are inside of the bodybag, else very weird things may happen
if(contains(user))
return TRUE
return ..()
/**
* Creates a new body bag item when unfolded, at the provided location, replacing the body bag item.
* * mob/user: User opening the body bag.
* * atom/location: the place/entity/mob where the body bag is being deployed from.
*/
/obj/item/bodybag/proc/deploy_bodybag(mob/user, atom/location)
var/obj/structure/closet/body_bag/item_bag = new unfoldedbag_path(location)
item_bag.open(user)
item_bag.add_fingerprint(user)
item_bag.foldedbag_instance = src
moveToNullspace()
return item_bag
/obj/item/bodybag/suicide_act(mob/living/user)
if(isopenturf(user.loc))
user.visible_message(span_suicide("[user] is crawling into [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
var/obj/structure/closet/body_bag/R = new unfoldedbag_path(user.loc)
R.add_fingerprint(user)
qdel(src)
user.forceMove(R)
playsound(src, 'sound/items/zip/zip.ogg', 15, TRUE, -3)
return OXYLOSS
// Bluespace bodybag
/obj/item/bodybag/bluespace
name = "bluespace body bag"
desc = "A folded bluespace body bag designed for the storage and transportation of cadavers."
icon = 'icons/obj/medical/bodybag.dmi'
icon_state = "bluebodybag_folded"
unfoldedbag_path = /obj/structure/closet/body_bag/bluespace
w_class = WEIGHT_CLASS_SMALL
item_flags = NO_MAT_REDEMPTION
/obj/item/bodybag/bluespace/examine(mob/user)
. = ..()
if(contents.len)
var/s = contents.len == 1 ? "" : "s"
. += span_notice("You can make out the shape[s] of [contents.len] object[s] through the fabric.")
/obj/item/bodybag/bluespace/Destroy()
for(var/atom/movable/A in contents)
A.forceMove(get_turf(src))
if(isliving(A))
to_chat(A, span_notice("You suddenly feel the space around you torn apart! You're free!"))
return ..()
/obj/item/bodybag/bluespace/deploy_bodybag(mob/user, atom/location)
var/obj/structure/closet/body_bag/item_bag = new unfoldedbag_path(location)
for(var/atom/movable/inside in contents)
inside.forceMove(item_bag)
if(isliving(inside))
to_chat(inside, span_notice("You suddenly feel air around you! You're free!"))
item_bag.open(user)
item_bag.add_fingerprint(user)
item_bag.foldedbag_instance = src
moveToNullspace()
return item_bag
/obj/item/bodybag/bluespace/container_resist_act(mob/living/user)
if(user.incapacitated)
to_chat(user, span_warning("You can't get out while you're restrained like this!"))
return
user.changeNext_move(CLICK_CD_BREAKOUT)
user.last_special = world.time + CLICK_CD_BREAKOUT
to_chat(user, span_notice("You claw at the fabric of [src], trying to tear it open..."))
to_chat(loc, span_warning("Someone starts trying to break free of [src]!"))
if(!do_after(user, 12 SECONDS, src, timed_action_flags = (IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM)))
return
// you are still in the bag? time to go unless you KO'd, honey!
// if they escape during this time and you rebag them the timer is still clocking down and does NOT reset so they can very easily get out.
if(user.incapacitated)
to_chat(loc, span_warning("The pressure subsides. It seems that they've stopped resisting..."))
return
loc.visible_message(span_warning("[user] suddenly appears in front of [loc]!"), span_userdanger("[user] breaks free of [src]!"))
qdel(src)
/obj/item/bodybag/environmental
name = "environmental protection bag"
desc = "A folded, reinforced bag designed to protect against exoplanetary environmental storms."
icon = 'icons/obj/medical/bodybag.dmi'
icon_state = "envirobag_folded"
unfoldedbag_path = /obj/structure/closet/body_bag/environmental
w_class = WEIGHT_CLASS_NORMAL //It's reinforced and insulated, like a beefed-up sleeping bag, so it has a higher bulkiness than regular bodybag
resistance_flags = ACID_PROOF | FIRE_PROOF | FREEZE_PROOF
/obj/item/bodybag/environmental/nanotrasen
name = "elite environmental protection bag"
desc = "A folded, heavily reinforced, and insulated bag, capable of fully isolating its contents from external factors."
icon_state = "ntenvirobag_folded"
unfoldedbag_path = /obj/structure/closet/body_bag/environmental/nanotrasen
resistance_flags = ACID_PROOF | FIRE_PROOF | FREEZE_PROOF | LAVA_PROOF
/obj/item/bodybag/environmental/prisoner
name = "prisoner transport bag"
desc = "Intended for transport of prisoners through hazardous environments, this folded environmental protection bag comes with straps to keep an occupant secure."
icon = 'icons/obj/medical/bodybag.dmi'
icon_state = "prisonerenvirobag_folded"
unfoldedbag_path = /obj/structure/closet/body_bag/environmental/prisoner
/obj/item/bodybag/environmental/prisoner/pressurized
name = "pressurized prisoner transport bag"
unfoldedbag_path = /obj/structure/closet/body_bag/environmental/prisoner/pressurized
/obj/item/bodybag/environmental/prisoner/syndicate
name = "syndicate prisoner transport bag"
desc = "An alteration of Nanotrasen's environmental protection bag which has been used in several high-profile kidnappings. Designed to keep a victim unconscious, alive, and secured until they are transported to a required location."
icon = 'icons/obj/medical/bodybag.dmi'
icon_state = "syndieenvirobag_folded"
unfoldedbag_path = /obj/structure/closet/body_bag/environmental/prisoner/pressurized/syndicate
resistance_flags = ACID_PROOF | FIRE_PROOF | FREEZE_PROOF | LAVA_PROOF
/obj/item/bodybag/stasis
name = /obj/structure/closet/body_bag/environmental/stasis::name
desc = /obj/structure/closet/body_bag/environmental/stasis::desc
max_integrity = /obj/structure/closet/body_bag/environmental/stasis::max_integrity
icon = 'icons/obj/medical/bodybag.dmi'
icon_state = "stasis_bag_folded"
unfoldedbag_path = /obj/structure/closet/body_bag/environmental/stasis
/obj/item/bodybag/stasis/deploy_bodybag(mob/user, atom/location)
var/obj/structure/closet/body_bag/environmental/stasis/bag = ..()
bag.last_filter_update = -1
bag.update_integrity(get_integrity())
return bag