Files
Leland KembleandGitHub 75c3a91948 Blood bags are fully synthetic (#95920)
## About The Pull Request

Blood bags are composed of fully synthetic blood. This means that a
blood worm can no longer ride a crate of blood bags all the way to
adulthood, and must get real blood at least once to mature.

## Why It's Good For The Game

I have played blood worm thrice, at this point. Each time, I have
absolutely curb stomped because I simply eat blood packs without anyone
knowing, reproduce, eat blood packs without anyone knowing, reproduce,
eat blood packs without anyone knowing, and kill a bunch of people as an
adult because I still have the element of surprise ALONG WITH the
undisarmable infinite ammo laser gun & the undisarmable 4 hit melee. The
worm tide's already become more than all but the most well-staffed
security team can handle by the time that I've done anything at all that
could put me at risk, and it's become absurdly beyond control by the
time the crew presents a legitimate threat to me.

On all maps(excluding catwalk), there are 2-4 blood bag crates, all in
locations rarely visited. This means that on a given round you can count
on there being at LEAST enough completely undefended blood to reproduce
TWICE. That's your objective right there, and that's assuming you just
instantly reproduce upon becoming an adult and don't use your power to
harvest a few bodies.

The other team progression antags get away with being able to simply sit
in silence and grow uncontrollable because they have bases, and
identification. Xenos have to sit in their nest to protect their bodies,
so while they can just sit there and snowball without interacting with
people, when they are discovered, they don't get to simply run away, or
blend in to a crowd. Same with spiders. Blood worms have the benefit of
snowballing silently, but also can just skedaddle at standard run speed
without a care in the world. Thus, I don't think they should be able to
snowball silently, and blood packs are what is letting them do that.

## Changelog
🆑

balance: Blood from blood bags is fully synthetic

/🆑
2026-05-03 17:49:41 +02:00

89 lines
3.0 KiB
Plaintext

/obj/item/reagent_containers/blood
name = "blood pack"
desc = "Contains blood used for transfusion. Must be attached to an IV drip."
icon = 'icons/obj/medical/bloodpack.dmi'
icon_state = "bloodpack"
volume = 200
fill_icon_thresholds = list(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
obj_flags = UNIQUE_RENAME | RENAME_NO_DESC
var/blood_type = null
var/labeled = FALSE
/obj/item/reagent_containers/blood/Initialize(mapload, vol)
. = ..()
if (!blood_type)
return
var/datum/blood_type/bloodtype = get_blood_type(blood_type)
reagents.add_reagent(bloodtype.reagent_type, volume, list("blood_type" = bloodtype, "blood_DNA" = bloodtype.dna_string, BLOOD_DATA_SYNTH_CONTENT = 1), creation_callback = CALLBACK(src, PROC_REF(on_blood_created)))
/obj/item/reagent_containers/blood/proc/on_blood_created(datum/reagent/new_blood)
new_blood.AddElement(/datum/element/blood_reagent, null, get_blood_type(blood_type))
update_appearance()
/obj/item/reagent_containers/blood/update_name(updates)
. = ..()
if(!labeled)
name = "blood pack[blood_type ? " - [blood_type]" : ""]"
/obj/item/reagent_containers/blood/random
icon_state = "random_bloodpack"
/obj/item/reagent_containers/blood/random/Initialize(mapload, vol)
icon_state = "bloodpack"
blood_type = pick(BLOOD_TYPE_A_PLUS, BLOOD_TYPE_A_MINUS, BLOOD_TYPE_B_PLUS, BLOOD_TYPE_B_MINUS, BLOOD_TYPE_O_PLUS, BLOOD_TYPE_O_MINUS, BLOOD_TYPE_LIZARD)
return ..()
/obj/item/reagent_containers/blood/a_plus
blood_type = BLOOD_TYPE_A_PLUS
/obj/item/reagent_containers/blood/a_minus
blood_type = BLOOD_TYPE_A_MINUS
/obj/item/reagent_containers/blood/b_plus
blood_type = BLOOD_TYPE_B_PLUS
/obj/item/reagent_containers/blood/b_minus
blood_type = BLOOD_TYPE_B_MINUS
/obj/item/reagent_containers/blood/o_plus
blood_type = BLOOD_TYPE_O_PLUS
/obj/item/reagent_containers/blood/o_minus
blood_type = BLOOD_TYPE_O_MINUS
/obj/item/reagent_containers/blood/lizard
blood_type = BLOOD_TYPE_LIZARD
/obj/item/reagent_containers/blood/ethereal
blood_type = BLOOD_TYPE_ETHEREAL
/obj/item/reagent_containers/blood/snail
blood_type = BLOOD_TYPE_SNAIL
/obj/item/reagent_containers/blood/snail/examine()
. = ..()
. += span_notice("It's a bit slimy... The label indicates that this is meant for snails.")
/obj/item/reagent_containers/blood/podperson
blood_type = BLOOD_TYPE_H2O
/obj/item/reagent_containers/blood/podperson/examine()
. = ..()
. += span_notice("This appears to be some very overpriced water.")
// for slimepeople
/obj/item/reagent_containers/blood/toxin
blood_type = BLOOD_TYPE_TOX
/obj/item/reagent_containers/blood/toxin/examine()
. = ..()
. += span_notice("There is a toxin warning on the label. This is for slimepeople.")
/obj/item/reagent_containers/blood/universal
blood_type = BLOOD_TYPE_UNIVERSAL
/obj/item/reagent_containers/blood/nameformat(input, user)
playsound(src, SFX_WRITING_PEN, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, SOUND_FALLOFF_EXPONENT + 3, ignore_walls = FALSE)
labeled = TRUE
return "blood pack[input? " - [input]" : null]"