This commit is contained in:
Ghommie
2019-12-09 00:04:22 +01:00
375 changed files with 11630 additions and 8094 deletions
@@ -234,5 +234,5 @@
/obj/effect/turf_decal/trimline/neutral/filled/corner
icon_state = "trimline_corner_fill"
/obj/effect/turf_decal/trimline/brown/filled/end
/obj/effect/turf_decal/trimline/neutral/filled/end
icon_state = "trimline_end_fill"
@@ -36,3 +36,7 @@
/obj/effect/projectile/impact/wormhole
icon_state = "wormhole_g"
/obj/effect/projectile/impact/laser/wavemotion
name = "particle impact"
icon_state = "impact_wavemotion"
@@ -28,3 +28,7 @@
/obj/effect/projectile/muzzle/wormhole
icon_state = "wormhole_g"
/obj/effect/projectile/muzzle/laser/wavemotion
name = "particle backblast"
icon_state = "muzzle_wavemotion"
@@ -66,3 +66,7 @@
/obj/effect/projectile/tracer/wormhole
icon_state = "wormhole_g"
/obj/effect/projectile/tracer/laser/wavemotion
name = "particle trail"
icon_state = "tracer_wavemotion"
+7 -2
View File
@@ -81,6 +81,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
var/flags_cover = 0 //for flags such as GLASSESCOVERSEYES
var/heat = 0
///All items with sharpness of IS_SHARP or higher will automatically get the butchering component.
var/sharpness = IS_BLUNT
var/tool_behaviour = NONE
@@ -139,6 +140,9 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
else if (!istype(embedding, /datum/embedding_behavior))
stack_trace("Invalid type [embedding.type] found in .embedding during /obj/item Initialize()")
if(sharpness) //give sharp objects butchering functionality, for consistency
AddComponent(/datum/component/butchering, 80 * toolspeed)
/obj/item/Destroy()
item_flags &= ~DROPDEL //prevent reqdels
if(ismob(loc))
@@ -393,13 +397,14 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
return
if(over == src)
return usr.client.Click(src, src_location, src_control, params)
var/list/directaccess = usr.DirectAccess()
var/list/directaccess = usr.DirectAccess() //This, specifically, is what requires the copypaste. If this were after the adjacency check, then it'd be impossible to use items in your inventory, among other things.
//If this were before the above checks, then trying to click on items would act a little funky and signal overrides wouldn't work.
if((usr.CanReach(src) || (src in directaccess)) && (usr.CanReach(over) || (over in directaccess)))
if(!usr.get_active_held_item())
usr.UnarmedAttack(src, TRUE)
if(usr.get_active_held_item() == src)
melee_attack_chain(usr, over)
return
return TRUE //returning TRUE as a "is this overridden?" flag
if(!Adjacent(usr) || !over.Adjacent(usr))
return // should stop you from dragging through windows
+3 -6
View File
@@ -104,7 +104,7 @@
/obj/item/defibrillator/MouseDrop(obj/over_object)
. = ..()
if(ismob(loc))
if(!. && ismob(loc) && loc == usr)
var/mob/M = loc
if(!M.incapacitated() && istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
@@ -734,9 +734,8 @@
/obj/item/disk/medical
name = "Defibrillator Upgrade Disk"
desc = "A blank upgrade disk, made for a defibrillator"
icon = 'modular_citadel/icons/obj/defib_disks.dmi'
icon_state = "upgrade_disk"
item_state = "heal_disk"
icon_state = "heal_disk"
item_state = "defib_disk"
w_class = WEIGHT_CLASS_SMALL
/obj/item/disk/medical/defib_heal
@@ -762,5 +761,3 @@
desc = "An upgrade to the defibrillator capacitors, which let it charge faster"
icon_state = "fast_disk"
materials = list(MAT_METAL=16000, MAT_GLASS = 8000, MAT_GOLD = 26000, MAT_SILVER = 26000)
#undef HALFWAYCRITDEATH
+1 -1
View File
@@ -1044,7 +1044,7 @@ GLOBAL_LIST_EMPTY(PDAs)
if (ismob(loc))
var/mob/M = loc
M.show_message("<span class='userdanger'>Your [src] explodes!</span>", 1)
M.show_message("<span class='userdanger'>Your [src] explodes!</span>", MSG_VISUAL, "<span class='warning'>You hear a loud *pop*!</span>", MSG_AUDIBLE)
else
visible_message("<span class='danger'>[src] explodes!</span>", "<span class='warning'>You hear a loud *pop*!</span>")
+6 -4
View File
@@ -24,6 +24,7 @@
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
w_class = WEIGHT_CLASS_TINY
rad_flags = RAD_PROTECT_CONTENTS //So the cartridges dont annoyingly get irradiated, and the signallers inside being radded as well
var/obj/item/integrated_signaler/radio = null
@@ -689,15 +690,16 @@ Code:
active_bot = null
if("summon") //Args are in the correct order, they are stated here just as an easy reminder.
active_bot.bot_control(command= "summon", user_turf= get_turf(usr), user_access= host_pda.GetAccess())
active_bot.bot_control("summon", usr, host_pda.GetAccess())
else //Forward all other bot commands to the bot itself!
active_bot.bot_control(command= href_list["op"], user= usr)
active_bot.bot_control(href_list["op"], usr)
playsound(src, 'sound/machines/terminal_select.ogg', 50, 1)
if(href_list["mule"]) //MULEbots are special snowflakes, and need different args due to how they work.
active_bot.bot_control(href_list["mule"], usr, TRUE)
var/mob/living/simple_animal/bot/mulebot/mule = active_bot
if (istype(mule))
active_bot.bot_control(href_list["mule"], usr, TRUE)
if(!host_pda)
return
@@ -72,12 +72,12 @@
difficulty += 2
var/datum/component/uplink/hidden_uplink = target.GetComponent(/datum/component/uplink)
if(!target.detonatable || prob(difficulty * 15) || (hidden_uplink))
U.show_message("<span class='danger'>An error flashes on your [src].</span>", 1)
U.show_message("<span class='danger'>An error flashes on your [src].</span>", MSG_VISUAL)
else
message_admins("[!is_special_character(U) ? "Non-antag " : ""][ADMIN_LOOKUPFLW(U)] triggered a PDA explosion on [target.name] at [ADMIN_VERBOSEJMP(target)].")
var/message_log = "triggered a PDA explosion on [target.name] at [AREACOORD(target)]."
U.log_message(message_log, LOG_ATTACK)
U.show_message("<span class='notice'>Success!</span>", 1)
U.show_message("<span class='notice'>Success!</span>", MSG_VISUAL)
target.explode()
else
to_chat(U, "PDA not found.")
@@ -431,6 +431,7 @@
icon_state = "glowstick"
item_state = "glowstick"
grind_results = list("phenol" = 15, "hydrogen" = 10, "oxygen" = 5) //Meth-in-a-stick
rad_flags = RAD_NO_CONTAMINATE
var/fuel = 0
/obj/item/flashlight/glowstick/Initialize()
+205 -202
View File
@@ -131,232 +131,228 @@ SLIME SCANNER
mob_status = "<span class='alert'><b>Deceased</b></span>"
oxy_loss = max(rand(1, 40), oxy_loss, (300 - (tox_loss + fire_loss + brute_loss))) // Random oxygen loss
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.undergoing_cardiac_arrest() && H.stat != DEAD)
to_chat(user, "<span class='danger'>Subject suffering from heart attack: Apply defibrillation or other electric shock immediately!</span>")
if(H.undergoing_liver_failure() && H.stat != DEAD) //might be depreciated BUG_PROBABLE_CAUSE
to_chat(user, "<span class='danger'>Subject is suffering from liver failure: Apply Corazone and begin a liver transplant immediately!</span>")
var/msg = "<span class='info'>*---------*\nAnalyzing results for [M]:\n\tOverall status: [mob_status]\n"
var/msg = "<span class='info'>*---------*\nAnalyzing results for [M]:\n\tOverall status: [mob_status]"
// Damage descriptions
if(brute_loss > 10)
msg += "\t<span class='alert'>[brute_loss > 50 ? "Severe" : "Minor"] tissue damage detected.</span>\n"
msg += "\n\t<span class='alert'>[brute_loss > 50 ? "Severe" : "Minor"] tissue damage detected.</span>"
if(fire_loss > 10)
msg += "\t<span class='alert'>[fire_loss > 50 ? "Severe" : "Minor"] burn damage detected.</span>\n"
msg += "\n\t<span class='alert'>[fire_loss > 50 ? "Severe" : "Minor"] burn damage detected.</span>"
if(oxy_loss > 10)
msg += "\t<span class='info'><span class='alert'>[oxy_loss > 50 ? "Severe" : "Minor"] oxygen deprivation detected.</span>\n"
msg += "\n\t<span class='info'><span class='alert'>[oxy_loss > 50 ? "Severe" : "Minor"] oxygen deprivation detected.</span>"
if(tox_loss > 10)
msg += "\t<span class='alert'>[tox_loss > 50 ? "Severe" : "Minor"] amount of toxin damage detected.</span>\n"
msg += "\n\t<span class='alert'>[tox_loss > 50 ? "Severe" : "Minor"] amount of toxin damage detected.</span>"
if(M.getStaminaLoss())
msg += "\t<span class='alert'>Subject appears to be suffering from fatigue.</span>\n"
msg += "\n\t<span class='alert'>Subject appears to be suffering from fatigue.</span>"
if(advanced)
msg += "\t<span class='info'>Fatigue Level: [M.getStaminaLoss()]%.</span>\n"
msg += "\n\t<span class='info'>Fatigue Level: [M.getStaminaLoss()]%.</span>"
if (M.getCloneLoss())
msg += "\t<span class='alert'>Subject appears to have [M.getCloneLoss() > 30 ? "Severe" : "Minor"] cellular damage.</span>\n"
msg += "\n\t<span class='alert'>Subject appears to have [M.getCloneLoss() > 30 ? "Severe" : "Minor"] cellular damage.</span>"
if(advanced)
msg += "\t<span class='info'>Cellular Damage Level: [M.getCloneLoss()].</span>\n"
if (!M.getorgan(/obj/item/organ/brain))
to_chat(user, "\t<span class='alert'>Subject lacks a brain.</span>") //Unsure how this won't proc for 50% of the cit playerbase (This is a joke everyone on cit a cute.)
if(ishuman(M) && advanced) // Should I make this not advanced?
var/mob/living/carbon/human/H = M
var/obj/item/organ/liver/L = H.getorganslot("liver")
if(L)
if(L.swelling > 20)
msg += "\t<span class='danger'>Subject is suffering from an enlarged liver.</span>\n" //i.e. shrink their liver or give them a transplant.
else
msg += "\t<span class='danger'>Subject's liver is missing.</span>\n"
var/obj/item/organ/tongue/T = H.getorganslot("tongue")
if(T)
if(T.damage > 40)
msg += "\t<span class='danger'>Subject is suffering from severe burn tissue on their tongue.</span>\n" //i.e. their tongue is shot
if(T.name == "fluffy tongue")
msg += "\t<span class='danger'>Subject is suffering from a fluffified tongue. Suggested cure: Yamerol or a tongue transplant.</span>\n"
else
msg += "\t<span class='danger'>Subject's tongue is missing.</span>\n"
var/obj/item/organ/lungs/Lung = H.getorganslot("lungs")
if(Lung)
if(Lung.damage > 150)
msg += "\t<span class='danger'>Subject is suffering from acute emphysema leading to trouble breathing.</span>\n" //i.e. Their lungs are shot
else
msg += "\t<span class='danger'>Subject's lungs have collapsed from trauma!</span>\n"
var/obj/item/organ/genital/penis/P = H.getorganslot("penis")
if(P)
if(P.length>20)
msg += "\t<span class='info'>Subject has a sizeable gentleman's organ at [P.length] inches.</span>\n"
var/obj/item/organ/genital/breasts/Br = H.getorganslot("breasts")
if(Br)
if(Br.cached_size>5)
msg += "\t<span class='info'>Subject has a sizeable bosom with a [Br.size] cup.</span>\n"
if (M.getOrganLoss(ORGAN_SLOT_BRAIN) >= 200 || !M.getorgan(/obj/item/organ/brain))
msg += "\t<span class='alert'>Subject's brain function is non-existent.</span>\n"
else if (M.getOrganLoss(ORGAN_SLOT_BRAIN) >= 120)
msg += "\t<span class='alert'>Severe brain damage detected. Subject likely to have mental traumas.</span>\n"
else if (M.getOrganLoss(ORGAN_SLOT_BRAIN) >= 45)
msg += "\t<span class='alert'>Brain damage detected.</span>\n"
if(iscarbon(M))
var/mob/living/carbon/C = M
if(LAZYLEN(C.get_traumas()))
var/list/trauma_text = list()
for(var/datum/brain_trauma/B in C.get_traumas())
var/trauma_desc = ""
switch(B.resilience)
if(TRAUMA_RESILIENCE_SURGERY)
trauma_desc += "severe "
if(TRAUMA_RESILIENCE_LOBOTOMY)
trauma_desc += "deep-rooted "
if(TRAUMA_RESILIENCE_MAGIC, TRAUMA_RESILIENCE_ABSOLUTE)
trauma_desc += "permanent "
trauma_desc += B.scan_desc
trauma_text += trauma_desc
msg += "\t<span class='alert'>Cerebral traumas detected: subject appears to be suffering from [english_list(trauma_text)].</span>\n"
if(C.roundstart_quirks.len)
msg += "\t<span class='info'>Subject has the following physiological traits: [C.get_trait_string()].</span>\n"
if(advanced)
msg += "\t<span class='info'>Brain Activity Level: [(200 - M.getOrganLoss(ORGAN_SLOT_BRAIN))/2]%.</span>\n"
if(M.radiation)
msg += "\t<span class='alert'>Subject is irradiated.</span>\n"
msg += "\t<span class='info'>Radiation Level: [M.radiation] rad</span>\n"
if(advanced && M.hallucinating())
msg += "\t<span class='info'>Subject is hallucinating.</span>\n"
//MKUltra
if(advanced && M.has_status_effect(/datum/status_effect/chem/enthrall))
msg += "\t<span class='info'>Subject has abnormal brain fuctions.</span>\n"
//Astrogen shenanigans
if(advanced && M.reagents.has_reagent("astral"))
if(M.mind)
msg += "\t<span class='danger'>Warning: subject may be possesed.</span>\n"
else
msg += "\t<span class='notice'>Subject appears to be astrally projecting.</span>\n"
//Eyes and ears
if(advanced)
if(iscarbon(M))
var/mob/living/carbon/C = M
var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_SLOT_EARS)
msg += "\t<span class='info'><b>==EAR STATUS==</b></span>\n"
if(istype(ears))
var/healthy = TRUE
if(HAS_TRAIT_FROM(C, TRAIT_DEAF, GENETIC_MUTATION))
healthy = FALSE
msg += "\t<span class='alert'>Subject is genetically deaf.</span>\n"
else if(HAS_TRAIT(C, TRAIT_DEAF))
healthy = FALSE
msg += "\t<span class='alert'>Subject is deaf.</span>\n"
else
if(ears.damage)
to_chat(user, "\t<span class='alert'>Subject has [ears.damage > ears.maxHealth ? "permanent ": "temporary "]hearing damage.</span>")
healthy = FALSE
if(ears.deaf)
to_chat(user, "\t<span class='alert'>Subject is [ears.damage > ears.maxHealth ? "permanently ": "temporarily "] deaf.</span>")
healthy = FALSE
if(healthy)
msg += "\t<span class='info'>Healthy.</span>\n"
else
msg += "\t<span class='alert'>Subject does not have ears.</span>\n"
var/obj/item/organ/eyes/eyes = C.getorganslot(ORGAN_SLOT_EYES)
msg += "\t<span class='info'><b>==EYE STATUS==</b></span>\n"
if(istype(eyes))
var/healthy = TRUE
if(HAS_TRAIT(C, TRAIT_BLIND))
msg += "\t<span class='alert'>Subject is blind.</span>\n"
healthy = FALSE
if(HAS_TRAIT(C, TRAIT_NEARSIGHT))
msg += "\t<span class='alert'>Subject is nearsighted.</span>\n"
healthy = FALSE
if(eyes.damage > 30)
msg += "\t<span class='alert'>Subject has severe eye damage.</span>\n"
healthy = FALSE
else if(eyes.damage > 20)
msg += "\t<span class='alert'>Subject has significant eye damage.</span>\n"
healthy = FALSE
else if(eyes.damage)
msg += "\t<span class='alert'>Subject has minor eye damage.</span>\n"
healthy = FALSE
if(healthy)
msg += "\t<span class='info'>Healthy.</span>\n"
else
msg += "\t<span class='alert'>Subject does not have eyes.</span>\n"
msg += "\n\t<span class='info'>Cellular Damage Level: [M.getCloneLoss()].</span>"
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/ldamage = H.return_liver_damage()
if(ldamage > 10)
msg += "\t<span class='alert'>[ldamage > 45 ? "Severe" : "Minor"] liver damage detected.</span>\n"
to_chat(user, msg)
msg = ""
// Body part damage report
var/list/dmgreport = list()
if(iscarbon(M) && mode == 1)
var/mob/living/carbon/C = M
var/list/damaged = C.get_damaged_bodyparts(1,1)
if(length(damaged)>0 || oxy_loss>0 || tox_loss>0 || fire_loss>0)
msg += "<span class='info'>\tDamage: <span class='info'><font color='red'>Brute</font></span>-<font color='#FF8000'>Burn</font>-<font color='green'>Toxin</font>-<font color='blue'>Suffocation</font>\n\t\tSpecifics: <font color='red'>[brute_loss]</font>-<font color='#FF8000'>[fire_loss]</font>-<font color='green'>[tox_loss]</font>-<font color='blue'>[oxy_loss]</font></span>\n"
for(var/obj/item/bodypart/org in damaged)
msg += "\t\t<span class='info'>[capitalize(org.name)]: [(org.brute_dam > 0) ? "<font color='red'>[org.brute_dam]</font></span>" : "<font color='red'>0</font>"]-[(org.burn_dam > 0) ? "<font color='#FF8000'>[org.burn_dam]</font>" : "<font color='#FF8000'>0</font>"]\n"
dmgreport += "<table style='margin-left:33px'><tr><font face='Verdana'>\
<td style='width: 90px;'><font color='#0000CC'>Damage:</font></td>\
<td style='width: 55px;'><font color='red'><b>Brute</b></font></td>\
<td style='width: 45px;'><font color='orange'><b>Burn</b></font></td>\
<td style='width: 45px;'><font color='green'><b>Toxin</b></font></td>\
<td style='width: 90px;'><font color='purple'><b>Suffocation</b></font></td></tr>\
<tr><td><font color='#0000CC'>Overall:</font></td>\
<td><font color='red'>[brute_loss]</font></td>\
<td><font color='orange'>[fire_loss]</font></td>\
<td><font color='green'>[tox_loss]</font></td>\
<td><font color='purple'>[oxy_loss]</font></td></tr>"
for(var/o in damaged)
var/obj/item/bodypart/org = o //head, left arm, right arm, etc.
dmgreport += "<tr><td><font color='#0000CC'>[capitalize(org.name)]:</font></td>\
<td><font color='red'>[(org.brute_dam > 0) ? "[org.brute_dam]" : "0"]</font></td>\
<td><font color='orange'>[(org.burn_dam > 0) ? "[org.burn_dam]" : "0"]</font></td></tr>"
dmgreport += "</table>"
to_chat(user, dmgreport.Join())
//Organ damages report
if(ishuman(M))
var/heart_ded = FALSE
if(iscarbon(M))
var/mob/living/carbon/C = M
var/mob/living/carbon/human/H = M
var/minor_damage
var/major_damage
var/max_damage
var/report_organs = FALSE
for(var/organ in C.internal_organs)
var/temp_message
var/damage_message
var/obj/item/organ/O = organ
//Piece together the lists to be reported
for(var/O in H.internal_organs)
var/obj/item/organ/organ = O
if(organ.organ_flags & ORGAN_FAILING)
report_organs = TRUE //if we report one organ, we report all organs, even if the lists are empty, just for consistency
if(max_damage)
max_damage += ", " //prelude the organ if we've already reported an organ
max_damage += organ.name //this just slaps the organ name into the string of text
else
max_damage = "\t<span class='alert'>Non-Functional Organs: " //our initial statement
max_damage += organ.name
else if(organ.damage > organ.high_threshold)
report_organs = TRUE
if(major_damage)
major_damage += ", "
major_damage += organ.name
else
major_damage = "\t<span class='info'>Severely Damaged Organs: "
major_damage += organ.name
else if(organ.damage > organ.low_threshold)
report_organs = TRUE
if(minor_damage)
minor_damage += ", "
minor_damage += organ.name
else
minor_damage = "\t<span class='info'>Mildly Damaged Organs: "
minor_damage += organ.name
//EYES
if(istype(O, /obj/item/organ/eyes))
var/obj/item/organ/eyes/eyes = O
if(advanced)
if(HAS_TRAIT(C, TRAIT_BLIND))
temp_message += " <span class='alert'>Subject is blind.</span>"
if(HAS_TRAIT(C, TRAIT_NEARSIGHT))
temp_message += " <span class='alert'>Subject is nearsighted.</span>"
if(eyes.damage > 30)
damage_message += " <span class='alert'>Subject has severe eye damage.</span>"
else if(eyes.damage > 20)
damage_message += " <span class='alert'>Subject has significant eye damage.</span>"
else if(eyes.damage)
damage_message += " <span class='alert'>Subject has minor eye damage.</span>"
//EARS
else if(istype(O, /obj/item/organ/ears))
var/obj/item/organ/ears/ears = O
if(advanced)
if(HAS_TRAIT_FROM(C, TRAIT_DEAF, GENETIC_MUTATION))
temp_message += " <span class='alert'>Subject is genetically deaf.</span>"
else if(HAS_TRAIT(C, TRAIT_DEAF))
temp_message += " <span class='alert'>Subject is deaf.</span>"
else
if(ears.damage)
damage_message += " <span class='alert'>Subject has [ears.damage > ears.maxHealth ? "permanent ": "temporary "]hearing damage.</span>"
if(ears.deaf)
damage_message += " <span class='alert'>Subject is [ears.damage > ears.maxHealth ? "permanently ": "temporarily "] deaf.</span>"
//BRAIN
else if(istype(O, /obj/item/organ/brain))
if (C.getOrganLoss(ORGAN_SLOT_BRAIN) >= 200)
damage_message += " <span class='alert'>Subject's brain non-functional. Neurine injection recomended.</span>"
else if (C.getOrganLoss(ORGAN_SLOT_BRAIN) >= 120)
damage_message += " <span class='alert'>Severe brain damage detected. Subject likely to have mental traumas.</span>"
else if (C.getOrganLoss(ORGAN_SLOT_BRAIN) >= 45)
damage_message += " <span class='alert'>Brain damage detected.</span>"
if(advanced)
temp_message += " <span class='info'>Brain Activity Level: [(200 - M.getOrganLoss(ORGAN_SLOT_BRAIN))/2]%.</span>"
//TRAUMAS
if(LAZYLEN(C.get_traumas()))
var/list/trauma_text = list()
for(var/datum/brain_trauma/B in C.get_traumas())
var/trauma_desc = ""
switch(B.resilience)
if(TRAUMA_RESILIENCE_SURGERY)
trauma_desc += "severe "
if(TRAUMA_RESILIENCE_LOBOTOMY)
trauma_desc += "deep-rooted "
if(TRAUMA_RESILIENCE_MAGIC, TRAUMA_RESILIENCE_ABSOLUTE)
trauma_desc += "permanent "
trauma_desc += B.scan_desc
trauma_text += trauma_desc
temp_message += " <span class='alert'>Cerebral traumas detected: subject appears to be suffering from [english_list(trauma_text)].</span>"
if(C.roundstart_quirks.len)
temp_message += " <span class='info'>Subject has the following physiological traits: [C.get_trait_string()].</span>"
if(ishuman(C) && advanced)
//MON PETIT CHAUFFEUR
if(H.hallucinating())
temp_message += " <span class='info'>Subject is hallucinating.</span>"
//MKUltra
if(H.has_status_effect(/datum/status_effect/chem/enthrall))
temp_message += " <span class='info'>Subject has abnormal brain fuctions.</span>"
//Astrogen shenanigans
if(H.reagents.has_reagent("astral"))
if(H.mind)
temp_message += " <span class='danger'>Warning: subject may be possesed.</span>"
else
temp_message += " <span class='notice'>Subject appears to be astrally projecting.</span>"
//LIVER
else if(istype(O, /obj/item/organ/liver))
var/obj/item/organ/liver/L = O
if(H.undergoing_liver_failure() && H.stat != DEAD) //might be depreciated
temp_message += "<span class='danger'>Subject is suffering from liver failure: Apply Corazone and begin a liver transplant immediately!</span>"
if(L.swelling > 20)
temp_message += " <span class='danger'>Subject is suffering from an enlarged liver.</span>" //i.e. shrink their liver or give them a transplant.
//HEART
else if(ishuman(M) && (istype(O, /obj/item/organ/heart)))
var/obj/item/organ/heart/He = O
if(H.undergoing_cardiac_arrest() && H.stat != DEAD)
temp_message += " <span class='danger'>Subject suffering from heart attack: Apply defibrillation or other electric shock <b>immediately!</b></span>"
if(He.organ_flags & ORGAN_FAILING)
heart_ded = TRUE
//TONGUE
else if(istype(O, /obj/item/organ/tongue))
var/obj/item/organ/tongue/T = O
if(T.name == "fluffy tongue")
temp_message += " <span class='danger'>Subject is suffering from a fluffified tongue. Suggested cure: Yamerol or a tongue transplant.</span>"
//HECK
else if(istype(O, /obj/item/organ/genital/penis))
var/obj/item/organ/genital/penis/P = O
if(P.length>20)
temp_message += " <span class='info'>Subject has a sizeable gentleman's organ at [P.length] inches.</span>"
else if(istype(O, /obj/item/organ/genital/breasts))
var/obj/item/organ/genital/breasts/Br = O
if(Br.cached_size>5)
temp_message += " <span class='info'>Subject has a sizeable bosom with a [Br.size] cup.</span>"
//GENERAL HANDLER
if(!damage_message)
if(O.organ_flags & ORGAN_FAILING)
damage_message += " <span class='alert'><b>End Stage [O.name] failure detected.</b></span>"
else if(O.damage > O.high_threshold)
damage_message += " <span class='alert'>Chronic [O.name] failure detected.</span>"
else if(O.damage > O.low_threshold && advanced)
damage_message += " <font color='red'>Acute [O.name] failure detected.</span>"
if(temp_message || damage_message)
msg += "\t<b><span class='info'>[uppertext(O.name)]:</b></span> [damage_message] [temp_message]\n"
//END; LOOK FOR MISSING ORGANS?
var/breathes = TRUE
var/blooded = TRUE
if(C.dna && C.dna.species)
if(HAS_TRAIT_FROM(C, TRAIT_NOBREATH, SPECIES_TRAIT))
breathes = FALSE
if(NOBLOOD in C.dna.species.species_traits)
blooded = FALSE
var/has_liver = (!(NOLIVER in C.dna.species.species_traits))
var/has_stomach = (!(NOSTOMACH in C.dna.species.species_traits))
if(!M.getorganslot(ORGAN_SLOT_EYES))
msg += "\t<span class='alert'><b>Subject does not have eyes.</b></span>\n"
if(!M.getorganslot(ORGAN_SLOT_EARS))
msg += "\t<span class='alert'><b>Subject does not have ears.</b></span>\n"
if(!M.getorganslot(ORGAN_SLOT_BRAIN))
msg += "\t<span class='alert'><b>Subject's brain function is non-existent!</b></span>\n"
if(has_liver && !M.getorganslot(ORGAN_SLOT_LIVER))
msg += "\t<span class='alert'><b>Subject's liver is missing!</b></span>\n"
if(blooded && !M.getorganslot(ORGAN_SLOT_HEART))
msg += "\t<span class='alert'><b>Subject's heart is missing!</b></span>\n"
if(breathes && !M.getorganslot(ORGAN_SLOT_LUNGS))
msg += "\t<span class='alert'><b>Subject's lungs have collapsed from trauma!</b></span>\n"
if(has_stomach && !M.getorganslot(ORGAN_SLOT_STOMACH))
msg += "\t<span class='alert'><b>Subject's stomach is missing!</span>\n"
if(M.radiation)
msg += "\t<span class='alert'>Subject is irradiated.</span>\n"
msg += "\t<span class='info'>Radiation Level: [M.radiation] rad</span>\n"
if(report_organs) //we either finish the list, or set it to be empty if no organs were reported in that category
if(!max_damage)
max_damage = "\t<span class='alert'>Non-Functional Organs: </span>\n"
else
max_damage += "</span>\n"
if(!major_damage)
major_damage = "\t<span class='info'>Severely Damaged Organs: </span>\n"
else
major_damage += "</span>\n"
if(!minor_damage)
minor_damage = "\t<span class='info'>Mildly Damaged Organs: </span>\n"
else
minor_damage += "</span>\n"
msg += "[minor_damage]"
msg += "[major_damage]"
msg += "[max_damage]"
// Species and body temperature
var/mob/living/carbon/human/H = M //Start to use human only stuff here
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/datum/species/S = H.dna.species
var/mutant = FALSE
if (H.dna.check_mutation(HULK))
@@ -393,7 +389,15 @@ SLIME SCANNER
msg += "<span class='info'>Time of Death:</span> [M.tod]\n"
var/tdelta = round(world.time - M.timeofdeath)
if(tdelta < (DEFIB_TIME_LIMIT * 10))
msg += "<span class='danger'>Subject died [DisplayTimeText(tdelta)] ago, defibrillation may be possible!</span>\n"
if(heart_ded)
msg += "<span class='danger'>Subject died [DisplayTimeText(tdelta)] ago, heart requires surgical intervention for defibrillation.</span>"
else
msg += "<span class='danger'>Subject died [DisplayTimeText(tdelta)] ago, defibrillation may be possible!</span>"
if(advanced)
if(H.get_ghost() || H.key || H.client)//Since it can last a while.
msg += "<span class='danger'> Intervention recommended.</span>\n"
else
msg += "\n"
for(var/thing in M.diseases)
var/datum/disease/D = thing
@@ -406,7 +410,6 @@ SLIME SCANNER
var/blood_id = C.get_blood_id()
if(blood_id)
if(ishuman(C))
var/mob/living/carbon/human/H = C
if(H.bleed_rate)
msg += "<span class='danger'>Subject is bleeding!</span>\n"
var/blood_percent = round((C.blood_volume / (BLOOD_VOLUME_NORMAL * C.blood_ratio))*100)
@@ -431,7 +434,7 @@ SLIME SCANNER
if(cyberimp_detect)
msg += "<span class='notice'>Detected cybernetic modifications:</span>\n"
msg += "<span class='notice'>[cyberimp_detect]</span>\n"
msg += "*---------*</span>"
msg += "<span class='notice'>*---------*</span>"
to_chat(user, msg)
SEND_SIGNAL(M, COMSIG_NANITE_SCAN, user, FALSE)
@@ -21,7 +21,7 @@
/obj/item/grenade/flashbang/proc/bang(turf/T , mob/living/M)
if(M.stat == DEAD) //They're dead!
return
M.show_message("<span class='warning'>BANG</span>", 2)
M.show_message("<span class='warning'>BANG</span>", MSG_AUDIBLE)
var/distance = max(0,get_dist(get_turf(src),T))
//Flash
+1 -1
View File
@@ -107,7 +107,7 @@
return ..()
/obj/item/implant/proc/get_data()
return "No information available"
return "No information available about this implant."
/obj/item/implant/dropped(mob/user)
. = 1
+12 -15
View File
@@ -13,34 +13,31 @@
var/broadcasting = null
var/listening = 1
/obj/item/implantpad/examine(mob/user)
. = ..()
if(case)
. += "<span class='notice'>Alt-click [src] to remove the inserted implant case.</span>"
/obj/item/implantpad/update_icon()
if(case)
icon_state = "implantpad-1"
else
icon_state = "implantpad-0"
icon_state = "implantpad-[case ? TRUE : FALSE]"
/obj/item/implantpad/attack_hand(mob/user)
/obj/item/implantpad/AltClick(mob/user)
. = ..()
if(.)
return
if(case && user.is_holding(src))
user.put_in_active_hand(case)
if(case && user.can_hold_items() && user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
user.put_in_hands(case)
case.add_fingerprint(user)
case = null
add_fingerprint(user)
update_icon()
return TRUE
/obj/item/implantpad/attackby(obj/item/implantcase/C, mob/user, params)
if(istype(C, /obj/item/implantcase))
if(!case)
if(!user.transferItemToLoc(C, src))
return
if(istype(C))
if(!case && user.transferItemToLoc(C, src))
case = C
update_icon()
update_icon()
else
return ..()
+4
View File
@@ -205,3 +205,7 @@
/obj/item/inducer/sci/combat/Initialize()
. = ..()
update_icon()
/obj/item/inducer/sci/supply
opened = FALSE
cell_type = /obj/item/stock_parts/cell/inducer_supply
@@ -23,8 +23,8 @@
else
if(attack_verb_off.len)
attack_verb = attack_verb_off
if(get_sharpness())
AddComponent(/datum/component/butchering, 50, 100, 0, hitsound, !active)
if(sharpness)
AddComponent(/datum/component/butchering, 50, 100, 0, hitsound)
/obj/item/melee/transforming/attack_self(mob/living/carbon/user)
if(transform_weapon(user))
@@ -65,13 +65,6 @@
icon_state = initial(icon_state)
w_class = initial(w_class)
total_mass = initial(total_mass)
if(get_sharpness())
var/datum/component/butchering/BT = LoadComponent(/datum/component/butchering)
BT.butchering_enabled = TRUE
else
var/datum/component/butchering/BT = GetComponent(/datum/component/butchering)
if(BT)
BT.butchering_enabled = FALSE
transform_messages(user, supress_message_text)
add_fingerprint(user)
return TRUE
+2 -1
View File
@@ -153,12 +153,13 @@
add_overlay("[locked ? "" : "un"]locked")
/obj/item/pet_carrier/MouseDrop(atom/over_atom)
. = ..()
if(isopenturf(over_atom) && usr.canUseTopic(src, BE_CLOSE, ismonkey(usr)) && usr.Adjacent(over_atom) && open && occupants.len)
usr.visible_message("<span class='notice'>[usr] unloads [src].</span>", \
"<span class='notice'>You unload [src] onto [over_atom].</span>")
for(var/V in occupants)
remove_occupant(V, over_atom)
else
return ..()
/obj/item/pet_carrier/proc/load_occupant(mob/living/user, mob/living/target)
if(pet_carrier_full(src))
+9 -5
View File
@@ -113,8 +113,10 @@
return
log_game("[key_name(user)] activated a hidden grenade in [src].")
grenade.preprime(user, msg = FALSE, volume = 10)
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plushpet", /datum/mood_event/plushpet)
else
to_chat(user, "<span class='notice'>You try to pet [src], but it has no stuffing. Aww...</span>")
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plush_nostuffing", /datum/mood_event/plush_nostuffing)
/obj/item/toy/plush/attackby(obj/item/I, mob/living/user, params)
if(I.get_sharpness())
@@ -125,6 +127,7 @@
user.visible_message("<span class='notice'>[user] tears out the stuffing from [src]!</span>", "<span class='notice'>You rip a bunch of the stuffing from [src]. Murderer.</span>")
I.play_tool_sound(src)
stuffed = FALSE
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plushjack", /datum/mood_event/plushjack)
else
to_chat(user, "<span class='notice'>You remove the grenade from [src].</span>")
user.put_in_hands(grenade)
@@ -147,6 +150,7 @@
return
if(istype(I, /obj/item/toy/plush))
love(I, user)
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plushplay", /datum/mood_event/plushplay)
return
return ..()
@@ -158,7 +162,7 @@
//we are not catholic
if(young == TRUE || Kisser.young == TRUE)
user.show_message("<span class='notice'>[src] plays tag with [Kisser].</span>", 1,
user.show_message("<span class='notice'>[src] plays tag with [Kisser].</span>", MSG_VISUAL,
"<span class='notice'>They're happy.</span>", 0)
Kisser.cheer_up()
cheer_up()
@@ -166,10 +170,10 @@
//never again
else if(Kisser in scorned)
//message, visible, alternate message, neither visible nor audible
user.show_message("<span class='notice'>[src] rejects the advances of [Kisser]!</span>", 1,
user.show_message("<span class='notice'>[src] rejects the advances of [Kisser]!</span>", MSG_VISUAL,
"<span class='notice'>That didn't feel like it worked.</span>", 0)
else if(src in Kisser.scorned)
user.show_message("<span class='notice'>[Kisser] realises who [src] is and turns away.</span>", 1,
user.show_message("<span class='notice'>[Kisser] realises who [src] is and turns away.</span>", MSG_VISUAL,
"<span class='notice'>That didn't feel like it worked.</span>", 0)
//first comes love
@@ -190,7 +194,7 @@
new_lover(Kisser)
Kisser.new_lover(src)
else
user.show_message("<span class='notice'>[src] rejects the advances of [Kisser], maybe next time?</span>", 1,
user.show_message("<span class='notice'>[src] rejects the advances of [Kisser], maybe next time?</span>", MSG_VISUAL,
"<span class='notice'>That didn't feel like it worked, this time.</span>", 0)
//then comes marriage
@@ -1014,7 +1018,7 @@
icon_state = "maya"
item_state = "maya"
attack_verb = list("nuked", "arrested", "harmbatonned")
/obj/item/toy/plush/catgirl/marisa
desc = "An adorable stuffed toy that resembles a crew member, or maybe a witch. Having it makes you feel you can win."
icon_state = "marisa"
@@ -39,6 +39,9 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
/obj/item/stack/sheet/glass/fifty
amount = 50
/obj/item/stack/sheet/glass/five
amount = 5
/obj/item/stack/sheet/glass/Initialize(mapload, new_amount, merge = TRUE)
recipes = GLOB.glass_recipes
return ..()
@@ -55,6 +55,9 @@ GLOBAL_LIST_INIT(sandstone_recipes, list ( \
/obj/item/stack/sheet/mineral/sandstone/thirty
amount = 30
/obj/item/stack/sheet/mineral/sandstone/twelve
amount = 12
/*
* Sandbags
*/
@@ -620,6 +620,7 @@ GLOBAL_LIST_INIT(plastic_recipes, list(
new /datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 5, one_per_turf = TRUE, on_floor = TRUE, time = 40), \
new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/empty), \
new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty,3), \
new /datum/stack_recipe("large trash cart", /obj/structure/closet/crate/bin,50),\
new /datum/stack_recipe("wet floor sign", /obj/item/caution, 2)))
/obj/item/stack/sheet/plastic
@@ -82,6 +82,55 @@
item_state = "tile-fairygrass"
turf_type = /turf/open/floor/grass/fairy
resistance_flags = FLAMMABLE
color = "#33CCFF"
/obj/item/stack/tile/fairygrass/white
name = "white fairygrass tile"
singular_name = "white fairygrass floor tile"
desc = "A patch of odd, glowing white grass."
turf_type = /turf/open/floor/grass/fairy/white
color = "#FFFFFF"
/obj/item/stack/tile/fairygrass/red
name = "red fairygrass tile"
singular_name = "red fairygrass floor tile"
desc = "A patch of odd, glowing red grass."
turf_type = /turf/open/floor/grass/fairy/red
color = "#FF3333"
/obj/item/stack/tile/fairygrass/yellow
name = "yellow fairygrass tile"
singular_name = "yellow fairygrass floor tile"
desc = "A patch of odd, glowing yellow grass."
turf_type = /turf/open/floor/grass/fairy/yellow
color = "#FFFF66"
/obj/item/stack/tile/fairygrass/green
name = "green fairygrass tile"
singular_name = "green fairygrass floor tile"
desc = "A patch of odd, glowing green grass."
turf_type = /turf/open/floor/grass/fairy/green
color = "#99FF99"
/obj/item/stack/tile/fairygrass/blue
name = "blue fairygrass tile"
singular_name = "blue fairygrass floor tile"
desc = "A patch of odd, glowing blue grass."
turf_type = /turf/open/floor/grass/fairy/blue
/obj/item/stack/tile/fairygrass/purple
name = "purple fairygrass tile"
singular_name = "purple fairygrass floor tile"
desc = "A patch of odd, glowing purple grass."
turf_type = /turf/open/floor/grass/fairy/purple
color = "#D966FF"
/obj/item/stack/tile/fairygrass/pink
name = "pink fairygrass tile"
singular_name = "pink fairygrass floor tile"
desc = "A patch of odd, glowing pink grass."
turf_type = /turf/open/floor/grass/fairy/pink
color = "#FFB3DA"
//Wood
/obj/item/stack/tile/wood
+1 -1
View File
@@ -253,7 +253,7 @@
/obj/item/storage/backpack/satchel/bone
name = "bone satchel"
desc = "A bone satchel fashend with watcher wings and large bones from goliath. Can be worn on the belt."
desc = "A grotesque satchel made of sinews and bones."
icon = 'icons/obj/mining.dmi'
icon_state = "goliath_saddle"
slot_flags = ITEM_SLOT_BACK
+3 -1
View File
@@ -575,7 +575,9 @@
/obj/item/clothing/gloves,
/obj/item/melee/flyswatter,
/obj/item/paint/paint_remover,
/obj/item/assembly/mousetrap
/obj/item/assembly/mousetrap,
/obj/item/screwdriver,
/obj/item/stack/cable_coil
))
/obj/item/storage/belt/bandolier
+35 -9
View File
@@ -105,25 +105,37 @@
// Ordinary survival box
/obj/item/storage/box/survival/PopulateContents()
new /obj/item/clothing/mask/breath(src)
new /obj/item/tank/internals/emergency_oxygen(src)
new /obj/item/reagent_containers/hypospray/medipen(src)
if(!isplasmaman(loc))
new /obj/item/tank/internals/emergency_oxygen(src)
else
new /obj/item/tank/internals/plasmaman/belt(src)
/obj/item/storage/box/survival/radio/PopulateContents()
..() // we want the survival stuff too.
new /obj/item/radio/off(src)
/obj/item/storage/box/survival_mining/PopulateContents()
new /obj/item/clothing/mask/gas/explorer(src)
new /obj/item/tank/internals/emergency_oxygen/engi(src)
new /obj/item/crowbar/red(src)
new /obj/item/reagent_containers/hypospray/medipen(src)
if(!isplasmaman(loc))
new /obj/item/tank/internals/emergency_oxygen(src)
else
new /obj/item/tank/internals/plasmaman/belt(src)
// Engineer survival box
/obj/item/storage/box/engineer/PopulateContents()
new /obj/item/clothing/mask/breath(src)
new /obj/item/tank/internals/emergency_oxygen/engi(src)
new /obj/item/reagent_containers/hypospray/medipen(src)
if(!isplasmaman(loc))
new /obj/item/tank/internals/emergency_oxygen/engi(src)
else
new /obj/item/tank/internals/plasmaman/belt(src)
/obj/item/storage/box/engineer/radio/PopulateContents()
..() // we want the regular items too.
new /obj/item/radio/off(src)
@@ -131,14 +143,22 @@
// Syndie survival box
/obj/item/storage/box/syndie/PopulateContents()
new /obj/item/clothing/mask/gas/syndicate(src)
new /obj/item/tank/internals/emergency_oxygen/engi(src)
if(!isplasmaman(loc))
new /obj/item/tank/internals/emergency_oxygen/engi(src)
else
new /obj/item/tank/internals/plasmaman/belt(src)
// Security survival box
/obj/item/storage/box/security/PopulateContents()
new /obj/item/clothing/mask/gas/sechailer(src)
new /obj/item/tank/internals/emergency_oxygen(src)
new /obj/item/reagent_containers/hypospray/medipen(src)
if(!isplasmaman(loc))
new /obj/item/tank/internals/emergency_oxygen(src)
else
new /obj/item/tank/internals/plasmaman/belt(src)
/obj/item/storage/box/security/radio/PopulateContents()
..() // we want the regular stuff too
new /obj/item/radio/off(src)
@@ -679,6 +699,7 @@
user.changeNext_move(CLICK_CD_MELEE)
playsound(loc, "rustle", 50, 1, -5)
user.visible_message("<span class='notice'>[user] hugs \the [src].</span>","<span class='notice'>You hug \the [src].</span>")
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"hugbox", /datum/mood_event/hugbox)
/////clown box & honkbot assembly
/obj/item/storage/box/clown
@@ -707,11 +728,16 @@
new /obj/item/stack/medical/ointment(src)
new /obj/item/reagent_containers/hypospray/medipen(src)
// Clown survival box
/obj/item/storage/box/hug/survival/PopulateContents()
new /obj/item/clothing/mask/breath(src)
new /obj/item/tank/internals/emergency_oxygen(src)
new /obj/item/reagent_containers/hypospray/medipen(src)
if(!isplasmaman(loc))
new /obj/item/tank/internals/emergency_oxygen(src)
else
new /obj/item/tank/internals/plasmaman/belt(src)
/obj/item/storage/box/rubbershot
name = "box of rubber shots"
desc = "A box full of rubber shots, designed for riot shotguns."
@@ -858,12 +884,12 @@
else if(W.get_sharpness())
if(!contents.len)
if(item_state == "paperbag_None")
user.show_message("<span class='notice'>You cut eyeholes into [src].</span>", 1)
user.show_message("<span class='notice'>You cut eyeholes into [src].</span>", MSG_VISUAL)
new /obj/item/clothing/head/papersack(user.loc)
qdel(src)
return 0
else if(item_state == "paperbag_SmileyFace")
user.show_message("<span class='notice'>You cut eyeholes into [src] and modify the design.</span>", 1)
user.show_message("<span class='notice'>You cut eyeholes into [src] and modify the design.</span>", MSG_VISUAL)
new /obj/item/clothing/head/papersack/smiley(user.loc)
qdel(src)
return 0
@@ -875,7 +901,7 @@
#undef HEART
#undef SMILEY
/obj/item/storage/box/ingredients //This box is for the randomely chosen version the chef spawns with, it shouldn't actually exist.
/obj/item/storage/box/ingredients //This box is for the randomly chosen version the chef spawns with, it shouldn't actually exist.
name = "ingredients box"
illustration = "fruit"
var/theme_name
+155 -13
View File
@@ -18,6 +18,12 @@
throw_speed = 3
throw_range = 7
var/empty = FALSE
var/list/possible_icons = list("firstaid","firstaid2","firstaid3","firstaid4")
/obj/item/storage/firstaid/Initialize(mapload)
. = ..()
if(LAZYLEN(possible_icons))
icon_state = pick(possible_icons)
/obj/item/storage/firstaid/regular
icon_state = "firstaid"
@@ -56,17 +62,14 @@
/obj/item/storage/firstaid/fire
name = "burn treatment kit"
desc = "A specialized medical kit for when the toxins lab <i>-spontaneously-</i> burns down."
icon_state = "ointment"
icon_state = "burn"
item_state = "firstaid-ointment"
possible_icons = list("burn","burn2","burn3","burn4")
/obj/item/storage/firstaid/fire/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] begins rubbing \the [src] against [user.p_them()]self! It looks like [user.p_theyre()] trying to start a fire!</span>")
return FIRELOSS
/obj/item/storage/firstaid/fire/Initialize(mapload)
. = ..()
icon_state = pick("ointment","firefirstaid")
/obj/item/storage/firstaid/fire/PopulateContents()
if(empty)
return
@@ -80,17 +83,14 @@
/obj/item/storage/firstaid/toxin
name = "toxin treatment kit"
desc = "Used to treat toxic blood content and radiation poisoning."
icon_state = "antitoxin"
icon_state = "toxin"
item_state = "firstaid-toxin"
possible_icons = list("toxin","toxin2","toxin3","toxin4")
/obj/item/storage/firstaid/toxin/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] begins licking the lead paint off \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return TOXLOSS
/obj/item/storage/firstaid/toxin/Initialize(mapload)
. = ..()
icon_state = pick("antitoxin","antitoxfirstaid","antitoxfirstaid2","antitoxfirstaid3")
/obj/item/storage/firstaid/toxin/PopulateContents()
if(empty)
return
@@ -103,8 +103,9 @@
/obj/item/storage/firstaid/radbgone
name = "radiation treatment kit"
desc = "Used to treat minor toxic blood content and major radiation poisoning."
icon_state = "antitoxin"
icon_state = "rad"
item_state = "firstaid-toxin"
possible_icons = list("rad","rad2","rad3")
/obj/item/storage/firstaid/radbgone/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] begins licking the lead paint off \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
@@ -128,8 +129,9 @@
/obj/item/storage/firstaid/o2
name = "oxygen deprivation treatment kit"
desc = "A box full of oxygen goodies."
icon_state = "o2"
icon_state = "oxy"
item_state = "firstaid-o2"
possible_icons = list("oxy", "oxy2", "oxy3", "oxy4")
/obj/item/storage/firstaid/o2/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] begins hitting [user.p_their()] neck with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
@@ -149,6 +151,7 @@
desc = "A first aid kit for when you get toolboxed."
icon_state = "brute"
item_state = "firstaid-brute"
possible_icons = list("brute", "brute2", "brute3", "brute4")
/obj/item/storage/firstaid/brute/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] begins beating [user.p_them()]self over the head with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
@@ -166,7 +169,8 @@
/obj/item/storage/firstaid/tactical
name = "combat medical kit"
desc = "I hope you've got insurance."
icon_state = "bezerk"
icon_state = "tactical"
possible_icons = null
/obj/item/storage/firstaid/tactical/ComponentInitialize()
. = ..()
@@ -389,3 +393,141 @@
/obj/item/organ_storage
))
//hijacking the minature first aids for hypospray boxes. <3
/obj/item/storage/hypospraykit
name = "hypospray kit"
desc = "It's a kit containing a hypospray and specific treatment chemical-filled vials."
icon_state = "firstaid-mini"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
throw_speed = 3
throw_range = 7
var/empty = FALSE
item_state = "firstaid"
/obj/item/storage/hypospraykit/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
STR.max_items = 12
STR.can_hold = typecacheof(list(
/obj/item/hypospray/mkii,
/obj/item/reagent_containers/glass/bottle/vial))
/obj/item/storage/hypospraykit/regular
icon_state = "firstaid-mini"
desc = "A hypospray kit with general use vials."
/obj/item/storage/hypospraykit/regular/PopulateContents()
if(empty)
return
new /obj/item/hypospray/mkii/tricord(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord(src)
/obj/item/storage/hypospraykit/fire
name = "burn treatment hypospray kit"
desc = "A specialized hypospray kit for burn treatments. Apply with sass."
icon_state = "burn-mini"
item_state = "firstaid-ointment"
/obj/item/storage/hypospraykit/fire/PopulateContents()
if(empty)
return
new /obj/item/hypospray/mkii/burn(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/kelotane(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/kelotane(src)
/obj/item/storage/hypospraykit/toxin
name = "toxin treatment hypospray kit"
icon_state = "toxin-mini"
item_state = "firstaid-toxin"
/obj/item/storage/hypospraykit/toxin/PopulateContents()
if(empty)
return
new /obj/item/hypospray/mkii/toxin(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/antitoxin(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/antitoxin(src)
/obj/item/storage/hypospraykit/o2
name = "oxygen deprivation hypospray kit"
icon_state = "oxy-mini"
item_state = "firstaid-o2"
/obj/item/storage/hypospraykit/o2/PopulateContents()
if(empty)
return
new /obj/item/hypospray/mkii/oxygen(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin(src)
/obj/item/storage/hypospraykit/enlarge
name = "organomegaly trauma hypospray kit"
icon_state = "enlarge-mini"
item_state = "firstaid-brute"
/obj/item/storage/hypospraykit/enlarge/PopulateContents()
if(empty)
return
new /obj/item/hypospray/mkii/enlarge(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/breastreduction(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/breastreduction(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/breastreduction(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/penisreduction(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/penisreduction(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/penisreduction(src)
/obj/item/storage/hypospraykit/brute
name = "brute trauma hypospray kit"
icon_state = "brute-mini"
item_state = "firstaid-brute"
/obj/item/storage/hypospraykit/brute/PopulateContents()
if(empty)
return
new /obj/item/hypospray/mkii/brute(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/bicaridine(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/bicaridine(src)
/obj/item/storage/hypospraykit/tactical
name = "combat hypospray kit"
desc = "A hypospray kit best suited for combat situations."
icon_state = "tactical-mini"
/obj/item/storage/hypospraykit/tactical/PopulateContents()
if(empty)
return
new /obj/item/defibrillator/compact/combat/loaded(src)
new /obj/item/hypospray/mkii/CMO/combat(src)
new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/combat(src)
new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/combat(src)
/obj/item/storage/hypospraykit/cmo
name = "deluxe hypospray kit"
desc = "A kit containing a Deluxe hypospray and Vials."
icon_state = "tactical-mini"
/obj/item/storage/hypospraykit/cmo/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
STR.max_items = 6
STR.can_hold = typecacheof(list(
/obj/item/hypospray/mkii,
/obj/item/reagent_containers/glass/bottle/vial))
/obj/item/storage/hypospraykit/cmo/PopulateContents()
if(empty)
return
new /obj/item/hypospray/mkii/CMO(src)
new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/tricord(src)
new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/charcoal(src)
new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/salglu(src)
new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/dexalin(src)
new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/synthflesh(src)
/obj/item/storage/box/vials
name = "box of hypovials"
/obj/item/storage/box/vials/PopulateContents()
for(var/i in 1 to 7)
new /obj/item/reagent_containers/glass/bottle/vial/small( src )
+9 -1
View File
@@ -37,7 +37,15 @@
/obj/item/screwdriver,
/obj/item/valentine,
/obj/item/stamp,
/obj/item/key))
/obj/item/key,
/obj/item/cartridge,
/obj/item/camera_film,
/obj/item/stack/ore/bluespace_crystal,
/obj/item/reagent_containers/food/snacks/grown/poppy,
/obj/item/instrument/harmonica,
/obj/item/mining_voucher,
/obj/item/suit_voucher,
/obj/item/reagent_containers/pill))
/obj/item/storage/wallet/Exited(atom/movable/AM)
. = ..()
+1 -1
View File
@@ -201,7 +201,7 @@
if(!current_location || current_area.noteleport || is_away_level(current_location.z) || !isturf(user.loc))//If turf was not found or they're on z level 2 or >7 which does not currently exist. or if user is not located on a turf
to_chat(user, "<span class='notice'>\The [src] is malfunctioning.</span>")
return
user.show_message("<span class='notice'>Locked In.</span>", 2)
user.show_message("<span class='notice'>Locked In.</span>", MSG_AUDIBLE)
var/list/obj/effect/portal/created = create_portal_pair(current_location, get_teleport_turf(get_turf(T)), src, 300, 1, null, atmos_link_override)
if(!(LAZYLEN(created) == 2))
return
+15 -6
View File
@@ -122,12 +122,21 @@
user.put_in_active_hand(pryjaws)
/obj/item/wirecutters/power/attack(mob/living/carbon/C, mob/user)
if(istype(C) && C.handcuffed)
user.visible_message("<span class='notice'>[user] cuts [C]'s restraints with [src]!</span>")
qdel(C.handcuffed)
return
else
..()
if(istype(C))
if(C.handcuffed)
user.visible_message("<span class='notice'>[user] cuts [C]'s restraints with [src]!</span>")
qdel(C.handcuffed)
return
else if(C.has_status_effect(STATUS_EFFECT_CHOKINGSTRAND))
var/man = C == user ? "your" : "[C]'\s"
user.visible_message("<span class='notice'>[user] attempts to remove the durathread strand from around [man] neck.</span>", \
"<span class='notice'>You attempt to remove the durathread strand from around [man] neck.</span>")
if(do_after(user, 15, null, C))
user.visible_message("<span class='notice'>[user] succesfuly removes the durathread strand.</span>",
"<span class='notice'>You succesfuly remove the durathread strand.</span>")
C.remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND)
return
..()
/obj/item/wirecutters/advanced
name = "advanced wirecutters"
+22 -1
View File
@@ -182,7 +182,7 @@
return
src.add_fingerprint(user)
if (src.bullets < 1)
user.show_message("<span class='warning'>*click*</span>", 2)
user.show_message("<span class='warning'>*click*</span>", MSG_AUDIBLE)
playsound(src, "gun_dry_fire", 30, 1)
return
playsound(user, 'sound/weapons/gunshot.ogg', 100, 1)
@@ -403,6 +403,7 @@
righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi'
var/active = FALSE
icon = 'icons/obj/items_and_weapons.dmi'
hitsound = 'sound/weapons/smash.ogg'
attack_verb = list("robusted")
/obj/item/toy/windupToolbox/attack_self(mob/user)
@@ -410,13 +411,33 @@
icon_state = "his_grace_awakened"
to_chat(user, "<span class='warning'>You wind up [src], it begins to rumble.</span>")
active = TRUE
playsound(src, 'sound/effects/pope_entry.ogg', 100)
Rumble()
addtimer(CALLBACK(src, .proc/stopRumble), 600)
else
to_chat(user, "[src] is already active.")
/obj/item/toy/windupToolbox/proc/Rumble()
var/static/list/transforms
if(!transforms)
var/matrix/M1 = matrix()
var/matrix/M2 = matrix()
var/matrix/M3 = matrix()
var/matrix/M4 = matrix()
M1.Translate(-1, 0)
M2.Translate(0, 1)
M3.Translate(1, 0)
M4.Translate(0, -1)
transforms = list(M1, M2, M3, M4)
animate(src, transform=transforms[1], time=0.2, loop=-1)
animate(transform=transforms[2], time=0.1)
animate(transform=transforms[3], time=0.2)
animate(transform=transforms[4], time=0.3)
/obj/item/toy/windupToolbox/proc/stopRumble()
icon_state = initial(icon_state)
active = FALSE
animate(src, transform=matrix())
/*
* Subtype of Double-Bladed Energy Swords
@@ -503,7 +503,7 @@
var/mutable_appearance/armrest
/obj/structure/chair/sofa/Initialize()
armrest = mutable_appearance(icon, "[icon_state]_armrest")
armrest = mutable_appearance(icon, "[icon_state]_armrest", ABOVE_MOB_LAYER)
return ..()
/obj/structure/chair/sofa/post_buckle_mob(mob/living/M)
@@ -342,25 +342,21 @@
. = TRUE
if(opened)
if(istype(W, cutting_tool))
var/welder = FALSE
if(istype(W, /obj/item/weldingtool))
if(!W.tool_start_check(user, amount=0))
return
to_chat(user, "<span class='notice'>You begin cutting \the [src] apart...</span>")
if(W.use_tool(src, user, 40, volume=50))
if(eigen_teleport)
to_chat(user, "<span class='notice'>The unstable nature of \the [src] makes it impossible to cut!</span>")
return
if(!opened)
return
user.visible_message("<span class='notice'>[user] slices apart \the [src].</span>",
"<span class='notice'>You cut \the [src] apart with \the [W].</span>",
"<span class='italics'>You hear welding.</span>")
deconstruct(TRUE)
return
else // for example cardboard box is cut with wirecutters
user.visible_message("<span class='notice'>[user] cut apart \the [src].</span>", \
"<span class='notice'>You cut \the [src] apart with \the [W].</span>")
to_chat(user, "<span class='notice'>You begin [welder ? "slicing" : "deconstructing"] \the [src] apart...</span>")
welder = TRUE
if(W.use_tool(src, user, 40, volume=50))
if(eigen_teleport)
to_chat(user, "<span class='notice'>The unstable nature of \the [src] makes it impossible to [welder ? "slice" : "deconstruct"]!</span>")
return
if(!opened)
return
user.visible_message("<span class='notice'>[user] [welder ? "slice" : "deconstruct"]s apart \the [src].</span>",
"<span class='notice'>You [welder ? "slice" : "deconstruct"] \the [src] apart with \the [W].</span>",
"<span class='italics'>You hear [welder ? "welding" : "rustling of screws and metal"].</span>")
deconstruct(TRUE)
return
if(user.transferItemToLoc(W, drop_location())) // so we put in unlit welder too
@@ -4,6 +4,8 @@
icon_state = "cabinet"
resistance_flags = FLAMMABLE
max_integrity = 70
material_drop = /obj/item/stack/sheet/mineral/wood
cutting_tool = /obj/item/screwdriver
/obj/structure/closet/acloset
name = "strange closet"
@@ -4,6 +4,8 @@
icon_state = "cabinet"
resistance_flags = FLAMMABLE
max_integrity = 70
material_drop = /obj/item/stack/sheet/mineral/wood
cutting_tool = /obj/item/screwdriver
/obj/structure/closet/secure_closet/bar/PopulateContents()
..()
@@ -9,12 +9,19 @@
if(registered_name)
. += "<span class='notice'>The display reads, \"Owned by [registered_name]\".</span>"
/obj/structure/closet/secure_closet/personal/check_access(obj/item/card/id/I)
/obj/structure/closet/secure_closet/personal/check_access(obj/item/I)
. = ..()
if(!I || !istype(I))
return
if(registered_name == I.registered_name)
if(istype(I,/obj/item/modular_computer/tablet))
var/obj/item/modular_computer/tablet/ourTablet = I
var/obj/item/computer_hardware/card_slot/card_slot = ourTablet.all_components[MC_CARD]
if(card_slot)
return registered_name == card_slot.stored_card.registered_name || registered_name == card_slot.stored_card2.registered_name
var/obj/item/card/id/ID = I.GetID()
if(ID && registered_name == ID.registered_name)
return TRUE
return FALSE
/obj/structure/closet/secure_closet/personal/PopulateContents()
..()
@@ -37,11 +44,14 @@
icon_state = "cabinet"
resistance_flags = FLAMMABLE
max_integrity = 70
material_drop = /obj/item/stack/sheet/mineral/wood
cutting_tool = /obj/item/screwdriver
/obj/structure/closet/secure_closet/personal/cabinet/PopulateContents()
new /obj/item/storage/backpack/satchel/leather/withwallet( src )
new /obj/item/instrument/piano_synth(src)
new /obj/item/radio/headset( src )
new /obj/item/clothing/head/colour(src)
/obj/structure/closet/secure_closet/personal/attackby(obj/item/W, mob/user, params)
var/obj/item/card/id/I = W.GetID()
@@ -161,12 +161,16 @@
..()
new /obj/item/clothing/accessory/armband/medblue(src)
new /obj/item/encryptionkey/headset_med(src)
/obj/structure/closet/secure_closet/detective
name = "\improper detective's cabinet"
req_access = list(ACCESS_FORENSICS_LOCKERS)
icon_state = "cabinet"
resistance_flags = FLAMMABLE
max_integrity = 70
material_drop = /obj/item/stack/sheet/mineral/wood
cutting_tool = /obj/item/screwdriver
/obj/structure/closet/secure_closet/detective/PopulateContents()
..()
new /obj/item/clothing/under/rank/det(src)
@@ -4,6 +4,8 @@
icon_state = "largebins"
open_sound = 'sound/effects/bin_open.ogg'
close_sound = 'sound/effects/bin_close.ogg'
material_drop = /obj/item/stack/sheet/plastic
material_drop_amount = 40
anchored = TRUE
horizontal = FALSE
delivery_icon = null
@@ -151,6 +151,9 @@
log_admin("[key_name(new_spawn)] possessed a golem shell enslaved to [key_name(owner)].")
if(ishuman(new_spawn))
var/mob/living/carbon/human/H = new_spawn
if(has_owner)
var/datum/species/golem/G = H.dna.species
G.owner = owner
H.set_cloned_appearance()
if(!name)
if(has_owner)
@@ -321,8 +324,9 @@
/datum/outfit/hotelstaff
name = "Hotel Staff"
uniform = /obj/item/clothing/under/assistantformal
uniform = /obj/item/clothing/under/telegram
shoes = /obj/item/clothing/shoes/laceup
head = /obj/item/clothing/head/hotel
r_pocket = /obj/item/radio/off
back = /obj/item/storage/backpack
implants = list(/obj/item/implant/mindshield)
+35 -12
View File
@@ -1,5 +1,7 @@
//Loom, turns raw cotton and durathread into their respective fabrics.
#define FABRIC_PER_SHEET 4
///This is a loom. It's usually made out of wood and used to weave fabric like durathread or cotton into their respective cloth types.
/obj/structure/loom
name = "loom"
desc = "A simple device used to weave cloth and other thread-based fabrics together into usable material."
@@ -8,14 +10,35 @@
density = TRUE
anchored = TRUE
/obj/structure/loom/attackby(obj/item/stack/sheet/W, mob/user)
if(W.is_fabric && W.amount > 1)
user.show_message("<span class='notice'>You start weaving the [W.name] through the loom..</span>", 1)
if(W.use_tool(src, user, W.pull_effort))
new W.loom_result(drop_location())
user.show_message("<span class='notice'>You weave the [W.name] into a workable fabric.</span>", 1)
W.amount = (W.amount - 2)
if(W.amount < 1)
qdel(W)
else
user.show_message("<span class='notice'>You need a valid fabric and at least 2 of said fabric before using this.</span>", 1)
/obj/structure/loom/attackby(obj/item/I, mob/user)
if(weave(I, user))
return
return ..()
/obj/structure/loom/wrench_act(mob/living/user, obj/item/I)
..()
default_unfasten_wrench(user, I, 5)
return TRUE
///Handles the weaving.
/obj/structure/loom/proc/weave(obj/item/stack/sheet/S, mob/user)
if(!istype(S) || !S.is_fabric)
return FALSE
if(!anchored)
user.show_message("<span class='notice'>The loom needs to be wrenched down.</span>", MSG_VISUAL)
return FALSE
if(S.amount < FABRIC_PER_SHEET)
user.show_message("<span class='notice'>You need at least [FABRIC_PER_SHEET] units of fabric before using this.</span>", 1)
return FALSE
user.show_message("<span class='notice'>You start weaving \the [S.name] through the loom..</span>", MSG_VISUAL)
if(S.use_tool(src, user, S.pull_effort))
if(S.amount >= FABRIC_PER_SHEET)
new S.loom_result(drop_location())
S.use(FABRIC_PER_SHEET)
user.show_message("<span class='notice'>You weave \the [S.name] into a workable fabric.</span>", MSG_VISUAL)
return TRUE
/obj/structure/loom/unanchored
anchored = FALSE
#undef FABRIC_PER_SHEET
+6 -2
View File
@@ -226,9 +226,13 @@
if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return
if(new_eye_color)
H.eye_color = sanitize_hexcolor(new_eye_color)
var/n_color = sanitize_hexcolor(new_eye_color)
var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES)
if(eyes)
eyes.eye_color = n_color
H.eye_color = n_color
H.dna.update_ui_block(DNA_EYE_COLOR_BLOCK)
H.update_body()
H.dna.species.handle_body()
if(choice)
curse(user)
+1 -1
View File
@@ -193,7 +193,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
icon_state = "morgue4" // Cloneable
if(mob_occupant.stat == DEAD && beeper)
if(world.time > next_beep)
playsound(src, 'sound/weapons/smg_empty_alarm.ogg', 50, 0) //Clone them you blind fucks
playsound(src, 'sound/machines/beeping_alarm.ogg', 50, 0) //Clone them you blind fucks
next_beep = world.time + beep_cooldown
break
@@ -15,6 +15,15 @@
var/flipped_build_type
var/base_icon
/obj/structure/c_transit_tube/proc/can_wrench_in_loc(mob/user)
var/turf/source_turf = get_turf(loc)
var/existing_tubes = 0
for(var/obj/structure/transit_tube/tube in source_turf)
existing_tubes++
if(existing_tubes >= 2)
to_chat(user, "<span class='warning'>You cannot wrench any more transit tubes!</span>")
return FALSE
return TRUE
/obj/structure/c_transit_tube/ComponentInitialize()
. = ..()
@@ -32,9 +41,11 @@
icon_state = "[base_icon][flipped]"
/obj/structure/c_transit_tube/wrench_act(mob/living/user, obj/item/I)
if(!can_wrench_in_loc(user))
return
to_chat(user, "<span class='notice'>You start attaching the [name]...</span>")
add_fingerprint(user)
if(I.use_tool(src, user, time_to_unwrench, volume=50))
if(I.use_tool(src, user, time_to_unwrench, volume=50, extra_checks=CALLBACK(src, .proc/can_wrench_in_loc, user)))
to_chat(user, "<span class='notice'>You attach the [name].</span>")
var/obj/structure/transit_tube/R = new build_type(loc, dir)
transfer_fingerprints_to(R)