/obj/item/weapon/storage/box/bloodpacks
name = "blood packs bags"
desc = "This box contains blood packs."
icon_state = "sterile"
/obj/item/weapon/storage/box/bloodpacks/fill()
..()
new /obj/item/weapon/reagent_containers/blood/empty(src)
new /obj/item/weapon/reagent_containers/blood/empty(src)
new /obj/item/weapon/reagent_containers/blood/empty(src)
new /obj/item/weapon/reagent_containers/blood/empty(src)
new /obj/item/weapon/reagent_containers/blood/empty(src)
new /obj/item/weapon/reagent_containers/blood/empty(src)
new /obj/item/weapon/reagent_containers/blood/empty(src)
/obj/item/weapon/reagent_containers/blood
name = "blood pack"
desc = "Contains blood used for transfusion."
icon = 'icons/obj/bloodpack.dmi'
icon_state = "empty"
volume = 200
var/blood_type = null
var/vampire_marks = null
var/being_feed = FALSE
drop_sound = 'sound/items/drop/food.ogg'
/obj/item/weapon/reagent_containers/blood/Initialize()
. = ..()
if(blood_type != null)
name = "blood pack [blood_type]"
reagents.add_reagent("blood", 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=blood_type,"resistances"=null,"trace_chem"=null))
update_icon()
/obj/item/weapon/reagent_containers/blood/on_reagent_change()
update_icon()
/obj/item/weapon/reagent_containers/blood/update_icon()
var/percent = round((reagents.total_volume / volume) * 100)
switch(percent)
if(0 to 9) icon_state = "empty"
if(10 to 50) icon_state = "half"
if(51 to INFINITY) icon_state = "full"
/obj/item/weapon/reagent_containers/blood/attack(mob/living/carbon/human/M as mob, mob/living/carbon/human/user as mob, var/target_zone)
if (user == M && (user.mind.vampire))
if (being_feed)
to_chat(user, "You are already feeding on \the [src].")
return
if (reagents.get_reagent_amount("blood"))
user.visible_message("[user] raises \the [src] up to their mouth and bites into it.", "You raise \the [src] up to your mouth and bite into it, starting to drain its contents.
You need to stand still.")
being_feed = TRUE
vampire_marks = TRUE
if (!LAZYLEN(src.other_DNA))
LAZYADD(src.other_DNA, M.dna.unique_enzymes)
src.other_DNA_type = "saliva"
while (do_after(user, 25, 5, 1))
var/blood_taken = 0
blood_taken = min(5, reagents.get_reagent_amount("blood")/4)
reagents.remove_reagent("blood", blood_taken*4)
user.mind.vampire.blood_usable += blood_taken
if (blood_taken)
to_chat(user, "You have accumulated [user.mind.vampire.blood_usable] [user.mind.vampire.blood_usable > 1 ? "units" : "unit"] of usable blood. It tastes quite stale.")
if (reagents.get_reagent_amount("blood") < 1)
break
user.visible_message("[user] licks \his fangs dry, lowering \the [src].", "You lick your fangs clean of the tasteless blood.")
being_feed = FALSE
else
..()
/obj/item/weapon/reagent_containers/blood/examine(mob/user, distance = 2)
if (..() && vampire_marks)
to_chat(user, "There are teeth marks on it.")
return
/obj/item/weapon/reagent_containers/blood/attackby(obj/item/weapon/P as obj, mob/user as mob)
..()
if (istype(P, /obj/item/weapon/pen))
if (reagents.get_reagent_amount("blood") && name != "empty blood pack") //Stops people mucking with bloodpacks that are filled
to_chat(usr, "You can't relabel [name] until it is empty!")
return
var/blood_name = input(usr, "What blood type would you like to label it as?", "Blood Types") in list("A+", "A-", "B+", "B-", "O+", "O-", "AB+", "AB-", "Cancel")
if (blood_name == "Cancel") return
var/obj/item/i = usr.get_active_hand()
if (!istype(i, /obj/item/weapon/pen) || !in_range(user, src)) return //Checks to see if pen is still held or bloodback is in range
name = "blood pack [blood_name]"
desc = "Contains blood used for transfusion."
to_chat(usr, "You label the blood pack as [blood_name].")
return
if (istype(P, /obj/item/weapon/) && P.sharp == 1)
var/mob/living/carbon/human/H = usr
if(LAZYLEN(P.attack_verb))
user.visible_message("[src] has been [pick(P.attack_verb)] with \the [P] by [user]!")
var/atkmsg_filled = null
if (reagents.get_reagent_amount("blood"))
atkmsg_filled = " and the contents spray everywhere"
if (src.loc != usr)
var/strength
var/percent = round((reagents.get_reagent_amount("blood") / volume) * 100) //the amount of blood changes the strength of spray
switch(percent)
if(1 to 9) strength = 2
if(10 to 50) strength = 3
if(51 to INFINITY) strength = 4
for (var/j = 0, j < strength - 1, j++) //The number of separate splatters
spray_loop:
var/direction = pick(alldirs)
var/target
for (var/i = 1, i < strength, i++) //The distance the splatters will travel from random direction
switch (direction)
if (NORTH)
target = locate(src.x, src.y+i, src.z)
if (SOUTH)
target = locate(src.x, src.y-i, src.z)
if (EAST)
target = locate(src.x+i, src.y, src.z)
if (WEST)
target = locate(src.x-i, src.y, src.z)
if (NORTHEAST)
target = locate(src.x+i, src.y+i, src.z)
if (NORTHWEST)
target = locate(src.x-i, src.y+i, src.z)
if (SOUTHEAST)
target = locate(src.x+i, src.y-i, src.z)
if (SOUTHWEST)
target = locate(src.x-i, src.y-i, src.z)
if (istype(get_turf(target), /turf/simulated/wall))
blood_splatter(target, null, 1)
break spray_loop
var/turf/base = get_turf(target)
for (var/atom/A in base) // Stops your blood spray if it meets a person, wall, door or window
if (istype(A, /mob/living/carbon/human/))
var/mob/living/carbon/human/K = A
K.bloody_body()
break spray_loop
if ((!istype(A, /obj/) && A.density) || istype(A, /obj/structure/window/) || istype(A, /obj/machinery/door/airlock/))
break spray_loop
blood_splatter(target, null, 1)
blood_splatter(src.loc, null, 1)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1, -6)
if(istype(H))
H.bloody_hands()
if (loc == usr)
H.bloody_body()
// Line below will do a check where the target bloodbag is located and create a new one accordingly
var/obj/item/weapon/reagent_containers/I = src.loc != usr ? new/obj/item/weapon/reagent_containers/blood/ripped(src.loc) : new/obj/item/weapon/reagent_containers/blood/ripped(usr.loc)
if (reagents.get_reagent_amount("blood"))
I.add_blood()
var/atkmsg = "\The [src] rips apart[atkmsg_filled]!"
user.visible_message(atkmsg)
qdel(src)
return
return
/obj/item/weapon/reagent_containers/blood/APlus
blood_type = "A+"
/obj/item/weapon/reagent_containers/blood/AMinus
blood_type = "A-"
/obj/item/weapon/reagent_containers/blood/BPlus
blood_type = "B+"
/obj/item/weapon/reagent_containers/blood/BMinus
blood_type = "B-"
/obj/item/weapon/reagent_containers/blood/OPlus
blood_type = "O+"
/obj/item/weapon/reagent_containers/blood/OMinus
blood_type = "O-"
/obj/item/weapon/reagent_containers/blood/empty
name = "empty blood pack"
desc = "Seems pretty useless... Maybe if there were a way to fill it?"
icon_state = "empty"
/obj/item/weapon/reagent_containers/blood/ripped
name = "ripped blood pack"
desc = "It's torn up and useless."
icon = 'icons/obj/bloodpack.dmi'
icon_state = "ripped"
volume = 0
/obj/item/weapon/reagent_containers/blood/ripped/attackby(obj/item/weapon/P as obj, mob/user as mob)
to_chat(user, "You can't do anything further with this.")
return