Merge branch 'master' into upstream-merge-37486

This commit is contained in:
deathride58
2018-05-06 07:15:48 +00:00
committed by GitHub
727 changed files with 10369 additions and 18653 deletions
+6
View File
@@ -568,3 +568,9 @@ AI MODULES
laws += generate_ion_law()
..()
laws = list()
/******************H.O.G.A.N.***************/
/obj/item/aiModule/core/full/hulkamania
name = "'H.O.G.A.N.' Core AI Module"
law_id = "hulkamania"
+1 -1
View File
@@ -636,7 +636,7 @@ RLD
if(useResource(launchcost, user))
activate()
to_chat(user, "<span class='notice'>You fire a glowstick!</span>")
var/obj/item/device/flashlight/glowstick/G = new /obj/item/device/flashlight/glowstick(start)
var/obj/item/flashlight/glowstick/G = new /obj/item/flashlight/glowstick(start)
G.color = color_choice
G.light_color = G.color
G.throw_at(A, 9, 3, user)
+3 -3
View File
@@ -13,11 +13,11 @@
slot_flags = SLOT_BELT
usesound = 'sound/effects/spray2.ogg'
var/obj/item/device/toner/ink = null
var/obj/item/toner/ink = null
/obj/item/airlock_painter/New()
..()
ink = new /obj/item/device/toner(src)
ink = new /obj/item/toner(src)
//This proc doesn't just check if the painter can be used, but also uses it.
//Only call this if you are certain that the painter will be used right after this check!
@@ -105,7 +105,7 @@
/obj/item/airlock_painter/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/device/toner))
if(istype(W, /obj/item/toner))
if(ink)
to_chat(user, "<span class='notice'>[src] already contains \a [ink].</span>")
return
+4 -1
View File
@@ -314,6 +314,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM
src.pixel_x = rand(-5, 5)
src.pixel_y = rand(-5, 5)
/obj/item/clothing/mask/cigarette/rollie/nicotine
list_reagents = list("nicotine" = 15)
/obj/item/clothing/mask/cigarette/rollie/trippy
list_reagents = list("nicotine" = 15, "mushroomhallucinogen" = 35)
starts_lit = TRUE
@@ -706,7 +709,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
to_chat(user, "<span class='notice'>You close the cap on [src].</span>")
cut_overlays()
if(istype(O, /obj/item/device/multitool))
if(istype(O, /obj/item/multitool))
if(screw && !(obj_flags & EMAGGED))//also kinky
if(!super)
cut_overlays()
@@ -224,10 +224,6 @@
name = "Supply Request Console (Computer Board)"
build_path = /obj/machinery/computer/cargo/request
/obj/item/circuitboard/computer/stockexchange
name = "circuit board (Stock Exchange Console)"
build_path = /obj/machinery/computer/stockexchange
/obj/item/circuitboard/computer/operating
name = "Operating Computer (Computer Board)"
build_path = /obj/machinery/computer/operating
@@ -204,6 +204,7 @@
/obj/item/circuitboard/machine/vendor
name = "Booze-O-Mat Vendor (Machine Board)"
desc = "You could turn the \"brand selection\" dial using a screwdriver."
build_path = /obj/machinery/vending/boozeomat
req_components = list(
/obj/item/vending_refill/boozeomat = 3)
@@ -449,7 +450,7 @@
/obj/item/stock_parts/matter_bin = 1,
/obj/item/stock_parts/micro_laser = 1,
/obj/item/stock_parts/manipulator = 1,
/obj/item/device/assembly/igniter = 1)
/obj/item/assembly/igniter = 1)
needs_anchored = FALSE
/obj/item/circuitboard/machine/mining_equipment_vendor
+1 -1
View File
@@ -116,7 +116,7 @@
. = ..()
AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 50)
/obj/item/weapon/bikehorn/attack(mob/living/carbon/M, mob/living/carbon/user)
/obj/item/bikehorn/attack(mob/living/carbon/M, mob/living/carbon/user)
M.SendSignal(COMSIG_ADD_MOOD_EVENT, "honk", /datum/mood_event/honk)
/obj/item/bikehorn/suicide_act(mob/user)
+4 -4
View File
@@ -43,13 +43,13 @@
switch(mode)
if(WAND_OPEN)
data.plaintext_data = "open"
data.data["data"] = "open"
if(WAND_BOLT)
data.plaintext_data = "bolt"
data.data["data"] = "bolt"
if(WAND_EMERGENCY)
data.plaintext_data = "emergency"
data.data["data"] = "emergency"
data.plaintext_data_secondary = "toggle"
data.data["data_secondary"] = "toggle"
data.passkey = access_list
ntnet_send(data)
+2
View File
@@ -247,6 +247,8 @@
var/cost = 1
if(paint_mode == PAINT_LARGE_HORIZONTAL)
cost = 5
if(istype(target, /obj/item/canvas))
cost = 0
var/charges_used = use_charges(user, cost)
if(!charges_used)
return
+47 -38
View File
@@ -9,8 +9,9 @@ GLOBAL_LIST_EMPTY(PDAs)
#define PDA_SCANNER_REAGENT 3
#define PDA_SCANNER_HALOGEN 4
#define PDA_SCANNER_GAS 5
#define PDA_SPAM_DELAY 2 MINUTES
/obj/item/device/pda
/obj/item/pda
name = "\improper PDA"
desc = "A portable microcomputer by Thinktronic Systems, LTD. Functionality determined by a preprogrammed ROM cartridge."
icon = 'icons/obj/pda.dmi'
@@ -52,6 +53,7 @@ GLOBAL_LIST_EMPTY(PDAs)
var/toff = FALSE //If TRUE, messenger disabled
var/tnote = null //Current Texts
var/last_text //No text spamming
var/last_everyone //No text for everyone spamming
var/last_noise //Also no honk spamming that's bad too
var/ttone = "beep" //The ringtone!
var/lock_code = "" // Lockcode to unlock uplink
@@ -68,17 +70,17 @@ GLOBAL_LIST_EMPTY(PDAs)
var/obj/item/card/id/id = null //Making it possible to slot an ID card into the PDA so it can function as both.
var/ownjob = null //related to above
var/obj/item/device/paicard/pai = null // A slot for a personal AI device
var/obj/item/paicard/pai = null // A slot for a personal AI device
var/icon/photo //Scanned photo
var/list/contained_item = list(/obj/item/pen, /obj/item/toy/crayon, /obj/item/lipstick, /obj/item/device/flashlight/pen, /obj/item/clothing/mask/cigarette)
var/list/contained_item = list(/obj/item/pen, /obj/item/toy/crayon, /obj/item/lipstick, /obj/item/flashlight/pen, /obj/item/clothing/mask/cigarette)
var/obj/item/inserted_item //Used for pen, crayon, and lipstick insertion or removal. Same as above.
var/overlays_x_offset = 0 //x offset to use for certain overlays
var/underline_flag = TRUE //flag for underline
/obj/item/device/pda/suicide_act(mob/living/carbon/user)
/obj/item/pda/suicide_act(mob/living/carbon/user)
var/deathMessage = msg_input(user)
if (!deathMessage)
deathMessage = "i ded"
@@ -86,14 +88,14 @@ GLOBAL_LIST_EMPTY(PDAs)
tnote += "<i><b>&rarr; To The Grim Reaper:</b></i><br>[deathMessage]<br>"//records a message in their PDA as being sent to the grim reaper
return BRUTELOSS
/obj/item/device/pda/examine(mob/user)
/obj/item/pda/examine(mob/user)
..()
if(!id && !inserted_item)
return
else
to_chat(user, "<span class='notice'>Alt-click to remove contents.</span>")
/obj/item/device/pda/Initialize()
/obj/item/pda/Initialize()
. = ..()
if(fon)
set_light(f_lum)
@@ -107,7 +109,7 @@ GLOBAL_LIST_EMPTY(PDAs)
inserted_item = new /obj/item/pen(src)
update_icon()
/obj/item/device/pda/equipped(mob/user, slot)
/obj/item/pda/equipped(mob/user, slot)
. = ..()
if(!equipped)
if(user.client)
@@ -130,19 +132,19 @@ GLOBAL_LIST_EMPTY(PDAs)
font_mode = FONT_MONO
equipped = TRUE
/obj/item/device/pda/proc/update_label()
/obj/item/pda/proc/update_label()
name = "PDA-[owner] ([ownjob])" //Name generalisation
/obj/item/device/pda/GetAccess()
/obj/item/pda/GetAccess()
if(id)
return id.GetAccess()
else
return ..()
/obj/item/device/pda/GetID()
/obj/item/pda/GetID()
return id
/obj/item/device/pda/update_icon()
/obj/item/pda/update_icon()
cut_overlays()
var/mutable_appearance/overlay = new()
overlay.pixel_x = overlays_x_offset
@@ -163,13 +165,13 @@ GLOBAL_LIST_EMPTY(PDAs)
overlay.icon_state = "pai_off_overlay"
add_overlay(new /mutable_appearance(overlay))
/obj/item/device/pda/MouseDrop(obj/over_object, src_location, over_location)
/obj/item/pda/MouseDrop(obj/over_object, src_location, over_location)
var/mob/M = usr
if((!istype(over_object, /obj/screen)) && usr.canUseTopic(src))
return attack_self(M)
return ..()
/obj/item/device/pda/attack_self(mob/user)
/obj/item/pda/attack_self(mob/user)
if(!user.IsAdvancedToolUser())
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
return
@@ -309,7 +311,7 @@ GLOBAL_LIST_EMPTY(PDAs)
var/count = 0
if (!toff)
for (var/obj/item/device/pda/P in sortNames(get_viewable_pdas()))
for (var/obj/item/pda/P in sortNames(get_viewable_pdas()))
if (P == src)
continue
dat += "<li><a href='byond://?src=[REF(src)];choice=Message;target=[REF(P)]'>[P]</a>"
@@ -368,7 +370,7 @@ GLOBAL_LIST_EMPTY(PDAs)
user << browse(dat, "window=pda;size=400x450;border=1;can_resize=1;can_minimize=0")
onclose(user, "pda", src)
/obj/item/device/pda/Topic(href, href_list)
/obj/item/pda/Topic(href, href_list)
..()
var/mob/living/U = usr
//Looking for master was kind of pointless since PDAs don't appear to have one.
@@ -586,7 +588,7 @@ GLOBAL_LIST_EMPTY(PDAs)
U << browse(null, "window=pda")
return
/obj/item/device/pda/proc/remove_id()
/obj/item/pda/proc/remove_id()
if (id)
if (ismob(loc))
var/mob/M = loc
@@ -597,7 +599,7 @@ GLOBAL_LIST_EMPTY(PDAs)
id = null
update_icon()
/obj/item/device/pda/proc/msg_input(mob/living/U = usr)
/obj/item/pda/proc/msg_input(mob/living/U = usr)
var/t = stripped_input(U, "Please enter message", name)
if (!t || toff)
return
@@ -609,16 +611,16 @@ GLOBAL_LIST_EMPTY(PDAs)
t = Gibberish(t, 100)
return t
/obj/item/device/pda/proc/send_message(mob/living/user, list/obj/item/device/pda/targets)
/obj/item/pda/proc/send_message(mob/living/user, list/obj/item/pda/targets, everyone)
var/message = msg_input(user)
if(!message || !targets.len)
return
if(last_text && world.time < last_text + 5)
if((last_text && world.time < last_text + 10) || (everyone && last_everyone && world.time < last_everyone + PDA_SPAM_DELAY))
return
// Send the signal
var/list/string_targets = list()
for (var/obj/item/device/pda/P in targets)
for (var/obj/item/pda/P in targets)
if (P.owner && P.ownjob) // != src is checked by the UI
string_targets += "[P.owner] ([P.ownjob])"
for (var/obj/machinery/computer/message_monitor/M in targets)
@@ -658,8 +660,11 @@ GLOBAL_LIST_EMPTY(PDAs)
to_chat(user, "<span class='info'>Message sent to [target_text]: \"[message]\"</span>")
// Reset the photo
photo = null
last_text = world.time
if (everyone)
last_everyone = world.time
/obj/item/device/pda/proc/receive_message(datum/signal/subspace/pda/signal)
/obj/item/pda/proc/receive_message(datum/signal/subspace/pda/signal)
tnote += "<i><b>&larr; From <a href='byond://?src=[REF(src)];choice=Message;target=[REF(signal.source)]'>[signal.data["name"]]</a> ([signal.data["job"]]):</b></i><br>[signal.format_message()]<br>"
if (!silent)
@@ -685,13 +690,16 @@ GLOBAL_LIST_EMPTY(PDAs)
update_icon()
add_overlay(icon_alert)
/obj/item/device/pda/proc/send_to_all(mob/living/U)
send_message(U,get_viewable_pdas())
/obj/item/pda/proc/send_to_all(mob/living/U)
if (last_everyone && world.time < last_everyone + PDA_SPAM_DELAY)
to_chat(U,"<span class='warning'>Send To All function is still on cooldown.")
return
send_message(U,get_viewable_pdas(), TRUE)
/obj/item/device/pda/proc/create_message(mob/living/U, obj/item/device/pda/P)
/obj/item/pda/proc/create_message(mob/living/U, obj/item/pda/P)
send_message(U,list(P))
/obj/item/device/pda/AltClick()
/obj/item/pda/AltClick()
..()
if(issilicon(usr))
@@ -703,7 +711,7 @@ GLOBAL_LIST_EMPTY(PDAs)
else
remove_pen()
/obj/item/device/pda/verb/verb_remove_id()
/obj/item/pda/verb/verb_remove_id()
set category = "Object"
set name = "Eject ID"
set src in usr
@@ -717,7 +725,7 @@ GLOBAL_LIST_EMPTY(PDAs)
else
to_chat(usr, "<span class='warning'>This PDA does not have an ID in it!</span>")
/obj/item/device/pda/verb/verb_remove_pen()
/obj/item/pda/verb/verb_remove_pen()
set category = "Object"
set name = "Remove Pen"
set src in usr
@@ -728,7 +736,7 @@ GLOBAL_LIST_EMPTY(PDAs)
if (usr.canUseTopic(src))
remove_pen()
/obj/item/device/pda/proc/remove_pen()
/obj/item/pda/proc/remove_pen()
if(inserted_item)
if(ismob(loc))
var/mob/M = loc
@@ -742,7 +750,7 @@ GLOBAL_LIST_EMPTY(PDAs)
to_chat(usr, "<span class='warning'>This PDA does not have a pen in it!</span>")
//trying to insert or remove an id
/obj/item/device/pda/proc/id_check(mob/user, obj/item/card/id/I)
/obj/item/pda/proc/id_check(mob/user, obj/item/card/id/I)
if(!I)
if(id)
remove_id()
@@ -763,7 +771,7 @@ GLOBAL_LIST_EMPTY(PDAs)
return 1
// access to status display signals
/obj/item/device/pda/attackby(obj/item/C, mob/user, params)
/obj/item/pda/attackby(obj/item/C, mob/user, params)
if(istype(C, /obj/item/cartridge) && !cartridge)
if(!user.transferItemToLoc(C, src))
return
@@ -791,7 +799,7 @@ GLOBAL_LIST_EMPTY(PDAs)
updateSelfDialog()//Update self dialog on success.
return //Return in case of failed check or when successful.
updateSelfDialog()//For the non-input related code.
else if(istype(C, /obj/item/device/paicard) && !src.pai)
else if(istype(C, /obj/item/paicard) && !src.pai)
if(!user.transferItemToLoc(C, src))
return
pai = C
@@ -814,7 +822,7 @@ GLOBAL_LIST_EMPTY(PDAs)
else
return ..()
/obj/item/device/pda/attack(mob/living/carbon/C, mob/living/user)
/obj/item/pda/attack(mob/living/carbon/C, mob/living/user)
if(istype(C))
switch(scanmode)
@@ -832,7 +840,7 @@ GLOBAL_LIST_EMPTY(PDAs)
else
user.show_message("<span class='notice'>No radiation detected.</span>")
/obj/item/device/pda/afterattack(atom/A as mob|obj|turf|area, mob/user, proximity)
/obj/item/pda/afterattack(atom/A as mob|obj|turf|area, mob/user, proximity)
if(!proximity)
return
switch(scanmode)
@@ -886,7 +894,7 @@ GLOBAL_LIST_EMPTY(PDAs)
to_chat(user, "<span class='notice'>Paper scanned. Saved to PDA's notekeeper.</span>" )
/obj/item/device/pda/proc/explode() //This needs tuning.
/obj/item/pda/proc/explode() //This needs tuning.
if(!detonatable)
return
var/turf/T = get_turf(src)
@@ -906,7 +914,7 @@ GLOBAL_LIST_EMPTY(PDAs)
qdel(src)
return
/obj/item/device/pda/Destroy()
/obj/item/pda/Destroy()
GLOB.PDAs -= src
if(istype(id))
QDEL_NULL(id)
@@ -928,7 +936,7 @@ GLOBAL_LIST_EMPTY(PDAs)
to_chat(user, "Turn on your receiver in order to send messages.")
return
for (var/obj/item/device/pda/P in get_viewable_pdas())
for (var/obj/item/pda/P in get_viewable_pdas())
if (P == src)
continue
else if (P == src.aiPDA)
@@ -989,7 +997,7 @@ GLOBAL_LIST_EMPTY(PDAs)
// Pass along the pulse to atoms in contents, largely added so pAIs are vulnerable to EMP
/obj/item/device/pda/emp_act(severity)
/obj/item/pda/emp_act(severity)
for(var/atom/A in src)
A.emp_act(severity)
emped += 1
@@ -999,7 +1007,7 @@ GLOBAL_LIST_EMPTY(PDAs)
/proc/get_viewable_pdas()
. = list()
// Returns a list of PDAs which can be viewed from another PDA/message monitor.
for(var/obj/item/device/pda/P in GLOB.PDAs)
for(var/obj/item/pda/P in GLOB.PDAs)
if(!P.owner || P.toff || P.hidden)
continue
. += P
@@ -1009,3 +1017,4 @@ GLOBAL_LIST_EMPTY(PDAs)
#undef PDA_SCANNER_REAGENT
#undef PDA_SCANNER_HALOGEN
#undef PDA_SCANNER_GAS
#undef PDA_SPAM_DELAY
@@ -1,5 +1,5 @@
//Clown PDA is slippery.
/obj/item/device/pda/clown
/obj/item/pda/clown
name = "clown PDA"
default_cartridge = /obj/item/cartridge/virus/clown
inserted_item = /obj/item/toy/crayon/rainbow
@@ -8,11 +8,11 @@
ttone = "honk"
var/slipvictims = list() //CIT CHANGE - makes clown PDAs track unique people slipped
/obj/item/device/pda/clown/Initialize()
/obj/item/pda/clown/Initialize()
. = ..()
AddComponent(/datum/component/slippery, 120, NO_SLIP_WHEN_WALKING, CALLBACK(src, .proc/AfterSlip))
/obj/item/device/pda/clown/proc/AfterSlip(mob/living/carbon/human/M)
/obj/item/pda/clown/proc/AfterSlip(mob/living/carbon/human/M)
if (istype(M) && (M.real_name != owner))
slipvictims |= M //CIT CHANGE - makes clown PDAs track unique people slipped
var/obj/item/cartridge/virus/clown/cart = cartridge
@@ -20,66 +20,66 @@
cart.charges++
// Special AI/pAI PDAs that cannot explode.
/obj/item/device/pda/ai
/obj/item/pda/ai
icon_state = "NONE"
ttone = "data"
fon = FALSE
detonatable = FALSE
/obj/item/device/pda/ai/attack_self(mob/user)
/obj/item/pda/ai/attack_self(mob/user)
if ((honkamt > 0) && (prob(60)))//For clown virus.
honkamt--
playsound(loc, 'sound/items/bikehorn.ogg', 30, 1)
return
/obj/item/device/pda/ai/pai
/obj/item/pda/ai/pai
ttone = "assist"
/obj/item/device/pda/medical
/obj/item/pda/medical
name = "medical PDA"
default_cartridge = /obj/item/cartridge/medical
icon_state = "pda-medical"
/obj/item/device/pda/viro
/obj/item/pda/viro
name = "virology PDA"
default_cartridge = /obj/item/cartridge/medical
icon_state = "pda-virology"
/obj/item/device/pda/engineering
/obj/item/pda/engineering
name = "engineering PDA"
default_cartridge = /obj/item/cartridge/engineering
icon_state = "pda-engineer"
/obj/item/device/pda/security
/obj/item/pda/security
name = "security PDA"
default_cartridge = /obj/item/cartridge/security
icon_state = "pda-security"
/obj/item/device/pda/detective
/obj/item/pda/detective
name = "detective PDA"
default_cartridge = /obj/item/cartridge/detective
icon_state = "pda-detective"
/obj/item/device/pda/warden
/obj/item/pda/warden
name = "warden PDA"
default_cartridge = /obj/item/cartridge/security
icon_state = "pda-warden"
/obj/item/device/pda/janitor
/obj/item/pda/janitor
name = "janitor PDA"
default_cartridge = /obj/item/cartridge/janitor
icon_state = "pda-janitor"
ttone = "slip"
/obj/item/device/pda/toxins
/obj/item/pda/toxins
name = "scientist PDA"
default_cartridge = /obj/item/cartridge/signal/toxins
icon_state = "pda-science"
ttone = "boom"
/obj/item/device/pda/mime
/obj/item/pda/mime
name = "mime PDA"
default_cartridge = /obj/item/cartridge/virus/mime
inserted_item = /obj/item/toy/crayon/mime
@@ -87,88 +87,88 @@
silent = TRUE
ttone = "silence"
/obj/item/device/pda/heads
/obj/item/pda/heads
default_cartridge = /obj/item/cartridge/head
icon_state = "pda-hop"
/obj/item/device/pda/heads/hop
/obj/item/pda/heads/hop
name = "head of personnel PDA"
default_cartridge = /obj/item/cartridge/hop
icon_state = "pda-hop"
/obj/item/device/pda/heads/hos
/obj/item/pda/heads/hos
name = "head of security PDA"
default_cartridge = /obj/item/cartridge/hos
icon_state = "pda-hos"
/obj/item/device/pda/heads/ce
/obj/item/pda/heads/ce
name = "chief engineer PDA"
default_cartridge = /obj/item/cartridge/ce
icon_state = "pda-ce"
/obj/item/device/pda/heads/cmo
/obj/item/pda/heads/cmo
name = "chief medical officer PDA"
default_cartridge = /obj/item/cartridge/cmo
icon_state = "pda-cmo"
/obj/item/device/pda/heads/rd
/obj/item/pda/heads/rd
name = "research director PDA"
default_cartridge = /obj/item/cartridge/rd
inserted_item = /obj/item/pen/fountain
icon_state = "pda-rd"
/obj/item/device/pda/captain
/obj/item/pda/captain
name = "captain PDA"
default_cartridge = /obj/item/cartridge/captain
inserted_item = /obj/item/pen/fountain/captain
icon_state = "pda-captain"
detonatable = FALSE
/obj/item/device/pda/cargo
/obj/item/pda/cargo
name = "cargo technician PDA"
default_cartridge = /obj/item/cartridge/quartermaster
icon_state = "pda-cargo"
/obj/item/device/pda/quartermaster
/obj/item/pda/quartermaster
name = "quartermaster PDA"
default_cartridge = /obj/item/cartridge/quartermaster
inserted_item = /obj/item/pen/fountain
icon_state = "pda-qm"
/obj/item/device/pda/shaftminer
/obj/item/pda/shaftminer
name = "shaft miner PDA"
icon_state = "pda-miner"
/obj/item/device/pda/syndicate
/obj/item/pda/syndicate
default_cartridge = /obj/item/cartridge/virus/syndicate
icon_state = "pda-syndi"
name = "military PDA"
owner = "John Doe"
hidden = 1
/obj/item/device/pda/chaplain
/obj/item/pda/chaplain
name = "chaplain PDA"
icon_state = "pda-chaplain"
ttone = "holy"
/obj/item/device/pda/lawyer
/obj/item/pda/lawyer
name = "lawyer PDA"
default_cartridge = /obj/item/cartridge/lawyer
inserted_item = /obj/item/pen/fountain
icon_state = "pda-lawyer"
ttone = "objection"
/obj/item/device/pda/botanist
/obj/item/pda/botanist
name = "botanist PDA"
//default_cartridge = /obj/item/cartridge/botanist
icon_state = "pda-hydro"
/obj/item/device/pda/roboticist
/obj/item/pda/roboticist
name = "roboticist PDA"
icon_state = "pda-roboticist"
default_cartridge = /obj/item/cartridge/roboticist
/obj/item/device/pda/curator
/obj/item/pda/curator
name = "curator PDA"
icon_state = "pda-library"
icon_alert = "pda-r-library"
@@ -179,32 +179,32 @@
silent = TRUE //Quiet in the library!
overlays_x_offset = -3
/obj/item/device/pda/clear
/obj/item/pda/clear
name = "clear PDA"
icon_state = "pda-clear"
desc = "A portable microcomputer by Thinktronic Systems, LTD. This model is a special edition with a transparent case."
note = "Congratulations, you have chosen the Thinktronic 5230 Personal Data Assistant Deluxe Special Max Turbo Limited Edition!"
/obj/item/device/pda/cook
/obj/item/pda/cook
name = "cook PDA"
icon_state = "pda-cook"
/obj/item/device/pda/bar
/obj/item/pda/bar
name = "bartender PDA"
icon_state = "pda-bartender"
inserted_item = /obj/item/pen/fountain
/obj/item/device/pda/atmos
/obj/item/pda/atmos
name = "atmospherics PDA"
default_cartridge = /obj/item/cartridge/atmos
icon_state = "pda-atmos"
/obj/item/device/pda/chemist
/obj/item/pda/chemist
name = "chemist PDA"
default_cartridge = /obj/item/cartridge/chemistry
icon_state = "pda-chemistry"
/obj/item/device/pda/geneticist
/obj/item/pda/geneticist
name = "geneticist PDA"
default_cartridge = /obj/item/cartridge/medical
icon_state = "pda-genetics"
+3 -3
View File
@@ -34,7 +34,7 @@
var/bot_access_flags = 0 //Bit flags. Selection: SEC_BOT | MULE_BOT | FLOOR_BOT | CLEAN_BOT | MED_BOT
var/spam_enabled = 0 //Enables "Send to All" Option
var/obj/item/device/pda/host_pda = null
var/obj/item/pda/host_pda = null
var/menu
var/datum/data/record/active1 = null //General
var/datum/data/record/active2 = null //Medical
@@ -51,7 +51,7 @@
/obj/item/cartridge/Initialize()
. = ..()
var/obj/item/device/pda/pda = loc
var/obj/item/pda/pda = loc
if(istype(pda))
host_pda = pda
@@ -710,7 +710,7 @@ Code:
return ""
//If the cartridge adds something to each potetial messaging target
/obj/item/cartridge/proc/message_special(obj/item/device/pda/target)
/obj/item/cartridge/proc/message_special(obj/item/pda/target)
return ""
//This is called for special abilities of cartridges
@@ -2,19 +2,19 @@
name = "Generic Virus PDA cart"
var/charges = 5
/obj/item/cartridge/virus/proc/send_virus(obj/item/device/pda/target, mob/living/U)
/obj/item/cartridge/virus/proc/send_virus(obj/item/pda/target, mob/living/U)
return
/obj/item/cartridge/virus/message_header()
return "<b>[charges] viral files left.</b><HR>"
/obj/item/cartridge/virus/message_special(obj/item/device/pda/target)
if (!istype(loc, /obj/item/device/pda))
/obj/item/cartridge/virus/message_special(obj/item/pda/target)
if (!istype(loc, /obj/item/pda))
return "" //Sanity check, this shouldn't be possible.
return " (<a href='byond://?src=[REF(loc)];choice=cart;special=virus;target=[REF(target)]'>*Send Virus*</a>)"
/obj/item/cartridge/virus/special(mob/living/user, list/params)
var/obj/item/device/pda/P = locate(params["target"])//Leaving it alone in case it may do something useful, I guess.
var/obj/item/pda/P = locate(params["target"])//Leaving it alone in case it may do something useful, I guess.
send_virus(P,user)
/obj/item/cartridge/virus/clown
@@ -23,7 +23,7 @@
desc = "A data cartridge for portable microcomputers. It smells vaguely of bananas."
access = CART_CLOWN
/obj/item/cartridge/virus/clown/send_virus(obj/item/device/pda/target, mob/living/U)
/obj/item/cartridge/virus/clown/send_virus(obj/item/pda/target, mob/living/U)
if(charges <= 0)
to_chat(U, "<span class='notice'>Out of charges.</span>")
return
@@ -39,7 +39,7 @@
icon_state = "cart-mi"
access = CART_MIME
/obj/item/cartridge/virus/mime/send_virus(obj/item/device/pda/target, mob/living/U)
/obj/item/cartridge/virus/mime/send_virus(obj/item/pda/target, mob/living/U)
if(charges <= 0)
to_chat(U, "<span class='notice'>Out of charges.</span>")
return
@@ -58,7 +58,7 @@
remote_door_id = "smindicate" //Make sure this matches the syndicate shuttle's shield/door id!! //don't ask about the name, testing.
charges = 4
/obj/item/cartridge/virus/syndicate/send_virus(obj/item/device/pda/target, mob/living/U)
/obj/item/cartridge/virus/syndicate/send_virus(obj/item/pda/target, mob/living/U)
if(charges <= 0)
to_chat(U, "<span class='notice'>Out of charges.</span>")
return
@@ -75,6 +75,13 @@
if(!target.detonatable || prob(difficulty * 15) || (hidden_uplink))
U.show_message("<span class='danger'>An error flashes on your [src].</span>", 1)
else
var/turf/T = get_turf(target)
var/area/A = get_area(T)
message_admins("[!is_special_character(U) ? "Non-antag " : ""][key_name_admin(U)][ADMIN_FLW(U)] triggered a PDA explosion on [target.name] at [A] [ADMIN_COORDJMP(T)].")
var/message_log = "triggered a PDA explosion on [target.name] at at [A] [COORD(T)]."
U.log_message(message_log, INDIVIDUAL_ATTACK_LOG)
log_game("[key_name(U)] [message_log]")
log_attack("[key_name(U)] [message_log]")
U.show_message("<span class='notice'>Success!</span>", 1)
target.explode()
else
@@ -85,7 +92,7 @@
icon_state = "cart"
var/telecrystals = 0
/obj/item/cartridge/virus/frame/send_virus(obj/item/device/pda/target, mob/living/U)
/obj/item/cartridge/virus/frame/send_virus(obj/item/pda/target, mob/living/U)
if(charges <= 0)
to_chat(U, "<span class='notice'>Out of charges.</span>")
return
+7 -7
View File
@@ -1,4 +1,4 @@
/obj/item/device/aicard
/obj/item/aicard
name = "intelliCard"
desc = "A storage device for AIs. Patent pending."
icon = 'icons/obj/aicards.dmi'
@@ -12,11 +12,11 @@
var/flush = FALSE
var/mob/living/silicon/ai/AI
/obj/item/device/aicard/suicide_act(mob/living/user)
/obj/item/aicard/suicide_act(mob/living/user)
user.visible_message("<span class='suicide'>[user] is trying to upload themselves into [src]! That's not going to work out well!</span>")
return BRUTELOSS
/obj/item/device/aicard/afterattack(atom/target, mob/user, proximity)
/obj/item/aicard/afterattack(atom/target, mob/user, proximity)
..()
if(!proximity || !target)
return
@@ -27,7 +27,7 @@
target.transfer_ai(AI_TRANS_TO_CARD, user, null, src)
update_icon() //Whatever happened, update the card's state (icon, name) to match.
/obj/item/device/aicard/update_icon()
/obj/item/aicard/update_icon()
cut_overlays()
if(AI)
name = "[initial(name)]- [AI.name]"
@@ -42,14 +42,14 @@
name = initial(name)
icon_state = initial(icon_state)
/obj/item/device/aicard/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
/obj/item/aicard/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.hands_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "intellicard", name, 500, 500, master_ui, state)
ui.open()
/obj/item/device/aicard/ui_data()
/obj/item/aicard/ui_data()
var/list/data = list()
if(AI)
data["name"] = AI.name
@@ -62,7 +62,7 @@
data["wiping"] = flush
return data
/obj/item/device/aicard/ui_act(action,params)
/obj/item/aicard/ui_act(action,params)
if(..())
return
switch(action)
+5 -5
View File
@@ -1,4 +1,4 @@
/obj/item/device/beacon
/obj/item/beacon
name = "\improper tracking beacon"
desc = "A beacon used by a teleporter."
icon = 'icons/obj/device.dmi'
@@ -9,18 +9,18 @@
var/enabled = TRUE
var/renamed = FALSE
/obj/item/device/beacon/Initialize()
/obj/item/beacon/Initialize()
. = ..()
if (enabled)
GLOB.teleportbeacons += src
else
icon_state = "beacon-off"
/obj/item/device/beacon/Destroy()
/obj/item/beacon/Destroy()
GLOB.teleportbeacons.Remove(src)
return ..()
/obj/item/device/beacon/attack_self(mob/user)
/obj/item/beacon/attack_self(mob/user)
enabled = !enabled
if (enabled)
icon_state = "beacon"
@@ -31,7 +31,7 @@
to_chat(user, "<span class='notice'>You [enabled ? "enable" : "disable"] the beacon.</span>")
return
/obj/item/device/beacon/attackby(obj/item/W, mob/user)
/obj/item/beacon/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/pen)) // needed for things that use custom names like the locator
var/new_name = stripped_input(user, "What would you like the name to be?")
if(!user.canUseTopic(src, BE_CLOSE))
+14 -14
View File
@@ -5,7 +5,7 @@
/obj/item/device/camera_bug
/obj/item/camera_bug
name = "camera bug"
desc = "For illicit snooping through the camera network."
icon = 'icons/obj/device.dmi'
@@ -31,11 +31,11 @@
var/last_found = null
var/last_seen = null
/obj/item/device/camera_bug/New()
/obj/item/camera_bug/New()
..()
START_PROCESSING(SSobj, src)
/obj/item/device/camera_bug/Destroy()
/obj/item/camera_bug/Destroy()
get_cameras()
for(var/cam_tag in bugged_cameras)
var/obj/machinery/camera/camera = bugged_cameras[cam_tag]
@@ -46,20 +46,20 @@
tracking = null
return ..()
/obj/item/device/camera_bug/interact(mob/user)
/obj/item/camera_bug/interact(mob/user)
ui_interact(user)
/obj/item/device/camera_bug/ui_interact(mob/user = usr)
/obj/item/camera_bug/ui_interact(mob/user = usr)
. = ..()
var/datum/browser/popup = new(user, "camerabug","Camera Bug",nref=src)
popup.set_content(menu(get_cameras()))
popup.open()
/obj/item/device/camera_bug/attack_self(mob/user)
/obj/item/camera_bug/attack_self(mob/user)
user.set_machine(src)
interact(user)
/obj/item/device/camera_bug/check_eye(mob/user)
/obj/item/camera_bug/check_eye(mob/user)
if ( loc != user || user.incapacitated() || user.eye_blind || !current )
user.unset_machine()
return 0
@@ -70,10 +70,10 @@
user.unset_machine()
return 0
return 1
/obj/item/device/camera_bug/on_unset_machine(mob/user)
/obj/item/camera_bug/on_unset_machine(mob/user)
user.reset_perspective(null)
/obj/item/device/camera_bug/proc/get_cameras()
/obj/item/camera_bug/proc/get_cameras()
if( world.time > (last_net_update + 100))
bugged_cameras = list()
for(var/obj/machinery/camera/camera in GLOB.cameranet.cameras)
@@ -85,7 +85,7 @@
return bugged_cameras
/obj/item/device/camera_bug/proc/menu(list/cameras)
/obj/item/camera_bug/proc/menu(list/cameras)
if(!cameras || !cameras.len)
return "No bugged cameras found."
@@ -139,12 +139,12 @@
return .(cameras)
return html
/obj/item/device/camera_bug/proc/get_seens()
/obj/item/camera_bug/proc/get_seens()
if(current && current.can_use())
var/list/seen = current.can_see()
return seen
/obj/item/device/camera_bug/proc/camera_report()
/obj/item/camera_bug/proc/camera_report()
// this should only be called if current exists
var/dat = ""
var/list/seen = get_seens()
@@ -189,7 +189,7 @@
else
return "Camera Offline<br>"
/obj/item/device/camera_bug/Topic(href,list/href_list)
/obj/item/camera_bug/Topic(href,list/href_list)
if(usr != loc)
usr.unset_machine()
usr << browse(null, "window=camerabug")
@@ -256,7 +256,7 @@
interact()
/obj/item/device/camera_bug/process()
/obj/item/camera_bug/process()
if(track_mode == BUGMODE_LIST || (world.time < (last_tracked + refresh_interval)))
return
last_tracked = world.time
@@ -1,5 +1,6 @@
/obj/item/device/chameleon
/obj/item/chameleon
name = "chameleon-projector"
icon = 'icons/obj/device.dmi'
icon_state = "shield0"
flags_1 = CONDUCT_1 | NOBLUDGEON_1
slot_flags = SLOT_BELT
@@ -14,26 +15,26 @@
var/obj/effect/dummy/chameleon/active_dummy = null
var/saved_appearance = null
/obj/item/device/chameleon/New()
/obj/item/chameleon/New()
..()
var/obj/item/cigbutt/butt = /obj/item/cigbutt
saved_appearance = initial(butt.appearance)
/obj/item/device/chameleon/dropped()
/obj/item/chameleon/dropped()
..()
disrupt()
/obj/item/device/chameleon/equipped()
/obj/item/chameleon/equipped()
..()
disrupt()
/obj/item/device/chameleon/attack_self(mob/user)
/obj/item/chameleon/attack_self(mob/user)
if (isturf(user.loc) || istype(user.loc, /obj/structure) || active_dummy)
toggle(user)
else
to_chat(user, "<span class='warning'>You can't use [src] while inside something!</span>")
/obj/item/device/chameleon/afterattack(atom/target, mob/user , proximity)
/obj/item/chameleon/afterattack(atom/target, mob/user , proximity)
if(!proximity)
return
if(!check_sprite(target))
@@ -48,12 +49,12 @@
temp.plane = initial(target.plane)
saved_appearance = temp.appearance
/obj/item/device/chameleon/proc/check_sprite(atom/target)
/obj/item/chameleon/proc/check_sprite(atom/target)
if(target.icon_state in icon_states(target.icon))
return TRUE
return FALSE
/obj/item/device/chameleon/proc/toggle(mob/user)
/obj/item/chameleon/proc/toggle(mob/user)
if(!can_use || !saved_appearance)
return
if(active_dummy)
@@ -71,7 +72,7 @@
new /obj/effect/temp_visual/emp/pulse(get_turf(src))
user.cancel_camera()
/obj/item/device/chameleon/proc/disrupt(delete_dummy = 1)
/obj/item/chameleon/proc/disrupt(delete_dummy = 1)
if(active_dummy)
for(var/mob/M in active_dummy)
to_chat(M, "<span class='danger'>Your chameleon-projector deactivates.</span>")
@@ -86,7 +87,7 @@
can_use = 0
spawn(50) can_use = 1
/obj/item/device/chameleon/proc/eject_all()
/obj/item/chameleon/proc/eject_all()
for(var/atom/movable/A in active_dummy)
A.forceMove(active_dummy.loc)
if(ismob(A))
@@ -98,9 +99,9 @@
desc = ""
density = FALSE
var/can_move = 0
var/obj/item/device/chameleon/master = null
var/obj/item/chameleon/master = null
/obj/effect/dummy/chameleon/proc/activate(mob/M, saved_appearance, obj/item/device/chameleon/C)
/obj/effect/dummy/chameleon/proc/activate(mob/M, saved_appearance, obj/item/chameleon/C)
appearance = saved_appearance
if(istype(M.buckled, /obj/vehicle))
var/obj/vehicle/V = M.buckled
@@ -1,6 +1,6 @@
// Dogborg Sleeper units
/obj/item/device/dogborg/sleeper
/obj/item/dogborg/sleeper
name = "hound sleeper"
desc = "nothing should see this."
icon = 'icons/mob/dogborg.dmi'
@@ -22,7 +22,7 @@
var/static/list/important_items = typecacheof(list(
/obj/item/hand_tele,
/obj/item/card/id,
/obj/item/device/aicard,
/obj/item/aicard,
/obj/item/gun,
/obj/item/pinpointer,
/obj/item/clothing/shoes/magboots,
@@ -45,15 +45,15 @@
// Bags are prohibited from this due to the potential explotation of objects, same with brought
/obj/item/device/dogborg/sleeper/New()
/obj/item/dogborg/sleeper/New()
..()
update_icon()
flags_1 |= NOBLUDGEON_1 //No more attack messages
/obj/item/device/dogborg/sleeper/Exit(atom/movable/O)
/obj/item/dogborg/sleeper/Exit(atom/movable/O)
return 0
/obj/item/device/dogborg/sleeper/afterattack(mob/living/carbon/target, mob/living/silicon/user, proximity)
/obj/item/dogborg/sleeper/afterattack(mob/living/carbon/target, mob/living/silicon/user, proximity)
hound = loc
if(!proximity)
return
@@ -91,7 +91,7 @@
message_admins("[key_name(hound)] has sleeper'd [key_name(patient)] as a dogborg. [ADMIN_JMP(src)]")
playsound(hound, 'sound/effects/bin_close.ogg', 100, 1)
/obj/item/device/dogborg/sleeper/container_resist(mob/living/user)
/obj/item/dogborg/sleeper/container_resist(mob/living/user)
hound = loc
user.changeNext_move(CLICK_CD_BREAKOUT)
user.last_special = world.time + CLICK_CD_BREAKOUT
@@ -107,7 +107,7 @@
"<span class='notice'>You successfully break out of [hound.name]!</span>")
go_out()
/obj/item/device/dogborg/sleeper/proc/go_out(var/target)
/obj/item/dogborg/sleeper/proc/go_out(var/target)
hound = loc
hound.setClickCooldown(50)
if(length(contents) > 0)
@@ -139,12 +139,12 @@
cleaning = FALSE
update_gut()
/obj/item/device/dogborg/sleeper/attack_self(mob/user)
/obj/item/dogborg/sleeper/attack_self(mob/user)
if(..())
return
ui_interact(user)
/obj/item/device/dogborg/sleeper/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
/obj/item/dogborg/sleeper/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.notcontained_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
@@ -152,7 +152,7 @@
ui = new(user, src, ui_key, "dogborg_sleeper", name, 375, 550, master_ui, state)
ui.open()
/obj/item/device/dogborg/sleeper/ui_data()
/obj/item/dogborg/sleeper/ui_data()
var/list/data = list()
data["occupied"] = patient ? 1 : 0
@@ -197,7 +197,7 @@
data["occupant"]["reagents"] += list(list("name" = R.name, "volume" = R.volume))
return data
/obj/item/device/dogborg/sleeper/ui_act(action, params)
/obj/item/dogborg/sleeper/ui_act(action, params)
if(..())
return
@@ -221,7 +221,7 @@
clean_cycle()
. = TRUE
/obj/item/device/dogborg/sleeper/proc/update_gut()
/obj/item/dogborg/sleeper/proc/update_gut()
//Well, we HAD one, what happened to them?
if(patient in contents)
if(patient_laststat != patient.stat)
@@ -268,7 +268,7 @@
return
//Gurgleborg process
/obj/item/device/dogborg/sleeper/proc/clean_cycle()
/obj/item/dogborg/sleeper/proc/clean_cycle()
//Sanity
for(var/I in items_preserved)
if(!(I in contents))
@@ -341,10 +341,10 @@
if(cleaning)
addtimer(CALLBACK(src, .proc/clean_cycle), 50)
/obj/item/device/dogborg/sleeper/proc/CheckAccepted(obj/item/I)
/obj/item/dogborg/sleeper/proc/CheckAccepted(obj/item/I)
return is_type_in_typecache(I, important_items)
/obj/item/device/dogborg/sleeper/proc/inject_chem(chem)
/obj/item/dogborg/sleeper/proc/inject_chem(chem)
if(hound.cell.charge <= 800) //This is so borgs don't kill themselves with it. Remember, 750 charge used every injection.
to_chat(hound, "<span class='notice'>You don't have enough power to synthesize fluids.</span>")
return
@@ -356,13 +356,13 @@
var/units = round(patient.reagents.get_reagent_amount(chem))
to_chat(hound, "<span class='notice'>Injecting [units] unit\s of [chem] into occupant.</span>") //If they were immersed, the reagents wouldn't leave with them.
/obj/item/device/dogborg/sleeper/medihound //Medihound sleeper
/obj/item/dogborg/sleeper/medihound //Medihound sleeper
name = "Mobile Sleeper"
desc = "Equipment for medical hound. A mounted sleeper that stabilizes patients and can inject reagents in the borg's reserves."
icon = 'icons/mob/dogborg.dmi'
icon_state = "sleeper"
/obj/item/device/dogborg/sleeper/K9 //The K9 portabrig
/obj/item/dogborg/sleeper/K9 //The K9 portabrig
name = "Mobile Brig"
desc = "Equipment for a K9 unit. A mounted portable-brig that holds criminals."
icon = 'icons/mob/dogborg.dmi'
@@ -371,13 +371,13 @@
min_health = -100
injection_chems = null //So they don't have all the same chems as the medihound!
/obj/item/storage/attackby(obj/item/device/dogborg/sleeper/K9, mob/user, proximity)
/obj/item/storage/attackby(obj/item/dogborg/sleeper/K9, mob/user, proximity)
if(istype(K9))
K9.afterattack(src, user ,1)
else
. = ..()
/obj/item/device/dogborg/sleeper/K9/afterattack(var/atom/movable/target, mob/living/silicon/user, proximity)
/obj/item/dogborg/sleeper/K9/afterattack(var/atom/movable/target, mob/living/silicon/user, proximity)
hound = loc
if(!istype(target))
@@ -413,7 +413,7 @@
return
return
/obj/item/device/dogborg/sleeper/compactor //Janihound gut.
/obj/item/dogborg/sleeper/compactor //Janihound gut.
name = "garbage processor"
desc = "A mounted garbage compactor unit with fuel processor."
icon = 'icons/mob/dogborg.dmi'
@@ -423,13 +423,13 @@
injection_chems = null //So they don't have all the same chems as the medihound!
var/max_item_count = 30
/obj/item/storage/attackby(obj/item/device/dogborg/sleeper/compactor, mob/user, proximity) //GIT CIRCUMVENTED YO!
/obj/item/storage/attackby(obj/item/dogborg/sleeper/compactor, mob/user, proximity) //GIT CIRCUMVENTED YO!
if(istype(compactor))
compactor.afterattack(src, user ,1)
else
. = ..()
/obj/item/device/dogborg/sleeper/compactor/afterattack(var/atom/movable/target, mob/living/silicon/user, proximity)//GARBO NOMS
/obj/item/dogborg/sleeper/compactor/afterattack(var/atom/movable/target, mob/living/silicon/user, proximity)//GARBO NOMS
hound = loc
var/obj/item/target_obj = target
if(!istype(target))
@@ -1,6 +1,7 @@
/obj/item/device/doorCharge
/obj/item/doorCharge
name = "airlock charge"
desc = null //Different examine for traitors
icon = 'icons/obj/device.dmi'
item_state = "electronic"
icon_state = "doorCharge"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
@@ -13,7 +14,7 @@
attack_verb = list("blown up", "exploded", "detonated")
materials = list(MAT_METAL=50, MAT_GLASS=30)
/obj/item/device/doorCharge/ex_act(severity, target)
/obj/item/doorCharge/ex_act(severity, target)
switch(severity)
if(1)
visible_message("<span class='warning'>[src] detonates!</span>")
@@ -26,14 +27,14 @@
if(prob(25))
ex_act(EXPLODE_DEVASTATE)
/obj/item/device/doorCharge/Destroy()
/obj/item/doorCharge/Destroy()
if(istype(loc, /obj/machinery/door/airlock))
var/obj/machinery/door/airlock/A = loc
if(A.charge == src)
A.charge = null
return ..()
/obj/item/device/doorCharge/examine(mob/user)
/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.")
@@ -1,5 +1,5 @@
//Used by engineering cyborgs in place of generic circuits.
/obj/item/device/electroadaptive_pseudocircuit
/obj/item/electroadaptive_pseudocircuit
name = "electroadaptive pseudocircuit"
desc = "An all-in-one circuit imprinter, designer, synthesizer, outfitter, creator, and chef. It can be used in place of any generic circuit board during construction."
icon = 'icons/obj/module.dmi'
@@ -11,18 +11,18 @@
var/static/recycleable_circuits = typecacheof(list(/obj/item/electronics/firelock, /obj/item/electronics/airalarm, /obj/item/electronics/firealarm, \
/obj/item/electronics/apc))//A typecache of circuits consumable for material
/obj/item/device/electroadaptive_pseudocircuit/Initialize()
/obj/item/electroadaptive_pseudocircuit/Initialize()
. = ..()
maptext = "[circuits]"
/obj/item/device/electroadaptive_pseudocircuit/examine(mob/user)
/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>")
/obj/item/device/electroadaptive_pseudocircuit/proc/adapt_circuit(mob/living/silicon/robot/R, circuit_cost = 0)
/obj/item/electroadaptive_pseudocircuit/proc/adapt_circuit(mob/living/silicon/robot/R, circuit_cost = 0)
if(QDELETED(R) || !istype(R))
return
if(!R.cell)
@@ -46,7 +46,7 @@
addtimer(CALLBACK(src, .proc/recharge), recharge_time)
return TRUE //The actual circuit magic itself is done on a per-object basis
/obj/item/device/electroadaptive_pseudocircuit/afterattack(atom/target, mob/living/user, proximity)
/obj/item/electroadaptive_pseudocircuit/afterattack(atom/target, mob/living/user, proximity)
if(!proximity)
return
if(!is_type_in_typecache(target, recycleable_circuits))
@@ -58,7 +58,7 @@
playsound(user, 'sound/items/deconstruct.ogg', 50, TRUE)
qdel(target)
/obj/item/device/electroadaptive_pseudocircuit/proc/recharge()
/obj/item/electroadaptive_pseudocircuit/proc/recharge()
playsound(src, 'sound/machines/chime.ogg', 25, TRUE)
recharging = FALSE
icon_state = initial(icon_state)
+50 -50
View File
@@ -1,4 +1,4 @@
/obj/item/device/flashlight
/obj/item/flashlight
name = "flashlight"
desc = "A hand-held emergency light."
icon = 'icons/obj/lighting.dmi'
@@ -15,11 +15,11 @@
var/brightness_on = 4 //range of light when on
var/flashlight_power = 1 //strength of the light when on
/obj/item/device/flashlight/Initialize()
/obj/item/flashlight/Initialize()
. = ..()
update_brightness()
/obj/item/device/flashlight/proc/update_brightness(mob/user = null)
/obj/item/flashlight/proc/update_brightness(mob/user = null)
if(on)
icon_state = "[initial(icon_state)]-on"
if(flashlight_power)
@@ -30,7 +30,7 @@
icon_state = initial(icon_state)
set_light(0)
/obj/item/device/flashlight/attack_self(mob/user)
/obj/item/flashlight/attack_self(mob/user)
on = !on
update_brightness(user)
for(var/X in actions)
@@ -38,14 +38,14 @@
A.UpdateButtonIcon()
return 1
/obj/item/device/flashlight/suicide_act(mob/living/carbon/human/user)
/obj/item/flashlight/suicide_act(mob/living/carbon/human/user)
if (user.eye_blind)
user.visible_message("<span class='suicide'>[user] is putting [src] close to [user.p_their()] eyes and turning it on ... but [user.p_theyre()] blind!</span>")
return SHAME
user.visible_message("<span class='suicide'>[user] is putting [src] close to [user.p_their()] eyes and turning it on! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return (FIRELOSS)
/obj/item/device/flashlight/attack(mob/living/carbon/M, mob/living/carbon/human/user)
/obj/item/flashlight/attack(mob/living/carbon/M, mob/living/carbon/human/user)
add_fingerprint(user)
if(istype(M) && on && user.zone_selected in list(BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH))
@@ -158,7 +158,7 @@
else
return ..()
/obj/item/device/flashlight/pen
/obj/item/flashlight/pen
name = "penlight"
desc = "A pen-sized light, used by medical staff. It can also be used to create a hologram to alert people of incoming medical assistance."
icon_state = "penlight"
@@ -167,7 +167,7 @@
brightness_on = 2
var/holo_cooldown = 0
/obj/item/device/flashlight/pen/afterattack(atom/target, mob/user, proximity_flag)
/obj/item/flashlight/pen/afterattack(atom/target, mob/user, proximity_flag)
if(!proximity_flag)
if(holo_cooldown > world.time)
to_chat(user, "<span class='warning'>[src] is not ready yet!</span>")
@@ -192,7 +192,7 @@
visible_message("<span class='danger'>[creator] created a medical hologram!</span>")
/obj/item/device/flashlight/seclite
/obj/item/flashlight/seclite
name = "seclite"
desc = "A robust flashlight used by security."
icon_state = "seclite"
@@ -204,7 +204,7 @@
hitsound = 'sound/weapons/genhit1.ogg'
// the desk lamps are a bit special
/obj/item/device/flashlight/lamp
/obj/item/flashlight/lamp
name = "desk lamp"
desc = "A desk lamp with an adjustable mount."
icon_state = "lamp"
@@ -220,14 +220,14 @@
// green-shaded desk lamp
/obj/item/device/flashlight/lamp/green
/obj/item/flashlight/lamp/green
desc = "A classic green-shaded desk lamp."
icon_state = "lampgreen"
item_state = "lampgreen"
/obj/item/device/flashlight/lamp/verb/toggle_light()
/obj/item/flashlight/lamp/verb/toggle_light()
set name = "Toggle light"
set category = "Object"
set src in oview(1)
@@ -236,7 +236,7 @@
attack_self(usr)
//Bananalamp
/obj/item/device/flashlight/lamp/bananalamp
/obj/item/flashlight/lamp/bananalamp
name = "banana lamp"
desc = "Only a clown would think to make a ghetto banana-shaped lamp. Even has a goofy pullstring."
icon_state = "bananalamp"
@@ -244,7 +244,7 @@
// FLARES
/obj/item/device/flashlight/flare
/obj/item/flashlight/flare
name = "flare"
desc = "A red Nanotrasen issued flare. There are instructions on the side, it reads 'pull cord, make light'."
w_class = WEIGHT_CLASS_SMALL
@@ -259,11 +259,11 @@
light_color = LIGHT_COLOR_FLARE
grind_results = list("sulfur" = 15)
/obj/item/device/flashlight/flare/New()
/obj/item/flashlight/flare/New()
fuel = rand(800, 1000) // Sorry for changing this so much but I keep under-estimating how long X number of ticks last in seconds.
..()
/obj/item/device/flashlight/flare/process()
/obj/item/flashlight/flare/process()
open_flame(heat)
fuel = max(fuel - 1, 0)
if(!fuel || !on)
@@ -272,14 +272,14 @@
icon_state = "[initial(icon_state)]-empty"
STOP_PROCESSING(SSobj, src)
/obj/item/device/flashlight/flare/ignition_effect(atom/A, mob/user)
/obj/item/flashlight/flare/ignition_effect(atom/A, mob/user)
if(fuel && on)
. = "<span class='notice'>[user] lights [A] with [src] like a real \
badass.</span>"
else
. = ""
/obj/item/device/flashlight/flare/proc/turn_off()
/obj/item/flashlight/flare/proc/turn_off()
on = FALSE
force = initial(src.force)
damtype = initial(src.damtype)
@@ -289,14 +289,14 @@
else
update_brightness(null)
/obj/item/device/flashlight/flare/update_brightness(mob/user = null)
/obj/item/flashlight/flare/update_brightness(mob/user = null)
..()
if(on)
item_state = "[initial(item_state)]-on"
else
item_state = "[initial(item_state)]"
/obj/item/device/flashlight/flare/attack_self(mob/user)
/obj/item/flashlight/flare/attack_self(mob/user)
// Usual checks
if(!fuel)
@@ -314,10 +314,10 @@
damtype = "fire"
START_PROCESSING(SSobj, src)
/obj/item/device/flashlight/flare/is_hot()
/obj/item/flashlight/flare/is_hot()
return on * heat
/obj/item/device/flashlight/flare/torch
/obj/item/flashlight/flare/torch
name = "torch"
desc = "A torch fashioned from some leaves and a log."
w_class = WEIGHT_CLASS_BULKY
@@ -330,7 +330,7 @@
on_damage = 10
slot_flags = null
/obj/item/device/flashlight/lantern
/obj/item/flashlight/lantern
name = "lantern"
icon_state = "lantern"
item_state = "lantern"
@@ -340,7 +340,7 @@
brightness_on = 6 // luminosity when on
/obj/item/device/flashlight/slime
/obj/item/flashlight/slime
gender = PLURAL
name = "glowing slime extract"
desc = "Extract from a yellow slime. It emits a strong light when squeezed."
@@ -352,21 +352,21 @@
materials = list()
brightness_on = 6 //luminosity when on
/obj/item/device/flashlight/emp
/obj/item/flashlight/emp
var/emp_max_charges = 4
var/emp_cur_charges = 4
var/charge_tick = 0
/obj/item/device/flashlight/emp/New()
/obj/item/flashlight/emp/New()
..()
START_PROCESSING(SSobj, src)
/obj/item/device/flashlight/emp/Destroy()
/obj/item/flashlight/emp/Destroy()
STOP_PROCESSING(SSobj, src)
. = ..()
/obj/item/device/flashlight/emp/process()
/obj/item/flashlight/emp/process()
charge_tick++
if(charge_tick < 10)
return FALSE
@@ -374,12 +374,12 @@
emp_cur_charges = min(emp_cur_charges+1, emp_max_charges)
return TRUE
/obj/item/device/flashlight/emp/attack(mob/living/M, mob/living/user)
/obj/item/flashlight/emp/attack(mob/living/M, mob/living/user)
if(on && user.zone_selected in list(BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH)) // call original attack when examining organs
..()
return
/obj/item/device/flashlight/emp/afterattack(atom/movable/A, mob/user, proximity)
/obj/item/flashlight/emp/afterattack(atom/movable/A, mob/user, proximity)
if(!proximity)
return
@@ -401,7 +401,7 @@
// Glowsticks, in the uncomfortable range of similar to flares,
// but not similar enough to make it worth a refactor
/obj/item/device/flashlight/glowstick
/obj/item/flashlight/glowstick
name = "glowstick"
desc = "A military-grade glowstick."
w_class = WEIGHT_CLASS_SMALL
@@ -412,27 +412,27 @@
grind_results = list("phenol" = 15, "hydrogen" = 10, "oxygen" = 5) //Meth-in-a-stick
var/fuel = 0
/obj/item/device/flashlight/glowstick/Initialize()
/obj/item/flashlight/glowstick/Initialize()
fuel = rand(1600, 2000)
light_color = color
. = ..()
/obj/item/device/flashlight/glowstick/Destroy()
/obj/item/flashlight/glowstick/Destroy()
STOP_PROCESSING(SSobj, src)
. = ..()
/obj/item/device/flashlight/glowstick/process()
/obj/item/flashlight/glowstick/process()
fuel = max(fuel - 1, 0)
if(!fuel)
turn_off()
STOP_PROCESSING(SSobj, src)
update_icon()
/obj/item/device/flashlight/glowstick/proc/turn_off()
/obj/item/flashlight/glowstick/proc/turn_off()
on = FALSE
update_icon()
/obj/item/device/flashlight/glowstick/update_icon()
/obj/item/flashlight/glowstick/update_icon()
item_state = "glowstick"
cut_overlays()
if(!fuel)
@@ -449,7 +449,7 @@
icon_state = "glowstick"
cut_overlays()
/obj/item/device/flashlight/glowstick/attack_self(mob/user)
/obj/item/flashlight/glowstick/attack_self(mob/user)
if(!fuel)
to_chat(user, "<span class='notice'>[src] is spent.</span>")
return
@@ -462,47 +462,47 @@
user.visible_message("<span class='notice'>[user] cracks and shakes [src].</span>", "<span class='notice'>You crack and shake [src], turning it on!</span>")
activate()
/obj/item/device/flashlight/glowstick/proc/activate()
/obj/item/flashlight/glowstick/proc/activate()
if(!on)
on = TRUE
START_PROCESSING(SSobj, src)
/obj/item/device/flashlight/glowstick/red
/obj/item/flashlight/glowstick/red
name = "red glowstick"
color = LIGHT_COLOR_RED
/obj/item/device/flashlight/glowstick/blue
/obj/item/flashlight/glowstick/blue
name = "blue glowstick"
color = LIGHT_COLOR_BLUE
/obj/item/device/flashlight/glowstick/cyan
/obj/item/flashlight/glowstick/cyan
name = "cyan glowstick"
color = LIGHT_COLOR_CYAN
/obj/item/device/flashlight/glowstick/orange
/obj/item/flashlight/glowstick/orange
name = "orange glowstick"
color = LIGHT_COLOR_ORANGE
/obj/item/device/flashlight/glowstick/yellow
/obj/item/flashlight/glowstick/yellow
name = "yellow glowstick"
color = LIGHT_COLOR_YELLOW
/obj/item/device/flashlight/glowstick/pink
/obj/item/flashlight/glowstick/pink
name = "pink glowstick"
color = LIGHT_COLOR_PINK
/obj/item/device/flashlight/glowstick/random
/obj/item/flashlight/glowstick/random
name = "random colored glowstick"
icon_state = "random_glowstick"
color = null
/obj/item/device/flashlight/glowstick/random/Initialize()
/obj/item/flashlight/glowstick/random/Initialize()
..()
var/T = pick(typesof(/obj/item/device/flashlight/glowstick) - /obj/item/device/flashlight/glowstick/random)
var/T = pick(typesof(/obj/item/flashlight/glowstick) - /obj/item/flashlight/glowstick/random)
new T(loc)
return INITIALIZE_HINT_QDEL
/obj/item/device/flashlight/spotlight //invisible lighting source
/obj/item/flashlight/spotlight //invisible lighting source
name = "disco light"
desc = "Groovy..."
icon_state = null
@@ -517,7 +517,7 @@
var/range = null
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/item/device/flashlight/flashdark
/obj/item/flashlight/flashdark
name = "flashdark"
desc = "A strange device manufactured with mysterious elements that somehow emits darkness. Or maybe it just sucks in light? Nobody knows for sure."
icon_state = "flashdark"
@@ -525,7 +525,7 @@
brightness_on = 2.5
flashlight_power = -3
/obj/item/device/flashlight/eyelight
/obj/item/flashlight/eyelight
name = "eyelight"
desc = "This shouldn't exist outside of someone's head, how are you seeing this?"
brightness_on = 15
@@ -1,6 +1,7 @@
/obj/item/device/forcefield
/obj/item/forcefield
name = "forcefield projector"
desc = "An experimental device that can create several forcefields at a distance."
icon = 'icons/obj/device.dmi'
icon_state = "signmaker_engi"
slot_flags = SLOT_BELT
w_class = WEIGHT_CLASS_SMALL
@@ -15,7 +16,7 @@
var/list/current_fields
var/field_distance_limit = 7
/obj/item/device/forcefield/afterattack(atom/target, mob/user, proximity_flag)
/obj/item/forcefield/afterattack(atom/target, mob/user, proximity_flag)
if(!check_allowed_items(target, 1))
return
if(istype(target, /obj/structure/projected_forcefield))
@@ -39,27 +40,27 @@
current_fields += F
user.changeNext_move(CLICK_CD_MELEE)
/obj/item/device/forcefield/attack_self(mob/user)
/obj/item/forcefield/attack_self(mob/user)
if(LAZYLEN(current_fields))
to_chat(user, "<span class='notice'>You deactivate [src], disabling all active forcefields.</span>")
for(var/obj/structure/projected_forcefield/F in current_fields)
qdel(F)
/obj/item/device/forcefield/examine(mob/user)
/obj/item/forcefield/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>")
/obj/item/device/forcefield/Initialize(mapload)
/obj/item/forcefield/Initialize(mapload)
..()
current_fields = list()
START_PROCESSING(SSobj, src)
/obj/item/device/forcefield/Destroy()
/obj/item/forcefield/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/device/forcefield/process()
/obj/item/forcefield/process()
if(!LAZYLEN(current_fields))
shield_integrity = min(shield_integrity + 4, max_shield_integrity)
else
@@ -80,9 +81,9 @@
resistance_flags = INDESTRUCTIBLE
CanAtmosPass = ATMOS_PASS_DENSITY
armor = list("melee" = 0, "bullet" = 25, "laser" = 50, "energy" = 50, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
var/obj/item/device/forcefield/generator
var/obj/item/forcefield/generator
/obj/structure/projected_forcefield/Initialize(mapload, obj/item/device/forcefield/origin)
/obj/structure/projected_forcefield/Initialize(mapload, obj/item/forcefield/origin)
. = ..()
generator = origin
@@ -8,9 +8,10 @@
#define RAD_GRACE_PERIOD 2
/obj/item/device/geiger_counter //DISCLAIMER: I know nothing about how real-life Geiger counters work. This will not be realistic. ~Xhuis
/obj/item/geiger_counter //DISCLAIMER: I know nothing about how real-life Geiger counters work. This will not be realistic. ~Xhuis
name = "geiger counter"
desc = "A handheld device used for detecting and measuring radiation pulses."
icon = 'icons/obj/device.dmi'
icon_state = "geiger_off"
item_state = "multitool"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
@@ -29,17 +30,17 @@
var/fail_to_receive = 0
var/current_warning = 1
/obj/item/device/geiger_counter/Initialize()
/obj/item/geiger_counter/Initialize()
. = ..()
START_PROCESSING(SSobj, src)
soundloop = new(list(src), FALSE)
/obj/item/device/geiger_counter/Destroy()
/obj/item/geiger_counter/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/device/geiger_counter/process()
/obj/item/geiger_counter/process()
update_icon()
update_sound()
@@ -61,7 +62,7 @@
current_tick_amount = 0
/obj/item/device/geiger_counter/examine(mob/user)
/obj/item/geiger_counter/examine(mob/user)
..()
if(!scanning)
return 1
@@ -85,7 +86,7 @@
to_chat(user, "<span class='notice'>The last radiation amount detected was [last_tick_amount]</span>")
/obj/item/device/geiger_counter/update_icon()
/obj/item/geiger_counter/update_icon()
if(!scanning)
icon_state = "geiger_off"
return 1
@@ -107,7 +108,7 @@
icon_state = "geiger_on_5"
..()
/obj/item/device/geiger_counter/proc/update_sound()
/obj/item/geiger_counter/proc/update_sound()
var/datum/looping_sound/geiger/loop = soundloop
if(!scanning)
loop.stop()
@@ -118,19 +119,19 @@
loop.last_radiation = radiation_count
loop.start()
/obj/item/device/geiger_counter/rad_act(amount)
/obj/item/geiger_counter/rad_act(amount)
. = ..()
if(amount <= RAD_BACKGROUND_RADIATION || !scanning)
return
current_tick_amount += amount
update_icon()
/obj/item/device/geiger_counter/attack_self(mob/user)
/obj/item/geiger_counter/attack_self(mob/user)
scanning = !scanning
update_icon()
to_chat(user, "<span class='notice'>[icon2html(src, user)] You switch [scanning ? "on" : "off"] [src].</span>")
/obj/item/device/geiger_counter/attack(mob/living/M, mob/user)
/obj/item/geiger_counter/attack(mob/living/M, mob/user)
if(user.a_intent == INTENT_HELP)
if(!(obj_flags & EMAGGED))
user.visible_message("<span class='notice'>[user] scans [M] with [src].</span>", "<span class='notice'>You scan [M]'s radiation levels with [src]...</span>")
@@ -142,7 +143,7 @@
return 1
..()
/obj/item/device/geiger_counter/proc/scan(atom/A, mob/user)
/obj/item/geiger_counter/proc/scan(atom/A, mob/user)
var/rad_strength = 0
for(var/i in get_rad_contents(A)) // Yes it's intentional that you can't detect radioactive things under rad protection. Gives traitors a way to hide their glowing green rocks.
var/atom/thing = i
@@ -164,7 +165,7 @@
else
to_chat(user, "<span class='notice'>[icon2html(src, user)] Subject is free of radioactive contamination.</span>")
/obj/item/device/geiger_counter/attackby(obj/item/I, mob/user, params)
/obj/item/geiger_counter/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/screwdriver) && (obj_flags & EMAGGED))
if(scanning)
to_chat(user, "<span class='warning'>Turn off [src] before you perform this action!</span>")
@@ -180,7 +181,7 @@
else
return ..()
/obj/item/device/geiger_counter/AltClick(mob/living/user)
/obj/item/geiger_counter/AltClick(mob/living/user)
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
return ..()
if(!scanning)
@@ -190,7 +191,7 @@
to_chat(usr, "<span class='notice'>You flush [src]'s radiation counts, resetting it to normal.</span>")
update_icon()
/obj/item/device/geiger_counter/emag_act(mob/user)
/obj/item/geiger_counter/emag_act(mob/user)
if(obj_flags & EMAGGED)
return
if(scanning)
@@ -199,17 +200,17 @@
to_chat(user, "<span class='warning'>You override [src]'s radiation storing protocols. It will now generate small doses of radiation, and stored rads are now projected into creatures you scan.</span>")
obj_flags |= EMAGGED
/obj/item/device/geiger_counter/cyborg
/obj/item/geiger_counter/cyborg
var/datum/component/mobhook
/obj/item/device/geiger_counter/cyborg/equipped(mob/user)
/obj/item/geiger_counter/cyborg/equipped(mob/user)
. = ..()
if (mobhook && mobhook.parent != user)
QDEL_NULL(mobhook)
if (!mobhook)
mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_ATOM_RAD_ACT), CALLBACK(src, /atom.proc/rad_act))
/obj/item/device/geiger_counter/cyborg/dropped()
/obj/item/geiger_counter/cyborg/dropped()
. = ..()
QDEL_NULL(mobhook)
+24 -24
View File
@@ -1,5 +1,5 @@
GLOBAL_LIST_EMPTY(GPS_list)
/obj/item/device/gps
/obj/item/gps
name = "global positioning system"
desc = "Helping lost spacemen find their way through the planets since 2016."
icon = 'icons/obj/telescience.dmi'
@@ -14,38 +14,38 @@ GLOBAL_LIST_EMPTY(GPS_list)
var/updating = TRUE //Automatic updating of GPS list. Can be set to manual by user.
var/global_mode = TRUE //If disabled, only GPS signals of the same Z level are shown
/obj/item/device/gps/examine(mob/user)
/obj/item/gps/examine(mob/user)
..()
to_chat(user, "<span class='notice'>Alt-click to switch it [tracking ? "off":"on"].</span>")
/obj/item/device/gps/Initialize()
/obj/item/gps/Initialize()
. = ..()
GLOB.GPS_list += src
name = "global positioning system ([gpstag])"
add_overlay("working")
/obj/item/device/gps/Destroy()
/obj/item/gps/Destroy()
GLOB.GPS_list -= src
return ..()
/obj/item/device/gps/emp_act(severity)
/obj/item/gps/emp_act(severity)
emped = TRUE
cut_overlay("working")
add_overlay("emp")
addtimer(CALLBACK(src, .proc/reboot), 300, TIMER_OVERRIDE) //if a new EMP happens, remove the old timer so it doesn't reactivate early
SStgui.close_uis(src) //Close the UI control if it is open.
/obj/item/device/gps/proc/reboot()
/obj/item/gps/proc/reboot()
emped = FALSE
cut_overlay("emp")
add_overlay("working")
/obj/item/device/gps/AltClick(mob/user)
/obj/item/gps/AltClick(mob/user)
if(!user.canUseTopic(src, BE_CLOSE))
return
toggletracking(user)
/obj/item/device/gps/proc/toggletracking(mob/user)
/obj/item/gps/proc/toggletracking(mob/user)
if(!user.canUseTopic(src, BE_CLOSE))
return //user not valid to use gps
if(emped)
@@ -61,7 +61,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
tracking = TRUE
/obj/item/device/gps/ui_interact(mob/user, ui_key = "gps", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) // Remember to use the appropriate state.
/obj/item/gps/ui_interact(mob/user, ui_key = "gps", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) // Remember to use the appropriate state.
if(emped)
to_chat(user, "[src] fizzles weakly.")
return
@@ -74,7 +74,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
ui.set_autoupdate(state = updating)
/obj/item/device/gps/ui_data(mob/user)
/obj/item/gps/ui_data(mob/user)
var/list/data = list()
data["power"] = tracking
data["tag"] = gpstag
@@ -90,7 +90,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
data["signals"] = list()
for(var/gps in GLOB.GPS_list)
var/obj/item/device/gps/G = gps
var/obj/item/gps/G = gps
if(G.emped || !G.tracking || G == src)
continue
var/turf/pos = get_turf(G)
@@ -115,7 +115,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
/obj/item/device/gps/ui_act(action, params)
/obj/item/gps/ui_act(action, params)
if(..())
return
switch(action)
@@ -137,42 +137,42 @@ GLOBAL_LIST_EMPTY(GPS_list)
. = TRUE
/obj/item/device/gps/science
/obj/item/gps/science
icon_state = "gps-s"
gpstag = "SCI0"
/obj/item/device/gps/engineering
/obj/item/gps/engineering
icon_state = "gps-e"
gpstag = "ENG0"
/obj/item/device/gps/mining
/obj/item/gps/mining
icon_state = "gps-m"
gpstag = "MINE0"
desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life."
/obj/item/device/gps/cyborg
/obj/item/gps/cyborg
icon_state = "gps-b"
gpstag = "BORG0"
desc = "A mining cyborg internal positioning system. Used as a recovery beacon for damaged cyborg assets, or a collaboration tool for mining teams."
flags_1 = NODROP_1
/obj/item/device/gps/internal
/obj/item/gps/internal
icon_state = null
flags_1 = ABSTRACT_1
gpstag = "Eerie Signal"
desc = "Report to a coder immediately."
invisibility = INVISIBILITY_MAXIMUM
/obj/item/device/gps/mining/internal
/obj/item/gps/mining/internal
icon_state = "gps-m"
gpstag = "MINER"
desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life."
/obj/item/device/gps/internal/base
/obj/item/gps/internal/base
gpstag = "NT_AUX"
desc = "A homing signal from Nanotrasen's mining base."
/obj/item/device/gps/visible_debug
/obj/item/gps/visible_debug
name = "visible GPS"
gpstag = "ADMIN"
desc = "This admin-spawn GPS unit leaves the coordinates visible \
@@ -180,12 +180,12 @@ GLOBAL_LIST_EMPTY(GPS_list)
for marking the area around the transition edges."
var/list/turf/tagged
/obj/item/device/gps/visible_debug/Initialize()
/obj/item/gps/visible_debug/Initialize()
. = ..()
tagged = list()
START_PROCESSING(SSfastprocess, src)
/obj/item/device/gps/visible_debug/process()
/obj/item/gps/visible_debug/process()
var/turf/T = get_turf(src)
if(T)
// I assume it's faster to color,tag and OR the turf in, rather
@@ -194,13 +194,13 @@ GLOBAL_LIST_EMPTY(GPS_list)
T.maptext = "[T.x],[T.y],[T.z]"
tagged |= T
/obj/item/device/gps/visible_debug/proc/clear()
/obj/item/gps/visible_debug/proc/clear()
while(tagged.len)
var/turf/T = pop(tagged)
T.color = initial(T.color)
T.maptext = initial(T.maptext)
/obj/item/device/gps/visible_debug/Destroy()
/obj/item/gps/visible_debug/Destroy()
if(tagged)
clear()
tagged = null
+32 -32
View File
@@ -1,5 +1,5 @@
//copy pasta of the space piano, don't hurt me -Pete
/obj/item/device/instrument
/obj/item/instrument
name = "generic instrument"
resistance_flags = FLAMMABLE
force = 10
@@ -11,34 +11,34 @@
var/instrumentId = "generic"
var/instrumentExt = "mid"
/obj/item/device/instrument/Initialize()
/obj/item/instrument/Initialize()
. = ..()
song = new(instrumentId, src, instrumentExt)
/obj/item/device/instrument/Destroy()
/obj/item/instrument/Destroy()
qdel(song)
song = null
return ..()
/obj/item/device/instrument/suicide_act(mob/user)
/obj/item/instrument/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] begins to play 'Gloomy Sunday'! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return (BRUTELOSS)
/obj/item/device/instrument/Initialize(mapload)
/obj/item/instrument/Initialize(mapload)
. = ..()
if(mapload)
song.tempo = song.sanitize_tempo(song.tempo) // tick_lag isn't set when the map is loaded
/obj/item/device/instrument/attack_self(mob/user)
/obj/item/instrument/attack_self(mob/user)
if(!user.IsAdvancedToolUser())
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
return 1
interact(user)
/obj/item/device/instrument/interact(mob/user)
/obj/item/instrument/interact(mob/user)
ui_interact(user)
/obj/item/device/instrument/ui_interact(mob/user)
/obj/item/instrument/ui_interact(mob/user)
if(!user)
return
@@ -48,7 +48,7 @@
user.set_machine(src)
song.interact(user)
/obj/item/device/instrument/violin
/obj/item/instrument/violin
name = "space violin"
desc = "A wooden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\""
icon_state = "violin"
@@ -56,14 +56,14 @@
hitsound = "swing_hit"
instrumentId = "violin"
/obj/item/device/instrument/violin/golden
/obj/item/instrument/violin/golden
name = "golden violin"
desc = "A golden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\""
icon_state = "golden_violin"
item_state = "golden_violin"
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
/obj/item/device/instrument/piano_synth
/obj/item/instrument/piano_synth
name = "synthesizer"
desc = "An advanced electronic synthesizer that can be used as various instruments."
icon_state = "synth"
@@ -73,11 +73,11 @@
var/static/list/insTypes = list("accordion" = "mid", "bikehorn" = "ogg", "glockenspiel" = "mid", "guitar" = "ogg", "harmonica" = "mid", "piano" = "ogg", "recorder" = "mid", "saxophone" = "mid", "trombone" = "mid", "violin" = "mid", "xylophone" = "mid") //No eguitar you ear-rapey fuckers.
actions_types = list(/datum/action/item_action/synthswitch)
/obj/item/device/instrument/piano_synth/proc/changeInstrument(name = "piano")
/obj/item/instrument/piano_synth/proc/changeInstrument(name = "piano")
song.instrumentDir = name
song.instrumentExt = insTypes[name]
/obj/item/device/instrument/guitar
/obj/item/instrument/guitar
name = "guitar"
desc = "It's made of wood and has bronze strings."
icon_state = "guitar"
@@ -87,7 +87,7 @@
hitsound = 'sound/weapons/stringsmash.ogg'
instrumentId = "guitar"
/obj/item/device/instrument/eguitar
/obj/item/instrument/eguitar
name = "electric guitar"
desc = "Makes all your shredding needs possible."
icon_state = "eguitar"
@@ -98,28 +98,28 @@
instrumentId = "eguitar"
instrumentExt = "ogg"
/obj/item/device/instrument/glockenspiel
/obj/item/instrument/glockenspiel
name = "glockenspiel"
desc = "Smooth metal bars perfect for any marching band."
icon_state = "glockenspiel"
item_state = "glockenspiel"
instrumentId = "glockenspiel"
/obj/item/device/instrument/accordion
/obj/item/instrument/accordion
name = "accordion"
desc = "Pun-Pun not included."
icon_state = "accordion"
item_state = "accordion"
instrumentId = "accordion"
/obj/item/device/instrument/trumpet
/obj/item/instrument/trumpet
name = "trumpet"
desc = "To announce the arrival of the king!"
icon_state = "trumpet"
item_state = "trombone"
instrumentId = "trombone"
/obj/item/device/instrument/trumpet/spectral
/obj/item/instrument/trumpet/spectral
name = "spectral trumpet"
desc = "Things are about to get spooky!"
icon_state = "trumpet"
@@ -128,22 +128,22 @@
instrumentId = "trombone"
attack_verb = list("played","jazzed","trumpeted","mourned","dooted","spooked")
/obj/item/device/instrument/trumpet/spectral/Initialize()
/obj/item/instrument/trumpet/spectral/Initialize()
. = ..()
AddComponent(/datum/component/spooky)
/obj/item/device/instrument/trumpet/spectral/attack(mob/living/carbon/C, mob/user)
/obj/item/instrument/trumpet/spectral/attack(mob/living/carbon/C, mob/user)
playsound (loc, 'sound/instruments/trombone/En4.mid', 100,1,-1)
..()
/obj/item/device/instrument/saxophone
/obj/item/instrument/saxophone
name = "saxophone"
desc = "This soothing sound will be sure to leave your audience in tears."
icon_state = "saxophone"
item_state = "saxophone"
instrumentId = "saxophone"
/obj/item/device/instrument/saxophone/spectral
/obj/item/instrument/saxophone/spectral
name = "spectral saxophone"
desc = "This spooky sound will be sure to leave mortals in bones."
icon_state = "saxophone"
@@ -152,22 +152,22 @@
force = 0
attack_verb = list("played","jazzed","saxxed","mourned","dooted","spooked")
/obj/item/device/instrument/saxophone/spectral/Initialize()
/obj/item/instrument/saxophone/spectral/Initialize()
. = ..()
AddComponent(/datum/component/spooky)
/obj/item/device/instrument/saxophone/spectral/attack(mob/living/carbon/C, mob/user)
/obj/item/instrument/saxophone/spectral/attack(mob/living/carbon/C, mob/user)
playsound (loc, 'sound/instruments/saxophone/En4.mid', 100,1,-1)
..()
/obj/item/device/instrument/trombone
/obj/item/instrument/trombone
name = "trombone"
desc = "How can any pool table ever hope to compete?"
icon_state = "trombone"
item_state = "trombone"
instrumentId = "trombone"
/obj/item/device/instrument/trombone/spectral
/obj/item/instrument/trombone/spectral
name = "spectral trombone"
desc = "A skeleton's favorite instrument. Apply directly on the mortals."
instrumentId = "trombone"
@@ -176,15 +176,15 @@
force = 0
attack_verb = list("played","jazzed","tromboned","mourned","dooted","spooked")
/obj/item/device/instrument/trombone/spectral/Initialize()
/obj/item/instrument/trombone/spectral/Initialize()
. = ..()
AddComponent(/datum/component/spooky)
/obj/item/device/instrument/trombone/spectral/attack(mob/living/carbon/C, mob/user)
/obj/item/instrument/trombone/spectral/attack(mob/living/carbon/C, mob/user)
playsound (loc, 'sound/instruments/trombone/Cn4.mid', 100,1,-1)
..()
/obj/item/device/instrument/recorder
/obj/item/instrument/recorder
name = "recorder"
desc = "Just like in school, playing ability and all."
force = 5
@@ -192,7 +192,7 @@
item_state = "recorder"
instrumentId = "recorder"
/obj/item/device/instrument/harmonica
/obj/item/instrument/harmonica
name = "harmonica"
desc = "For when you get a bad case of the space blues."
icon_state = "harmonica"
@@ -203,13 +203,13 @@
w_class = WEIGHT_CLASS_SMALL
actions_types = list(/datum/action/item_action/instrument)
/obj/item/device/instrument/harmonica/speechModification(message)
/obj/item/instrument/harmonica/speechModification(message)
if(song.playing && ismob(loc))
to_chat(loc, "<span class='warning'>You stop playing the harmonica to talk...</span>")
song.playing = FALSE
return message
/obj/item/device/instrument/bikehorn
/obj/item/instrument/bikehorn
name = "gilded bike horn"
desc = "An exquisitely decorated bike horn, capable of honking in a variety of notes."
icon_state = "bike_horn"
+11 -11
View File
@@ -1,4 +1,4 @@
/obj/item/device/laser_pointer
/obj/item/laser_pointer
name = "laser pointer"
desc = "Don't shine it in your eyes!"
icon = 'icons/obj/device.dmi'
@@ -18,26 +18,26 @@
var/obj/item/stock_parts/micro_laser/diode //used for upgrading!
/obj/item/device/laser_pointer/red
/obj/item/laser_pointer/red
pointer_icon_state = "red_laser"
/obj/item/device/laser_pointer/green
/obj/item/laser_pointer/green
pointer_icon_state = "green_laser"
/obj/item/device/laser_pointer/blue
/obj/item/laser_pointer/blue
pointer_icon_state = "blue_laser"
/obj/item/device/laser_pointer/purple
/obj/item/laser_pointer/purple
pointer_icon_state = "purple_laser"
/obj/item/device/laser_pointer/New()
/obj/item/laser_pointer/New()
..()
diode = new(src)
if(!pointer_icon_state)
pointer_icon_state = pick("red_laser","green_laser","blue_laser","purple_laser")
/obj/item/device/laser_pointer/upgraded/New()
/obj/item/laser_pointer/upgraded/New()
..()
diode = new /obj/item/stock_parts/micro_laser/ultra
/obj/item/device/laser_pointer/attackby(obj/item/W, mob/user, params)
/obj/item/laser_pointer/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/stock_parts/micro_laser))
if(!diode)
if(!user.transferItemToLoc(W, src))
@@ -55,10 +55,10 @@
else
return ..()
/obj/item/device/laser_pointer/afterattack(atom/target, mob/living/user, flag, params)
/obj/item/laser_pointer/afterattack(atom/target, mob/living/user, flag, params)
laser_act(target, user, params)
/obj/item/device/laser_pointer/proc/laser_act(atom/target, mob/living/user, params)
/obj/item/laser_pointer/proc/laser_act(atom/target, mob/living/user, params)
if( !(user in (viewers(7,target))) )
return
if (!diode)
@@ -182,7 +182,7 @@
flick_overlay_view(I, targloc, 10)
icon_state = "pointer"
/obj/item/device/laser_pointer/process()
/obj/item/laser_pointer/process()
if(prob(20 - recharge_locked*5))
energy += 1
if(energy >= max_energy)
@@ -38,7 +38,7 @@
#define LIGHT_BURNED 3
/obj/item/device/lightreplacer
/obj/item/lightreplacer
name = "light replacer"
desc = "A device to automatically replace lights. Refill with broken or working lightbulbs, or sheets of glass."
@@ -67,16 +67,16 @@
// when we get this many shards, we get a free bulb.
var/shards_required = 4
/obj/item/device/lightreplacer/New()
/obj/item/lightreplacer/New()
uses = max_uses / 2
failmsg = "The [name]'s refill light blinks red."
..()
/obj/item/device/lightreplacer/examine(mob/user)
/obj/item/lightreplacer/examine(mob/user)
..()
to_chat(user, status_string())
/obj/item/device/lightreplacer/attackby(obj/item/W, mob/user, params)
/obj/item/lightreplacer/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/stack/sheet/glass))
var/obj/item/stack/sheet/glass/G = W
@@ -148,30 +148,30 @@
to_chat(user, "<span class='notice'>You fill \the [src] with lights from \the [S]. " + status_string() + "</span>")
/obj/item/device/lightreplacer/emag_act()
/obj/item/lightreplacer/emag_act()
if(obj_flags & EMAGGED)
return
Emag()
/obj/item/device/lightreplacer/attack_self(mob/user)
/obj/item/lightreplacer/attack_self(mob/user)
to_chat(user, status_string())
/obj/item/device/lightreplacer/update_icon()
/obj/item/lightreplacer/update_icon()
icon_state = "lightreplacer[(obj_flags & EMAGGED ? 1 : 0)]"
/obj/item/device/lightreplacer/proc/status_string()
/obj/item/lightreplacer/proc/status_string()
return "It has [uses] light\s remaining (plus [bulb_shards] fragment\s)."
/obj/item/device/lightreplacer/proc/Use(mob/user)
/obj/item/lightreplacer/proc/Use(mob/user)
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
AddUses(-1)
return 1
// Negative numbers will subtract
/obj/item/device/lightreplacer/proc/AddUses(amount = 1)
/obj/item/lightreplacer/proc/AddUses(amount = 1)
uses = CLAMP(uses + amount, 0, max_uses)
/obj/item/device/lightreplacer/proc/AddShards(amount = 1, user)
/obj/item/lightreplacer/proc/AddShards(amount = 1, user)
bulb_shards += amount
var/new_bulbs = round(bulb_shards / shards_required)
if(new_bulbs > 0)
@@ -182,13 +182,13 @@
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
return new_bulbs
/obj/item/device/lightreplacer/proc/Charge(var/mob/user)
/obj/item/lightreplacer/proc/Charge(var/mob/user)
charge += 1
if(charge > 3)
AddUses(1)
charge = 1
/obj/item/device/lightreplacer/proc/ReplaceLight(obj/machinery/light/target, mob/living/U)
/obj/item/lightreplacer/proc/ReplaceLight(obj/machinery/light/target, mob/living/U)
if(target.status != LIGHT_OK)
if(CanUse(U))
@@ -222,7 +222,7 @@
to_chat(U, "<span class='warning'>There is a working [target.fitting] already inserted!</span>")
return
/obj/item/device/lightreplacer/proc/Emag()
/obj/item/lightreplacer/proc/Emag()
obj_flags ^= EMAGGED
playsound(src.loc, "sparks", 100, 1)
if(obj_flags & EMAGGED)
@@ -231,14 +231,14 @@
name = initial(name)
update_icon()
/obj/item/device/lightreplacer/proc/CanUse(mob/living/user)
/obj/item/lightreplacer/proc/CanUse(mob/living/user)
src.add_fingerprint(user)
if(uses > 0)
return 1
else
return 0
/obj/item/device/lightreplacer/afterattack(atom/T, mob/U, proximity)
/obj/item/lightreplacer/afterattack(atom/T, mob/U, proximity)
if(!proximity)
return
if(!isturf(T))
@@ -255,12 +255,12 @@
if(!used)
to_chat(U, failmsg)
/obj/item/device/lightreplacer/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J)
/obj/item/lightreplacer/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J)
J.put_in_cart(src, user)
J.myreplacer = src
J.update_icon()
/obj/item/device/lightreplacer/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J)
/obj/item/lightreplacer/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J)
return
#undef LIGHT_OK
+9 -8
View File
@@ -1,6 +1,7 @@
/obj/item/device/megaphone
/obj/item/megaphone
name = "megaphone"
desc = "A device used to project your voice. Loudly."
icon = 'icons/obj/device.dmi'
icon_state = "megaphone"
item_state = "radio"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
@@ -10,13 +11,13 @@
var/spamcheck = 0
var/list/voicespan = list(SPAN_COMMAND)
/obj/item/device/megaphone/suicide_act(mob/living/carbon/user)
/obj/item/megaphone/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] is uttering [user.p_their()] last words into \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
spamcheck = 0//so they dont have to worry about recharging
user.say("AAAAAAAAAAAARGHHHHH")//he must have died while coding this
return OXYLOSS
/obj/item/device/megaphone/get_held_item_speechspans(mob/living/carbon/user)
/obj/item/megaphone/get_held_item_speechspans(mob/living/carbon/user)
if(spamcheck > world.time)
to_chat(user, "<span class='warning'>\The [src] needs to recharge!</span>")
else
@@ -24,26 +25,26 @@
spamcheck = world.time + 50
return voicespan
/obj/item/device/megaphone/emag_act(mob/user)
/obj/item/megaphone/emag_act(mob/user)
if(obj_flags & EMAGGED)
return
to_chat(user, "<span class='warning'>You overload \the [src]'s voice synthesizer.</span>")
obj_flags |= EMAGGED
voicespan = list(SPAN_REALLYBIG, "userdanger")
/obj/item/device/megaphone/sec
/obj/item/megaphone/sec
name = "security megaphone"
icon_state = "megaphone-sec"
/obj/item/device/megaphone/command
/obj/item/megaphone/command
name = "command megaphone"
icon_state = "megaphone-command"
/obj/item/device/megaphone/cargo
/obj/item/megaphone/cargo
name = "supply megaphone"
icon_state = "megaphone-cargo"
/obj/item/device/megaphone/clown
/obj/item/megaphone/clown
name = "clown's megaphone"
desc = "Something that should not exist."
icon_state = "megaphone-clown"
+16 -15
View File
@@ -10,9 +10,10 @@
/obj/item/device/multitool
/obj/item/multitool
name = "multitool"
desc = "Used for pulsing wires to test which to cut. Not recommended by doctors."
icon = 'icons/obj/device.dmi'
icon_state = "multitool"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
@@ -31,11 +32,11 @@
var/datum/integrated_io/selected_io = null //functional for integrated circuits.
var/mode = 0
/obj/item/device/multitool/suicide_act(mob/living/carbon/user)
/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>")
return OXYLOSS//theres a reason it wasnt recommended by doctors
/obj/item/device/multitool/attack_self(mob/user)
/obj/item/multitool/attack_self(mob/user)
if(selected_io)
selected_io = null
to_chat(user, "<span class='notice'>You clear the wired connection from the multitool.</span>")
@@ -43,13 +44,13 @@
..()
update_icon()
/obj/item/device/multitool/update_icon()
/obj/item/multitool/update_icon()
if(selected_io)
icon_state = "multitool_red"
else
icon_state = "multitool"
/obj/item/device/multitool/proc/wire(var/datum/integrated_io/io, mob/user)
/obj/item/multitool/proc/wire(var/datum/integrated_io/io, mob/user)
if(!io.holder.assembly)
to_chat(user, "<span class='warning'>\The [io.holder] needs to be secured inside an assembly first.</span>")
return
@@ -78,7 +79,7 @@
update_icon()
/obj/item/device/multitool/proc/unwire(var/datum/integrated_io/io1, var/datum/integrated_io/io2, mob/user)
/obj/item/multitool/proc/unwire(var/datum/integrated_io/io1, var/datum/integrated_io/io2, mob/user)
if(!io1.linked.len || !io2.linked.len)
to_chat(user, "<span class='warning'>There is nothing connected to the data channel.</span>")
return
@@ -98,22 +99,22 @@
// Syndicate device disguised as a multitool; it will turn red when an AI camera is nearby.
/obj/item/device/multitool/ai_detect
/obj/item/multitool/ai_detect
var/track_cooldown = 0
var/track_delay = 10 //How often it checks for proximity
var/detect_state = PROXIMITY_NONE
var/rangealert = 8 //Glows red when inside
var/rangewarning = 20 //Glows yellow when inside
/obj/item/device/multitool/ai_detect/New()
/obj/item/multitool/ai_detect/New()
..()
START_PROCESSING(SSobj, src)
/obj/item/device/multitool/ai_detect/Destroy()
/obj/item/multitool/ai_detect/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/device/multitool/ai_detect/process()
/obj/item/multitool/ai_detect/process()
if(track_cooldown > world.time)
return
detect_state = PROXIMITY_NONE
@@ -121,7 +122,7 @@
icon_state = "[initial(icon_state)][detect_state]"
track_cooldown = world.time + track_delay
/obj/item/device/multitool/ai_detect/proc/multitool_detect()
/obj/item/multitool/ai_detect/proc/multitool_detect()
var/turf/our_turf = get_turf(src)
for(var/mob/living/silicon/ai/AI in GLOB.ai_list)
if(AI.cameraFollow == src)
@@ -141,11 +142,11 @@
detect_state = PROXIMITY_NEAR
break
/obj/item/device/multitool/ai_detect/admin
/obj/item/multitool/ai_detect/admin
desc = "Used for pulsing wires to test which to cut. Not recommended by doctors. Has a strange tag that says 'Grief in Safety'." //What else should I say for a meme item?
track_delay = 5
/obj/item/device/multitool/ai_detect/admin/multitool_detect()
/obj/item/multitool/ai_detect/admin/multitool_detect()
var/turf/our_turf = get_turf(src)
for(var/mob/J in urange(rangewarning,our_turf))
if(GLOB.admin_datums[J.ckey])
@@ -155,12 +156,12 @@
detect_state = PROXIMITY_ON_SCREEN
break
/obj/item/device/multitool/cyborg
/obj/item/multitool/cyborg
name = "multitool"
desc = "Optimised and stripped-down version of a regular multitool."
toolspeed = 0.5
/obj/item/device/multitool/abductor
/obj/item/multitool/abductor
name = "alien multitool"
desc = "An omni-technological interface."
icon = 'icons/obj/abductor.dmi'
+11 -11
View File
@@ -1,4 +1,4 @@
/obj/item/device/paicard
/obj/item/paicard
name = "personal AI device"
icon = 'icons/obj/aicards.dmi'
icon_state = "pai"
@@ -10,22 +10,22 @@
var/mob/living/silicon/pai/pai
resistance_flags = FIRE_PROOF | ACID_PROOF | INDESTRUCTIBLE
/obj/item/device/paicard/suicide_act(mob/living/user)
/obj/item/paicard/suicide_act(mob/living/user)
user.visible_message("<span class='suicide'>[user] is staring sadly at [src]! [user.p_they()] can't keep living without real human intimacy!</span>")
return OXYLOSS
/obj/item/device/paicard/Initialize()
/obj/item/paicard/Initialize()
SSpai.pai_card_list += src
add_overlay("pai-off")
return ..()
/obj/item/device/paicard/Destroy()
/obj/item/paicard/Destroy()
//Will stop people throwing friend pAIs into the singularity so they can respawn
SSpai.pai_card_list -= src
QDEL_NULL(pai)
return ..()
/obj/item/device/paicard/attack_self(mob/user)
/obj/item/paicard/attack_self(mob/user)
if (!in_range(src, user))
return
user.set_machine(src)
@@ -60,7 +60,7 @@
onclose(user, "paicard")
return
/obj/item/device/paicard/Topic(href, href_list)
/obj/item/paicard/Topic(href, href_list)
if(!usr || usr.stat)
return
@@ -115,19 +115,19 @@
// WIRE_RECEIVE = 2
// WIRE_TRANSMIT = 4
/obj/item/device/paicard/proc/setPersonality(mob/living/silicon/pai/personality)
/obj/item/paicard/proc/setPersonality(mob/living/silicon/pai/personality)
src.pai = personality
src.add_overlay("pai-null")
playsound(loc, 'sound/effects/pai_boot.ogg', 50, 1, -1)
audible_message("\The [src] plays a cheerful startup noise!")
/obj/item/device/paicard/proc/removePersonality()
/obj/item/paicard/proc/removePersonality()
QDEL_NULL(pai)
cut_overlays()
add_overlay("pai-off")
/obj/item/device/paicard/proc/setEmotion(emotion)
/obj/item/paicard/proc/setEmotion(emotion)
if(pai)
src.cut_overlays()
switch(emotion)
@@ -152,10 +152,10 @@
if(10)
src.add_overlay("pai-null")
/obj/item/device/paicard/proc/alertUpdate()
/obj/item/paicard/proc/alertUpdate()
visible_message("<span class ='info'>[src] flashes a message across its screen, \"Additional personalities available for download.\"", "<span class='notice'>[src] bleeps electronically.</span>")
/obj/item/device/paicard/emp_act(severity)
/obj/item/paicard/emp_act(severity)
if(pai)
pai.emp_act(severity)
..()
@@ -1,4 +1,4 @@
/obj/item/device/pipe_painter
/obj/item/pipe_painter
name = "pipe painter"
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "labeler1"
@@ -8,7 +8,7 @@
materials = list(MAT_METAL=5000, MAT_GLASS=2000)
/obj/item/device/pipe_painter/afterattack(atom/A, mob/user, proximity_flag)
/obj/item/pipe_painter/afterattack(atom/A, mob/user, proximity_flag)
//Make sure we only paint adjacent items
if(!proximity_flag)
return
@@ -21,9 +21,9 @@
playsound(src, 'sound/machines/click.ogg', 50, 1)
user.visible_message("<span class='notice'>[user] paints \the [P] [paint_color].</span>","<span class='notice'>You paint \the [P] [paint_color].</span>")
/obj/item/device/pipe_painter/attack_self(mob/user)
/obj/item/pipe_painter/attack_self(mob/user)
paint_color = input("Which colour do you want to use?","Pipe painter") in GLOB.pipe_paint_colors
/obj/item/device/pipe_painter/examine(mob/user)
/obj/item/pipe_painter/examine(mob/user)
..()
to_chat(user, "<span class='notice'>It is set to [paint_color].</span>")
+9 -8
View File
@@ -1,8 +1,9 @@
// Powersink - used to drain station power
/obj/item/device/powersink
/obj/item/powersink
desc = "A nulling power sink which drains energy from electrical systems."
name = "power sink"
icon = 'icons/obj/device.dmi'
icon_state = "powersink0"
item_state = "electronic"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
@@ -25,10 +26,10 @@
var/obj/structure/cable/attached // the attached cable
/obj/item/device/powersink/update_icon()
/obj/item/powersink/update_icon()
icon_state = "powersink[mode == OPERATING]"
/obj/item/device/powersink/proc/set_mode(value)
/obj/item/powersink/proc/set_mode(value)
if(value == mode)
return
switch(value)
@@ -55,7 +56,7 @@
update_icon()
set_light(0)
/obj/item/device/powersink/attackby(obj/item/I, mob/user, params)
/obj/item/powersink/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/screwdriver))
if(mode == DISCONNECTED)
var/turf/T = loc
@@ -80,13 +81,13 @@
else
return ..()
/obj/item/device/powersink/attack_paw()
/obj/item/powersink/attack_paw()
return
/obj/item/device/powersink/attack_ai()
/obj/item/powersink/attack_ai()
return
/obj/item/device/powersink/attack_hand(mob/user)
/obj/item/powersink/attack_hand(mob/user)
. = ..()
if(.)
return
@@ -110,7 +111,7 @@
"<span class='italics'>You hear a click.</span>")
set_mode(CLAMPED_OFF)
/obj/item/device/powersink/process()
/obj/item/powersink/process()
if(!attached)
set_mode(DISCONNECTED)
return
@@ -1,7 +1,8 @@
/obj/item/device/pressure_plate
/obj/item/pressure_plate
name = "pressure plate"
desc = "An electronic device that triggers when stepped on."
icon = 'icons/obj/device.dmi'
item_state = "flash"
icon_state = "pressureplate"
level = 1
@@ -9,7 +10,7 @@
var/trigger_item = FALSE
var/trigger_silent = FALSE
var/sound/trigger_sound = 'sound/effects/pressureplate.ogg'
var/obj/item/device/assembly/signaler/sigdev = null
var/obj/item/assembly/signaler/sigdev = null
var/roundstart_signaller = FALSE
var/roundstart_signaller_freq = FREQ_PRESSURE_PLATE
var/roundstart_signaller_code = 30
@@ -20,7 +21,7 @@
var/can_trigger = TRUE
var/trigger_delay = 10
/obj/item/device/pressure_plate/Initialize()
/obj/item/pressure_plate/Initialize()
. = ..()
tile_overlay = image(icon = 'icons/turf/floors.dmi', icon_state = "pp_overlay")
if(roundstart_signaller)
@@ -30,7 +31,7 @@
if(isopenturf(loc))
hide(TRUE)
/obj/item/device/pressure_plate/Crossed(atom/movable/AM)
/obj/item/pressure_plate/Crossed(atom/movable/AM)
. = ..()
if(!can_trigger || !active)
return
@@ -42,18 +43,18 @@
can_trigger = FALSE
addtimer(CALLBACK(src, .proc/trigger), trigger_delay)
/obj/item/device/pressure_plate/proc/trigger()
/obj/item/pressure_plate/proc/trigger()
can_trigger = TRUE
if(istype(sigdev))
sigdev.signal()
/obj/item/device/pressure_plate/attackby(obj/item/I, mob/living/L)
if(istype(I, /obj/item/device/assembly/signaler) && !istype(sigdev) && removable_signaller && L.transferItemToLoc(I, src))
/obj/item/pressure_plate/attackby(obj/item/I, mob/living/L)
if(istype(I, /obj/item/assembly/signaler) && !istype(sigdev) && removable_signaller && L.transferItemToLoc(I, src))
sigdev = I
to_chat(L, "<span class='notice'>You attach [I] to [src]!</span>")
return ..()
/obj/item/device/pressure_plate/attack_self(mob/living/L)
/obj/item/pressure_plate/attack_self(mob/living/L)
if(removable_signaller && istype(sigdev))
to_chat(L, "<span class='notice'>You remove [sigdev] from [src]</span>")
if(!L.put_in_hands(sigdev))
@@ -61,7 +62,7 @@
sigdev = null
return ..()
/obj/item/device/pressure_plate/hide(yes)
/obj/item/pressure_plate/hide(yes)
if(yes)
invisibility = INVISIBILITY_MAXIMUM
anchored = TRUE
@@ -1,4 +1,4 @@
/obj/item/device/electropack
/obj/item/electropack
name = "electropack"
desc = "Dance my monkeys! DANCE!!!"
icon = 'icons/obj/radio.dmi'
@@ -15,20 +15,20 @@
var/frequency = FREQ_ELECTROPACK
var/shock_cooldown = 0
/obj/item/device/electropack/suicide_act(mob/user)
/obj/item/electropack/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] hooks [user.p_them()]self to the electropack and spams the trigger! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return (FIRELOSS)
/obj/item/device/electropack/Initialize()
/obj/item/electropack/Initialize()
. = ..()
SSradio.add_object(src, frequency, RADIO_SIGNALER)
/obj/item/device/electropack/Destroy()
/obj/item/electropack/Destroy()
SSradio.remove_object(src, frequency)
return ..()
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/device/electropack/attack_hand(mob/user)
/obj/item/electropack/attack_hand(mob/user)
if(iscarbon(user))
var/mob/living/carbon/C = user
if(src == C.back)
@@ -36,7 +36,7 @@
return
return ..()
/obj/item/device/electropack/attackby(obj/item/W, mob/user, params)
/obj/item/electropack/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/clothing/head/helmet))
var/obj/item/assembly/shock_kit/A = new /obj/item/assembly/shock_kit( user )
A.icon = 'icons/obj/assemblies.dmi'
@@ -58,7 +58,7 @@
else
return ..()
/obj/item/device/electropack/Topic(href, href_list)
/obj/item/electropack/Topic(href, href_list)
//..()
var/mob/living/carbon/C = usr
if(usr.stat || usr.restrained() || C.back == src)
@@ -98,7 +98,7 @@
return
return
/obj/item/device/electropack/receive_signal(datum/signal/signal)
/obj/item/electropack/receive_signal(datum/signal/signal)
if(!signal || signal.data["code"] != code)
return
@@ -122,7 +122,7 @@
master.receive_signal()
return
/obj/item/device/electropack/attack_self(mob/user)
/obj/item/electropack/attack_self(mob/user)
if(!ishuman(user))
return
@@ -1,4 +1,4 @@
/obj/item/device/encryptionkey
/obj/item/encryptionkey
name = "standard encryption key"
desc = "An encryption key for a radio headset. Has no special codes in it. WHY DOES IT EXIST? ASK NANOTRASEN."
icon = 'icons/obj/radio.dmi'
@@ -9,124 +9,124 @@
var/independent = FALSE
var/list/channels = list()
/obj/item/device/encryptionkey/syndicate
/obj/item/encryptionkey/syndicate
name = "syndicate encryption key"
desc = "An encryption key for a radio headset. To access the syndicate channel, use :t."
icon_state = "syn_cypherkey"
channels = list("Syndicate" = 1)
syndie = 1//Signifies that it de-crypts Syndicate transmissions
/obj/item/device/encryptionkey/binary
/obj/item/encryptionkey/binary
name = "binary translator key"
desc = "An encryption key for a radio headset. To access the binary channel, use :b."
icon_state = "bin_cypherkey"
translate_binary = TRUE
/obj/item/device/encryptionkey/headset_sec
/obj/item/encryptionkey/headset_sec
name = "security radio encryption key"
desc = "An encryption key for a radio headset. To access the security channel, use :s."
icon_state = "sec_cypherkey"
channels = list("Security" = 1)
/obj/item/device/encryptionkey/headset_eng
/obj/item/encryptionkey/headset_eng
name = "engineering radio encryption key"
desc = "An encryption key for a radio headset. To access the engineering channel, use :e."
icon_state = "eng_cypherkey"
channels = list("Engineering" = 1)
/obj/item/device/encryptionkey/headset_rob
/obj/item/encryptionkey/headset_rob
name = "robotics radio encryption key"
desc = "An encryption key for a radio headset. To access the engineering channel, use :e. For research, use :n."
icon_state = "rob_cypherkey"
channels = list("Science" = 1, "Engineering" = 1)
/obj/item/device/encryptionkey/headset_med
/obj/item/encryptionkey/headset_med
name = "medical radio encryption key"
desc = "An encryption key for a radio headset. To access the medical channel, use :m."
icon_state = "med_cypherkey"
channels = list("Medical" = 1)
/obj/item/device/encryptionkey/headset_sci
/obj/item/encryptionkey/headset_sci
name = "science radio encryption key"
desc = "An encryption key for a radio headset. To access the science channel, use :n."
icon_state = "sci_cypherkey"
channels = list("Science" = 1)
/obj/item/device/encryptionkey/headset_medsci
/obj/item/encryptionkey/headset_medsci
name = "medical research radio encryption key"
desc = "An encryption key for a radio headset. To access the medical channel, use :m. For science, use :n."
icon_state = "medsci_cypherkey"
channels = list("Science" = 1, "Medical" = 1)
/obj/item/device/encryptionkey/headset_com
/obj/item/encryptionkey/headset_com
name = "command radio encryption key"
desc = "An encryption key for a radio headset. To access the command channel, use :c."
icon_state = "com_cypherkey"
channels = list("Command" = 1)
/obj/item/device/encryptionkey/heads/captain
/obj/item/encryptionkey/heads/captain
name = "\proper the captain's encryption key"
desc = "An encryption key for a radio headset. Channels are as follows: :c - command, :s - security, :e - engineering, :u - supply, :v - service, :m - medical, :n - science."
icon_state = "cap_cypherkey"
channels = list("Command" = 1, "Security" = 1, "Engineering" = 0, "Science" = 0, "Medical" = 0, "Supply" = 0, "Service" = 0)
/obj/item/device/encryptionkey/heads/rd
/obj/item/encryptionkey/heads/rd
name = "\proper the research director's encryption key"
desc = "An encryption key for a radio headset. To access the science channel, use :n. For command, use :c."
icon_state = "rd_cypherkey"
channels = list("Science" = 1, "Command" = 1)
/obj/item/device/encryptionkey/heads/hos
/obj/item/encryptionkey/heads/hos
name = "\proper the head of security's encryption key"
desc = "An encryption key for a radio headset. To access the security channel, use :s. For command, use :c."
icon_state = "hos_cypherkey"
channels = list("Security" = 1, "Command" = 1)
/obj/item/device/encryptionkey/heads/ce
/obj/item/encryptionkey/heads/ce
name = "\proper the chief engineer's encryption key"
desc = "An encryption key for a radio headset. To access the engineering channel, use :e. For command, use :c."
icon_state = "ce_cypherkey"
channels = list("Engineering" = 1, "Command" = 1)
/obj/item/device/encryptionkey/heads/cmo
/obj/item/encryptionkey/heads/cmo
name = "\proper the chief medical officer's encryption key"
desc = "An encryption key for a radio headset. To access the medical channel, use :m. For command, use :c."
icon_state = "cmo_cypherkey"
channels = list("Medical" = 1, "Command" = 1)
/obj/item/device/encryptionkey/heads/hop
/obj/item/encryptionkey/heads/hop
name = "\proper the head of personnel's encryption key"
desc = "An encryption key for a radio headset. Channels are as follows: :u - supply, :v - service, :c - command."
icon_state = "hop_cypherkey"
channels = list("Supply" = 1, "Service" = 1, "Command" = 1)
/obj/item/device/encryptionkey/headset_cargo
/obj/item/encryptionkey/headset_cargo
name = "supply radio encryption key"
desc = "An encryption key for a radio headset. To access the supply channel, use :u."
icon_state = "cargo_cypherkey"
channels = list("Supply" = 1)
/obj/item/device/encryptionkey/headset_mining
/obj/item/encryptionkey/headset_mining
name = "mining radio encryption key"
desc = "An encryption key for a radio headset. To access the supply channel, use :u. For science, use :n."
icon_state = "cargo_cypherkey"
channels = list("Supply" = 1, "Science" = 1)
/obj/item/device/encryptionkey/headset_service
/obj/item/encryptionkey/headset_service
name = "service radio encryption key"
desc = "An encryption key for a radio headset. To access the service channel, use :v."
icon_state = "srv_cypherkey"
channels = list("Service" = 1)
/obj/item/device/encryptionkey/headset_cent
/obj/item/encryptionkey/headset_cent
name = "\improper CentCom radio encryption key"
desc = "An encryption key for a radio headset. To access the CentCom channel, use :y."
icon_state = "cent_cypherkey"
independent = TRUE
channels = list("CentCom" = 1)
/obj/item/device/encryptionkey/ai //ported from NT, this goes 'inside' the AI.
/obj/item/encryptionkey/ai //ported from NT, this goes 'inside' the AI.
channels = list("Command" = 1, "Security" = 1, "Engineering" = 1, "Science" = 1, "Medical" = 1, "Supply" = 1, "Service" = 1, "AI Private" = 1)
/obj/item/device/encryptionkey/secbot
/obj/item/encryptionkey/secbot
channels = list("AI Private"=1,"Security"=1)
@@ -1,4 +1,4 @@
/obj/item/device/radio/headset
/obj/item/radio/headset
name = "radio headset"
desc = "An updated, modular intercom that fits over the head. Takes encryption keys."
icon_state = "headset"
@@ -8,33 +8,33 @@
canhear_range = 0 // can't hear headsets from very far away
slot_flags = SLOT_EARS
var/obj/item/device/encryptionkey/keyslot2 = null
var/obj/item/encryptionkey/keyslot2 = null
dog_fashion = null
/obj/item/device/radio/headset/suicide_act(mob/living/carbon/user)
/obj/item/radio/headset/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] begins putting \the [src]'s antenna up [user.p_their()] nose! It looks like [user.p_theyre()] trying to give [user.p_them()]self cancer!</span>")
return TOXLOSS
/obj/item/device/radio/headset/examine(mob/user)
/obj/item/radio/headset/examine(mob/user)
..()
to_chat(user, "<span class='notice'>To speak on the general radio frequency, use ; before speaking.</span>")
if (command)
to_chat(user, "<span class='notice'>Alt-click to toggle the high-volume mode.</span>")
/obj/item/device/radio/headset/Initialize()
/obj/item/radio/headset/Initialize()
. = ..()
recalculateChannels()
/obj/item/device/radio/headset/Destroy()
/obj/item/radio/headset/Destroy()
QDEL_NULL(keyslot2)
return ..()
/obj/item/device/radio/headset/talk_into(mob/living/M, message, channel, list/spans,datum/language/language)
/obj/item/radio/headset/talk_into(mob/living/M, message, channel, list/spans,datum/language/language)
if (!listening)
return ITALICS | REDUCE_RANGE
return ..()
/obj/item/device/radio/headset/can_receive(freq, level, AIuser)
/obj/item/radio/headset/can_receive(freq, level, AIuser)
if(ishuman(src.loc))
var/mob/living/carbon/human/H = src.loc
if(H.ears == src)
@@ -43,165 +43,165 @@
return ..(freq, level)
return FALSE
/obj/item/device/radio/headset/syndicate //disguised to look like a normal headset for stealth ops
/obj/item/radio/headset/syndicate //disguised to look like a normal headset for stealth ops
/obj/item/device/radio/headset/syndicate/alt //undisguised bowman with flash protection
/obj/item/radio/headset/syndicate/alt //undisguised bowman with flash protection
name = "syndicate headset"
desc = "A syndicate headset that can be used to hear all radio frequencies. Protects ears from flashbangs. \nTo access the syndicate channel, use ; before speaking."
icon_state = "syndie_headset"
item_state = "syndie_headset"
flags_2 = BANG_PROTECT_2 | NO_EMP_WIRES_2
/obj/item/device/radio/headset/syndicate/alt/leader
/obj/item/radio/headset/syndicate/alt/leader
name = "team leader headset"
command = TRUE
/obj/item/device/radio/headset/syndicate/Initialize()
/obj/item/radio/headset/syndicate/Initialize()
. = ..()
make_syndie()
/obj/item/device/radio/headset/binary
/obj/item/device/radio/headset/binary/Initialize()
/obj/item/radio/headset/binary
/obj/item/radio/headset/binary/Initialize()
. = ..()
qdel(keyslot)
keyslot = new /obj/item/device/encryptionkey/binary
keyslot = new /obj/item/encryptionkey/binary
recalculateChannels()
/obj/item/device/radio/headset/headset_sec
/obj/item/radio/headset/headset_sec
name = "security radio headset"
desc = "This is used by your elite security force.\nTo access the security channel, use :s."
icon_state = "sec_headset"
keyslot = new /obj/item/device/encryptionkey/headset_sec
keyslot = new /obj/item/encryptionkey/headset_sec
/obj/item/device/radio/headset/headset_sec/alt
/obj/item/radio/headset/headset_sec/alt
name = "security bowman headset"
desc = "This is used by your elite security force. Protects ears from flashbangs.\nTo access the security channel, use :s."
icon_state = "sec_headset_alt"
item_state = "sec_headset_alt"
flags_2 = BANG_PROTECT_2 | NO_EMP_WIRES_2
/obj/item/device/radio/headset/headset_eng
/obj/item/radio/headset/headset_eng
name = "engineering radio headset"
desc = "When the engineers wish to chat like girls.\nTo access the engineering channel, use :e."
icon_state = "eng_headset"
keyslot = new /obj/item/device/encryptionkey/headset_eng
keyslot = new /obj/item/encryptionkey/headset_eng
/obj/item/device/radio/headset/headset_rob
/obj/item/radio/headset/headset_rob
name = "robotics radio headset"
desc = "Made specifically for the roboticists, who cannot decide between departments.\nTo access the engineering channel, use :e. For research, use :n."
icon_state = "rob_headset"
keyslot = new /obj/item/device/encryptionkey/headset_rob
keyslot = new /obj/item/encryptionkey/headset_rob
/obj/item/device/radio/headset/headset_med
/obj/item/radio/headset/headset_med
name = "medical radio headset"
desc = "A headset for the trained staff of the medbay.\nTo access the medical channel, use :m."
icon_state = "med_headset"
keyslot = new /obj/item/device/encryptionkey/headset_med
keyslot = new /obj/item/encryptionkey/headset_med
/obj/item/device/radio/headset/headset_sci
/obj/item/radio/headset/headset_sci
name = "science radio headset"
desc = "A sciency headset. Like usual.\nTo access the science channel, use :n."
icon_state = "sci_headset"
keyslot = new /obj/item/device/encryptionkey/headset_sci
keyslot = new /obj/item/encryptionkey/headset_sci
/obj/item/device/radio/headset/headset_medsci
/obj/item/radio/headset/headset_medsci
name = "medical research radio headset"
desc = "A headset that is a result of the mating between medical and science.\nTo access the medical channel, use :m. For science, use :n."
icon_state = "medsci_headset"
keyslot = new /obj/item/device/encryptionkey/headset_medsci
keyslot = new /obj/item/encryptionkey/headset_medsci
/obj/item/device/radio/headset/headset_com
/obj/item/radio/headset/headset_com
name = "command radio headset"
desc = "A headset with a commanding channel.\nTo access the command channel, use :c."
icon_state = "com_headset"
keyslot = new /obj/item/device/encryptionkey/headset_com
keyslot = new /obj/item/encryptionkey/headset_com
/obj/item/device/radio/headset/heads
/obj/item/radio/headset/heads
command = TRUE
/obj/item/device/radio/headset/heads/captain
/obj/item/radio/headset/heads/captain
name = "\proper the captain's headset"
desc = "The headset of the king.\nChannels are as follows: :c - command, :s - security, :e - engineering, :u - supply, :v - service, :m - medical, :n - science."
icon_state = "com_headset"
keyslot = new /obj/item/device/encryptionkey/heads/captain
keyslot = new /obj/item/encryptionkey/heads/captain
/obj/item/device/radio/headset/heads/captain/alt
/obj/item/radio/headset/heads/captain/alt
name = "\proper the captain's bowman headset"
desc = "The headset of the boss. Protects ears from flashbangs.\nChannels are as follows: :c - command, :s - security, :e - engineering, :u - supply, :v - service, :m - medical, :n - science."
icon_state = "com_headset_alt"
item_state = "com_headset_alt"
flags_2 = BANG_PROTECT_2 | NO_EMP_WIRES_2
/obj/item/device/radio/headset/heads/rd
/obj/item/radio/headset/heads/rd
name = "\proper the research director's headset"
desc = "Headset of the fellow who keeps society marching towards technological singularity.\nTo access the science channel, use :n. For command, use :c."
icon_state = "com_headset"
keyslot = new /obj/item/device/encryptionkey/heads/rd
keyslot = new /obj/item/encryptionkey/heads/rd
/obj/item/device/radio/headset/heads/hos
/obj/item/radio/headset/heads/hos
name = "\proper the head of security's headset"
desc = "The headset of the man in charge of keeping order and protecting the station.\nTo access the security channel, use :s. For command, use :c."
icon_state = "com_headset"
keyslot = new /obj/item/device/encryptionkey/heads/hos
keyslot = new /obj/item/encryptionkey/heads/hos
/obj/item/device/radio/headset/heads/hos/alt
/obj/item/radio/headset/heads/hos/alt
name = "\proper the head of security's bowman headset"
desc = "The headset of the man in charge of keeping order and protecting the station. Protects ears from flashbangs.\nTo access the security channel, use :s. For command, use :c."
icon_state = "com_headset_alt"
item_state = "com_headset_alt"
flags_2 = BANG_PROTECT_2 | NO_EMP_WIRES_2
/obj/item/device/radio/headset/heads/ce
/obj/item/radio/headset/heads/ce
name = "\proper the chief engineer's headset"
desc = "The headset of the guy in charge of keeping the station powered and undamaged.\nTo access the engineering channel, use :e. For command, use :c."
icon_state = "com_headset"
keyslot = new /obj/item/device/encryptionkey/heads/ce
keyslot = new /obj/item/encryptionkey/heads/ce
/obj/item/device/radio/headset/heads/cmo
/obj/item/radio/headset/heads/cmo
name = "\proper the chief medical officer's headset"
desc = "The headset of the highly trained medical chief.\nTo access the medical channel, use :m. For command, use :c."
icon_state = "com_headset"
keyslot = new /obj/item/device/encryptionkey/heads/cmo
keyslot = new /obj/item/encryptionkey/heads/cmo
/obj/item/device/radio/headset/heads/hop
/obj/item/radio/headset/heads/hop
name = "\proper the head of personnel's headset"
desc = "The headset of the guy who will one day be captain.\nChannels are as follows: :u - supply, :v - service, :c - command."
icon_state = "com_headset"
keyslot = new /obj/item/device/encryptionkey/heads/hop
keyslot = new /obj/item/encryptionkey/heads/hop
/obj/item/device/radio/headset/headset_cargo
/obj/item/radio/headset/headset_cargo
name = "supply radio headset"
desc = "A headset used by the QM and his slaves.\nTo access the supply channel, use :u."
icon_state = "cargo_headset"
keyslot = new /obj/item/device/encryptionkey/headset_cargo
keyslot = new /obj/item/encryptionkey/headset_cargo
/obj/item/device/radio/headset/headset_cargo/mining
/obj/item/radio/headset/headset_cargo/mining
name = "mining radio headset"
desc = "Headset used by shaft miners.\nTo access the supply channel, use :u. For science, use :n."
icon_state = "mine_headset"
keyslot = new /obj/item/device/encryptionkey/headset_mining
keyslot = new /obj/item/encryptionkey/headset_mining
/obj/item/device/radio/headset/headset_srv
/obj/item/radio/headset/headset_srv
name = "service radio headset"
desc = "Headset used by the service staff, tasked with keeping the station full, happy and clean.\nTo access the service channel, use :v."
icon_state = "srv_headset"
keyslot = new /obj/item/device/encryptionkey/headset_service
keyslot = new /obj/item/encryptionkey/headset_service
/obj/item/device/radio/headset/headset_cent
/obj/item/radio/headset/headset_cent
name = "\improper CentCom headset"
desc = "A headset used by the upper echelons of Nanotrasen.\nTo access the CentCom channel, use :y."
icon_state = "cent_headset"
keyslot = new /obj/item/device/encryptionkey/headset_com
keyslot2 = new /obj/item/device/encryptionkey/headset_cent
keyslot = new /obj/item/encryptionkey/headset_com
keyslot2 = new /obj/item/encryptionkey/headset_cent
/obj/item/device/radio/headset/headset_cent/empty
/obj/item/radio/headset/headset_cent/empty
keyslot = null
keyslot2 = null
/obj/item/device/radio/headset/headset_cent/commander
keyslot = new /obj/item/device/encryptionkey/heads/captain
/obj/item/radio/headset/headset_cent/commander
keyslot = new /obj/item/encryptionkey/heads/captain
/obj/item/device/radio/headset/headset_cent/alt
/obj/item/radio/headset/headset_cent/alt
name = "\improper CentCom bowman headset"
desc = "A headset especially for emergency response personnel. Protects ears from flashbangs.\nTo access the CentCom channel, use :y."
icon_state = "cent_headset_alt"
@@ -209,15 +209,15 @@
keyslot = null
flags_2 = BANG_PROTECT_2 | NO_EMP_WIRES_2
/obj/item/device/radio/headset/ai
/obj/item/radio/headset/ai
name = "\proper Integrated Subspace Transceiver "
keyslot2 = new /obj/item/device/encryptionkey/ai
keyslot2 = new /obj/item/encryptionkey/ai
command = TRUE
/obj/item/device/radio/headset/ai/can_receive(freq, level)
/obj/item/radio/headset/ai/can_receive(freq, level)
return ..(freq, level, TRUE)
/obj/item/device/radio/headset/attackby(obj/item/W, mob/user, params)
/obj/item/radio/headset/attackby(obj/item/W, mob/user, params)
user.set_machine(src)
if(istype(W, /obj/item/screwdriver))
@@ -241,7 +241,7 @@
else
to_chat(user, "<span class='warning'>This headset doesn't have any unique encryption keys! How useless...</span>")
else if(istype(W, /obj/item/device/encryptionkey))
else if(istype(W, /obj/item/encryptionkey))
if(keyslot && keyslot2)
to_chat(user, "<span class='warning'>The headset can't hold another key!</span>")
return
@@ -262,7 +262,7 @@
return ..()
/obj/item/device/radio/headset/recalculateChannels()
/obj/item/radio/headset/recalculateChannels()
..()
if(keyslot2)
for(var/ch_name in keyslot2.channels)
@@ -279,7 +279,7 @@
for(var/ch_name in channels)
secure_radio_connections[ch_name] = add_radio(src, GLOB.radiochannels[ch_name])
/obj/item/device/radio/headset/AltClick(mob/living/user)
/obj/item/radio/headset/AltClick(mob/living/user)
if(!istype(user) || !Adjacent(user) || user.incapacitated())
return
if (command)
@@ -1,4 +1,4 @@
/obj/item/device/radio/intercom
/obj/item/radio/intercom
name = "station intercom"
desc = "Talk through this."
icon_state = "intercom"
@@ -12,22 +12,22 @@
dog_fashion = null
var/unfastened = FALSE
/obj/item/device/radio/intercom/unscrewed
/obj/item/radio/intercom/unscrewed
unfastened = TRUE
/obj/item/device/radio/intercom/ratvar
/obj/item/radio/intercom/ratvar
name = "hierophant intercom"
desc = "A modified intercom that uses the Hierophant network instead of subspace tech. Can listen to and broadcast on any frequency."
icon_state = "intercom_ratvar"
freerange = TRUE
/obj/item/device/radio/intercom/ratvar/attackby(obj/item/I, mob/living/user, params)
/obj/item/radio/intercom/ratvar/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/screwdriver))
to_chat(user, "<span class='danger'>[src] is fastened to the wall with [is_servant_of_ratvar(user) ? "replicant alloy" : "some material you've never seen"], and can't be removed.</span>")
return //no unfastening!
. = ..()
/obj/item/device/radio/intercom/ratvar/process()
/obj/item/radio/intercom/ratvar/process()
if(!istype(SSticker.mode, /datum/game_mode/clockwork_cult))
invisibility = INVISIBILITY_OBSERVER
alpha = 125
@@ -38,24 +38,24 @@
emped = FALSE
..()
/obj/item/device/radio/intercom/Initialize(mapload, ndir, building)
/obj/item/radio/intercom/Initialize(mapload, ndir, building)
. = ..()
if(building)
setDir(ndir)
START_PROCESSING(SSobj, src)
/obj/item/device/radio/intercom/Destroy()
/obj/item/radio/intercom/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/device/radio/intercom/examine(mob/user)
/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>")
else
to_chat(user, "<span class='notice'>It's <i>unscrewed</i> from the wall, and can be <b>detached</b>.</span>")
/obj/item/device/radio/intercom/attackby(obj/item/I, mob/living/user, params)
/obj/item/radio/intercom/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/screwdriver))
if(unfastened)
user.visible_message("<span class='notice'>[user] starts tightening [src]'s screws...</span>", "<span class='notice'>You start screwing in [src]...</span>")
@@ -82,20 +82,20 @@
return
return ..()
/obj/item/device/radio/intercom/attack_ai(mob/user)
/obj/item/radio/intercom/attack_ai(mob/user)
interact(user)
/obj/item/device/radio/intercom/attack_hand(mob/user)
/obj/item/radio/intercom/attack_hand(mob/user)
. = ..()
if(.)
return
interact(user)
/obj/item/device/radio/intercom/interact(mob/user)
/obj/item/radio/intercom/interact(mob/user)
..()
ui_interact(user, state = GLOB.default_state)
/obj/item/device/radio/intercom/can_receive(freq, level)
/obj/item/radio/intercom/can_receive(freq, level)
if(!on)
return FALSE
if(wires.is_cut(WIRE_RX))
@@ -113,14 +113,14 @@
return TRUE
/obj/item/device/radio/intercom/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, message_mode)
/obj/item/radio/intercom/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, message_mode)
if (message_mode == MODE_INTERCOM)
return // Avoid hearing the same thing twice
if(!anyai && !(speaker in ai))
return
..()
/obj/item/device/radio/intercom/process()
/obj/item/radio/intercom/process()
if(((world.timeofday - last_tick) > 30) || ((world.timeofday - last_tick) < 0))
last_tick = world.timeofday
@@ -135,7 +135,7 @@
else
icon_state = initial(icon_state)
/obj/item/device/radio/intercom/add_blood_DNA(list/blood_dna)
/obj/item/radio/intercom/add_blood_DNA(list/blood_dna)
return FALSE
//Created through the autolathe or through deconstructing intercoms. Can be applied to wall to make a new intercom on it!
@@ -143,7 +143,7 @@
name = "intercom frame"
desc = "A ready-to-go intercom. Just slap it on a wall and screw it in!"
icon_state = "intercom"
result_path = /obj/item/device/radio/intercom/unscrewed
result_path = /obj/item/radio/intercom/unscrewed
pixel_shift = 29
inverse = TRUE
materials = list(MAT_METAL = 75, MAT_GLASS = 25)
+32 -32
View File
@@ -1,4 +1,4 @@
/obj/item/device/radio
/obj/item/radio
icon = 'icons/obj/radio.dmi'
name = "station bounced radio"
icon_state = "walkietalkie"
@@ -33,7 +33,7 @@
var/command = FALSE // If true, use_command can be toggled at will.
// Encryption key handling
var/obj/item/device/encryptionkey/keyslot
var/obj/item/encryptionkey/keyslot
var/translate_binary = FALSE // If true, can hear the special binary channel.
var/independent = FALSE // If true, can say/hear on the special CentCom channel.
var/syndie = FALSE // If true, hears all well-known channels automatically, and can say/hear on the Syndicate channel.
@@ -43,15 +43,15 @@
var/const/FREQ_LISTENING = 1
//FREQ_BROADCASTING = 2
/obj/item/device/radio/suicide_act(mob/living/user)
/obj/item/radio/suicide_act(mob/living/user)
user.visible_message("<span class='suicide'>[user] starts bouncing [src] off their head! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return BRUTELOSS
/obj/item/device/radio/proc/set_frequency(new_frequency)
/obj/item/radio/proc/set_frequency(new_frequency)
remove_radio(src, frequency)
frequency = add_radio(src, new_frequency)
/obj/item/device/radio/proc/recalculateChannels()
/obj/item/radio/proc/recalculateChannels()
channels = list()
translate_binary = FALSE
syndie = FALSE
@@ -72,19 +72,19 @@
for(var/ch_name in channels)
secure_radio_connections[ch_name] = add_radio(src, GLOB.radiochannels[ch_name])
/obj/item/device/radio/proc/make_syndie() // Turns normal radios into Syndicate radios!
/obj/item/radio/proc/make_syndie() // Turns normal radios into Syndicate radios!
qdel(keyslot)
keyslot = new /obj/item/device/encryptionkey/syndicate
keyslot = new /obj/item/encryptionkey/syndicate
syndie = 1
recalculateChannels()
/obj/item/device/radio/Destroy()
/obj/item/radio/Destroy()
remove_radio_all(src) //Just to be sure
QDEL_NULL(wires)
QDEL_NULL(keyslot)
return ..()
/obj/item/device/radio/Initialize()
/obj/item/radio/Initialize()
wires = new /datum/wires/radio(src)
if(prison_radio)
wires.cut(WIRE_TX) // OH GOD WHY
@@ -96,7 +96,7 @@
for(var/ch_name in channels)
secure_radio_connections[ch_name] = add_radio(src, GLOB.radiochannels[ch_name])
/obj/item/device/radio/interact(mob/user)
/obj/item/radio/interact(mob/user)
if (..())
return
if(unscrewed && !isAI(user))
@@ -104,7 +104,7 @@
else
ui_interact(user)
/obj/item/device/radio/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
/obj/item/radio/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.inventory_state)
. = ..()
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
@@ -112,7 +112,7 @@
ui = new(user, src, ui_key, "radio", name, 370, 220 + channels.len * 22, master_ui, state)
ui.open()
/obj/item/device/radio/ui_data(mob/user)
/obj/item/radio/ui_data(mob/user)
var/list/data = list()
data["broadcasting"] = broadcasting
@@ -128,11 +128,11 @@
data["useCommand"] = use_command
data["subspace"] = subspace_transmission
data["subspaceSwitchable"] = subspace_switchable
data["headset"] = istype(src, /obj/item/device/radio/headset)
data["headset"] = istype(src, /obj/item/radio/headset)
return data
/obj/item/device/radio/ui_act(action, params, datum/tgui/ui)
/obj/item/radio/ui_act(action, params, datum/tgui/ui)
if(..())
return
switch(action)
@@ -191,7 +191,7 @@
recalculateChannels()
. = TRUE
/obj/item/device/radio/talk_into(atom/movable/M, message, channel, list/spans, datum/language/language)
/obj/item/radio/talk_into(atom/movable/M, message, channel, list/spans, datum/language/language)
if(!spans)
spans = M.get_spans()
if(!language)
@@ -199,7 +199,7 @@
INVOKE_ASYNC(src, .proc/talk_into_impl, M, message, channel, spans.Copy(), language)
return ITALICS | REDUCE_RANGE
/obj/item/device/radio/proc/talk_into_impl(atom/movable/M, message, channel, list/spans, datum/language/language)
/obj/item/radio/proc/talk_into_impl(atom/movable/M, message, channel, list/spans, datum/language/language)
if(!on)
return // the device has to be on
if(!M || !message)
@@ -236,7 +236,7 @@
// Nearby active jammers severely gibberish the message
var/turf/position = get_turf(src)
for(var/obj/item/device/jammer/jammer in GLOB.active_jammers)
for(var/obj/item/jammer/jammer in GLOB.active_jammers)
var/turf/jammer_turf = get_turf(jammer)
if(position.z == jammer_turf.z && (get_dist(position, jammer_turf) < jammer.range))
message = Gibberish(message,100)
@@ -267,7 +267,7 @@
// was never received, send a mundane broadcast (no headsets).
addtimer(CALLBACK(src, .proc/backup_transmission, signal), 20)
/obj/item/device/radio/proc/backup_transmission(datum/signal/subspace/vocal/signal)
/obj/item/radio/proc/backup_transmission(datum/signal/subspace/vocal/signal)
var/turf/T = get_turf(src)
if (signal.data["done"] && (T.z in signal.levels))
return
@@ -278,7 +278,7 @@
signal.levels = list(T.z)
signal.broadcast()
/obj/item/device/radio/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
/obj/item/radio/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
if(radio_freq || !broadcasting || get_dist(src, speaker) > canhear_range)
return
@@ -297,7 +297,7 @@
talk_into(speaker, raw_message, , spans, language=message_language)
// Checks if this radio can receive on the given frequency.
/obj/item/device/radio/proc/can_receive(freq, level)
/obj/item/radio/proc/can_receive(freq, level)
// deny checks
if (!on || !listening || wires.is_cut(WIRE_RX))
return FALSE
@@ -321,14 +321,14 @@
return FALSE
/obj/item/device/radio/examine(mob/user)
/obj/item/radio/examine(mob/user)
..()
if (unscrewed)
to_chat(user, "<span class='notice'>It can be attached and modified.</span>")
else
to_chat(user, "<span class='notice'>It cannot be modified or attached.</span>")
/obj/item/device/radio/attackby(obj/item/W, mob/user, params)
/obj/item/radio/attackby(obj/item/W, mob/user, params)
add_fingerprint(user)
if(istype(W, /obj/item/screwdriver))
unscrewed = !unscrewed
@@ -339,7 +339,7 @@
else
return ..()
/obj/item/device/radio/emp_act(severity)
/obj/item/radio/emp_act(severity)
emped++ //There's been an EMP; better count it
var/curremp = emped //Remember which EMP this was
if (listening && ismob(loc)) // if the radio is turned on and on someone's person they notice
@@ -352,7 +352,7 @@
spawn(200)
if(emped == curremp) //Don't fix it if it's been EMP'd again
emped = 0
if (!istype(src, /obj/item/device/radio/intercom)) // intercoms will turn back on on their own
if (!istype(src, /obj/item/radio/intercom)) // intercoms will turn back on on their own
on = TRUE
..()
@@ -361,24 +361,24 @@
///////////////////////////////
//Giving borgs their own radio to have some more room to work with -Sieve
/obj/item/device/radio/borg
/obj/item/radio/borg
name = "cyborg radio"
subspace_switchable = TRUE
dog_fashion = null
flags_2 = NO_EMP_WIRES_2
/obj/item/device/radio/borg/Initialize(mapload)
/obj/item/radio/borg/Initialize(mapload)
. = ..()
/obj/item/device/radio/borg/syndicate
/obj/item/radio/borg/syndicate
syndie = 1
keyslot = new /obj/item/device/encryptionkey/syndicate
keyslot = new /obj/item/encryptionkey/syndicate
/obj/item/device/radio/borg/syndicate/Initialize()
/obj/item/radio/borg/syndicate/Initialize()
. = ..()
set_frequency(FREQ_SYNDICATE)
/obj/item/device/radio/borg/attackby(obj/item/W, mob/user, params)
/obj/item/radio/borg/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/screwdriver))
if(keyslot)
@@ -399,7 +399,7 @@
else
to_chat(user, "<span class='warning'>This radio doesn't have any encryption keys!</span>")
else if(istype(W, /obj/item/device/encryptionkey/))
else if(istype(W, /obj/item/encryptionkey/))
if(keyslot)
to_chat(user, "<span class='warning'>The radio can't hold another key!</span>")
return
@@ -412,6 +412,6 @@
recalculateChannels()
/obj/item/device/radio/off // Station bounced radios, their only difference is spawning with the speakers off, this was made to help the lag.
/obj/item/radio/off // Station bounced radios, their only difference is spawning with the speakers off, this was made to help the lag.
listening = 0 // And it's nice to have a subtype too for future features.
dog_fashion = /datum/dog_fashion/back
@@ -1,6 +1,7 @@
/obj/item/device/reverse_bear_trap
/obj/item/reverse_bear_trap
name = "reverse bear trap"
desc = "A horrifying set of shut metal jaws, rigged to a kitchen timer and secured by padlock to a head-mounted clamp. To apply, hit someone with it."
icon = 'icons/obj/device.dmi'
icon_state = "reverse_bear_trap"
slot_flags = SLOT_HEAD
flags_1 = CONDUCT_1
@@ -21,18 +22,18 @@
var/datum/looping_sound/reverse_bear_trap/soundloop
var/datum/looping_sound/reverse_bear_trap_beep/soundloop2
/obj/item/device/reverse_bear_trap/Initialize()
/obj/item/reverse_bear_trap/Initialize()
. = ..()
soundloop = new(list(src))
soundloop2 = new(list(src))
/obj/item/device/reverse_bear_trap/Destroy()
/obj/item/reverse_bear_trap/Destroy()
QDEL_NULL(soundloop)
QDEL_NULL(soundloop2)
STOP_PROCESSING(SSprocessing, src)
return ..()
/obj/item/device/reverse_bear_trap/process()
/obj/item/reverse_bear_trap/process()
if(!ticking)
return
time_left--
@@ -44,7 +45,7 @@
to_chat(loc, "<span class='userdanger'>*ding*</span>")
addtimer(CALLBACK(src, .proc/snap), 2)
/obj/item/device/reverse_bear_trap/attack_hand(mob/user)
/obj/item/reverse_bear_trap/attack_hand(mob/user)
if(iscarbon(user))
var/mob/living/carbon/C = user
if(C.get_item_by_slot(slot_head) == src)
@@ -80,7 +81,7 @@
return
..()
/obj/item/device/reverse_bear_trap/attack(mob/living/target, mob/living/user)
/obj/item/reverse_bear_trap/attack(mob/living/target, mob/living/user)
if(target.get_item_by_slot(slot_head))
to_chat(user, "<span class='warning'>Remove their headgear first!</span>")
return
@@ -97,7 +98,7 @@
arm()
notify_ghosts("[user] put a reverse bear trap on [target]!", source = src, action = NOTIFY_ORBIT, ghost_sound = 'sound/machines/beep.ogg')
/obj/item/device/reverse_bear_trap/proc/snap()
/obj/item/reverse_bear_trap/proc/snap()
reset()
var/mob/living/carbon/human/H = loc
if(!istype(H) || H.get_item_by_slot(slot_head) != src)
@@ -113,14 +114,14 @@
jill.death() //just in case, for some reason, they're still alive
flash_color(jill, flash_color = "#FF0000", flash_time = 100)
/obj/item/device/reverse_bear_trap/proc/reset()
/obj/item/reverse_bear_trap/proc/reset()
ticking = FALSE
flags_1 &= ~NODROP_1
soundloop.stop()
soundloop2.stop()
STOP_PROCESSING(SSprocessing, src)
/obj/item/device/reverse_bear_trap/proc/arm() //hulen
/obj/item/reverse_bear_trap/proc/arm() //hulen
ticking = TRUE
escape_chance = initial(escape_chance) //we keep these vars until re-arm, for tracking purposes
time_left = initial(time_left)
+24 -20
View File
@@ -6,9 +6,10 @@ HEALTH ANALYZER
GAS ANALYZER
*/
/obj/item/device/t_scanner
/obj/item/t_scanner
name = "\improper T-ray scanner"
desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes."
icon = 'icons/obj/device.dmi'
icon_state = "t-ray0"
var/on = FALSE
slot_flags = SLOT_BELT
@@ -18,11 +19,11 @@ GAS ANALYZER
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
materials = list(MAT_METAL=150)
/obj/item/device/t_scanner/suicide_act(mob/living/carbon/user)
/obj/item/t_scanner/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] begins to emit terahertz-rays into [user.p_their()] brain with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return TOXLOSS
/obj/item/device/t_scanner/attack_self(mob/user)
/obj/item/t_scanner/attack_self(mob/user)
on = !on
icon_state = copytext(icon_state, 1, length(icon_state))+"[on]"
@@ -30,13 +31,13 @@ GAS ANALYZER
if(on)
START_PROCESSING(SSobj, src)
/obj/item/device/t_scanner/process()
/obj/item/t_scanner/process()
if(!on)
STOP_PROCESSING(SSobj, src)
return null
scan()
/obj/item/device/t_scanner/proc/scan()
/obj/item/t_scanner/proc/scan()
t_ray_scan(loc)
/proc/t_ray_scan(mob/viewer, flick_time = 8, distance = 2)
@@ -57,8 +58,9 @@ GAS ANALYZER
if(t_ray_images.len)
flick_overlay(t_ray_images, list(viewer.client), flick_time)
/obj/item/device/healthanalyzer
/obj/item/healthanalyzer
name = "health analyzer"
icon = 'icons/obj/device.dmi'
icon_state = "health"
item_state = "healthanalyzer"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
@@ -75,11 +77,11 @@ GAS ANALYZER
var/scanmode = 0
var/advanced = FALSE
/obj/item/device/healthanalyzer/suicide_act(mob/living/carbon/user)
/obj/item/healthanalyzer/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>")
return BRUTELOSS
/obj/item/device/healthanalyzer/attack_self(mob/user)
/obj/item/healthanalyzer/attack_self(mob/user)
if(!scanmode)
to_chat(user, "<span class='notice'>You switch the health analyzer to scan chemical contents.</span>")
scanmode = 1
@@ -87,7 +89,7 @@ GAS ANALYZER
to_chat(user, "<span class='notice'>You switch the health analyzer to check physical health.</span>")
scanmode = 0
/obj/item/device/healthanalyzer/attack(mob/living/M, mob/living/carbon/human/user)
/obj/item/healthanalyzer/attack(mob/living/M, mob/living/carbon/human/user)
// Clumsiness/brain damage check
if ((user.has_trait(TRAIT_CLUMSY) || user.has_trait(TRAIT_DUMB)) && prob(50))
@@ -315,7 +317,7 @@ GAS ANALYZER
else
to_chat(user, "<span class='notice'>Subject is not addicted to any reagents.</span>")
/obj/item/device/healthanalyzer/verb/toggle_mode()
/obj/item/healthanalyzer/verb/toggle_mode()
set name = "Switch Verbosity"
set category = "Object"
@@ -329,15 +331,16 @@ GAS ANALYZER
if(0)
to_chat(usr, "The scanner no longer shows limb damage.")
/obj/item/device/healthanalyzer/advanced
/obj/item/healthanalyzer/advanced
name = "advanced health analyzer"
icon_state = "health_adv"
desc = "A hand-held body scanner able to distinguish vital signs of the subject with high accuracy."
advanced = TRUE
/obj/item/device/analyzer
/obj/item/analyzer
desc = "A hand-held environmental scanner which reports current gas levels. Alt-Click to use the built in barometer function."
name = "analyzer"
icon = 'icons/obj/device.dmi'
icon_state = "atmos"
item_state = "analyzer"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
@@ -354,11 +357,11 @@ GAS ANALYZER
var/cooldown_time = 250
var/accuracy // 0 is the best accuracy.
/obj/item/device/analyzer/suicide_act(mob/living/carbon/user)
/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>")
return BRUTELOSS
/obj/item/device/analyzer/attack_self(mob/user)
/obj/item/analyzer/attack_self(mob/user)
add_fingerprint(user)
@@ -417,7 +420,7 @@ GAS ANALYZER
to_chat(user, "<span class='alert'>[env_gases[id][GAS_META][META_GAS_NAME]]: [round(gas_concentration*100, 0.01)] %</span>")
to_chat(user, "<span class='info'>Temperature: [round(environment.temperature-T0C)] &deg;C ([round(environment.temperature)]K)</span>")
/obj/item/device/analyzer/AltClick(mob/user) //Barometer output for measuring when the next storm happens
/obj/item/analyzer/AltClick(mob/user) //Barometer output for measuring when the next storm happens
..()
if(user.canUseTopic(src))
@@ -460,17 +463,17 @@ GAS ANALYZER
else
to_chat(user, "<span class='warning'>[src]'s barometer function says a storm will land in approximately [butchertime(fixed)].</span>")
cooldown = TRUE
addtimer(CALLBACK(src,/obj/item/device/analyzer/proc/ping), cooldown_time)
addtimer(CALLBACK(src,/obj/item/analyzer/proc/ping), cooldown_time)
/obj/item/device/analyzer/proc/ping()
/obj/item/analyzer/proc/ping()
if(isliving(loc))
var/mob/living/L = loc
to_chat(L, "<span class='notice'>[src]'s barometer function is ready!</span>")
playsound(src, 'sound/machines/click.ogg', 100)
cooldown = FALSE
/obj/item/device/analyzer/proc/butchertime(amount)
/obj/item/analyzer/proc/butchertime(amount)
if(!amount)
return
if(accuracy)
@@ -481,9 +484,10 @@ GAS ANALYZER
amount += inaccurate
return DisplayTimeText(max(1,amount))
/obj/item/device/slime_scanner
/obj/item/slime_scanner
name = "slime scanner"
desc = "A device that analyzes a slime's internal composition and measures its stats."
icon = 'icons/obj/device.dmi'
icon_state = "adv_spectrometer"
item_state = "analyzer"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
@@ -495,7 +499,7 @@ GAS ANALYZER
throw_range = 7
materials = list(MAT_METAL=30, MAT_GLASS=20)
/obj/item/device/slime_scanner/attack(mob/living/M, mob/living/user)
/obj/item/slime_scanner/attack(mob/living/M, mob/living/user)
if(user.stat || user.eye_blind)
return
if (!isslime(M))
@@ -1,4 +1,4 @@
/obj/item/device/sensor_device
/obj/item/sensor_device
name = "handheld crew monitor" //Thanks to Gun Hog for the name!
desc = "A miniature machine that tracks suit sensors across the station."
icon = 'icons/obj/device.dmi'
@@ -6,5 +6,5 @@
w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
/obj/item/device/sensor_device/attack_self(mob/user)
/obj/item/sensor_device/attack_self(mob/user)
GLOB.crewmonitor.show(user,src) //Proc already exists, just had to call it
+30 -28
View File
@@ -1,6 +1,7 @@
/obj/item/device/taperecorder
/obj/item/taperecorder
name = "universal recorder"
desc = "A device that can record to cassette tapes, and play them. It automatically translates the content in playback."
icon = 'icons/obj/device.dmi'
icon_state = "taperecorder_empty"
item_state = "analyzer"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
@@ -14,26 +15,26 @@
var/recording = 0
var/playing = 0
var/playsleepseconds = 0
var/obj/item/device/tape/mytape
var/starting_tape_type = /obj/item/device/tape/random
var/obj/item/tape/mytape
var/starting_tape_type = /obj/item/tape/random
var/open_panel = 0
var/canprint = 1
/obj/item/device/taperecorder/Initialize(mapload)
/obj/item/taperecorder/Initialize(mapload)
. = ..()
if(starting_tape_type)
mytape = new starting_tape_type(src)
update_icon()
/obj/item/device/taperecorder/examine(mob/user)
/obj/item/taperecorder/examine(mob/user)
..()
to_chat(user, "The wire panel is [open_panel ? "opened" : "closed"].")
/obj/item/device/taperecorder/attackby(obj/item/I, mob/user, params)
if(!mytape && istype(I, /obj/item/device/tape))
/obj/item/taperecorder/attackby(obj/item/I, mob/user, params)
if(!mytape && istype(I, /obj/item/tape))
if(!user.transferItemToLoc(I,src))
return
mytape = I
@@ -41,7 +42,7 @@
update_icon()
/obj/item/device/taperecorder/proc/eject(mob/user)
/obj/item/taperecorder/proc/eject(mob/user)
if(mytape)
to_chat(user, "<span class='notice'>You remove [mytape] from [src].</span>")
stop()
@@ -49,12 +50,12 @@
mytape = null
update_icon()
/obj/item/device/taperecorder/fire_act(exposed_temperature, exposed_volume)
/obj/item/taperecorder/fire_act(exposed_temperature, exposed_volume)
mytape.ruin() //Fires destroy the tape
..()
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/device/taperecorder/attack_hand(mob/user)
/obj/item/taperecorder/attack_hand(mob/user)
if(loc == user)
if(mytape)
if(!user.is_holding(src))
@@ -63,14 +64,14 @@
else
return ..()
/obj/item/device/taperecorder/proc/can_use(mob/user)
/obj/item/taperecorder/proc/can_use(mob/user)
if(user && ismob(user))
if(!user.incapacitated())
return TRUE
return FALSE
/obj/item/device/taperecorder/verb/ejectverb()
/obj/item/taperecorder/verb/ejectverb()
set name = "Eject Tape"
set category = "Object"
@@ -82,7 +83,7 @@
eject(usr)
/obj/item/device/taperecorder/update_icon()
/obj/item/taperecorder/update_icon()
if(!mytape)
icon_state = "taperecorder_empty"
else if(recording)
@@ -93,12 +94,12 @@
icon_state = "taperecorder_idle"
/obj/item/device/taperecorder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode)
/obj/item/taperecorder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode)
if(mytape && recording)
mytape.timestamp += mytape.used_capacity
mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [message]"
/obj/item/device/taperecorder/verb/record()
/obj/item/taperecorder/verb/record()
set name = "Start Recording"
set category = "Object"
@@ -131,7 +132,7 @@
to_chat(usr, "<span class='notice'>The tape is full.</span>")
/obj/item/device/taperecorder/verb/stop()
/obj/item/taperecorder/verb/stop()
set name = "Stop"
set category = "Object"
@@ -151,7 +152,7 @@
update_icon()
/obj/item/device/taperecorder/verb/play()
/obj/item/taperecorder/verb/play()
set name = "Play Tape"
set category = "Object"
@@ -193,7 +194,7 @@
update_icon()
/obj/item/device/taperecorder/attack_self(mob/user)
/obj/item/taperecorder/attack_self(mob/user)
if(!mytape || mytape.ruined)
return
if(recording)
@@ -202,7 +203,7 @@
record()
/obj/item/device/taperecorder/verb/print_transcript()
/obj/item/taperecorder/verb/print_transcript()
set name = "Print Transcript"
set category = "Object"
@@ -230,14 +231,15 @@
//empty tape recorders
/obj/item/device/taperecorder/empty
/obj/item/taperecorder/empty
starting_tape_type = null
/obj/item/device/tape
/obj/item/tape
name = "tape"
desc = "A magnetic tape that can hold up to ten minutes of content."
icon_state = "tape_white"
icon = 'icons/obj/device.dmi'
item_state = "analyzer"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
@@ -251,17 +253,17 @@
var/list/timestamp = list()
var/ruined = 0
/obj/item/device/tape/fire_act(exposed_temperature, exposed_volume)
/obj/item/tape/fire_act(exposed_temperature, exposed_volume)
ruin()
..()
/obj/item/device/tape/attack_self(mob/user)
/obj/item/tape/attack_self(mob/user)
if(!ruined)
to_chat(user, "<span class='notice'>You pull out all the tape!</span>")
ruin()
/obj/item/device/tape/proc/ruin()
/obj/item/tape/proc/ruin()
//Lets not add infinite amounts of overlays when our fireact is called
//repeatedly
if(!ruined)
@@ -269,12 +271,12 @@
ruined = 1
/obj/item/device/tape/proc/fix()
/obj/item/tape/proc/fix()
cut_overlay("ribbonoverlay")
ruined = 0
/obj/item/device/tape/attackby(obj/item/I, mob/user, params)
/obj/item/tape/attackby(obj/item/I, mob/user, params)
if(ruined && istype(I, /obj/item/screwdriver) || istype(I, /obj/item/pen))
to_chat(user, "<span class='notice'>You start winding the tape back in...</span>")
if(I.use_tool(src, user, 120))
@@ -282,9 +284,9 @@
fix()
//Random colour tapes
/obj/item/device/tape/random
/obj/item/tape/random
icon_state = "random_tape"
/obj/item/device/tape/random/New()
/obj/item/tape/random/New()
icon_state = "tape_[pick("white", "blue", "red", "yellow", "purple")]"
..()
@@ -15,9 +15,10 @@ effective or pretty fucking useless.
*/
/obj/item/device/batterer
/obj/item/batterer
name = "mind batterer"
desc = "A strange device with twin antennas."
icon = 'icons/obj/device.dmi'
icon_state = "batterer"
throwforce = 5
w_class = WEIGHT_CLASS_TINY
@@ -32,7 +33,7 @@ effective or pretty fucking useless.
var/max_uses = 2
/obj/item/device/batterer/attack_self(mob/living/carbon/user, flag = 0, emp = 0)
/obj/item/batterer/attack_self(mob/living/carbon/user, flag = 0, emp = 0)
if(!user) return
if(times_used >= max_uses)
to_chat(user, "<span class='danger'>The mind batterer has been burnt out!</span>")
@@ -67,7 +68,7 @@ effective or pretty fucking useless.
Wavelength is also slightly increased by the intensity as well.
*/
/obj/item/device/healthanalyzer/rad_laser
/obj/item/healthanalyzer/rad_laser
materials = list(MAT_METAL=400)
var/irradiate = 1
var/intensity = 10 // how much damage the radiation does
@@ -75,7 +76,7 @@ effective or pretty fucking useless.
var/used = 0 // is it cooling down?
var/stealth = FALSE
/obj/item/device/healthanalyzer/rad_laser/attack(mob/living/M, mob/living/user)
/obj/item/healthanalyzer/rad_laser/attack(mob/living/M, mob/living/user)
if(!stealth || !irradiate)
..()
if(!irradiate)
@@ -95,21 +96,21 @@ effective or pretty fucking useless.
else
to_chat(user, "<span class='warning'>The radioactive microlaser is still recharging.</span>")
/obj/item/device/healthanalyzer/rad_laser/proc/handle_cooldown(cooldown)
/obj/item/healthanalyzer/rad_laser/proc/handle_cooldown(cooldown)
spawn(cooldown)
used = 0
icon_state = "health"
/obj/item/device/healthanalyzer/rad_laser/attack_self(mob/user)
/obj/item/healthanalyzer/rad_laser/attack_self(mob/user)
interact(user)
/obj/item/device/healthanalyzer/rad_laser/proc/GetCooldown()
/obj/item/healthanalyzer/rad_laser/proc/GetCooldown()
return round(max(10, (stealth*30 + intensity*5 - wavelength/4)))
/obj/item/device/healthanalyzer/rad_laser/interact(mob/user)
/obj/item/healthanalyzer/rad_laser/interact(mob/user)
ui_interact(user)
/obj/item/device/healthanalyzer/rad_laser/ui_interact(mob/user)
/obj/item/healthanalyzer/rad_laser/ui_interact(mob/user)
. = ..()
var/dat = "Irradiation: <A href='?src=[REF(src)];rad=1'>[irradiate ? "On" : "Off"]</A><br>"
@@ -140,7 +141,7 @@ effective or pretty fucking useless.
popup.set_content(dat)
popup.open()
/obj/item/device/healthanalyzer/rad_laser/Topic(href, href_list)
/obj/item/healthanalyzer/rad_laser/Topic(href, href_list)
if(!usr.canUseTopic(src))
return 1
@@ -170,7 +171,7 @@ effective or pretty fucking useless.
add_fingerprint(usr)
return
/obj/item/device/shadowcloak
/obj/item/shadowcloak
name = "cloaker belt"
desc = "Makes you invisible for short periods of time. Recharges in darkness."
icon = 'icons/obj/clothing/belts.dmi'
@@ -186,7 +187,7 @@ effective or pretty fucking useless.
var/old_alpha = 0
actions_types = list(/datum/action/item_action/toggle)
/obj/item/device/shadowcloak/ui_action_click(mob/user)
/obj/item/shadowcloak/ui_action_click(mob/user)
if(user.get_item_by_slot(slot_belt) == src)
if(!on)
Activate(usr)
@@ -194,11 +195,11 @@ effective or pretty fucking useless.
Deactivate()
return
/obj/item/device/shadowcloak/item_action_slot_check(slot, mob/user)
/obj/item/shadowcloak/item_action_slot_check(slot, mob/user)
if(slot == slot_belt)
return 1
/obj/item/device/shadowcloak/proc/Activate(mob/living/carbon/human/user)
/obj/item/shadowcloak/proc/Activate(mob/living/carbon/human/user)
if(!user)
return
to_chat(user, "<span class='notice'>You activate [src].</span>")
@@ -207,7 +208,7 @@ effective or pretty fucking useless.
old_alpha = user.alpha
on = TRUE
/obj/item/device/shadowcloak/proc/Deactivate()
/obj/item/shadowcloak/proc/Deactivate()
to_chat(user, "<span class='notice'>You deactivate [src].</span>")
STOP_PROCESSING(SSobj, src)
if(user)
@@ -215,12 +216,12 @@ effective or pretty fucking useless.
on = FALSE
user = null
/obj/item/device/shadowcloak/dropped(mob/user)
/obj/item/shadowcloak/dropped(mob/user)
..()
if(user && user.get_item_by_slot(slot_belt) != src)
Deactivate()
/obj/item/device/shadowcloak/process()
/obj/item/shadowcloak/process()
if(user.get_item_by_slot(slot_belt) != src)
Deactivate()
return
@@ -234,14 +235,15 @@ effective or pretty fucking useless.
animate(user,alpha = CLAMP(255 - charge,0,255),time = 10)
/obj/item/device/jammer
/obj/item/jammer
name = "radio jammer"
desc = "Device used to disrupt nearby radio communication."
icon = 'icons/obj/device.dmi'
icon_state = "jammer"
var/active = FALSE
var/range = 12
/obj/item/device/jammer/attack_self(mob/user)
/obj/item/jammer/attack_self(mob/user)
to_chat(user,"<span class='notice'>You [active ? "deactivate" : "activate"] [src].</span>")
active = !active
if(active)
@@ -1,6 +1,7 @@
/obj/item/device/transfer_valve
/obj/item/transfer_valve
icon = 'icons/obj/assemblies.dmi'
name = "tank transfer valve"
icon = 'icons/obj/device.dmi'
icon_state = "valve_1"
item_state = "ttv"
lefthand_file = 'icons/mob/inhands/weapons/bombs_lefthand.dmi'
@@ -9,15 +10,15 @@
w_class = WEIGHT_CLASS_BULKY
var/obj/item/tank/tank_one
var/obj/item/tank/tank_two
var/obj/item/device/assembly/attached_device
var/obj/item/assembly/attached_device
var/mob/attacher = null
var/valve_open = FALSE
var/toggle = 1
/obj/item/device/transfer_valve/IsAssemblyHolder()
/obj/item/transfer_valve/IsAssemblyHolder()
return TRUE
/obj/item/device/transfer_valve/attackby(obj/item/item, mob/user, params)
/obj/item/transfer_valve/attackby(obj/item/item, mob/user, params)
if(istype(item, /obj/item/tank))
if(tank_one && tank_two)
to_chat(user, "<span class='warning'>There are already two tanks attached, remove one first!</span>")
@@ -37,7 +38,7 @@
update_icon()
//TODO: Have this take an assemblyholder
else if(isassembly(item))
var/obj/item/device/assembly/A = item
var/obj/item/assembly/A = item
if(A.secured)
to_chat(user, "<span class='notice'>The device is secured.</span>")
return
@@ -57,7 +58,7 @@
attacher = user
return
/obj/item/device/transfer_valve/attack_self(mob/user)
/obj/item/transfer_valve/attack_self(mob/user)
user.set_machine(src)
var/dat = {"<B> Valve properties: </B>
<BR> <B> Attachment one:</B> [tank_one] [tank_one ? "<A href='?src=[REF(src)];tankone=1'>Remove</A>" : ""]
@@ -70,7 +71,7 @@
popup.open()
return
/obj/item/device/transfer_valve/Topic(href, href_list)
/obj/item/transfer_valve/Topic(href, href_list)
..()
if(!usr.canUseTopic(src))
return
@@ -100,16 +101,16 @@
attack_self(usr)
add_fingerprint(usr)
/obj/item/device/transfer_valve/proc/process_activation(obj/item/device/D)
/obj/item/transfer_valve/proc/process_activation(obj/item/D)
if(toggle)
toggle = FALSE
toggle_valve()
addtimer(CALLBACK(src, .proc/toggle_off), 5) //To stop a signal being spammed from a proxy sensor constantly going off or whatever
/obj/item/device/transfer_valve/proc/toggle_off()
/obj/item/transfer_valve/proc/toggle_off()
toggle = TRUE
/obj/item/device/transfer_valve/update_icon()
/obj/item/transfer_valve/update_icon()
cut_overlays()
underlays = null
@@ -127,13 +128,13 @@
if(attached_device)
add_overlay("device")
/obj/item/device/transfer_valve/proc/merge_gases()
/obj/item/transfer_valve/proc/merge_gases()
tank_two.air_contents.volume += tank_one.air_contents.volume
var/datum/gas_mixture/temp
temp = tank_one.air_contents.remove_ratio(1)
tank_two.air_contents.merge(temp)
/obj/item/device/transfer_valve/proc/split_gases()
/obj/item/transfer_valve/proc/split_gases()
if (!valve_open || !tank_one || !tank_two)
return
var/ratio1 = tank_one.air_contents.volume/tank_two.air_contents.volume
@@ -147,7 +148,7 @@
it explodes properly when it gets a signal (and it does).
*/
/obj/item/device/transfer_valve/proc/toggle_valve()
/obj/item/transfer_valve/proc/toggle_valve()
if(!valve_open && tank_one && tank_two)
valve_open = TRUE
var/turf/bombturf = get_turf(src)
@@ -155,7 +156,7 @@
var/attachment = "no device"
if(attached_device)
if(istype(attached_device, /obj/item/device/assembly/signaler))
if(istype(attached_device, /obj/item/assembly/signaler))
attachment = "<A HREF='?_src_=holder;[HrefToken()];secrets=list_signalers'>[attached_device]</A>"
else
attachment = attached_device
@@ -197,5 +198,5 @@
// this doesn't do anything but the timer etc. expects it to be here
// eventually maybe have it update icon to show state (timer, prox etc.) like old bombs
/obj/item/device/transfer_valve/proc/c_state()
/obj/item/transfer_valve/proc/c_state()
return
+8 -8
View File
@@ -18,13 +18,13 @@
var/lit = FALSE //on or off
var/operating = FALSE//cooldown
var/obj/item/weldingtool/weldtool = null
var/obj/item/device/assembly/igniter/igniter = null
var/obj/item/assembly/igniter/igniter = null
var/obj/item/tank/internals/plasma/ptank = null
var/warned_admins = FALSE //for the message_admins() when lit
//variables for prebuilt flamethrowers
var/create_full = FALSE
var/create_with_tank = FALSE
var/igniter_type = /obj/item/device/assembly/igniter
var/igniter_type = /obj/item/assembly/igniter
trigger_guard = TRIGGER_GUARD_NORMAL
/obj/item/flamethrower/Destroy()
@@ -101,7 +101,7 @@
return
else if(isigniter(W))
var/obj/item/device/assembly/igniter/I = W
var/obj/item/assembly/igniter/I = W
if(I.secured)
return
if(igniter)
@@ -125,7 +125,7 @@
update_icon()
return
else if(istype(W, /obj/item/device/analyzer) && ptank)
else if(istype(W, /obj/item/analyzer) && ptank)
atmosanalyzer_scan(ptank.air_contents, user)
else
return ..()
@@ -167,7 +167,7 @@
/obj/item/flamethrower/CheckParts(list/parts_list)
..()
weldtool = locate(/obj/item/weldingtool) in contents
igniter = locate(/obj/item/device/assembly/igniter) in contents
igniter = locate(/obj/item/assembly/igniter) in contents
weldtool.status = FALSE
igniter.secured = FALSE
status = TRUE
@@ -240,11 +240,11 @@
return 1 //It hit the flamethrower, not them
/obj/item/device/assembly/igniter/proc/flamethrower_process(turf/open/location)
/obj/item/assembly/igniter/proc/flamethrower_process(turf/open/location)
location.hotspot_expose(700,2)
/obj/item/device/assembly/igniter/cold/flamethrower_process(turf/open/location)
/obj/item/assembly/igniter/cold/flamethrower_process(turf/open/location)
return
/obj/item/device/assembly/igniter/proc/ignite_turf(obj/item/flamethrower/F,turf/open/location,release_amount = 0.05)
/obj/item/assembly/igniter/proc/ignite_turf(obj/item/flamethrower/F,turf/open/location,release_amount = 0.05)
F.default_ignite(location,release_amount)
+3 -3
View File
@@ -64,9 +64,9 @@ GLOBAL_LIST_EMPTY(possible_gifts)
/obj/item/banhammer,
/obj/item/reagent_containers/food/snacks/grown/ambrosia/deus,
/obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris,
/obj/item/device/paicard,
/obj/item/device/instrument/violin,
/obj/item/device/instrument/guitar,
/obj/item/paicard,
/obj/item/instrument/violin,
/obj/item/instrument/guitar,
/obj/item/storage/belt/utility/full,
/obj/item/clothing/neck/tie/horrible,
/obj/item/clothing/suit/jacket/leather,
@@ -13,7 +13,7 @@
var/list/beakers = list()
var/list/allowed_containers = list(/obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/glass/bottle)
var/affected_area = 3
var/obj/item/device/assembly_holder/nadeassembly = null
var/obj/item/assembly_holder/nadeassembly = null
var/assemblyattacher
var/ignition_temp = 10 // The amount of heat added to the reagents when this grenade goes off.
var/threatscale = 1 // Used by advanced grenades to make them slightly more worthy.
@@ -78,9 +78,9 @@
else
to_chat(user, "<span class='warning'>[I] is empty!</span>")
else if(stage == EMPTY && istype(I, /obj/item/device/assembly_holder))
else if(stage == EMPTY && istype(I, /obj/item/assembly_holder))
. = 1 // no afterattack
var/obj/item/device/assembly_holder/A = I
var/obj/item/assembly_holder/A = I
if(isigniter(A.a_left) == isigniter(A.a_right)) //Check if either part of the assembly has an igniter, but if both parts are igniters, then fuck it
return
if(!user.transferItemToLoc(I, src))
@@ -254,7 +254,7 @@
var/unit_spread = 10 // Amount of units per repeat. Can be altered with a multitool.
/obj/item/grenade/chem_grenade/adv_release/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/device/multitool))
if(istype(I, /obj/item/multitool))
switch(unit_spread)
if(0 to 24)
unit_spread += 5
+3 -3
View File
@@ -12,7 +12,7 @@
w_class = WEIGHT_CLASS_SMALL
var/atom/target = null
var/mutable_appearance/plastic_overlay
var/obj/item/device/assembly_holder/nadeassembly = null
var/obj/item/assembly_holder/nadeassembly = null
var/assemblyattacher
var/directional = FALSE
var/aim_dir = NORTH
@@ -31,8 +31,8 @@
..()
/obj/item/grenade/plastic/attackby(obj/item/I, mob/user, params)
if(!nadeassembly && istype(I, /obj/item/device/assembly_holder))
var/obj/item/device/assembly_holder/A = I
if(!nadeassembly && istype(I, /obj/item/assembly_holder))
var/obj/item/assembly_holder/A = I
if(!user.transferItemToLoc(I, src))
return ..()
nadeassembly = A
@@ -81,7 +81,7 @@
/obj/item/implant/radio
name = "internal radio implant"
activated = TRUE
var/obj/item/device/radio/radio
var/obj/item/radio/radio
var/radio_key
var/subspace_transmission = FALSE
icon = 'icons/obj/radio.dmi'
@@ -105,18 +105,18 @@
radio.recalculateChannels()
/obj/item/implant/radio/mining
radio_key = /obj/item/device/encryptionkey/headset_cargo
radio_key = /obj/item/encryptionkey/headset_cargo
/obj/item/implant/radio/syndicate
desc = "Are you there God? It's me, Syndicate Comms Agent."
radio_key = /obj/item/device/encryptionkey/syndicate
radio_key = /obj/item/encryptionkey/syndicate
subspace_transmission = TRUE
/obj/item/implant/radio/slime
name = "slime radio"
icon = 'icons/obj/surgery.dmi'
icon_state = "adamantine_resonator"
radio_key = /obj/item/device/encryptionkey/headset_sci
radio_key = /obj/item/encryptionkey/headset_sci
subspace_transmission = TRUE
/obj/item/implant/radio/get_data()
@@ -15,7 +15,7 @@
imp_type = /obj/item/implant/tracking
/obj/item/implanter/tracking/gps
imp_type = /obj/item/device/gps/mining/internal
imp_type = /obj/item/gps/mining/internal
/obj/item/implant/tracking/get_data()
var/dat = {"<b>Implant Specifications:</b><BR>
+1 -1
View File
@@ -173,7 +173,7 @@
possible_colors = list("purple" = LIGHT_COLOR_LAVENDER)
/obj/item/melee/transforming/energy/sword/saber/attackby(obj/item/W, mob/living/user, params)
if(istype(W, /obj/item/device/multitool))
if(istype(W, /obj/item/multitool))
if(!hacked)
hacked = TRUE
item_color = "rainbow"
+4 -4
View File
@@ -2,14 +2,14 @@
//Malf Picker
/obj/item/device/malf_upgrade
/obj/item/malf_upgrade
name = "combat software upgrade"
desc = "A highly illegal, highly dangerous upgrade for artificial intelligence units, granting them a variety of powers as well as the ability to hack APCs."
icon = 'icons/obj/module.dmi'
icon_state = "datadisk3"
/obj/item/device/malf_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user)
/obj/item/malf_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user)
if(!istype(AI))
return
if(AI.malf_picker)
@@ -23,13 +23,13 @@
//Lipreading
/obj/item/device/surveillance_upgrade
/obj/item/surveillance_upgrade
name = "surveillance software upgrade"
desc = "A software package that will allow an artificial intelligence to 'hear' from its cameras via lip reading."
icon = 'icons/obj/module.dmi'
icon_state = "datadisk3"
/obj/item/device/surveillance_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user)
/obj/item/surveillance_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user)
if(!istype(AI))
return
if(AI.eyeobj)
+3 -3
View File
@@ -273,20 +273,20 @@
to_chat(user, "<span class='notice'>You stop charging [target].</span>")
/obj/item/device/harmalarm
/obj/item/harmalarm
name = "\improper Sonic Harm Prevention Tool"
desc = "Releases a harmless blast that confuses most organics. For when the harm is JUST TOO MUCH."
icon_state = "megaphone"
var/cooldown = 0
/obj/item/device/harmalarm/emag_act(mob/user)
/obj/item/harmalarm/emag_act(mob/user)
obj_flags ^= EMAGGED
if(obj_flags & EMAGGED)
to_chat(user, "<font color='red'>You short out the safeties on [src]!</font>")
else
to_chat(user, "<font color='red'>You reset the safeties on [src]!</font>")
/obj/item/device/harmalarm/attack_self(mob/user)
/obj/item/harmalarm/attack_self(mob/user)
var/safety = !(obj_flags & EMAGGED)
if(cooldown > world.time)
to_chat(user, "<font color='red'>The device is still recharging!</font>")
+4 -4
View File
@@ -152,14 +152,14 @@
else
to_chat(user, "<span class='warning'>You need to attach a flash to it first!</span>")
else if (istype(W, /obj/item/device/multitool))
else if (istype(W, /obj/item/multitool))
if(check_completion())
Interact(user)
else
to_chat(user, "<span class='warning'>The endoskeleton must be assembled before debugging can begin!</span>")
else if(istype(W, /obj/item/device/mmi))
var/obj/item/device/mmi/M = W
else if(istype(W, /obj/item/mmi))
var/obj/item/mmi/M = W
if(check_completion())
if(!isturf(loc))
to_chat(user, "<span class='warning'>You can't put [M] in, the frame has to be standing on the ground to be perfectly precise!</span>")
@@ -304,7 +304,7 @@
var/mob/living/living_user = usr
var/obj/item/item_in_hand = living_user.get_active_held_item()
if(!istype(item_in_hand, /obj/item/device/multitool))
if(!istype(item_in_hand, /obj/item/multitool))
to_chat(living_user, "<span class='warning'>You need a multitool!</span>")
return
+1 -1
View File
@@ -49,7 +49,7 @@
/obj/item/stack/ore/bluespace_crystal/artificial
name = "artificial bluespace crystal"
desc = "An artificially made bluespace crystal, it looks delicate."
materials = list(MAT_BLUESPACE=MINERAL_MATERIAL_AMOUNT / 2)
materials = list(MAT_BLUESPACE=MINERAL_MATERIAL_AMOUNT*0.5)
blink_range = 4 // Not as good as the organic stuff!
points = 0 //nice try
refined_type = null
@@ -285,7 +285,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
/obj/item/shard/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/device/lightreplacer))
if(istype(I, /obj/item/lightreplacer))
I.attackby(src, user)
else
return ..()
@@ -19,9 +19,6 @@ Mineral Sheets
- Abductor
*/
/obj/item/stack/sheet/mineral
icon = 'icons/obj/mining.dmi'
/obj/item/stack/sheet/mineral/Initialize(mapload)
pixel_x = rand(-4, 4)
pixel_y = rand(-4, 4)
@@ -63,7 +60,6 @@ GLOBAL_LIST_INIT(sandstone_recipes, list ( \
/obj/item/stack/sheet/mineral/sandbags
name = "sandbags"
icon = 'icons/obj/stack_objects.dmi'
icon_state = "sandbags"
singular_name = "sandbag"
layer = LOW_ITEM_LAYER
@@ -337,16 +333,6 @@ GLOBAL_LIST_INIT(snow_recipes, list ( \
/****************************** Others ****************************/
/*
* Enriched Uranium
*/
/obj/item/stack/sheet/mineral/enruranium
name = "enriched uranium"
icon_state = "sheet-enruranium"
item_state = "sheet-enruranium"
singular_name = "enriched uranium sheet"
materials = list(MAT_URANIUM=3000)
/*
* Adamantine
*/
+20 -8
View File
@@ -227,26 +227,36 @@
else
to_chat(usr, "<span class='warning'>You haven't got enough [src] to build \the [R.title]!</span>")
return FALSE
if(R.window_checks && !valid_window_location(usr.loc, usr.dir))
var/turf/T = get_turf(usr)
if(R.window_checks && !valid_window_location(T, usr.dir))
to_chat(usr, "<span class='warning'>The [R.title] won't fit here!</span>")
return FALSE
if(R.one_per_turf && (locate(R.result_type) in usr.loc))
if(R.one_per_turf && (locate(R.result_type) in T))
to_chat(usr, "<span class='warning'>There is another [R.title] here!</span>")
return FALSE
if(R.on_floor && !isfloorturf(usr.loc))
to_chat(usr, "<span class='warning'>\The [R.title] must be constructed on the floor!</span>")
return FALSE
if(R.on_floor)
if(!isfloorturf(T))
to_chat(usr, "<span class='warning'>\The [R.title] must be constructed on the floor!</span>")
return FALSE
for(var/obj/AM in T)
if(istype(AM,/obj/structure/grille))
continue
if(istype(AM,/obj/structure/table))
continue
if(AM.density)
to_chat(usr, "<span class='warning'>Theres a [AM.name] here. You cant make a [R.title] here!</span>")
return FALSE
if(R.placement_checks)
switch(R.placement_checks)
if(STACK_CHECK_CARDINALS)
var/turf/step
for(var/direction in GLOB.cardinals)
step = get_step(usr, direction)
step = get_step(T, direction)
if(locate(R.result_type) in step)
to_chat(usr, "<span class='warning'>\The [R.title] must not be built directly adjacent to another!</span>")
return FALSE
if(STACK_CHECK_ADJACENT)
if(locate(R.result_type) in range(1, usr))
if(locate(R.result_type) in range(1, T))
to_chat(usr, "<span class='warning'>\The [R.title] must be constructed at least one tile away from others of its type!</span>")
return FALSE
return TRUE
@@ -395,7 +405,9 @@
var/window_checks = FALSE
var/placement_checks = FALSE
/datum/stack_recipe/New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = FALSE, on_floor = FALSE, window_checks = FALSE, placement_checks = FALSE)
/datum/stack_recipe/New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1,time = 0, one_per_turf = FALSE, on_floor = FALSE, window_checks = FALSE, placement_checks = FALSE )
src.title = title
src.result_type = result_type
src.req_amount = req_amount
+3 -3
View File
@@ -379,7 +379,7 @@
new /obj/item/crowbar(src)
new /obj/item/stack/cable_coil/random(src)
new /obj/item/wirecutters(src)
new /obj/item/device/multitool(src)
new /obj/item/multitool(src)
/obj/item/storage/backpack/duffelbag/clown
name = "clown's duffel bag"
@@ -439,7 +439,7 @@
new /obj/item/surgical_drapes(src)
new /obj/item/clothing/suit/straight_jacket(src)
new /obj/item/clothing/mask/muzzle(src)
new /obj/item/device/mmi/syndie(src)
new /obj/item/mmi/syndie(src)
/obj/item/storage/backpack/duffelbag/syndie/ammo
name = "ammunition duffel bag"
@@ -542,7 +542,7 @@
STR.silent = TRUE
/obj/item/storage/backpack/duffelbag/clown/syndie/PopulateContents()
new /obj/item/device/pda/clown(src)
new /obj/item/pda/clown(src)
new /obj/item/clothing/under/rank/clown(src)
new /obj/item/clothing/shoes/clown_shoes(src)
new /obj/item/clothing/mask/gas/clown_hat(src)
+43 -42
View File
@@ -34,27 +34,28 @@
item_state = "utility"
content_overlays = TRUE
/obj/item/storage/belt/ulility/ComponentInitialize()
/obj/item/storage/belt/utility/ComponentInitialize()
. = ..()
GET_COMPONENT(STR, /datum/component/storage)
STR.can_hold = typecacheof(list(
var/static/list/can_hold = typecacheof(list(
/obj/item/crowbar,
/obj/item/screwdriver,
/obj/item/weldingtool,
/obj/item/wirecutters,
/obj/item/wrench,
/obj/item/device/multitool,
/obj/item/device/flashlight,
/obj/item/multitool,
/obj/item/flashlight,
/obj/item/stack/cable_coil,
/obj/item/device/t_scanner,
/obj/item/device/analyzer,
/obj/item/device/geiger_counter,
/obj/item/t_scanner,
/obj/item/analyzer,
/obj/item/geiger_counter,
/obj/item/extinguisher/mini,
/obj/item/device/radio,
/obj/item/radio,
/obj/item/clothing/gloves,
/obj/item/holosign_creator,
/obj/item/device/assembly/signaler
/obj/item/assembly/signaler
))
STR.can_hold = can_hold
/obj/item/storage/belt/utility/chief
name = "\improper Chief Engineer's toolbelt" //"the Chief Engineer's toolbelt", because "Chief Engineer's toolbelt" is not a proper noun
@@ -66,10 +67,10 @@
new /obj/item/screwdriver/power(src)
new /obj/item/crowbar/power(src)
new /obj/item/weldingtool/experimental(src)//This can be changed if this is too much
new /obj/item/device/multitool(src)
new /obj/item/multitool(src)
new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange"))
new /obj/item/extinguisher/mini(src)
new /obj/item/device/analyzer(src)
new /obj/item/analyzer(src)
//much roomier now that we've managed to remove two tools
/obj/item/storage/belt/utility/full/PopulateContents()
@@ -78,7 +79,7 @@
new /obj/item/weldingtool(src)
new /obj/item/crowbar(src)
new /obj/item/wirecutters(src)
new /obj/item/device/multitool(src)
new /obj/item/multitool(src)
new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange"))
/obj/item/storage/belt/utility/full/engi/PopulateContents()
@@ -87,7 +88,7 @@
new /obj/item/weldingtool/largetank(src)
new /obj/item/crowbar(src)
new /obj/item/wirecutters(src)
new /obj/item/device/multitool(src)
new /obj/item/multitool(src)
new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange"))
@@ -97,7 +98,7 @@
new /obj/item/weldingtool(src)
new /obj/item/crowbar(src)
new /obj/item/wirecutters(src)
new /obj/item/device/t_scanner(src)
new /obj/item/t_scanner(src)
new /obj/item/extinguisher/mini(src)
/obj/item/storage/belt/utility/servant/PopulateContents()
@@ -106,7 +107,7 @@
new /obj/item/wrench/brass(src)
new /obj/item/crowbar/brass(src)
new /obj/item/weldingtool/experimental/brass(src)
new /obj/item/device/multitool(src)
new /obj/item/multitool(src)
new /obj/item/stack/cable_coil(src, 30, "yellow")
/obj/item/storage/belt/medical
@@ -120,7 +121,7 @@
GET_COMPONENT(STR, /datum/component/storage)
STR.max_w_class = WEIGHT_CLASS_BULKY
STR.can_hold = typecacheof(list(
/obj/item/device/healthanalyzer,
/obj/item/healthanalyzer,
/obj/item/dnainjector,
/obj/item/reagent_containers/dropper,
/obj/item/reagent_containers/glass/beaker,
@@ -132,11 +133,11 @@
/obj/item/storage/fancy/cigarettes,
/obj/item/storage/pill_bottle,
/obj/item/stack/medical,
/obj/item/device/flashlight/pen,
/obj/item/flashlight/pen,
/obj/item/extinguisher/mini,
/obj/item/reagent_containers/hypospray,
/obj/item/device/sensor_device,
/obj/item/device/radio,
/obj/item/sensor_device,
/obj/item/radio,
/obj/item/clothing/gloves/,
/obj/item/lazarus_injector,
/obj/item/bikehorn/rubberducky,
@@ -150,7 +151,7 @@
/obj/item/retractor,
/obj/item/cautery,
/obj/item/hemostat,
/obj/item/device/geiger_counter,
/obj/item/geiger_counter,
/obj/item/clothing/neck/stethoscope,
/obj/item/stamp,
/obj/item/clothing/glasses,
@@ -185,15 +186,15 @@
/obj/item/grenade,
/obj/item/reagent_containers/spray/pepper,
/obj/item/restraints/handcuffs,
/obj/item/device/assembly/flash/handheld,
/obj/item/assembly/flash/handheld,
/obj/item/clothing/glasses,
/obj/item/ammo_casing/shotgun,
/obj/item/ammo_box,
/obj/item/reagent_containers/food/snacks/donut,
/obj/item/kitchen/knife/combat,
/obj/item/device/flashlight/seclite,
/obj/item/flashlight/seclite,
/obj/item/melee/classic_baton/telescopic,
/obj/item/device/radio,
/obj/item/radio,
/obj/item/clothing/gloves,
/obj/item/restraints/legcuffs/bola
))
@@ -202,7 +203,7 @@
new /obj/item/reagent_containers/spray/pepper(src)
new /obj/item/restraints/handcuffs(src)
new /obj/item/grenade/flashbang(src)
new /obj/item/device/assembly/flash/handheld(src)
new /obj/item/assembly/flash/handheld(src)
new /obj/item/melee/baton/loaded(src)
update_icon()
@@ -225,15 +226,15 @@
/obj/item/weldingtool,
/obj/item/wirecutters,
/obj/item/wrench,
/obj/item/device/multitool,
/obj/item/device/flashlight,
/obj/item/multitool,
/obj/item/flashlight,
/obj/item/stack/cable_coil,
/obj/item/device/analyzer,
/obj/item/analyzer,
/obj/item/extinguisher/mini,
/obj/item/device/radio,
/obj/item/radio,
/obj/item/clothing/gloves,
/obj/item/resonator,
/obj/item/device/mining_scanner,
/obj/item/mining_scanner,
/obj/item/pickaxe,
/obj/item/stack/sheet/animalhide,
/obj/item/stack/sheet/sinew,
@@ -244,16 +245,16 @@
/obj/item/stack/medical,
/obj/item/kitchen/knife,
/obj/item/reagent_containers/hypospray,
/obj/item/device/gps,
/obj/item/gps,
/obj/item/storage/bag/ore,
/obj/item/survivalcapsule,
/obj/item/device/t_scanner/adv_mining_scanner,
/obj/item/t_scanner/adv_mining_scanner,
/obj/item/reagent_containers/pill,
/obj/item/storage/pill_bottle,
/obj/item/stack/ore,
/obj/item/reagent_containers/food/drinks,
/obj/item/organ/regenerative_core,
/obj/item/device/wormhole_jaunter,
/obj/item/wormhole_jaunter,
/obj/item/storage/bag/plants,
/obj/item/stack/marker_beacon
))
@@ -288,16 +289,16 @@
GET_COMPONENT(STR, /datum/component/storage)
STR.max_items = 6
STR.can_hold = typecacheof(list(
/obj/item/device/soulstone
/obj/item/soulstone
))
/obj/item/storage/belt/soulstone/full/PopulateContents()
for(var/i in 1 to 6)
new /obj/item/device/soulstone(src)
new /obj/item/soulstone(src)
/obj/item/storage/belt/soulstone/full/chappy/PopulateContents()
for(var/i in 1 to 6)
new /obj/item/device/soulstone/anybody/chaplain(src)
new /obj/item/soulstone/anybody/chaplain(src)
/obj/item/storage/belt/champion
name = "championship belt"
@@ -338,7 +339,7 @@
new /obj/item/weldingtool/abductor(src)
new /obj/item/crowbar/abductor(src)
new /obj/item/wirecutters/abductor(src)
new /obj/item/device/multitool/abductor(src)
new /obj/item/multitool/abductor(src)
new /obj/item/stack/cable_coil(src,30,"white")
/obj/item/storage/belt/military/army
@@ -375,7 +376,7 @@
/obj/item/grenade,
/obj/item/screwdriver,
/obj/item/lighter,
/obj/item/device/multitool,
/obj/item/multitool,
/obj/item/reagent_containers/food/drinks/bottle/molotov,
/obj/item/grenade/plastic/c4,
))
@@ -408,7 +409,7 @@
new /obj/item/grenade/syndieminibomb(src)
new /obj/item/grenade/syndieminibomb(src)
new /obj/item/screwdriver(src)
new /obj/item/device/multitool(src)
new /obj/item/multitool(src)
/obj/item/storage/belt/wands
name = "wand belt"
@@ -449,15 +450,15 @@
STR.max_w_class = WEIGHT_CLASS_BULKY // Set to this so the light replacer can fit.
STR.can_hold = typecacheof(list(
/obj/item/grenade/chem_grenade,
/obj/item/device/lightreplacer,
/obj/item/device/flashlight,
/obj/item/lightreplacer,
/obj/item/flashlight,
/obj/item/reagent_containers/spray,
/obj/item/soap,
/obj/item/holosign_creator,
/obj/item/key/janitor,
/obj/item/clothing/gloves,
/obj/item/melee/flyswatter,
/obj/item/device/assembly/mousetrap
/obj/item/assembly/mousetrap
))
/obj/item/storage/belt/bandolier
@@ -606,4 +607,4 @@
/obj/item/storage/belt/sabre/PopulateContents()
new /obj/item/melee/sabre(src)
update_icon()
update_icon()
+1 -1
View File
@@ -177,7 +177,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
playsound(src,'sound/hallucinations/veryfar_noise.ogg',40,1)
if(do_after(user, 40, target = sword))
playsound(src,'sound/effects/pray_chaplain.ogg',60,1)
for(var/obj/item/device/soulstone/SS in sword.contents)
for(var/obj/item/soulstone/SS in sword.contents)
SS.usability = TRUE
for(var/mob/living/simple_animal/shade/EX in SS)
SSticker.mode.remove_cultist(EX.mind, 1, 0)
+14 -14
View File
@@ -101,7 +101,7 @@
/obj/item/storage/box/survival/radio/PopulateContents()
..() // we want the survival stuff too.
new /obj/item/device/radio/off(src)
new /obj/item/radio/off(src)
/obj/item/storage/box/survival_mining/PopulateContents()
new /obj/item/clothing/mask/gas/explorer(src)
@@ -118,7 +118,7 @@
/obj/item/storage/box/engineer/radio/PopulateContents()
..() // we want the regular items too.
new /obj/item/device/radio/off(src)
new /obj/item/radio/off(src)
// Syndie survival box
/obj/item/storage/box/syndie/PopulateContents()
@@ -133,7 +133,7 @@
/obj/item/storage/box/security/radio/PopulateContents()
..() // we want the regular stuff too
new /obj/item/device/radio/off(src)
new /obj/item/radio/off(src)
/obj/item/storage/box/gloves
name = "box of latex gloves"
@@ -225,7 +225,7 @@
/obj/item/storage/box/flashes/PopulateContents()
for(var/i in 1 to 6)
new /obj/item/device/assembly/flash/handheld(src)
new /obj/item/assembly/flash/handheld(src)
/obj/item/storage/box/wall_flash
name = "wall-mounted flash kit"
@@ -238,11 +238,11 @@
new /obj/item/wallframe/button(src)
new /obj/item/electronics/airlock(src)
var/obj/item/device/assembly/control/flasher/remote = new(src)
var/obj/item/assembly/control/flasher/remote = new(src)
remote.id = id
var/obj/item/wallframe/flasher/frame = new(src)
frame.id = id
new /obj/item/device/assembly/flash/handheld(src)
new /obj/item/assembly/flash/handheld(src)
new /obj/item/screwdriver(src)
@@ -399,10 +399,10 @@
illustration = "pda"
/obj/item/storage/box/PDAs/PopulateContents()
new /obj/item/device/pda(src)
new /obj/item/device/pda(src)
new /obj/item/device/pda(src)
new /obj/item/device/pda(src)
new /obj/item/pda(src)
new /obj/item/pda(src)
new /obj/item/pda(src)
new /obj/item/pda(src)
new /obj/item/cartridge/head(src)
var/newcart = pick( /obj/item/cartridge/engineering,
@@ -453,7 +453,7 @@
/obj/item/storage/box/firingpins/PopulateContents()
for(var/i in 1 to 5)
new /obj/item/device/firing_pin(src)
new /obj/item/firing_pin(src)
/obj/item/storage/box/lasertagpins
name = "box of laser tag firing pins"
@@ -462,8 +462,8 @@
/obj/item/storage/box/lasertagpins/PopulateContents()
for(var/i in 1 to 3)
new /obj/item/device/firing_pin/tag/red(src)
new /obj/item/device/firing_pin/tag/blue(src)
new /obj/item/firing_pin/tag/red(src)
new /obj/item/firing_pin/tag/blue(src)
/obj/item/storage/box/handcuffs
name = "box of spare handcuffs"
@@ -511,7 +511,7 @@
/obj/item/storage/box/mousetraps/PopulateContents()
for(var/i in 1 to 6)
new /obj/item/device/assembly/mousetrap(src)
new /obj/item/assembly/mousetrap(src)
/obj/item/storage/box/pillbottles
name = "box of pill bottles"
+1 -1
View File
@@ -237,7 +237,7 @@
name = "\improper Midori Tabako packet"
desc = "You can't understand the runes, but the packet smells funny."
icon_state = "midori"
spawn_type = /obj/item/clothing/mask/cigarette/rollie
spawn_type = /obj/item/clothing/mask/cigarette/rollie/nicotine
/obj/item/storage/fancy/cigarettes/cigpack_shadyjims
name = "\improper Shady Jim's Super Slims packet"
+5 -5
View File
@@ -35,7 +35,7 @@
new /obj/item/stack/medical/ointment(src)
new /obj/item/stack/medical/ointment(src)
new /obj/item/reagent_containers/hypospray/medipen(src)
new /obj/item/device/healthanalyzer(src)
new /obj/item/healthanalyzer(src)
/obj/item/storage/firstaid/ancient
icon_state = "firstaid"
@@ -74,7 +74,7 @@
new /obj/item/reagent_containers/pill/oxandrolone(src)
new /obj/item/reagent_containers/pill/oxandrolone(src)
new /obj/item/reagent_containers/hypospray/medipen(src)
new /obj/item/device/healthanalyzer(src)
new /obj/item/healthanalyzer(src)
/obj/item/storage/firstaid/toxin
name = "toxin treatment kit"
@@ -97,7 +97,7 @@
new /obj/item/reagent_containers/syringe/charcoal(src)
for(var/i in 1 to 2)
new /obj/item/storage/pill_bottle/charcoal(src)
new /obj/item/device/healthanalyzer(src)
new /obj/item/healthanalyzer(src)
/obj/item/storage/firstaid/o2
name = "oxygen deprivation treatment kit"
@@ -116,7 +116,7 @@
new /obj/item/reagent_containers/pill/salbutamol(src)
new /obj/item/reagent_containers/hypospray/medipen(src)
new /obj/item/reagent_containers/hypospray/medipen(src)
new /obj/item/device/healthanalyzer(src)
new /obj/item/healthanalyzer(src)
/obj/item/storage/firstaid/brute
name = "brute trauma treatment kit"
@@ -135,7 +135,7 @@
new /obj/item/reagent_containers/pill/patch/styptic(src)
new /obj/item/stack/medical/gauze(src)
new /obj/item/stack/medical/gauze(src)
new /obj/item/device/healthanalyzer(src)
new /obj/item/healthanalyzer(src)
/obj/item/storage/firstaid/tactical
name = "combat medical kit"
+1 -1
View File
@@ -43,7 +43,7 @@
return
if (istype(W, /obj/item/wirecutters))
to_chat(user, "<span class='danger'>[src] is protected from this sort of tampering, yet it appears the internal memory wires can still be <b>pulsed</b>.</span>")
if ((istype(W, /obj/item/device/multitool)) && (!l_hacking))
if ((istype(W, /obj/item/multitool)) && (!l_hacking))
if(open == 1)
to_chat(user, "<span class='danger'>Now attempting to reset internal memory, please hold.</span>")
l_hacking = 1
+8 -8
View File
@@ -48,12 +48,12 @@
new /obj/item/extinguisher/mini(src)
switch(rand(1,3))
if(1)
new /obj/item/device/flashlight(src)
new /obj/item/flashlight(src)
if(2)
new /obj/item/device/flashlight/glowstick(src)
new /obj/item/flashlight/glowstick(src)
if(3)
new /obj/item/device/flashlight/flare(src)
new /obj/item/device/radio/off(src)
new /obj/item/flashlight/flare(src)
new /obj/item/radio/off(src)
/obj/item/storage/toolbox/emergency/old
name = "rusty red toolbox"
@@ -70,7 +70,7 @@
new /obj/item/wrench(src)
new /obj/item/weldingtool(src)
new /obj/item/crowbar(src)
new /obj/item/device/analyzer(src)
new /obj/item/analyzer(src)
new /obj/item/wirecutters(src)
/obj/item/storage/toolbox/mechanical/old
@@ -96,7 +96,7 @@
var/pickedcolor = pick("red","yellow","green","blue","pink","orange","cyan","white")
new /obj/item/screwdriver(src)
new /obj/item/wirecutters(src)
new /obj/item/device/t_scanner(src)
new /obj/item/t_scanner(src)
new /obj/item/crowbar(src)
new /obj/item/stack/cable_coil(src,30,pickedcolor)
new /obj/item/stack/cable_coil(src,30,pickedcolor)
@@ -123,7 +123,7 @@
new /obj/item/weldingtool/largetank(src)
new /obj/item/crowbar/red(src)
new /obj/item/wirecutters(src, "red")
new /obj/item/device/multitool(src)
new /obj/item/multitool(src)
new /obj/item/clothing/gloves/combat(src)
/obj/item/storage/toolbox/drone
@@ -139,7 +139,7 @@
new /obj/item/crowbar(src)
new /obj/item/stack/cable_coil(src,30,pickedcolor)
new /obj/item/wirecutters(src)
new /obj/item/device/multitool(src)
new /obj/item/multitool(src)
/obj/item/storage/toolbox/brass
name = "brass box"
+25 -25
View File
@@ -7,20 +7,20 @@
new /obj/item/clothing/mask/chameleon(src) // Goes with above
new /obj/item/card/id/syndicate(src) // 2 tc
new /obj/item/clothing/shoes/chameleon/noslip(src) // 2 tc
new /obj/item/device/camera_bug(src) // 1 tc
new /obj/item/device/multitool/ai_detect(src) // 1 tc
new /obj/item/device/encryptionkey/syndicate(src) // 2 tc
new /obj/item/camera_bug(src) // 1 tc
new /obj/item/multitool/ai_detect(src) // 1 tc
new /obj/item/encryptionkey/syndicate(src) // 2 tc
new /obj/item/reagent_containers/syringe/mulligan(src) // 4 tc
new /obj/item/switchblade(src) //I'll count this as 2 tc
new /obj/item/storage/fancy/cigarettes/cigpack_syndicate (src) // 2 tc this shit heals
new /obj/item/device/flashlight/emp(src) // 2 tc
new /obj/item/device/chameleon(src) // 7 tc
new /obj/item/flashlight/emp(src) // 2 tc
new /obj/item/chameleon(src) // 7 tc
if("stealth") // 31 tc
new /obj/item/gun/energy/kinetic_accelerator/crossbow(src)
new /obj/item/pen/sleepy(src)
new /obj/item/device/healthanalyzer/rad_laser(src)
new /obj/item/device/chameleon(src)
new /obj/item/healthanalyzer/rad_laser(src)
new /obj/item/chameleon(src)
new /obj/item/soap/syndie(src)
new /obj/item/clothing/glasses/thermal/syndi(src)
@@ -34,12 +34,12 @@
new /obj/item/reagent_containers/syringe/stimulants(src)
if("screwed") // 29 tc
new /obj/item/device/sbeacondrop/bomb(src)
new /obj/item/sbeacondrop/bomb(src)
new /obj/item/grenade/syndieminibomb(src)
new /obj/item/device/sbeacondrop/powersink(src)
new /obj/item/sbeacondrop/powersink(src)
new /obj/item/clothing/suit/space/syndicate/black/red(src)
new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
new /obj/item/device/encryptionkey/syndicate(src)
new /obj/item/encryptionkey/syndicate(src)
if("guns") // 28 tc now
new /obj/item/gun/ballistic/revolver(src)
@@ -56,7 +56,7 @@
new /obj/item/clothing/glasses/thermal/syndi(src)
new /obj/item/card/emag(src)
new /obj/item/clothing/shoes/chameleon/noslip(src)
new /obj/item/device/encryptionkey/syndicate(src)
new /obj/item/encryptionkey/syndicate(src)
new /obj/item/grenade/syndieminibomb(src)
if("implant") // 55+ tc holy shit what the fuck this is a lottery disguised as fun boxes isn't it?
@@ -70,12 +70,12 @@
if("hacker") // 26 tc
new /obj/item/aiModule/syndicate(src)
new /obj/item/card/emag(src)
new /obj/item/device/encryptionkey/binary(src)
new /obj/item/encryptionkey/binary(src)
new /obj/item/aiModule/toyAI(src)
new /obj/item/device/multitool/ai_detect(src)
new /obj/item/multitool/ai_detect(src)
if("lordsingulo") // 24 tc
new /obj/item/device/sbeacondrop(src)
new /obj/item/sbeacondrop(src)
new /obj/item/clothing/suit/space/syndicate/black/red(src)
new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
new /obj/item/card/emag(src)
@@ -83,10 +83,10 @@
if("sabotage") // 26 tc now
new /obj/item/grenade/plastic/c4 (src)
new /obj/item/grenade/plastic/c4 (src)
new /obj/item/device/doorCharge(src)
new /obj/item/device/doorCharge(src)
new /obj/item/device/camera_bug(src)
new /obj/item/device/sbeacondrop/powersink(src)
new /obj/item/doorCharge(src)
new /obj/item/doorCharge(src)
new /obj/item/camera_bug(src)
new /obj/item/sbeacondrop/powersink(src)
new /obj/item/cartridge/virus/syndicate(src)
new /obj/item/storage/toolbox/syndicate(src) //To actually get to those places
new /obj/item/pizzabox/bomb
@@ -128,7 +128,7 @@
new /obj/item/throwing_star(src)
new /obj/item/storage/belt/chameleon(src) // Unique but worth at least 2 tc
new /obj/item/card/id/syndicate(src) // 2 tc
new /obj/item/device/chameleon(src) // 7 tc
new /obj/item/chameleon(src) // 7 tc
/obj/item/storage/box/syndie_kit
name = "box"
@@ -277,9 +277,9 @@
new /obj/item/clothing/head/chameleon(src)
new /obj/item/clothing/mask/chameleon(src)
new /obj/item/storage/backpack/chameleon(src)
new /obj/item/device/radio/headset/chameleon(src)
new /obj/item/radio/headset/chameleon(src)
new /obj/item/stamp/chameleon(src)
new /obj/item/device/pda/chameleon(src)
new /obj/item/pda/chameleon(src)
new /obj/item/gun/energy/laser/chameleon(src)
//5*(2*4) = 5*8 = 45, 45 damage if you hit one person with all 5 stars.
@@ -321,10 +321,10 @@
new /obj/item/clothing/under/rank/centcom_officer(src)
new /obj/item/clothing/shoes/sneakers/black(src)
new /obj/item/clothing/gloves/color/black(src)
new /obj/item/device/radio/headset/headset_cent/empty(src)
new /obj/item/radio/headset/headset_cent/empty(src)
new /obj/item/clothing/glasses/sunglasses(src)
new /obj/item/storage/backpack/satchel(src)
new /obj/item/device/pda/heads(src)
new /obj/item/pda/heads(src)
new /obj/item/clipboard(src)
/obj/item/storage/box/syndie_kit/chameleon/broken/PopulateContents()
@@ -336,7 +336,7 @@
new /obj/item/clothing/head/chameleon/broken(src)
new /obj/item/clothing/mask/chameleon/broken(src)
new /obj/item/storage/backpack/chameleon/broken(src)
new /obj/item/device/radio/headset/chameleon/broken(src)
new /obj/item/radio/headset/chameleon/broken(src)
new /obj/item/stamp/chameleon/broken(src)
new /obj/item/device/pda/chameleon/broken(src)
new /obj/item/pda/chameleon/broken(src)
// No chameleon laser, they can't randomise for //REASONS//
+1 -1
View File
@@ -17,7 +17,7 @@
/obj/item/stack/spacecash,
/obj/item/card,
/obj/item/clothing/mask/cigarette,
/obj/item/device/flashlight/pen,
/obj/item/flashlight/pen,
/obj/item/seeds,
/obj/item/stack/medical,
/obj/item/toy/crayon,
+1 -1
View File
@@ -196,7 +196,7 @@
hitcost = 2000
throw_hit_chance = 10
slot_flags = SLOT_BACK
var/obj/item/device/assembly/igniter/sparkler = 0
var/obj/item/assembly/igniter/sparkler = 0
/obj/item/melee/baton/cattleprod/Initialize()
. = ..()
+7 -7
View File
@@ -138,10 +138,10 @@
/obj/item/tank/attackby(obj/item/W, mob/user, params)
add_fingerprint(user)
if((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1)
if((istype(W, /obj/item/analyzer)) && get_dist(user, src) <= 1)
atmosanalyzer_scan(air_contents, user)
else if(istype(W, /obj/item/device/assembly_holder))
else if(istype(W, /obj/item/assembly_holder))
bomb_assemble(W,user)
else
. = ..()
@@ -237,20 +237,20 @@
var/temperature = air_contents.return_pressure()
if(pressure > TANK_FRAGMENT_PRESSURE)
if(!istype(src.loc, /obj/item/device/transfer_valve))
if(!istype(src.loc, /obj/item/transfer_valve))
message_admins("Explosive tank rupture! Last key to touch the tank was [src.fingerprintslast].")
log_game("Explosive tank rupture! Last key to touch the tank was [src.fingerprintslast].")
//Give the gas a chance to build up more pressure through reacting
air_contents.react()
air_contents.react()
air_contents.react()
air_contents.react(src)
air_contents.react(src)
air_contents.react(src)
pressure = air_contents.return_pressure()
var/range = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE
var/turf/epicenter = get_turf(loc)
explosion(epicenter, round(range*0.25), round(range*0.5), round(range), round(range*1.5))
if(istype(src.loc, /obj/item/device/transfer_valve))
if(istype(src.loc, /obj/item/transfer_valve))
qdel(src.loc)
else
qdel(src)
+1 -1
View File
@@ -55,7 +55,7 @@
if (sr)
temp += "<B>Beacon Signals:</B><BR>"
for(var/obj/item/device/beacon/W in GLOB.teleportbeacons)
for(var/obj/item/beacon/W in GLOB.teleportbeacons)
if (!W.renamed)
continue
var/turf/tr = get_turf(W)
+1 -1
View File
@@ -258,7 +258,7 @@
newSaber.item_color = "rainbow"
qdel(W)
qdel(src)
else if(istype(W, /obj/item/device/multitool))
else if(istype(W, /obj/item/multitool))
if(!hacked)
hacked = TRUE
item_color = "rainbow"
+1 -1
View File
@@ -438,7 +438,7 @@
possible_colors = list("purple")
/obj/item/twohanded/dualsaber/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/device/multitool))
if(istype(W, /obj/item/multitool))
if(!hacked)
hacked = TRUE
to_chat(user, "<span class='warning'>2XRNBW_ENGAGE</span>")
+3 -3
View File
@@ -248,7 +248,7 @@
user.put_in_hands(S)
to_chat(user, "<span class='notice'>You fasten the glass shard to the top of the rod with the cable.</span>")
else if(istype(I, /obj/item/device/assembly/igniter) && !(I.flags_1 & NODROP_1))
else if(istype(I, /obj/item/assembly/igniter) && !(I.flags_1 & NODROP_1))
var/obj/item/melee/baton/cattleprod/P = new /obj/item/melee/baton/cattleprod
remove_item_from_storage(user)
@@ -383,7 +383,7 @@
name = "stick"
desc = "A great tool to drag someone else's drinks across the bar."
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "stick"
icon_state = "cane"
item_state = "stick"
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
@@ -577,7 +577,7 @@
/obj/item/melee/flyswatter/afterattack(atom/target, mob/user, proximity_flag)
if(proximity_flag)
if(is_type_in_typecache(target, strong_against))
new /obj/effect/decal/cleanable/deadcockroach(get_turf(target))
new /obj/effect/decal/cleanable/insectguts(target.drop_location())
to_chat(user, "<span class='warning'>You easily splat the [target].</span>")
if(istype(target, /mob/living/))
var/mob/living/bug = target