This commit is contained in:
Ghommie
2019-11-27 18:48:20 +01:00
767 changed files with 7493 additions and 3792 deletions
+74 -39
View File
@@ -103,12 +103,11 @@ GLOBAL_LIST_EMPTY(PDAs)
/obj/item/pda/examine(mob/user)
. = ..()
var/dat = id ? "<span class='notice'>Alt-click to remove the id.</span>" : ""
. += id ? "<span class='notice'>Alt-click to remove the id.</span>" : ""
if(inserted_item && (!isturf(loc)))
dat += "\n<span class='notice'>Ctrl-click to remove [inserted_item].</span>"
. += "<span class='notice'>Ctrl-click to remove [inserted_item].</span>"
if(LAZYLEN(GLOB.pda_reskins))
dat += "\n<span class='notice'>Ctrl-shift-click it to reskin it.</span>"
to_chat(user, dat)
. += "<span class='notice'>Ctrl-shift-click it to reskin it.</span>"
/obj/item/pda/Initialize()
. = ..()
@@ -162,31 +161,33 @@ GLOBAL_LIST_EMPTY(PDAs)
/obj/item/pda/equipped(mob/user, slot)
. = ..()
if(equipped)
if(equipped || !user.client)
return
if(user.client)
background_color = user.client.prefs.pda_color
switch(user.client.prefs.pda_style)
if(MONO)
font_index = MODE_MONO
font_mode = FONT_MONO
if(SHARE)
font_index = MODE_SHARE
font_mode = FONT_SHARE
if(ORBITRON)
font_index = MODE_ORBITRON
font_mode = FONT_ORBITRON
if(VT)
font_index = MODE_VT
font_mode = FONT_VT
else
font_index = MODE_MONO
font_mode = FONT_MONO
var/pref_skin = GLOB.pda_reskins[user.client.prefs.pda_skin]
if(icon != pref_skin)
icon = pref_skin
update_icon(FALSE, TRUE)
equipped = TRUE
update_style(user.client)
/obj/item/pda/proc/update_style(client/C)
background_color = C.prefs.pda_color
switch(C.prefs.pda_style)
if(MONO)
font_index = MODE_MONO
font_mode = FONT_MONO
if(SHARE)
font_index = MODE_SHARE
font_mode = FONT_SHARE
if(ORBITRON)
font_index = MODE_ORBITRON
font_mode = FONT_ORBITRON
if(VT)
font_index = MODE_VT
font_mode = FONT_VT
else
font_index = MODE_MONO
font_mode = FONT_MONO
var/pref_skin = GLOB.pda_reskins[C.prefs.pda_skin]
if(icon != pref_skin)
icon = pref_skin
update_icon(FALSE, TRUE)
equipped = TRUE
/obj/item/pda/proc/update_label()
name = "PDA-[owner] ([ownjob])" //Name generalisation
@@ -200,6 +201,18 @@ GLOBAL_LIST_EMPTY(PDAs)
/obj/item/pda/GetID()
return id
/obj/item/pda/RemoveID()
return do_remove_id()
/obj/item/pda/InsertID(obj/item/inserting_item)
var/obj/item/card/inserting_id = inserting_item.RemoveID()
if(!inserting_id)
return
insert_id(inserting_id)
if(id == inserting_id)
return TRUE
return FALSE
/obj/item/pda/update_icon(alert = FALSE, new_overlays = FALSE)
if(new_overlays)
set_new_overlays()
@@ -688,15 +701,27 @@ GLOBAL_LIST_EMPTY(PDAs)
return
/obj/item/pda/proc/remove_id()
if(issilicon(usr) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return
do_remove_id(usr)
if (id)
usr.put_in_hands(id)
to_chat(usr, "<span class='notice'>You remove the ID from the [name].</span>")
id = null
update_icon()
/obj/item/pda/proc/do_remove_id(mob/user)
if(!id)
return
if(user)
user.put_in_hands(id)
to_chat(user, "<span class='notice'>You remove the ID from the [name].</span>")
else
id.forceMove(get_turf(src))
. = id
id = null
update_icon()
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
if(H.wear_id == src)
H.sec_hud_set_ID()
/obj/item/pda/proc/msg_input(mob/living/U = usr)
var/t = stripped_input(U, "Please enter message", name)
@@ -878,17 +903,27 @@ GLOBAL_LIST_EMPTY(PDAs)
if(istype(C))
I = C
if(I && I.registered_name)
if(I?.registered_name)
if(!user.transferItemToLoc(I, src))
return FALSE
var/obj/old_id = id
id = I
if(old_id)
user.put_in_hands(old_id)
insert_id(I, user)
update_icon()
playsound(src, 'sound/machines/button.ogg', 50, 1)
return TRUE
/obj/item/pda/proc/insert_id(obj/item/card/id/inserting_id, mob/user)
var/obj/old_id = id
id = inserting_id
if(ishuman(loc))
var/mob/living/carbon/human/human_wearer = loc
if(human_wearer.wear_id == src)
human_wearer.sec_hud_set_ID()
if(old_id)
if(user)
user.put_in_hands(old_id)
else
old_id.forceMove(get_turf(src))
// access to status display signals
/obj/item/pda/attackby(obj/item/C, mob/user, params)
if(istype(C, /obj/item/cartridge) && !cartridge)
@@ -12,9 +12,9 @@
var/mode = 0
/obj/item/compressionkit/examine(mob/user)
..()
to_chat(user, "<span class='notice'>It has [charges] charges left. Recharge with bluespace crystals.</span>")
to_chat(user, "<span class='notice'>Use in-hand to swap toggle compress/expand mode (expand mode not yet implemented).</span>")
. = ..()
. += "<span class='notice'>It has [charges] charges left. Recharge with bluespace crystals.</span>"
. += "<span class='notice'>Use in-hand to swap toggle compress/expand mode (expand mode not yet implemented).</span>"
/obj/item/compressionkit/attack_self(mob/user)
if(mode == 0)
@@ -0,0 +1,87 @@
/obj/item/desynchronizer
name = "desynchronizer"
desc = "An experimental device that can temporarily desynchronize the user from spacetime, effectively making them disappear while it's active."
icon = 'icons/obj/device.dmi'
icon_state = "desynchronizer"
item_state = "electronic"
w_class = WEIGHT_CLASS_SMALL
item_flags = NOBLUDGEON
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
materials = list(MAT_METAL = 250, MAT_GLASS = 500)
var/max_duration = 3000
var/duration = 300
var/last_use = 0
var/next_use = 0
var/obj/effect/abstract/sync_holder/sync_holder
/obj/item/desynchronizer/attack_self(mob/living/user)
if(world.time < next_use)
to_chat(user, "<span class='warning'>[src] is still recharging.</span>")
return
if(!sync_holder)
desync(user)
else
resync()
/obj/item/desynchronizer/examine(mob/user)
. = ..()
if(world.time < next_use)
. += "<span class='warning'>Time left to recharge: [DisplayTimeText(next_use - world.time)]</span>"
. += "<span class='notice'>Alt-click to customize the duration. Current duration: [DisplayTimeText(duration)].</span>"
. += "<span class='notice'>Can be used again to interrupt the effect early. The recharge time is the same as the time spent in desync.</span>"
/obj/item/desynchronizer/AltClick(mob/living/user)
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
var/new_duration = input(user, "Set the duration (5-300):", "Desynchronizer", duration / 10) as null|num
if(new_duration)
new_duration = new_duration SECONDS
new_duration = CLAMP(new_duration, 50, max_duration)
duration = new_duration
to_chat(user, "<span class='notice'>You set the duration to [DisplayTimeText(duration)].</span>")
/obj/item/desynchronizer/proc/desync(mob/living/user)
if(sync_holder)
return
sync_holder = new(drop_location())
new /obj/effect/temp_visual/desynchronizer(drop_location())
to_chat(user, "<span class='notice'>You activate [src], desynchronizing yourself from the present. You can still see your surroundings, but you feel eerily dissociated from reality.</span>")
user.forceMove(sync_holder)
SEND_SIGNAL(user, COMSIG_MOVABLE_SECLUDED_LOCATION)
for(var/thing in user)
var/atom/movable/AM = thing
SEND_SIGNAL(AM, COMSIG_MOVABLE_SECLUDED_LOCATION)
last_use = world.time
icon_state = "desynchronizer-on"
addtimer(CALLBACK(src, .proc/resync), duration)
/obj/item/desynchronizer/proc/resync()
new /obj/effect/temp_visual/desynchronizer(sync_holder.drop_location())
QDEL_NULL(sync_holder)
icon_state = initial(icon_state)
next_use = world.time + (world.time - last_use) // Could be 2*world.time-last_use but that would just be confusing
/obj/item/desynchronizer/Destroy()
resync()
return ..()
/obj/effect/abstract/sync_holder
name = "desyncronized pocket"
desc = "A pocket in spacetime, keeping the user a fraction of a second in the future."
icon = null
icon_state = null
alpha = 0
invisibility = INVISIBILITY_ABSTRACT
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
anchored = TRUE
resistance_flags = INDESTRUCTIBLE
/obj/effect/abstract/sync_holder/Destroy()
for(var/I in contents)
var/atom/movable/AM = I
AM.forceMove(drop_location())
return ..()
/obj/effect/abstract/sync_holder/AllowDrop()
return TRUE //no dropping spaghetti out of your spacetime pocket
@@ -134,7 +134,6 @@
var/voracious = hound ? TRUE : FALSE
var/list/targets = target && hound ? list(target) : contents
if(hound)
hound.setClickCooldown(50)
if(!hound.client || !(hound.client.prefs.cit_toggles & MEDIHOUND_SLEEPER))
voracious = FALSE
else
@@ -447,7 +446,7 @@
if (!target.devourable)
to_chat(user, "The target registers an error code. Unable to insert into [src].")
return
if(target)
if(patient)
to_chat(user,"<span class='warning'>Your [src] is already occupied.</span>")
return
if(target.buckled)
@@ -524,3 +523,7 @@
update_gut()
user.visible_message("<span class='warning'>[hound.name]'s garbage processor groans lightly as [trashman] slips inside.</span>", "<span class='notice'>Your garbage compactor groans lightly as [trashman] slips inside.</span>")
playsound(hound, 'sound/effects/bin_close.ogg', 80, 1)
/obj/item/dogborg/sleeper/K9/flavour
name = "Mobile Sleeper"
desc = "A mounted, underslung sleeper, intended for holding willing occupants for leisurely purposes."
@@ -35,8 +35,8 @@
return ..()
/obj/item/doorCharge/examine(mob/user)
..()
. = ..()
if(user.mind && user.mind.has_antag_datum(/datum/antagonist/traitor)) //No nuke ops because the device is excluded from nuclear
to_chat(user, "A small explosive device that can be used to sabotage airlocks to cause an explosion upon opening. To apply, remove the airlock's maintenance panel and place it within.")
. += "A small explosive device that can be used to sabotage airlocks to cause an explosion upon opening. To apply, remove the airlock's maintenance panel and place it within."
else
to_chat(user, "A small, suspicious object that feels lukewarm when held.")
. += "A small, suspicious object that feels lukewarm when held."
@@ -16,11 +16,11 @@
maptext = "[circuits]"
/obj/item/electroadaptive_pseudocircuit/examine(mob/user)
..()
. = ..()
if(iscyborg(user))
to_chat(user, "<span class='notice'>It has material for <b>[circuits]</b> circuit[circuits == 1 ? "" : "s"]. Use the pseudocircuit on existing circuits to gain material.</span>")
to_chat(user, "<span class='notice'>Serves as a substitute for <b>fire/air alarm</b>, <b>firelock</b>, and <b>APC</b> electronics.</span>")
to_chat(user, "<span class='notice'>It can also be used on an APC with no power cell to <b>fabricate a low-capacity cell</b> at a high power cost.</span>")
. += "<span class='notice'>It has material for <b>[circuits]</b> circuit[circuits == 1 ? "" : "s"]. Use the pseudocircuit on existing circuits to gain material.</span>"
. += "<span class='notice'>Serves as a substitute for <b>fire/air alarm</b>, <b>firelock</b>, and <b>APC</b> electronics.</span>"
. += "<span class='notice'>It can also be used on an APC with no power cell to <b>fabricate a low-capacity cell</b> at a high power cost.</span>"
/obj/item/electroadaptive_pseudocircuit/proc/adapt_circuit(mob/living/silicon/robot/R, circuit_cost = 0)
if(QDELETED(R) || !istype(R))
@@ -52,9 +52,9 @@
qdel(F)
/obj/item/forcefield_projector/examine(mob/user)
..()
. = ..()
var/percent_charge = round((shield_integrity/max_shield_integrity)*100)
to_chat(user, "<span class='notice'>It is currently sustaining [LAZYLEN(current_fields)]/[max_fields] fields, and it's [percent_charge]% charged.</span>")
. += "<span class='notice'>It is currently sustaining [LAZYLEN(current_fields)]/[max_fields] fields, and it's [percent_charge]% charged.</span>"
/obj/item/forcefield_projector/Initialize(mapload)
. = ..()
@@ -63,28 +63,28 @@
current_tick_amount = 0
/obj/item/geiger_counter/examine(mob/user)
..()
. = ..()
if(!scanning)
return 1
to_chat(user, "<span class='info'>Alt-click it to clear stored radiation levels.</span>")
return
. += "<span class='info'>Alt-click it to clear stored radiation levels.</span>"
if(obj_flags & EMAGGED)
to_chat(user, "<span class='warning'>The display seems to be incomprehensible.</span>")
return 1
. += "<span class='warning'>The display seems to be incomprehensible.</span>"
return
switch(radiation_count)
if(-INFINITY to RAD_LEVEL_NORMAL)
to_chat(user, "<span class='notice'>Ambient radiation level count reports that all is well.</span>")
. += "<span class='notice'>Ambient radiation level count reports that all is well.</span>"
if(RAD_LEVEL_NORMAL + 1 to RAD_LEVEL_MODERATE)
to_chat(user, "<span class='disarm'>Ambient radiation levels slightly above average.</span>")
. += "<span class='disarm'>Ambient radiation levels slightly above average.</span>"
if(RAD_LEVEL_MODERATE + 1 to RAD_LEVEL_HIGH)
to_chat(user, "<span class='warning'>Ambient radiation levels above average.</span>")
. += "<span class='warning'>Ambient radiation levels above average.</span>"
if(RAD_LEVEL_HIGH + 1 to RAD_LEVEL_VERY_HIGH)
to_chat(user, "<span class='danger'>Ambient radiation levels highly above average.</span>")
. += "<span class='danger'>Ambient radiation levels highly above average.</span>"
if(RAD_LEVEL_VERY_HIGH + 1 to RAD_LEVEL_CRITICAL)
to_chat(user, "<span class='suicide'>Ambient radiation levels nearing critical level.</span>")
. += "<span class='suicide'>Ambient radiation levels nearing critical level.</span>"
if(RAD_LEVEL_CRITICAL + 1 to INFINITY)
to_chat(user, "<span class='boldannounce'>Ambient radiation levels above critical level!</span>")
. += "<span class='boldannounce'>Ambient radiation levels above critical level!</span>"
to_chat(user, "<span class='notice'>The last radiation amount detected was [last_tick_amount]</span>")
. += "<span class='notice'>The last radiation amount detected was [last_tick_amount]</span>"
/obj/item/geiger_counter/update_icon()
if(!scanning)
+3 -3
View File
@@ -14,10 +14,10 @@ GLOBAL_LIST_EMPTY(GPS_list)
var/global_mode = TRUE //If disabled, only GPS signals of the same Z level are shown
/obj/item/gps/examine(mob/user)
..()
. = ..()
var/turf/curr = get_turf(src)
to_chat(user, "The screen says: [get_area_name(curr, TRUE)] ([curr.x], [curr.y], [curr.z])")
to_chat(user, "<span class='notice'>Alt-click to switch it [tracking ? "off":"on"].</span>")
. += "The screen says: [get_area_name(curr, TRUE)] ([curr.x], [curr.y], [curr.z])"
. += "<span class='notice'>Alt-click to switch it [tracking ? "off":"on"].</span>"
/obj/item/gps/Initialize()
. = ..()
@@ -73,8 +73,8 @@
..()
/obj/item/lightreplacer/examine(mob/user)
..()
to_chat(user, status_string())
. = ..()
. += status_string()
/obj/item/lightreplacer/attackby(obj/item/W, mob/user, params)
+5 -3
View File
@@ -51,11 +51,11 @@
AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE)
/obj/item/multitool/examine(mob/user)
..()
. = ..()
if(selected_io)
to_chat(user, "<span class='notice'>Activate [src] to detach the data wire.</span>")
. += "<span class='notice'>Activate [src] to detach the data wire.</span>"
if(buffer)
to_chat(user, "<span class='notice'>Its buffer contains [buffer].</span>")
. += "<span class='notice'>Its buffer contains [buffer].</span>"
/obj/item/multitool/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] puts the [src] to [user.p_their()] chest. It looks like [user.p_theyre()] trying to pulse [user.p_their()] heart off!</span>")
@@ -247,6 +247,8 @@
/obj/item/multitool/cyborg
name = "multitool"
desc = "Optimised and stripped-down version of a regular multitool."
icon = 'icons/obj/items_cyborg.dmi'
icon_state = "multitool_cyborg"
toolspeed = 0.5
/obj/item/multitool/abductor
@@ -26,5 +26,5 @@
paint_color = input("Which colour do you want to use?","Pipe painter") in GLOB.pipe_paint_colors
/obj/item/pipe_painter/examine(mob/user)
..()
to_chat(user, "<span class='notice'>It is set to [paint_color].</span>")
. = ..()
. += "<span class='notice'>It is set to [paint_color].</span>"
@@ -10,12 +10,12 @@
var/obj/machinery/quantumpad/qpad
/obj/item/quantum_keycard/examine(mob/user)
..()
. = ..()
if(qpad)
to_chat(user, "It's currently linked to a quantum pad.")
to_chat(user, "<span class='notice'>Alt-click to unlink the keycard.</span>")
. += "It's currently linked to a quantum pad."
. += "<span class='notice'>Alt-click to unlink the keycard.</span>"
else
to_chat(user, "<span class='notice'>Insert [src] into an active quantum pad to link it.</span>")
. += "<span class='notice'>Insert [src] into an active quantum pad to link it.</span>"
/obj/item/quantum_keycard/AltClick(mob/living/user)
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
@@ -21,7 +21,7 @@
for(var/i in channels)
examine_text_list += "[GLOB.channel_tokens[i]] - [lowertext(i)]"
to_chat(user, "<span class='notice'>It can access the following channels; [jointext(examine_text_list, ", ")].</span>")
. += "<span class='notice'>It can access the following channels; [jointext(examine_text_list, ", ")].</span>"
/obj/item/encryptionkey/syndicate
name = "syndicate encryption key"
@@ -32,7 +32,7 @@ GLOBAL_LIST_INIT(channel_tokens, list(
return TOXLOSS
/obj/item/radio/headset/examine(mob/user)
..()
. = ..()
if(item_flags & IN_INVENTORY && loc == user)
// construction of frequency description
@@ -45,12 +45,12 @@ GLOBAL_LIST_INIT(channel_tokens, list(
avail_chans += "use [MODE_TOKEN_DEPARTMENT] or [GLOB.channel_tokens[channels[i]]] for [lowertext(channels[i])]"
else
avail_chans += "use [GLOB.channel_tokens[channels[i]]] for [lowertext(channels[i])]"
to_chat(user, "<span class='notice'>A small screen on the headset displays the following available frequencies:\n[english_list(avail_chans)].")
. += "<span class='notice'>A small screen on the headset displays the following available frequencies:\n[english_list(avail_chans)]."
if(command)
to_chat(user, "<span class='info'>Alt-click to toggle the high-volume mode.</span>")
. += "<span class='info'>Alt-click to toggle the high-volume mode.</span>"
else
to_chat(user, "<span class='notice'>A small screen on the headset flashes, it's too small to read without holding or wearing the headset.</span>")
. += "<span class='notice'>A small screen on the headset flashes, it's too small to read without holding or wearing the headset.</span>"
/obj/item/radio/headset/Initialize()
. = ..()
@@ -49,11 +49,11 @@
return ..()
/obj/item/radio/intercom/examine(mob/user)
..()
. = ..()
if(!unfastened)
to_chat(user, "<span class='notice'>It's <b>screwed</b> and secured to the wall.</span>")
. += "<span class='notice'>It's <b>screwed</b> and secured to the wall.</span>"
else
to_chat(user, "<span class='notice'>It's <i>unscrewed</i> from the wall, and can be <b>detached</b>.</span>")
. += "<span class='notice'>It's <i>unscrewed</i> from the wall, and can be <b>detached</b>.</span>"
/obj/item/radio/intercom/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/screwdriver))
@@ -319,11 +319,11 @@
/obj/item/radio/examine(mob/user)
..()
. = ..()
if (unscrewed)
to_chat(user, "<span class='notice'>It can be attached and modified.</span>")
. += "<span class='notice'>It can be attached and modified.</span>"
else
to_chat(user, "<span class='notice'>It cannot be modified or attached.</span>")
. += "<span class='notice'>It cannot be modified or attached.</span>"
/obj/item/radio/attackby(obj/item/W, mob/user, params)
add_fingerprint(user)
+2 -2
View File
@@ -382,7 +382,7 @@ SLIME SCANNER
else if (S.mutantstomach != initial(S.mutantstomach))
mutant = TRUE
msg += "\t<span class='info'>Reported Species: [H.dna.custom_species ? H.dna.custom_species : S.name]</span>\n"
msg += "\t<span class='info'>Reported Species: [H.dna.custom_species ? H.dna.custom_species : S.name]</span>\n"
msg += "\t<span class='info'>Base Species: [S.name]</span>\n"
if(mutant)
msg += "\t<span class='info'>Subject has mutations present.</span>\n"
@@ -523,7 +523,7 @@ SLIME SCANNER
/obj/item/analyzer/examine(mob/user)
. = ..()
to_chat(user, "<span class='notice'>Alt-click [src] to activate the barometer function.</span>")
. += "<span class='notice'>Alt-click [src] to activate the barometer function.</span>"
/obj/item/analyzer/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] begins to analyze [user.p_them()]self with [src]! The display shows that [user.p_theyre()] dead!</span>")
@@ -29,8 +29,8 @@
/obj/item/taperecorder/examine(mob/user)
..()
to_chat(user, "The wire panel is [open_panel ? "opened" : "closed"].")
. = ..()
. += "The wire panel is [open_panel ? "opened" : "closed"]."
/obj/item/taperecorder/attackby(obj/item/I, mob/user, params)