Merge remote-tracking branch 'upstream/master' into universal-damage

# Conflicts:
#	code/game/machinery/machinery.dm
#	code/game/objects/items.dm
#	code/game/objects/structures.dm
#	code/game/objects/structures/inflatable.dm
#	code/game/objects/structures/mirror.dm
#	code/modules/clothing/spacesuits/hardsuit.dm
#	code/modules/clothing/suits/wiz_robe.dm
#	code/modules/mob/living/carbon/alien/alien_defense.dm
#	code/modules/mob/living/carbon/slime/slime.dm
#	code/modules/mob/living/simple_animal/friendly/slime.dm
This commit is contained in:
Fox McCloud
2019-09-28 00:16:11 -04:00
375 changed files with 4142 additions and 3725 deletions
+1 -1
View File
@@ -111,7 +111,7 @@
return
playsound(loc, 'sound/items/eatfood.ogg', 50, 0)
to_chat(user, "<span class='notice'>You take a [huffable ? "huff" : "bite"] of the [name]. Delicious!</span>")
user.nutrition += 5
user.adjust_nutrition(5)
if(uses)
uses -= 5
if(uses <= 0)
@@ -68,8 +68,8 @@
/obj/item/lightreplacer/examine(mob/user)
..()
to_chat(user, status_string())
. = ..()
. += status_string()
/obj/item/lightreplacer/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/stack/sheet/glass))
@@ -29,5 +29,5 @@
mode = input("Which colour do you want to use?", "Pipe Painter", mode) in modes
/obj/item/pipe_painter/examine(mob/user)
..(user)
to_chat(user, "It is in [mode] mode.")
. = ..()
. += "<span class='notice'>It is in [mode] mode.</span>"
@@ -48,12 +48,11 @@
/obj/item/radio/headset/list_channels(var/mob/user)
return list_secure_channels()
/obj/item/radio/headset/examine(mob/user, var/distance = -1)
if(!(..(user, 1) && radio_desc))
return
to_chat(user, "The following channels are available:")
to_chat(user, radio_desc)
/obj/item/radio/headset/examine(mob/user)
. = ..()
if(in_range(src, user) && radio_desc)
. += "The following channels are available:"
. += radio_desc
/obj/item/radio/headset/handle_message_mode(mob/living/M as mob, list/message_pieces, channel)
if(channel == "special")
@@ -595,14 +595,13 @@ var/global/list/default_medbay_channels = list(
return null
/obj/item/radio/examine(mob/user, var/distance = -1)
. = ..(user, distance)
if((in_range(src, user) || loc == user))
/obj/item/radio/examine(mob/user)
. = ..()
if(in_range(src, user) || loc == user)
if(b_stat)
user.show_message("<span class='notice'>\the [src] can be attached and modified!</span>")
. += "<span class='notice'>\the [src] can be attached and modified!</span>"
else
user.show_message("<span class='notice'>\the [src] can not be modified or attached!</span>")
return .
. += "<span class='notice'>\the [src] can not be modified or attached!</span>"
/obj/item/radio/attackby(obj/item/W as obj, mob/user as mob, params)
..()
+32 -25
View File
@@ -339,8 +339,8 @@ proc/healthscan(mob/user, mob/living/M, mode = 1, upgraded = FALSE)
var/accuracy // 0 is the best accuracy.
/obj/item/analyzer/examine(mob/user)
.=..()
to_chat(user, "<span class='info'>Alt-click [src] to activate the barometer function.</span>")
. = ..()
. += "<span class='info'>Alt-click [src] to activate the barometer function.</span>"
/obj/item/analyzer/attack_self(mob/user as mob)
@@ -547,39 +547,46 @@ proc/healthscan(mob/user, mob/living/M, mode = 1, upgraded = FALSE)
throw_range = 7
materials = list(MAT_METAL=30, MAT_GLASS=20)
/obj/item/slime_scanner/attack(mob/living/M as mob, mob/living/user as mob)
slime_scan(M, user)
/proc/slime_scan(mob/living/carbon/slime/M, mob/living/user)
if(!isslime(M))
user.show_message("<span class='warning'>This device can only scan slimes!</span>", 1)
/obj/item/slime_scanner/attack(mob/living/M, mob/living/user)
if(user.incapacitated() || user.eye_blind)
return
var/mob/living/carbon/slime/T = M
user.show_message("Slime scan results:", 1)
user.show_message(text("[T.colour] [] slime", T.is_adult ? "adult" : "baby"), 1)
user.show_message(text("Nutrition: [T.nutrition]/[]", T.get_max_nutrition()), 1)
if(!isslime(M))
to_chat(user, "<span class='warning'>This device can only scan slimes!</span>")
return
var/mob/living/simple_animal/slime/T = M
slime_scan(T, user)
/proc/slime_scan(mob/living/simple_animal/slime/T, mob/living/user)
to_chat(user, "========================")
to_chat(user, "<b>Slime scan results:</b>")
to_chat(user, "<span class='notice'>[T.colour] [T.is_adult ? "adult" : "baby"] slime</span>")
to_chat(user, "Nutrition: [T.nutrition]/[T.get_max_nutrition()]")
if(T.nutrition < T.get_starve_nutrition())
user.show_message("<span class='warning'>Warning: slime is starving!</span>", 1)
to_chat(user, "<span class='warning'>Warning: slime is starving!</span>")
else if(T.nutrition < T.get_hunger_nutrition())
user.show_message("<span class='warning'>Warning: slime is hungry</span>", 1)
user.show_message("Electric change strength: [T.powerlevel]", 1)
user.show_message("Health: [T.health]", 1)
to_chat(user, "<span class='warning'>Warning: slime is hungry</span>")
to_chat(user, "Electric change strength: [T.powerlevel]")
to_chat(user, "Health: [round(T.health/T.maxHealth,0.01)*100]%")
if(T.slime_mutation[4] == T.colour)
user.show_message("This slime does not evolve any further.", 1)
to_chat(user, "This slime does not evolve any further.")
else
if(T.slime_mutation[3] == T.slime_mutation[4])
if(T.slime_mutation[2] == T.slime_mutation[1])
user.show_message("Possible mutation: [T.slime_mutation[3]]", 1)
user.show_message("Genetic destability: [T.mutation_chance/2]% chance of mutation on splitting", 1)
to_chat(user, "Possible mutation: [T.slime_mutation[3]]")
to_chat(user, "Genetic destability: [T.mutation_chance/2] % chance of mutation on splitting")
else
user.show_message("Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]] (x2)", 1)
user.show_message("Genetic destability: [T.mutation_chance]% chance of mutation on splitting", 1)
to_chat(user, "Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]] (x2)")
to_chat(user, "Genetic destability: [T.mutation_chance] % chance of mutation on splitting")
else
user.show_message("Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]], [T.slime_mutation[4]]", 1)
user.show_message("Genetic destability: [T.mutation_chance]% chance of mutation on splitting", 1)
to_chat(user, "Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]], [T.slime_mutation[4]]")
to_chat(user, "Genetic destability: [T.mutation_chance] % chance of mutation on splitting")
if(T.cores > 1)
user.show_message("Anomalous slime core amount detected", 1)
user.show_message("Growth progress: [T.amount_grown]/10", 1)
to_chat(user, "Multiple cores detected")
to_chat(user, "Growth progress: [T.amount_grown]/[SLIME_EVOLUTION_THRESHOLD]")
if(T.effectmod)
to_chat(user, "<span class='notice'>Core mutation in progress: [T.effectmod]</span>")
to_chat(user, "<span class='notice'>Progress in core mutation: [T.applied] / [SLIME_EXTRACT_CROSSING_REQUIRED]</span>")
to_chat(user, "========================")
/obj/item/bodyanalyzer
name = "handheld body analyzer"
@@ -26,8 +26,9 @@
return ..()
/obj/item/taperecorder/examine(mob/user)
if(..(user, 1))
to_chat(user, "The wire panel is [open_panel ? "opened" : "closed"].")
. = ..()
if(in_range(user, src))
. += "The wire panel is [open_panel ? "opened" : "closed"]."
/obj/item/taperecorder/attackby(obj/item/I, mob/user)
@@ -31,11 +31,11 @@ effective or pretty fucking useless.
var/max_uses = 5
/obj/item/batterer/examine(mob/user)
..(user)
. = ..()
if(times_used >= max_uses)
to_chat(user, "<span class='notice'>[src] is out of charge.</span>")
. += "<span class='notice'>[src] is out of charge.</span>"
if(times_used < max_uses)
to_chat(user, "<span class='notice'>[src] has [max_uses-times_used] charges left.</span>")
. += "<span class='notice'>[src] has [max_uses-times_used] charges left.</span>"
/obj/item/batterer/attack_self(mob/living/carbon/user, flag = 0, emp = 0)
if(!user)
+5 -4
View File
@@ -49,12 +49,13 @@
return ..()
/obj/item/stack/examine(mob/user)
if(..(user, 1))
. = ..()
if(in_range(user, src))
if(singular_name)
to_chat(user, "There are [amount] [singular_name]\s in the stack.")
. += "There are [amount] [singular_name]\s in the stack."
else
to_chat(user, "There are [amount] [name]\s in the stack.")
to_chat(user,"<span class='notice'>Alt-click to take a custom amount.</span>")
. += "There are [amount] [name]\s in the stack."
. +="<span class='notice'>Alt-click to take a custom amount.</span>"
/obj/item/stack/proc/add(newamount)
amount += newamount
+6 -5
View File
@@ -642,13 +642,14 @@ obj/item/toy/cards/singlecard
obj/item/toy/cards/singlecard/examine(mob/user)
if(..(user, 0))
. = ..()
if(get_dist(user, src) <= 0)
if(ishuman(user))
var/mob/living/carbon/human/cardUser = user
if(cardUser.get_item_by_slot(slot_l_hand) == src || cardUser.get_item_by_slot(slot_r_hand) == src)
cardUser.visible_message("<span class='notice'>[cardUser] checks [cardUser.p_their()] card.</span>", "<span class='notice'>The card reads: [src.cardname]</span>")
else
to_chat(cardUser, "<span class='notice'>You need to have the card in your hand to check it.</span>")
. += "<span class='notice'>You need to have the card in your hand to check it.</span>"
obj/item/toy/cards/singlecard/verb/Flip()
@@ -1471,9 +1472,9 @@ obj/item/toy/cards/deck/syndicate/black
fake_bullets = rand(2, 7)
/obj/item/toy/russian_revolver/trick_revolver/examine(mob/user) //Sneaky sneaky
..()
to_chat(user, "Has [fake_bullets] round\s remaining.")
to_chat(user, "[fake_bullets] of those are live rounds.")
. = ..()
. += "Has [fake_bullets] round\s remaining."
. += "[fake_bullets] of those are live rounds."
/obj/item/toy/russian_revolver/trick_revolver/post_shot(user)
to_chat(user, "<span class='danger'>[src] did look pretty dodgey!</span>")
+2 -2
View File
@@ -83,8 +83,8 @@ GLOBAL_LIST_INIT(rcd_door_types, list(
/obj/item/rcd/examine(mob/user)
. = ..()
to_chat(user, "MATTER: [matter]/[max_matter] matter-units.")
to_chat(user, "MODE: [mode].")
. += "MATTER: [matter]/[max_matter] matter-units."
. += "MODE: [mode]."
/obj/item/rcd/Destroy()
QDEL_NULL(spark_system)
+2 -2
View File
@@ -57,9 +57,9 @@
..()
/obj/item/twohanded/rcl/examine(mob/user)
..()
. = ..()
if(loaded)
to_chat(user, "<span class='info'>It contains [loaded.amount]/[max_amount] cables.</span>")
. += "<span class='info'>It contains [loaded.amount]/[max_amount] cables.</span>"
/obj/item/twohanded/rcl/Destroy()
QDEL_NULL(loaded)
@@ -23,12 +23,12 @@
return ..()
/obj/item/bee_briefcase/examine(mob/user)
..()
. = ..()
if(loc == user)
if(bees_left)
to_chat(user, "<span class='warning'>There are [bees_left] bees still inside in briefcase!</span>")
. += "<span class='warning'>There are [bees_left] bees still inside in briefcase!</span>"
else
to_chat(user, "<span class='danger'>The bees are gone... Colony collapse disorder?</span>")
. += "<span class='danger'>The bees are gone... Colony collapse disorder?</span>"
/obj/item/bee_briefcase/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/reagent_containers/syringe))
+9 -9
View File
@@ -120,20 +120,21 @@
SetOwnerInfo(H)
/obj/item/card/id/examine(mob/user)
if(..(user, 1))
. = ..()
if(in_range(user, src))
show(usr)
else
to_chat(user, "<span class='warning'>It is too far away.</span>")
. += "<span class='warning'>It is too far away.</span>"
if(guest_pass)
to_chat(user, "<span class='notice'>There is a guest pass attached to this ID card</span>")
. += "<span class='notice'>There is a guest pass attached to this ID card</span>"
if(world.time < guest_pass.expiration_time)
to_chat(user, "<span class='notice'>It expires at [station_time_timestamp("hh:mm:ss", guest_pass.expiration_time)].</span>")
. += "<span class='notice'>It expires at [station_time_timestamp("hh:mm:ss", guest_pass.expiration_time)].</span>"
else
to_chat(user, "<span class='warning'>It expired at [station_time_timestamp("hh:mm:ss", guest_pass.expiration_time)].</span>")
to_chat(user, "<span class='notice'>It grants access to following areas:</span>")
. += "<span class='warning'>It expired at [station_time_timestamp("hh:mm:ss", guest_pass.expiration_time)].</span>"
. += "<span class='notice'>It grants access to following areas:</span>"
for(var/A in guest_pass.temp_access)
to_chat(user, "<span class='notice'>[get_access_desc(A)].</span>")
to_chat(user, "<span class='notice'>Issuing reason: [guest_pass.reason].</span>")
. += "<span class='notice'>[get_access_desc(A)].</span>"
. += "<span class='notice'>Issuing reason: [guest_pass.reason].</span>"
/obj/item/card/id/proc/show(mob/user as mob)
var/datum/asset/assets = get_asset_datum(/datum/asset/simple/paper)
@@ -143,7 +144,6 @@
popup.set_content(dat)
popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
return
/obj/item/card/id/attack_self(mob/user as mob)
user.visible_message("[user] shows you: [bicon(src)] [src.name]. The assignment on the card: [src.assignment]",\
+2 -2
View File
@@ -45,8 +45,8 @@
update_charge()
/obj/item/defibrillator/examine(mob/user)
..(user)
to_chat(user, "<span class='notice'>Ctrl-click to remove the paddles from the defibrillator.</span>")
. = ..()
. += "<span class='notice'>Ctrl-click to remove the paddles from the defibrillator.</span>"
/obj/item/defibrillator/proc/update_power()
if(bcell)
@@ -41,7 +41,7 @@
/obj/item/extinguisher/examine(mob/user)
. = ..()
to_chat(user, "<span class='notice'>The safety is [safety ? "on" : "off"].</span>")
. += "<span class='notice'>The safety is [safety ? "on" : "off"].</span>"
/obj/item/extinguisher/New()
@@ -142,9 +142,9 @@
update_icon()
/obj/item/flamethrower/examine(mob/user)
..()
. = ..()
if(ptank)
to_chat(user, "<span class='notice'>[src] has \a [ptank] attached. Alt-click to remove it.</span>")
. += "<span class='notice'>[src] has \a [ptank] attached. Alt-click to remove it.</span>"
/obj/item/flamethrower/proc/toggle_igniter(mob/user)
if(!ptank)
@@ -37,7 +37,7 @@
return ..()
/obj/item/grenade/chem_grenade/examine(mob/user)
..(user)
. = ..()
display_timer = (stage == READY && !nadeassembly) //show/hide the timer based on assembly state
@@ -62,5 +62,5 @@
qdel(src)
/obj/item/grenade/iedcasing/examine(mob/user)
..()
to_chat(user, "You can't tell when it will explode!")
. = ..()
. += "You can't tell when it will explode!"
@@ -54,12 +54,12 @@
/obj/item/grenade/examine(mob/user)
..(user)
. = ..()
if(display_timer)
if(det_time > 1)
to_chat(user, "The timer is set to [det_time/10] second\s.")
. += "The timer is set to [det_time/10] second\s."
else
to_chat(user, "\The [src] is set for instant detonation.")
. += "\The [src] is set for instant detonation."
/obj/item/grenade/attack_self(mob/user as mob)
if(!active)
@@ -47,7 +47,7 @@
/obj/item/nullrod/examine(mob/living/user)
. = ..()
if(sanctify_force)
to_chat(user, "<span class='notice'>It bears the inscription: 'Sanctified weapon of the inquisitors. Only the worthy may wield. Nobody shall expect us.'</span>")
. += "<span class='notice'>It bears the inscription: 'Sanctified weapon of the inquisitors. Only the worthy may wield. Nobody shall expect us.'</span>"
/obj/item/nullrod/proc/reskin_holy_weapon(mob/M)
var/list/holy_weapons_list = typesof(/obj/item/nullrod)
@@ -619,6 +619,7 @@
/obj/item/nullrod/missionary_staff/proc/do_convert(mob/living/carbon/human/target, mob/living/carbon/human/missionary)
var/convert_duration = 6000 //10 min
if(!target || !ishuman(target) || !missionary || !ishuman(missionary))
return
if(ismindslave(target) || target.mind.zealot_master) //mindslaves and zealots override the staff because the staff is just a temporary mindslave
@@ -17,64 +17,65 @@
return dat
/obj/item/implant/traitor/implant(mob/M, mob/user)
if(!M.mind) // If the target is catatonic or doesn't have a mind, don't let them use it
to_chat(user, "<span class='warning'><i>This person doesn't have a mind for you to slave!</i></span>")
return 0
if(!activated) //So you can't just keep taking it out and putting it back into other people.
var/mob/living/carbon/human/H = M
if(ismindslave(H))
H.visible_message("<span class='warning'>[H] seems to resist the implant!</span>", "<span class='warning'>You feel a strange sensation in your head that quickly dissipates.</span>")
var/mob/living/carbon/human/mindslave_target = M
if(ismindslave(mindslave_target))
mindslave_target.visible_message("<span class='warning'>[mindslave_target] seems to resist the implant!</span>", "<span class='warning'>You feel a strange sensation in your head that quickly dissipates.</span>")
qdel(src)
return -1
if(..())
var/list/implanters
var/ref = "\ref[user.mind]"
if(!ishuman(M))
if(!ishuman(mindslave_target))
return 0
if(!M.mind)
if(!mindslave_target.mind)
return 0
if(M == user)
if(mindslave_target == user)
to_chat(user, "<span class='notice'>Making yourself loyal to yourself was a great idea! Perhaps even the best idea ever! Actually, you just feel like an idiot.</span>")
if(isliving(user))
var/mob/living/L = user
L.adjustBrainLoss(20)
removed(M)
removed(mindslave_target)
qdel(src)
return -1
if(ismindshielded(mindslave_target))
mindslave_target.visible_message("<span class='warning'>[mindslave_target] seems to resist the implant!</span>", "<span class='warning'>You feel a strange sensation in your head that quickly dissipates.</span>")
removed(mindslave_target)
qdel(src)
return -1
if(ismindshielded(H))
H.visible_message("<span class='warning'>[H] seems to resist the implant!</span>", "<span class='warning'>You feel a strange sensation in your head that quickly dissipates.</span>")
removed(M)
qdel(src)
return -1
H.implanting = 1
to_chat(H, "<span class='notice'>You feel completely loyal to [user.name].</span>")
mindslave_target.implanting = 1
to_chat(mindslave_target, "<span class='notice'>You feel completely loyal to [user.name].</span>")
if(!(user.mind in SSticker.mode.implanter))
SSticker.mode.implanter[ref] = list()
implanters = SSticker.mode.implanter[ref]
implanters.Add(H.mind)
SSticker.mode.implanted.Add(H.mind)
SSticker.mode.implanted[H.mind] = user.mind
//SSticker.mode.implanter[user.mind] += H.mind
SSticker.mode.implanter[ref] = implanters
SSticker.mode.traitors += H.mind
H.mind.special_role = SPECIAL_ROLE_TRAITOR
to_chat(H, "<span class='warning'><B>You're now completely loyal to [user.name]!</B> You now must lay down your life to protect [user.p_them()] and assist in [user.p_their()] goals at any cost.</span>")
SSticker.mode.implanter[user.mind] = list()
implanters = SSticker.mode.implanter[user.mind]
implanters.Add(mindslave_target.mind)
SSticker.mode.implanted.Add(mindslave_target.mind)
SSticker.mode.implanted[mindslave_target.mind] = user.mind
SSticker.mode.implanter[user.mind] = implanters
SSticker.mode.traitors += mindslave_target.mind
to_chat(mindslave_target, "<span class='warning'><B>You're now completely loyal to [user.name]!</B> You now must lay down your life to protect [user.p_them()] and assist in [user.p_their()] goals at any cost.</span>")
var/datum/objective/protect/mindslave/MS = new
MS.owner = H.mind
MS.owner = mindslave_target.mind
MS.target = user.mind
MS.explanation_text = "Obey every order from and protect [user.real_name], the [user.mind.assigned_role == user.mind.special_role ? (user.mind.special_role) : (user.mind.assigned_role)]."
H.mind.objectives += MS
for(var/datum/objective/objective in H.mind.objectives)
to_chat(H, "<B>Objective #1</B>: [objective.explanation_text]")
var/datum/antagonist/mindslave/S = new()
S.add_objective(MS)
mindslave_target.mind.add_antag_datum(S)
SSticker.mode.update_traitor_icons_added(user.mind)
SSticker.mode.update_traitor_icons_added(H.mind)//handles datahuds/observerhuds
var/datum/mindslaves/slaved = user.mind.som
mindslave_target.mind.som = slaved
slaved.serv += mindslave_target
slaved.add_serv_hud(user.mind, "master") //handles master servent icons
slaved.add_serv_hud(mindslave_target.mind, "mindslave")
if(user.mind.som)//do not add if not a traitor..and you just picked up an implanter in the hall...
var/datum/mindslaves/slaved = user.mind.som
H.mind.som = slaved
slaved.serv += H
slaved.add_serv_hud(user.mind, "master") //handles master servent icons
slaved.add_serv_hud(H.mind, "mindslave")
log_admin("[key_name(user)] has mind-slaved [key_name(H)].")
log_admin("[key_name(user)] has mind-slaved [key_name(mindslave_target)].")
activated = 1
if(jobban_isbanned(M, ROLE_SYNDICATE))
SSticker.mode.replace_jobbanned_player(M, ROLE_SYNDICATE)
@@ -83,6 +84,7 @@
/obj/item/implant/traitor/removed(mob/target)
if(..())
SSticker.mode.remove_traitor_mind(target.mind)
target.mind.remove_antag_datum(/datum/antagonist/mindslave)
to_chat(target, "<span class='warning'>You are no longer a mindslave: you have complete and free control of your own faculties, once more!</span>")
return 1
return 0
return 0
@@ -79,7 +79,7 @@
return
var/mob/M = G.affecting
if(M.has_buckled_mobs())
to_chat(usr, "[M] will not fit into [src] because [M.p_they()] [M.p_have()] a slime latched onto [M.p_their()] head.")
to_chat(user, "[M] will not fit into [src] because [M.p_they()] [M.p_have()] a slime latched onto [M.p_their()] head.")
return
if(put_mob(M))
qdel(G)
+3 -4
View File
@@ -151,12 +151,11 @@
w_class = WEIGHT_CLASS_NORMAL
/obj/item/kitchen/knife/butcher/meatcleaver
name = "Meat Cleaver"
name = "meat cleaver"
icon_state = "mcleaver"
item_state = "butch"
desc = "A huge thing used for chopping and chopping up meat. This includes clowns and clown-by-products."
force = 25.0
throwforce = 15.0
force = 25
throwforce = 15
/obj/item/kitchen/knife/combat
name = "combat knife"
@@ -332,10 +332,10 @@
add_fingerprint(user)
/obj/item/melee/energy/cleaving_saw/examine(mob/user)
..()
to_chat(user, "<span class='notice'>It is [active ? "open, will cleave enemies in a wide arc and deal additional damage to fauna":"closed, and can be used for rapid consecutive attacks that cause fauna to bleed"].<br>\
. = ..()
. += "<span class='notice'>It is [active ? "open, will cleave enemies in a wide arc and deal additional damage to fauna":"closed, and can be used for rapid consecutive attacks that cause fauna to bleed"].<br>\
Both modes will build up existing bleed effects, doing a burst of high damage if the bleed is built up high enough.<br>\
Transforming it immediately after an attack causes the next attack to come out faster.</span>")
Transforming it immediately after an attack causes the next attack to come out faster.</span>"
/obj/item/melee/energy/cleaving_saw/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is [active ? "closing [src] on [user.p_their()] neck" : "opening [src] into [user.p_their()] chest"]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
+2 -2
View File
@@ -106,8 +106,8 @@
reagents.add_reagent(refill_reagent, refill_rate)
/obj/item/mop/advanced/examine(mob/user)
..()
to_chat(user, "<span class='notice'>The condenser switch is set to <b>[refill_enabled ? "ON" : "OFF"]</b>.</span>")
. = ..()
. += "<span class='notice'>The condenser switch is set to <b>[refill_enabled ? "ON" : "OFF"]</b>.</span>"
/obj/item/mop/advanced/Destroy()
if(refill_enabled)
@@ -23,16 +23,14 @@
return ..()
/obj/item/pneumatic_cannon/examine(mob/user)
..()
. = ..()
if(!in_range(user, src))
to_chat(user, "<span class='notice'>You'll need to get closer to see any more.</span>")
return
for(var/obj/item/I in loadedItems)
spawn(0)
to_chat(user, "<span class='info'>[bicon(I)] It has \the [I] loaded.</span>")
if(tank)
to_chat(user, "<span class='notice'>[bicon(tank)] It has \the [tank] mounted onto it.</span>")
. += "<span class='notice'>You'll need to get closer to see any more.</span>"
else
if(tank)
. += "<span class='notice'>[bicon(tank)] It has \the [tank] mounted onto it.</span>"
for(var/obj/item/I in loadedItems)
. += "<span class='info'>[bicon(I)] It has \the [I] loaded.</span>"
/obj/item/pneumatic_cannon/attackby(obj/item/W, mob/user, params)
..()
+4 -5
View File
@@ -23,12 +23,11 @@
return ..()
/obj/item/melee/powerfist/examine(mob/user)
..()
. = ..()
if(!in_range(user, src))
to_chat(user, "<span class='notice'>You'll need to get closer to see any more.</span>")
return
if(tank)
to_chat(user, "<span class='notice'>[bicon(tank)] It has [tank] mounted onto it.</span>")
. += "<span class='notice'>You'll need to get closer to see any more.</span>"
else if(tank)
. += "<span class='notice'>[bicon(tank)] It has [tank] mounted onto it.</span>"
/obj/item/melee/powerfist/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/tank))
@@ -85,6 +85,9 @@
if(user && user.buckled)
user.buckled.unbuckle_mob(user, force = TRUE)
if(user && user.has_buckled_mobs())
user.unbuckle_all_mobs(force = TRUE)
var/list/tempL = L
var/attempt = null
var/success = 0
+1 -1
View File
@@ -31,7 +31,7 @@
if(muncher && isdrask(muncher))
to_chat(user, "You take a bite of the [name]. Delicious!")
playsound(user.loc, 'sound/items/eatfood.ogg', 50, 0)
user.nutrition += 2
user.adjust_nutrition(2)
else if(istype(target,/obj/effect/decal/cleanable))
user.visible_message("<span class='warning'>[user] begins to scrub \the [target.name] out with [src].</span>")
if(do_after(user, cleanspeed, target = target) && target)
@@ -29,20 +29,20 @@
/obj/item/storage/backpack/examine(mob/user)
var/space_used = 0
if(!..(user, 1))
return
for(var/obj/item/I in contents)
space_used += I.w_class
if(!space_used)
to_chat(user, "<span class='notice'> [src] is empty.</span>")
else if(space_used <= max_combined_w_class*0.6)
to_chat(user, "<span class='notice'> [src] still has plenty of remaining space.</span>")
else if(space_used <= max_combined_w_class*0.8)
to_chat(user, "<span class='notice'> [src] is beginning to run out of space.</span>")
else if(space_used < max_combined_w_class)
to_chat(user, "<span class='notice'> [src] doesn't have much space left.</span>")
else
to_chat(user, "<span class='notice'> [src] is full.</span>")
. = ..()
if(in_range(user, src))
for(var/obj/item/I in contents)
space_used += I.w_class
if(!space_used)
. += "<span class='notice'> [src] is empty.</span>"
else if(space_used <= max_combined_w_class*0.6)
. += "<span class='notice'> [src] still has plenty of remaining space.</span>"
else if(space_used <= max_combined_w_class*0.8)
. += "<span class='notice'> [src] is beginning to run out of space.</span>"
else if(space_used < max_combined_w_class)
. += "<span class='notice'> [src] doesn't have much space left.</span>"
else
. += "<span class='notice'> [src] is full.</span>"
/*
* Backpack Types
@@ -26,15 +26,15 @@
return
/obj/item/storage/fancy/examine(mob/user)
if(!..(user, 1))
return
if(contents.len <= 0)
to_chat(user, "There are no [src.icon_type]s left in the box.")
else if(contents.len == 1)
to_chat(user, "There is one [src.icon_type] left in the box.")
else
to_chat(user, "There are [src.contents.len] [src.icon_type]s in the box.")
. = ..()
if(in_range(user, src))
var/len = LAZYLEN(contents)
if(len <= 0)
. += "There are no [src.icon_type]s left in the box."
else if(len == 1)
. += "There is one [src.icon_type] left in the box."
else
. += "There are [src.contents.len] [src.icon_type]s in the box."
@@ -28,8 +28,9 @@
max_combined_w_class = 14
/obj/item/storage/secure/examine(mob/user)
if(..(user, 1))
to_chat(user, text("The service panel is [open ? "open" : "closed"]."))
. = ..()
if(in_range(user, src))
. += "The service panel is [open ? "open" : "closed"]."
/obj/item/storage/secure/attackby(obj/item/W as obj, mob/user as mob, params)
if(locked)
+4 -4
View File
@@ -74,13 +74,13 @@
icon_state = "[base_icon]"
/obj/item/melee/baton/examine(mob/user)
..(user)
. = ..()
if(isrobot(loc))
to_chat(user, "<span class='notice'>This baton is drawing power directly from your own internal charge.</span>")
. += "<span class='notice'>This baton is drawing power directly from your own internal charge.</span>"
if(bcell)
to_chat(user, "<span class='notice'>The baton is [round(bcell.percent())]% charged.</span>")
. += "<span class='notice'>The baton is [round(bcell.percent())]% charged.</span>"
if(!bcell)
to_chat(user, "<span class='warning'>The baton does not have a power source installed.</span>")
. += "<span class='warning'>The baton does not have a power source installed.</span>"
/obj/item/melee/baton/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/stock_parts/cell))
@@ -35,11 +35,9 @@
/obj/item/tank/jetpack/examine(mob/user)
if(!..(user, 0))
return
if(air_contents.oxygen < 10)
to_chat(user, "<span class='danger'>The meter on [src] indicates you are almost out of air!</span>")
. = ..()
if(get_dist(user, src) <= 0 && air_contents.oxygen < 10)
. += "<span class='danger'>The meter on [src] indicates you are almost out of air!</span>"
playsound(user, 'sound/effects/alert.ogg', 50, 1)
@@ -157,11 +155,9 @@
air_contents.carbon_dioxide = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
/obj/item/tank/jetpack/carbondioxide/examine(mob/user)
if(!..(user, 0))
return
if(air_contents.carbon_dioxide < 10)
to_chat(user, "<span class='danger'>The meter on [src] indicates you are almost out of air!</span>")
. = ..()
if(get_dist(user, src) <= 0 && air_contents.carbon_dioxide < 10)
. += "<span class='danger'>The meter on [src] indicates you are almost out of air!</span>"
playsound(user, 'sound/effects/alert.ogg', 50, 1)
/obj/item/tank/jetpack/suit
@@ -230,8 +226,7 @@
actions_types = list(/datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization)
/obj/item/tank/jetpack/rig/examine()
to_chat(usr, "It's a jetpack. If you can see this, report it on the bug tracker.")
return 0
. = list("It's a jetpack. If you can see this, report it on the bug tracker.")
/obj/item/tank/jetpack/rig/allow_thrust(num, mob/living/user)
if(!on)
@@ -23,10 +23,9 @@
air_contents.oxygen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
/obj/item/tank/oxygen/examine(mob/user)
if(..(user, 0))
if(air_contents.oxygen < 10)
to_chat(user, text("<span class='danger'>The meter on the [src.name] indicates you are almost out of air!</span>"))
//playsound(usr, 'sound/effects/alert.ogg', 50, 1)
. = ..()
if(get_dist(user, src) <= 0 && air_contents.oxygen < 10)
. += "<span class='danger'>The meter on [src] indicates you are almost out of air!</span>"
obj/item/tank/oxygen/empty/New()
..()
@@ -72,10 +71,10 @@ obj/item/tank/oxygen/empty/New()
item_state = "air"
/obj/item/tank/air/examine(mob/user)
if(..(user, 0))
if(air_contents.oxygen < 1 && loc==usr)
to_chat(user, "<span class='danger'>The meter on the [src.name] indicates you are almost out of air!</span>")
user << sound('sound/effects/alert.ogg')
. = ..()
if(get_dist(user, src) <= 0 && air_contents.oxygen < 1)
. += "<span class='danger'>The meter on [src] indicates you are almost out of air!</span>"
playsound(user, 'sound/effects/alert.ogg', 50, 1)
/obj/item/tank/air/New()
..()
@@ -121,10 +120,10 @@ obj/item/tank/oxygen/empty/New()
distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE
/obj/item/tank/plasma/plasmaman/examine(mob/user)
if(..(user, 0))
if(air_contents.toxins < 0.2 && loc==usr)
to_chat(user, text("<span class='danger'>The meter on the [src.name] indicates you are almost out of plasma!</span>"))
user << sound('sound/effects/alert.ogg')
. = ..()
if(get_dist(user, src) <= 0 && air_contents.toxins < 0.2)
. += "<span class='danger'>The meter on [src] indicates you are almost out of plasma!</span>"
playsound(user, 'sound/effects/alert.ogg', 50, 1)
/obj/item/tank/plasma/plasmaman/belt
@@ -159,10 +158,10 @@ obj/item/tank/oxygen/empty/New()
air_contents.oxygen = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
/obj/item/tank/emergency_oxygen/examine(mob/user)
if(..(user, 0))
if(air_contents.oxygen < 0.2 && loc==usr)
to_chat(user, text("<span class='danger'>The meter on the [src.name] indicates you are almost out of air!</span>"))
user << sound('sound/effects/alert.ogg')
. = ..()
if(get_dist(user, src) <= 0 && air_contents.oxygen < 0.2)
. += "<span class='danger'>The meter on [src] indicates you are almost out of air!</span>"
playsound(user, 'sound/effects/alert.ogg', 50, 1)
obj/item/tank/emergency_oxygen/empty/New()
..()
@@ -215,10 +214,9 @@ obj/item/tank/emergency_oxygen/double/empty/New()
air_contents.nitrogen = (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C)
/obj/item/tank/nitrogen/examine(mob/user)
if(..(user, 0))
if(air_contents.nitrogen < 10)
to_chat(user, text("<span class='danger'>The meter on the [src.name] indicates you are almost out of air!</span>"))
//playsound(usr, 'sound/effects/alert.ogg', 50, 1)
. = ..()
if(get_dist(user, src) <= 0 && air_contents.nitrogen < 10)
. += "<span class='danger'>The meter on the [src.name] indicates you are almost out of air!</span>"
/obj/item/tank/emergency_oxygen/vox
name = "vox specialized nitrogen tank"
@@ -76,8 +76,7 @@
/obj/item/tank/examine(mob/user)
if(!..(user, 0))
return
. = ..()
var/obj/icon = src
if(istype(loc, /obj/item/assembly))
@@ -85,7 +84,7 @@
if(!in_range(src, user))
if(icon == src)
to_chat(user, "<span class='notice'>It's \a [bicon(icon)][src]! If you want any more information you'll need to get closer.</span>")
. += "<span class='notice'>It's \a [bicon(icon)][src]! If you want any more information you'll need to get closer.</span>"
return
var/celsius_temperature = air_contents.temperature-T0C
@@ -104,9 +103,7 @@
else
descriptive = "furiously hot"
to_chat(user, "<span class='notice'>\The [bicon(icon)][src] feels [descriptive]</span>")
return
. += "<span class='notice'>\The [bicon(icon)][src] feels [descriptive]</span>"
/obj/item/tank/blob_act(obj/structure/blob/B)
if(B && B.loc == loc)
+3 -2
View File
@@ -352,8 +352,9 @@
update_icon()
/obj/item/weldingtool/examine(mob/user)
if(..(user, 0))
to_chat(user, "It contains [get_fuel()] unit\s of fuel out of [max_fuel].")
. = ..()
if(get_dist(user, src) <= 0)
. += "It contains [get_fuel()] unit\s of fuel out of [max_fuel]."
/obj/item/weldingtool/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] welds [user.p_their()] every orifice closed! It looks like [user.p_theyre()] trying to commit suicide!</span>")
@@ -29,11 +29,11 @@
. = ..()
var/num = get_part_rating()
if (num == INFINITY)
to_chat(user, "It's sealed tight, completely full of supplies.")
. += "It's sealed tight, completely full of supplies."
else if (num == 0)
to_chat(user, "It's empty!")
. += "It's empty!"
else
to_chat(user, "It can restock [num] item\s.")
. += "It can restock [num] item\s."
/obj/item/vending_refill/get_part_rating()
if (!products || !contraband || !premium)